diff options
Diffstat (limited to 'src/kern/priv.c')
-rw-r--r-- | src/kern/priv.c | 88 |
1 files changed, 7 insertions, 81 deletions
diff --git a/src/kern/priv.c b/src/kern/priv.c index 085de85..3162639 100644 --- a/src/kern/priv.c +++ b/src/kern/priv.c @@ -3,87 +3,6 @@ #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) :); @@ -102,3 +21,10 @@ void enter_user_mode() "mov r0, #1\n\t" "msr control, r0\n\t"); } + +void jump_to_user_mode() +{ + asm volatile( + "mov r0, #1\n\t" + "msr control, r0\n\t"); +} |