diff options
Diffstat (limited to 'src/kern/priv.c')
-rw-r--r-- | src/kern/priv.c | 92 |
1 files changed, 86 insertions, 6 deletions
diff --git a/src/kern/priv.c b/src/kern/priv.c index 9d64005..085de85 100644 --- a/src/kern/priv.c +++ b/src/kern/priv.c @@ -1,5 +1,89 @@ #include "kern/priv.h" +#include "arch.h" +#include "kern/log.h" + +void handle_svc_call(uint32_t svc_number) +{ + klogf("Handle SVC: %p\n", svc_number); + for (;;) + ; +} + +asm(" .align 2\n" + " .global on_svc\n" + " .syntax unified\n" + " .fpu softvfp\n" + " .type on_svc, %function\n" + "on_svc:\n" + " tst lr,#4\n" + " ite eq\n" + " moveq r12,sp\n" + " mrsne r12,psp\n" + " ldr r12, [r12, #24]\n" + " ldrh r12, [r12, #-2]\n" + " bics r12, r12, #0xff00\n" + " push {r4, lr}\n" + " mov r0 , r12\n" + " bl handle_svc_call\n" + " pop {r4, lr}\n" + " tst lr, #4\n" + " ite eq\n" + " moveq r12,sp\n" + " mrsne r12,psp\n" + " stm r12,{r0-r3}\n" + " bx lr\n"); + +// void on_svc() // ISR handler. Override from weak symbol. +// { +// asm volatile( +// "push {r0-r12, lr}\n\t" +// "ldr r0, [lr, #-4]\n\t" +// "bic r0, r0, #0xff000000\n\t" +// ); + +// TST LR,#4 ; Called from Handler Mode? +// MRSNE R12,PSP ; Yes, use PSP +// MOVEQ R12,SP ; No, use MSP +// LDR R12,[R12,#24] ; Read Saved PC from Stack +// LDRH R12,[R12,#-2] ; Load Halfword +// BICS R12,R12,#0xFF00 ; Extract SVC Number +// uint32_t reg; +// asm volatile( +// "mov r12, sp\n\t" +// "ldr r12, [r12,#24]\n\t" +// // "ldrh r12,[r12, #-2]\n\t" +// // "bics r12, r12, #0xff00\n\t" +// "mov %0, r12\n\t": "=r"(reg)); + +// uint32_t base[0]; +// uint32_t reg; +// +// +// asm volatile("mov %0, sp\n\t" : "=r"(reg)); +// uint32_t* at = (uint32_t*) (reg + 44); /* Does GCC set up 5 stack frame +// words? */ +// +// klogf("Stack pointer: %p\n", reg); +// klogf("Stack pointer +44: %p\n", (reg + 44)); +// klogf("At_: %p: %p\n\n", 0x80009f6, *(uint32_t*)0x80009f6); +// klogf("At: %p: %p\n\n", at, *at); +// +// +// int i = 0; +// for (; i < 20 && &base[i] != (void*)STACK_TOP; ++ i) { +// kerr_logf(" (%p) %p\n", &base[i], base[i]); +// } +// +// // klogf("TEST %p\n", reg); +// +// for(;;); + +// register int svc_number asm ("r0"); + +// klogf("SVC #: %p\n", svc_number); +// } + void set_control_register(uint32_t reg) { asm volatile("msr control, %0" : "=r"(reg) :); @@ -14,11 +98,7 @@ uint32_t get_control_register() void enter_user_mode() { - asm volatile ( + asm volatile( "mov r0, #1\n\t" - "msr control, r0\n\t" - ); - - // uint32_t creg = get_control_register(); - // set_control_register(creg | 1); + "msr control, r0\n\t"); } |