diff options
Diffstat (limited to 'src/kernel')
-rw-r--r-- | src/kernel/clock.c | 14 | ||||
-rw-r--r-- | src/kernel/gpio.c | 20 | ||||
-rw-r--r-- | src/kernel/svc.c | 25 | ||||
-rw-r--r-- | src/kernel/task.c | 22 | ||||
-rw-r--r-- | src/kernel/vfs.c | 16 |
5 files changed, 50 insertions, 47 deletions
diff --git a/src/kernel/clock.c b/src/kernel/clock.c index a49b4c1..41a3199 100644 --- a/src/kernel/clock.c +++ b/src/kernel/clock.c @@ -27,14 +27,14 @@ volatile uint32_t clock_ticks = 0; volatile uint8_t tim2_finished = 1; -void clock_svc(uint32_t *args) +void clock_svc(uint32_t n, uint32_t *ret, uint32_t *args) { - if (args[0] == 0) - task_sleep(args[1]); - else if (args[0] == 1) - clock_udelay(args[1]); - else if (args[0] == 2) - *((unsigned int *)args[1]) = clock_millis(); + if (n == 0) + task_sleep(args[0]); + else if (n == 1) + clock_udelay(args[0]); + else if (n == 2) + *((unsigned int *)ret) = clock_millis(); } void clock_init(void) diff --git a/src/kernel/gpio.c b/src/kernel/gpio.c index 33423b9..3bd67cb 100644 --- a/src/kernel/gpio.c +++ b/src/kernel/gpio.c @@ -25,29 +25,29 @@ static GPIO_TypeDef *gpio_ports[8] = { GPIOE, GPIOF, GPIOG, GPIOH }; -void gpio_svc(uint32_t *args) +void gpio_svc(uint32_t n, uint32_t *ret, uint32_t *args) { - GPIO_TypeDef *port = gpio_ports[args[1] >> 4]; - uint32_t pin = args[1] & 0xF; + GPIO_TypeDef *port = gpio_ports[args[0] >> 4]; + uint32_t pin = args[0] & 0xF; - switch (args[0]) { + switch (n) { case 0: - gpio_mode(port, pin, args[2]); + gpio_mode(port, pin, args[1]); break; case 1: - gpio_type(port, pin, args[2]); + gpio_type(port, pin, args[1]); break; case 2: - gpio_pupd(port, pin, args[2]); + gpio_pupd(port, pin, args[1]); break; case 3: - gpio_speed(port, pin, args[2]); + gpio_speed(port, pin, args[1]); break; case 4: - gpio_dout(port, pin, args[2]); + gpio_dout(port, pin, args[1]); break; case 5: - *((int *)args[2]) = gpio_din(port, pin); + *((int *)ret) = gpio_din(port, pin); break; } } 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; diff --git a/src/kernel/task.c b/src/kernel/task.c index c5d09d4..304e608 100644 --- a/src/kernel/task.c +++ b/src/kernel/task.c @@ -31,28 +31,28 @@ static task_t *task_queue; static uint8_t task_disable = 0; static pid_t task_next_pid = 0; -void task_svc(uint32_t *args) +void task_svc(uint32_t n, uint32_t *ret, uint32_t *args) { - switch (args[0]) { + switch (n) { case 0: - task_exit(args[1]); + task_exit(args[0]); break; case 1: - *((int *)args[1]) = task_fork(); + *((int *)ret) = task_fork(); break; case 2: - *((int *)args[1]) = task_getpid(); + *((int *)ret) = task_getpid(); break; case 3: - *((int *)args[4]) = task_waitpid(args[1], (int *)args[2], - args[3]); + *((int *)ret) = task_waitpid(args[0], (int *)args[1], + args[2]); break; case 4: - *((void **)args[2]) = task_sbrk(args[1]); + *((void **)ret) = task_sbrk(args[0]); break; case 5: - *((uint32_t *)args[4]) = elf_execve((const char *)args[1], - (char * const *)args[2], (char * const *)args[3]); + *((uint32_t *)ret) = elf_execve((const char *)args[0], + (char * const *)args[1], (char * const *)args[2]); break; default: break; @@ -325,7 +325,7 @@ void PendSV_Handler(void) task_current = task_queue; if (task_current->status.state == TASK_SLEEPING && - task_current->status.value <= ticks) + task_current->status.value < ticks) task_current->status.state = TASK_RUNNING; } while (task_current->status.state != TASK_RUNNING); diff --git a/src/kernel/vfs.c b/src/kernel/vfs.c index b9be9bc..8d4b975 100644 --- a/src/kernel/vfs.c +++ b/src/kernel/vfs.c @@ -35,24 +35,24 @@ static vfs_file vfs_files[VFS_MAX_FILES]; if (pid != fpid && fpid != 0) \ return 0; } -void vfs_svc(uint32_t *args) +void vfs_svc(uint32_t n, uint32_t *ret, uint32_t *args) { - switch (args[0]) { + switch (n) { case 0: - *((int *)args[3]) = vfs_mount((vfs_volume_funcs *)args[1], - args[2]); + *((int *)ret) = vfs_mount((vfs_volume_funcs *)args[0], + args[1]); break; case 1: - *((int *)args[3]) = vfs_open((const char *)args[1], args[2]); + *((int *)ret) = vfs_open((const char *)args[0], args[1]); break; case 2: - *((int *)args[2]) = vfs_close(args[1]); + *((int *)ret) = vfs_close(args[0]); break; case 3: - *((int *)args[4]) = vfs_read(args[1], args[2], (uint8_t *)args[3]); + *((int *)ret) = vfs_read(args[0], args[1], (uint8_t *)args[2]); break; case 4: - *((int *)args[4]) = vfs_write(args[1], args[2], (const uint8_t *)args[3]); + *((int *)ret) = vfs_write(args[0], args[1], (const uint8_t *)args[2]); break; default: break; |