/** * @file svc.c * Handler code for SVC calls * * Copyright (C) 2018 Clyne Sullivan * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include "gpio.h" #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); 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: case 0: /* Task-related calls * 0 - _exit * 1 - fork * 2 - getpid * 3 - waitpid * 4 - sbrk (TODO bad) * 5 - execve */ task_svc(args); break; case 1: /* GPIO-related calls * 0 - gpio_mode * 1 - gpio_type * 2 - gpio_pupd * 3 - gpio_speed * 4 - gpio_dout * 5 - gpio_din */ gpio_svc(args); break; case 2: /* Clock-related calls * 0 - delay * 1 - udelay * 2 - ticks */ clock_svc(args); break; case 3: /* Filesystem-related calls * 0 - mount * 1 - open * 2 - close * 3 - read * 4 - write */ vfs_svc(args); break; default: break; } }