152,7 → 152,7 |
/** Perform arm32 specific tasks needed before the new thread is scheduled. */ |
void before_thread_runs_arch(void) |
{ |
supervisor_sp = (uintptr_t) &THREAD->kstack/*[THREAD_STACK_SIZE-SP_DELTA]*/; |
supervisor_sp = (uintptr_t) &THREAD->kstack[THREAD_STACK_SIZE-SP_DELTA]; |
} |
|
void after_thread_ran_arch(void) |
194,47 → 194,59 |
*/ |
void userspace(uspace_arg_t *kernel_uarg) |
{ |
// dprintf("userspace\n"); |
// WILL be changed .. after exception return .. eret will be done |
/* |
volatile ustate_t ustate; |
dprintf("userspace\n"); |
|
dprintf("userspce krnl_uard .uspace_uarg(%X), .uspace_entry(%X), .uspace_stack(%X)\n", |
(unsigned int)(kernel_uarg->uspace_uarg), |
kernel_uarg->uspace_entry, |
kernel_uarg->uspace_stack); |
// Step 1 ... prepare user space environmen |
// set first paramater |
|
volatile ustate_t ustate; |
|
//Step 1 ... prepare user space environment |
//set first paramater |
ustate.r0 = (uintptr_t) kernel_uarg->uspace_uarg; |
// clear other registers |
|
//clear other registers |
ustate.r1 = ustate.r2 = ustate.r3 = ustate.r4 = |
ustate.r5 = ustate.r6 = ustate.r7 = ustate.r8 = |
ustate.r9 = ustate.r10 = ustate.r11 = ustate.r12 = 1; |
ustate.lr = 3; |
// set user stack |
|
//set user stack |
ustate.sp = ((uint32_t)kernel_uarg->uspace_stack)+PAGE_SIZE; |
// set where uspace executin starts |
|
//set where uspace executin starts |
ustate.pc = (uintptr_t) kernel_uarg->uspace_entry; |
|
// status register in user mode |
|
//status register in user mode |
ipl_t cpsr = current_status_reg_read(); |
cpsr &= ~STATUS_REG_MODE_MASK | USER_MODE; |
// |
ipl_t tmpsr = (cpsr & ~STATUS_REG_MODE_MASK) | ABORT_MODE; |
|
ipl_t tmpsr = (cpsr & ~STATUS_REG_MODE_MASK) | SUPERVISOR_MODE; |
|
asm __volatile__ ( |
"mov r0, %0 \n" // save pointer into ustate struct |
"mov r1, %1 \n" // save cspr |
"msr cpsr_c, %2 \n" // change mode into any exception mode |
"msr spsr_c, r1 \n" // set saved cpsr ... as user mode |
"ldmfd r0, {r0-r12, sp, lr, pc}^\n" // jump into user mode |
// save pointer into ustate struct |
"mov r0, %0 \n" |
// save cspr |
"mov r1, %1 \n" |
// change mode into any exception mode |
"msr cpsr_c, %2 \n" |
// set saved cpsr |
"msr spsr_c, r1 \n" |
|
"mov sp, r0 \n" |
// replace almost all registers |
"ldmfd sp!, {r0-r12, sp, lr}^\n" |
//jump to the usermode |
"ldmfd sp!, {pc}^" |
: // no output |
: "r"(&ustate), "r"(cpsr), "r"(tmpsr) // |
: "r0","r1" |
); |
*/ |
while(1) |
; |
|
|
while(1) ; |
} |
/** @} |
*/ |