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; |
|