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)232bfe3f2eSlogwang arch_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