aboutsummaryrefslogtreecommitdiffstats
path: root/src/kernel/svc.c
diff options
context:
space:
mode:
authortcsullivan <tullivan99@gmail.com>2019-07-18 18:43:22 -0400
committertcsullivan <tullivan99@gmail.com>2019-07-18 18:43:22 -0400
commit998b3ac86e3b3f926d81e768f1200815e9e3d148 (patch)
treee4f0c7ea4499c07b5a73844cbeef55cb56a5b46d /src/kernel/svc.c
parentb92ccff9b1d3dd33fc97b0796b193852027678ba (diff)
Fixed syscalls, initrd program works
Diffstat (limited to 'src/kernel/svc.c')
-rw-r--r--src/kernel/svc.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/src/kernel/svc.c b/src/kernel/svc.c
index 9044141..7c81e5f 100644
--- a/src/kernel/svc.c
+++ b/src/kernel/svc.c
@@ -23,22 +23,25 @@
#include "clock.h"
#include "task.h"
-extern void gpio_svc(uint32_t *);
-extern void clock_svc(uint32_t *);
-extern void task_svc(uint32_t *);
-extern void vfs_svc(uint32_t *args);
+extern void gpio_svc(uint32_t, uint32_t *, uint32_t *);
+extern void clock_svc(uint32_t, uint32_t *, uint32_t *);
+extern void task_svc(uint32_t, uint32_t *, uint32_t *);
+extern void vfs_svc(uint32_t, uint32_t *, uint32_t *args);
void SVC_Handler(void) {
- uint32_t *args;
+ uint32_t *stack;
asm("\
tst lr, #4; \
ite eq; \
mrseq %0, msp; \
mrsne %0, psp; \
- " : "=r" (args));
+ " : "=r" (stack));
- int svc_number = ((char *)args[6])[-2];
+ int svc_number = ((char *)stack[6])[-2];
+ uint32_t min_number = stack[0];
+ uint32_t *ret = (uint32_t *)stack[1];
+ uint32_t *args = (uint32_t *)stack[2];
switch (svc_number) {
case -1:
@@ -50,7 +53,7 @@ void SVC_Handler(void) {
* 4 - sbrk (TODO bad)
* 5 - execve
*/
- task_svc(args);
+ task_svc(min_number, ret, args);
break;
case 1: /* GPIO-related calls
@@ -61,7 +64,7 @@ void SVC_Handler(void) {
* 4 - gpio_dout
* 5 - gpio_din
*/
- gpio_svc(args);
+ gpio_svc(min_number, ret, args);
break;
case 2: /* Clock-related calls
@@ -69,7 +72,7 @@ void SVC_Handler(void) {
* 1 - udelay
* 2 - ticks
*/
- clock_svc(args);
+ clock_svc(min_number, ret, args);
break;
case 3: /* Filesystem-related calls
@@ -79,7 +82,7 @@ void SVC_Handler(void) {
* 3 - read
* 4 - write
*/
- vfs_svc(args);
+ vfs_svc(min_number, ret, args);
break;
default:
break;