Rev 3022 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3022 | Rev 4055 | ||
|---|---|---|---|
| Line 68... | Line 68... | ||
| 68 | volatile ustate_t ustate; |
68 | volatile ustate_t ustate; |
| 69 | 69 | ||
| 70 | /* set first parameter */ |
70 | /* set first parameter */ |
| 71 | ustate.r0 = (uintptr_t) kernel_uarg->uspace_uarg; |
71 | ustate.r0 = (uintptr_t) kernel_uarg->uspace_uarg; |
| 72 | 72 | ||
| - | 73 | /* %r1 is defined to hold pcb_ptr - set it to 0 */ |
|
| - | 74 | ustate.r1 = 0; |
|
| - | 75 | ||
| 73 | /* clear other registers */ |
76 | /* clear other registers */ |
| 74 | ustate.r1 = ustate.r2 = ustate.r3 = ustate.r4 = ustate.r5 = |
77 | ustate.r2 = ustate.r3 = ustate.r4 = ustate.r5 = |
| 75 | ustate.r6 = ustate.r7 = ustate.r8 = ustate.r9 = ustate.r10 = |
78 | ustate.r6 = ustate.r7 = ustate.r8 = ustate.r9 = ustate.r10 = |
| 76 | ustate.r11 = ustate.r12 = ustate.lr = 0; |
79 | ustate.r11 = ustate.r12 = ustate.lr = 0; |
| 77 | 80 | ||
| 78 | /* set user stack */ |
81 | /* set user stack */ |
| 79 | ustate.sp = ((uint32_t)kernel_uarg->uspace_stack) + PAGE_SIZE; |
82 | ustate.sp = ((uint32_t)kernel_uarg->uspace_stack) + PAGE_SIZE; |
| Line 85... | Line 88... | ||
| 85 | ipl_t user_mode = current_status_reg_read() & |
88 | ipl_t user_mode = current_status_reg_read() & |
| 86 | (~STATUS_REG_MODE_MASK | USER_MODE); |
89 | (~STATUS_REG_MODE_MASK | USER_MODE); |
| 87 | 90 | ||
| 88 | /* set user mode, set registers, jump */ |
91 | /* set user mode, set registers, jump */ |
| 89 | asm volatile ( |
92 | asm volatile ( |
| 90 | "mov sp, %0 \n" |
93 | "mov sp, %[ustate]\n" |
| 91 | "msr spsr_c, %1 \n" |
94 | "msr spsr_c, %[user_mode]\n" |
| 92 | "ldmfd sp!, {r0-r12, sp, lr}^ \n" |
95 | "ldmfd sp!, {r0-r12, sp, lr}^\n" |
| 93 | "ldmfd sp!, {pc}^\n" |
96 | "ldmfd sp!, {pc}^\n" |
| 94 | : |
- | |
| 95 | : "r" (&ustate), "r" (user_mode) |
97 | :: [ustate] "r" (&ustate), [user_mode] "r" (user_mode) |
| 96 | ); |
98 | ); |
| 97 | 99 | ||
| 98 | /* unreachable */ |
100 | /* unreachable */ |
| 99 | while(1) |
101 | while(1) |
| 100 | ; |
102 | ; |