1*d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause 2*d30ea906Sjfb8856606 * Copyright(c) 2015 Intel Corporation. 32bfe3f2eSlogwang * Copyright(c) Cavium, Inc. 2017. 4*d30ea906Sjfb8856606 * All rights reserved 55af785ecSfengbojiang(姜凤波) * Copyright (C) 2012, Hasan Alayli <[email protected]> 6*d30ea906Sjfb8856606 * Portions derived from: https://github.com/halayli/lthread 7*d30ea906Sjfb8856606 * With permissions from Hasan Alayli to use them as BSD-3-Clause 85af785ecSfengbojiang(姜凤波) */ 95af785ecSfengbojiang(姜凤波) 102bfe3f2eSlogwang #ifndef STACK_H 112bfe3f2eSlogwang #define STACK_H 122bfe3f2eSlogwang 132bfe3f2eSlogwang #ifdef __cplusplus 142bfe3f2eSlogwang extern "C" { 152bfe3f2eSlogwang #endif 162bfe3f2eSlogwang 172bfe3f2eSlogwang #include "lthread_int.h" 182bfe3f2eSlogwang 192bfe3f2eSlogwang /* 202bfe3f2eSlogwang * Sets up the initial stack for the lthread. 212bfe3f2eSlogwang */ 222bfe3f2eSlogwang static inline void arch_set_stack(struct lthread * lt,void * func)232bfe3f2eSlogwangarch_set_stack(struct lthread *lt, void *func) 242bfe3f2eSlogwang { 252bfe3f2eSlogwang char *stack_top = (char *)(lt->stack) + lt->stack_size; 262bfe3f2eSlogwang void **s = (void **)stack_top; 272bfe3f2eSlogwang 282bfe3f2eSlogwang /* set initial context */ 292bfe3f2eSlogwang s[-3] = NULL; 302bfe3f2eSlogwang s[-2] = (void *)lt; 312bfe3f2eSlogwang lt->ctx.rsp = (void *)(stack_top - (4 * sizeof(void *))); 322bfe3f2eSlogwang lt->ctx.rbp = (void *)(stack_top - (3 * sizeof(void *))); 332bfe3f2eSlogwang lt->ctx.rip = func; 342bfe3f2eSlogwang } 352bfe3f2eSlogwang 362bfe3f2eSlogwang #ifdef __cplusplus 372bfe3f2eSlogwang } 382bfe3f2eSlogwang #endif 392bfe3f2eSlogwang 402bfe3f2eSlogwang #endif /* STACK_H_ */ 41