1 /*
2 * Copyright (C) 2016 YunOS Project. All rights reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <k_api.h>
18
cpu_task_stack_init(cpu_stack_t * stack_base,size_t stack_size,void * arg,task_entry_t entry)19 void *cpu_task_stack_init(cpu_stack_t *stack_base, size_t stack_size,
20 void *arg, task_entry_t entry)
21 {
22 cpu_stack_t *stk;
23 register int *gp asm("x3");
24 uint32_t temp = (uint32_t)(stack_base + stack_size);
25
26 temp &= 0xFFFFFFF8UL;
27
28 stk = (cpu_stack_t *)temp;
29
30 *(--stk) = (uint32_t)0x12345678L; /* F31 */
31 *(--stk) = (uint32_t)0x12345678L; /* F30 */
32 *(--stk) = (uint32_t)0x12345678L; /* F29 */
33 *(--stk) = (uint32_t)0x12345678L; /* F28 */
34 *(--stk) = (uint32_t)0x12345678L; /* F27 */
35 *(--stk) = (uint32_t)0x12345678L; /* F26 */
36 *(--stk) = (uint32_t)0x12345678L; /* F25 */
37 *(--stk) = (uint32_t)0x12345678L; /* F24 */
38 *(--stk) = (uint32_t)0x12345678L; /* F23 */
39 *(--stk) = (uint32_t)0x12345678L; /* F22 */
40 *(--stk) = (uint32_t)0x12345678L; /* F21 */
41 *(--stk) = (uint32_t)0x12345678L; /* F20 */
42 *(--stk) = (uint32_t)0x12345678L; /* F19 */
43 *(--stk) = (uint32_t)0x12345678L; /* F18 */
44 *(--stk) = (uint32_t)0x12345678L; /* F17 */
45 *(--stk) = (uint32_t)0x12345678L; /* F16 */
46 *(--stk) = (uint32_t)0x12345678L; /* F15 */
47 *(--stk) = (uint32_t)0x12345678L; /* F14 */
48 *(--stk) = (uint32_t)0x12345678L; /* F13 */
49 *(--stk) = (uint32_t)0x12345678L; /* F12 */
50 *(--stk) = (uint32_t)0x12345678L; /* F11 */
51 *(--stk) = (uint32_t)0x12345678L; /* F10 */
52 *(--stk) = (uint32_t)0x12345678L; /* F9 */
53 *(--stk) = (uint32_t)0x12345678L; /* F8 */
54 *(--stk) = (uint32_t)0x12345678L; /* F7 */
55 *(--stk) = (uint32_t)0x12345678L; /* F6 */
56 *(--stk) = (uint32_t)0x12345678L; /* F5 */
57 *(--stk) = (uint32_t)0x12345678L; /* F4 */
58 *(--stk) = (uint32_t)0x12345678L; /* F3 */
59 *(--stk) = (uint32_t)0x12345678L; /* F2 */
60 *(--stk) = (uint32_t)0x12345678L; /* F1 */
61 *(--stk) = (uint32_t)0x12345678L; /* F0 */
62
63
64 *(--stk) = (uint32_t)entry; /* PC */
65 *(--stk) = (uint32_t)0x31313131L; /* X31 */
66 *(--stk) = (uint32_t)0x30303030L; /* X30 */
67 *(--stk) = (uint32_t)0x29292929L; /* X29 */
68 *(--stk) = (uint32_t)0x28282828L; /* X28 */
69 *(--stk) = (uint32_t)0x27272727L; /* X27 */
70 *(--stk) = (uint32_t)0x26262626L; /* X26 */
71 *(--stk) = (uint32_t)0x25252525L; /* X25 */
72 *(--stk) = (uint32_t)0x24242424L; /* X24 */
73 *(--stk) = (uint32_t)0x23232323L; /* X23 */
74 *(--stk) = (uint32_t)0x22222222L; /* X22 */
75 *(--stk) = (uint32_t)0x21212121L; /* X21 */
76 *(--stk) = (uint32_t)0x20202020L; /* X20 */
77 *(--stk) = (uint32_t)0x19191919L; /* X19 */
78 *(--stk) = (uint32_t)0x18181818L; /* X18 */
79 *(--stk) = (uint32_t)0x17171717L; /* X17 */
80 *(--stk) = (uint32_t)0x16161616L; /* X16 */
81 *(--stk) = (uint32_t)0x15151515L; /* X15 */
82 *(--stk) = (uint32_t)0x14141414L; /* X14 */
83 *(--stk) = (uint32_t)0x13131313L; /* X13 */
84 *(--stk) = (uint32_t)0x12121212L; /* X12 */
85 *(--stk) = (uint32_t)0x11111111L; /* X11 */
86 *(--stk) = (uint32_t)arg; /* X10 */
87 *(--stk) = (uint32_t)0x09090909L; /* X9 */
88 *(--stk) = (uint32_t)0x08080808L; /* X8 */
89 *(--stk) = (uint32_t)0x07070707L; /* X7 */
90 *(--stk) = (uint32_t)0x06060606L; /* X6 */
91 *(--stk) = (uint32_t)0x05050505L; /* X5 */
92 *(--stk) = (uint32_t)0x04040404L; /* X4 */
93 *(--stk) = (uint32_t)gp; /* X3 */
94 *(--stk) = (uint32_t)krhino_task_deathbed; /* X1 */
95
96 return stk;
97 }
98
99