Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2297 → Rev 2298

/branches/arm/kernel/arch/arm32/src/arm32.c
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) ;
}
/** @}
*/