46,10 → 46,44 |
#include <print.h> |
#include <config.h> |
#include <interrupt.h> |
#include <arch/machine.h> |
|
#include <arch/regutils.h> |
//#include <arch/drivers/init.h> |
#include <userspace.h> |
bootinfo_t bootinfo; |
|
//TODO: Remove include and move into exceptio.c |
#include <arch/exception.h> |
|
#include <syscall/syscall.h> |
static 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) |
{ |
dprintf("arch_pre_main\n"); |
75,6 → 109,8 |
|
} |
|
void prefetch_exception_generator(void); |
|
void arch_post_mm_init(void) |
{ |
dprintf("arch_post_mm_init start()\n"); |
82,14 → 118,23 |
Note: Have to be after page_init() */ |
exception_init(); |
|
machine_hw_map_init(); |
// drivers_init(); |
interrupt_init(); |
|
console_init(device_assign_devno()); |
// console_init(device_assign_devno()); |
//fb_init(0x12000000, 640, 480, 1920, VISUAL_RGB_8_8_8); |
|
interrupts_enable(); |
// while(1); |
// interrupts_enable(); |
// asm __volatile__ ("ldr pc, =0x70000000"); // prefetch exception |
//while(1); |
/* |
uspace_arg_t uspace; |
uspace.uspace_entry = (void*)prefetch_exception_generator; |
uspace.uspace_stack = (void*)0x6000000; |
uspace.uspace_uarg = &uspace; |
|
userspace(&uspace); |
*/ |
dprintf("arch_post_mm_init end()\n"); |
} |
|
125,5 → 170,95 |
/* TODO */ |
} |
|
/** Struct to hold general purpose register values */ |
typedef struct { |
uint32_t r0; |
uint32_t r1; |
uint32_t r2; |
uint32_t r3; |
uint32_t r4; |
uint32_t r5; |
uint32_t r6; |
uint32_t r7; |
uint32_t r8; |
uint32_t r9; |
uint32_t r10; |
uint32_t r11; |
uint32_t r12; |
uint32_t sp; |
uint32_t lr; |
uint32_t pc; |
} ustate_t; |
|
|
void prefetch_exception_generator(void) { |
asm __volatile__ ( |
"ldr pc, =0x7000000" |
); |
|
} |
|
/** Change processor mode and jump into addres specified in |
* kernel_uarg.uspace_entry |
* \param kernel_uarg information needed for correct setting of userspace |
*/ |
void userspace(uspace_arg_t *kernel_uarg) |
{ |
// WILL be changed .. after exception return .. eret will be done |
/* |
volatile ustate_t ustate; |
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 |
ustate.r0 = (uintptr_t) kernel_uarg->uspace_uarg; |
// 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 |
ustate.sp = ((uint32_t)kernel_uarg->uspace_stack)+PAGE_SIZE; |
// set where uspace executin 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; |
// |
ipl_t tmpsr = (cpsr & ~STATUS_REG_MODE_MASK) | ABORT_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 |
: // no output |
: "r"(&ustate), "r"(cpsr), "r"(tmpsr) // |
: "r0","r1" |
); |
|
while(1) |
; |
*/ |
|
} |
/** @} |
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|