aboutsummaryrefslogtreecommitdiffstats
path: root/src/kernel/svc.c
diff options
context:
space:
mode:
authorClyne Sullivan <tullivan99@gmail.com>2018-10-21 13:10:34 -0400
committerClyne Sullivan <tullivan99@gmail.com>2018-10-21 13:10:34 -0400
commit2a01cc57c1c98574e4e6067e64ea2dc8d02fde9f (patch)
treece33240a08f303bb16bbb3a8a2ad5be30094297a /src/kernel/svc.c
parentf4149952ea4895356a3d4c0a9517893bb1e18cd2 (diff)
fork, getpid
Diffstat (limited to 'src/kernel/svc.c')
-rw-r--r--src/kernel/svc.c35
1 files changed, 17 insertions, 18 deletions
diff --git a/src/kernel/svc.c b/src/kernel/svc.c
index edf2b68..4aa156e 100644
--- a/src/kernel/svc.c
+++ b/src/kernel/svc.c
@@ -1,7 +1,6 @@
/**
* @file svc.c
* An unused handler for SVC calls
- * TODO: use SVC calls, possibly allowing for switch to unprivileged mode?
*
* Copyright (C) 2018 Clyne Sullivan
*
@@ -28,9 +27,17 @@ extern void gpio_svc(uint32_t *);
extern void clock_svc(uint32_t *);
extern void task_svc(uint32_t *);
-void svc_handler(uint32_t *args)
-{
- /*uint32_t*/int svc_number = ((char *)args[6])[-2];
+void SVC_Handler(void) {
+ uint32_t *args;
+
+ asm("\
+ tst lr, #4; \
+ ite eq; \
+ mrseq %0, msp; \
+ mrsne %0, psp; \
+ " : "=r" (args));
+
+ int svc_number = ((char *)args[6])[-2];
switch (svc_number) {
case -1:
@@ -44,24 +51,16 @@ void svc_handler(uint32_t *args)
clock_svc(args);
break;
case 3:
+ asm("\
+ mrs r0, psp; \
+ stmdb r0!, {r4-r11, r14}; \
+ mov %0, r0; \
+ " : "=r" (args[0]));
task_svc(args);
- asm("mov r0, %0" :: "r" (args[0]));
+ asm("mov r0, %0" :: "r" (args[0])); // TODO doesn't work, r0 overwritten on exc. return
break;
default:
break;
}
}
-void SVC_Handler(void) {
- uint32_t *args;
-
- asm("\
- tst lr, #4; \
- ite eq; \
- mrseq %0, msp; \
- mrsne %0, psp; \
- " : "=r" (args));
-
- svc_handler(args);
-}
-