Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2303 → Rev 2304

/branches/arm/kernel/arch/arm32/src/arm32.c
54,40 → 54,6
// // uintptr_t supervisor_sp /*__attribute__ ((section (".text")))*/;
extern uintptr_t supervisor_sp;
 
//TODO: Remove include and move into exceptio.c
#include <arch/exception.h>
 
#include <syscall/syscall.h>
void tmp_swi_exception(int exc_no, istate_t* istate);
void tmp_swi_exception(int exc_no, istate_t* istate)
{
ASSERT(exc_no == EXC_SWI);
ASSERT(istate);
// TODO: Alf ... remove aftet swi_exception is tested
dprintf("\nSWI - istate dump input :\n");
dprintf(" r0:%X r1:%X r2:%X r3:%X\n", istate->r0, istate->r1, istate->r2, istate->r3);
dprintf(" r4:%X r5:%X r6:%X r7:%X\n", istate->r4, istate->r5, istate->r6, istate->r7);
dprintf(" r8:%X r8:%X r10:%X r11:%X\n", istate->r8, istate->r9, istate->r10, istate->r11);
dprintf(" r12:%X r13:%X lr:%X spsr:%X\n", istate->r12, istate->sp, istate->lr, istate->spsr);
// dprintf(" prev_lr:%X prev_sp:%X\n", istate->r12, istate->prev_lr, istate->prev_sp);
// call kernel to serve syscall
istate->r0 = syscall_handler(
istate->r0,
istate->r1,
istate->r2,
istate->r3,
istate->r4);
 
// TODO: Alf ... remove aftet swi_exception is tested
dprintf("\nSWI - Istate dump after :\n");
dprintf(" r0:%X r1:%X r2:%X r3:%X\n", istate->r0, istate->r1, istate->r2, istate->r3);
dprintf(" r4:%X r5:%X r6:%X r7:%X\n", istate->r4, istate->r5, istate->r6, istate->r7);
dprintf(" r8:%X r8:%X r10:%X r11:%X\n", istate->r8, istate->r9, istate->r10, istate->r11);
dprintf(" r12:%X r13:%X lr:%X spsr:%X\n", istate->r12, istate->sp, istate->lr, istate->spsr);
// dprintf(" prev_lr:%X prev_sp:%X\n", istate->r12, istate->prev_lr, istate->prev_sp);
}
 
 
void arch_pre_main(void)
{
int i;
126,6 → 92,7
//fb_init(0x12000000, 640, 480, 1920, VISUAL_RGB_8_8_8);
interrupts_enable();
 
}
 
void arch_post_cpu_init(void)
188,41 → 155,37
 
}
 
/** Change processor mode and jump into addres specified in
* kernel_uarg.uspace_entry
* \param kernel_uarg information needed for correct setting of userspace
/** Changes processor mode and jumps to the address specified in the first parameter.
*
* \param kernel_uarg userspace settings (entry point, stack, ...)
*/
void userspace(uspace_arg_t *kernel_uarg)
{
dprintf("userspace\n");
dprintf("Userspace: .uspace_uarg(%X), .uspace_entry(%X), .uspace_stack(%X)\n",
(unsigned int)(kernel_uarg->uspace_uarg), kernel_uarg->uspace_entry,
kernel_uarg->uspace_stack);
 
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);
volatile ustate_t ustate;
 
volatile ustate_t ustate;
 
//Step 1 ... prepare user space environment
//set first paramater
// set first parameter
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;
ustate.r5 = ustate.r6 = ustate.r7 = ustate.r8 =
ustate.r9 = ustate.r10 = ustate.r11 = ustate.r12 = 1;
 
ustate.lr = 3;
 
//set user stack
ustate.sp = ((uint32_t)kernel_uarg->uspace_stack)+PAGE_SIZE;
ustate.sp = ((uint32_t)kernel_uarg->uspace_stack) + PAGE_SIZE;
 
//set where uspace executin starts
ustate.pc = (uintptr_t) kernel_uarg->uspace_entry;
//set where uspace execution starts
ustate.pc = (uintptr_t) kernel_uarg->uspace_entry;
 
 
//status register in user mode
ipl_t cpsr = current_status_reg_read();
cpsr &= ~STATUS_REG_MODE_MASK | USER_MODE;
cpsr &= ~STATUS_REG_MODE_MASK | USER_MODE;
ipl_t tmpsr = (cpsr & ~STATUS_REG_MODE_MASK) | SUPERVISOR_MODE;