Subversion Repositories HelenOS

Compare Revisions

Ignore whitespace Rev 2279 → Rev 2280

/branches/arm/kernel/arch/arm32/src/arm32.c
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)
;
*/
}
/** @}
*/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/branches/arm/kernel/arch/arm32/src/dummy.S
57,7 → 57,7
#.global tlb_invalidate_asid
#.global tlb_invalidate_pages
 
.global userspace
#.global userspace
calibrate_delay_loop:
mov pc, lr // return
98,9 → 98,6
sys_tls_set:
bkpt
 
userspace:
bkpt
 
dummy:
 
0:
/branches/arm/kernel/arch/arm32/src/start.S
33,6 → 33,8
.global kernel_image_start
.global irq_stack
.global abort_stack
.global exc_stack
.global supervisor_sp
 
kernel_image_start:
 
68,7 → 70,14
irq_stack:
.space 1024
abort_stack:
.space 1024
exc_stack:
 
.space 4
supervisor_sp:
.space 4
 
.space 4
halt:
ldr r0,=0x10000010
ldr r1, [r0]