aboutsummaryrefslogtreecommitdiff
path: root/src/kern/priv.c
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2020-11-25 15:47:02 -0700
committerJosh Rahm <joshuarahm@gmail.com>2020-11-25 15:47:02 -0700
commit6d22b0dfc7761a605758552d5824f8039ac5a00f (patch)
treede0cd4848c02b787d45b41afaca244606eceab5d /src/kern/priv.c
parentb07c6f6a9d926d4eac726b94963e479839382675 (diff)
downloadstm32l4-6d22b0dfc7761a605758552d5824f8039ac5a00f.tar.gz
stm32l4-6d22b0dfc7761a605758552d5824f8039ac5a00f.tar.bz2
stm32l4-6d22b0dfc7761a605758552d5824f8039ac5a00f.zip
Primitive ability to call kernel code from userspace.
Diffstat (limited to 'src/kern/priv.c')
-rw-r--r--src/kern/priv.c88
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");
+}