diff options
author | tcsullivan <tullivan99@gmail.com> | 2019-07-18 18:43:22 -0400 |
---|---|---|
committer | tcsullivan <tullivan99@gmail.com> | 2019-07-18 18:43:22 -0400 |
commit | 998b3ac86e3b3f926d81e768f1200815e9e3d148 (patch) | |
tree | e4f0c7ea4499c07b5a73844cbeef55cb56a5b46d /src/pdclib/platform | |
parent | b92ccff9b1d3dd33fc97b0796b193852027678ba (diff) |
Fixed syscalls, initrd program works
Diffstat (limited to 'src/pdclib/platform')
-rw-r--r-- | src/pdclib/platform/stmos/functions/os/syscalls.c | 118 |
1 files changed, 55 insertions, 63 deletions
diff --git a/src/pdclib/platform/stmos/functions/os/syscalls.c b/src/pdclib/platform/stmos/functions/os/syscalls.c index 912b988..823da23 100644 --- a/src/pdclib/platform/stmos/functions/os/syscalls.c +++ b/src/pdclib/platform/stmos/functions/os/syscalls.c @@ -1,72 +1,73 @@ #include "syscalls.h" +#define NOOPTIMIZE __attribute__((optimize(0))) + // // Task-related calls +NOOPTIMIZE void _exit(int code) { - register uint32_t r1 __asm("r1") = code; - __asm("\ + uint32_t args[1] = { code }; + __asm volatile("\ mov r0, 0; \ - mov r1, %0; \ + mov r1, 0; \ + mov r2, %0; \ svc 0; \ - " :: "r" (r1)); + " :: "r" (args)); } +NOOPTIMIZE int fork(void) { - int ret = 0; - register uint32_t r1 __asm("r1") = (uint32_t)&ret; - __asm("\ + volatile uint32_t ret = 0; + __asm volatile("\ mov r0, 1; \ mov r1, %0; \ + mov r2, 0; \ svc 0; \ - " :: "r" (r1)); + " :: "r" (&ret)); return ret; } +NOOPTIMIZE int getpid(void) { - int ret = 0; - register uint32_t r1 __asm("r1") = (uint32_t)&ret; - __asm("\ + volatile uint32_t ret = 0; + __asm volatile("\ mov r0, 2; \ mov r1, %0; \ + mov r2, 0; \ svc 0; \ - " :: "r" (r1)); + " :: "r" (&ret)); return ret; } +NOOPTIMIZE void *sbrk(unsigned int bytes) { - uint32_t ret = 0; - register uint32_t r1 __asm("r1") = bytes; - register uint32_t r2 __asm("r2") = (uint32_t)&ret; + volatile uint32_t ret = 0; + uint32_t args[1] = { bytes }; __asm("\ mov r0, 4; \ mov r1, %0; \ mov r2, %1; \ svc 0; \ - " :: "r" (r1), "r" (r2)); - __asm("mov %0, r2" : "=r" (ret)); - return *((void **)ret); + " :: "r" (&ret), "r" (args)); + return (void *)ret; } +NOOPTIMIZE int execve(const char *file, char * const argv[], char * const envp[]) { volatile uint32_t ret = 0; - register uint32_t r1 __asm("r1") = (uint32_t)file; - register uint32_t r2 __asm("r2") = (uint32_t)argv; - register uint32_t r3 __asm("r3") = (uint32_t)envp; - register uint32_t r12 __asm("r12") = (uint32_t)&ret; + uint32_t args[3] = { (uint32_t)file, (uint32_t)argv, (uint32_t)envp }; __asm("\ mov r0, 5; \ mov r1, %0; \ mov r2, %1; \ - mov r3, %2; \ - mov r12, %3; \ svc 0; \ - " :: "r" (r1), "r" (r2), "r" (r3), "r" (r12)); + " :: "r" (&ret), "r" (args)); if (ret == (uint32_t)-1) return ret; @@ -77,110 +78,101 @@ int execve(const char *file, char * const argv[], char * const envp[]) // // Clock-related calls +NOOPTIMIZE void delay(unsigned int ms) { - register uint32_t r1 __asm("r1") = ms; + uint32_t args[1] = { ms }; __asm("\ mov r0, 0; \ - mov r1, %0; \ + mov r1, 0; \ + mov r2, %0; \ svc 2; \ - " :: "r" (r1)); + " :: "r" (args)); } +NOOPTIMIZE unsigned int ticks(void) { - unsigned int ret = 0; - register uint32_t r1 __asm("r1") = (uint32_t)&ret; + volatile unsigned int ret = 0; __asm("\ mov r0, 2; \ mov r1, %0; \ + mov r2, 0; \ svc 2; \ - " :: "r" (r1)); + " :: "r" (&ret)); return ret; } // // File-related calls +NOOPTIMIZE int mount(vfs_volume_funcs *funcs, uint32_t flags) { - int ret = 0; - register uint32_t r1 __asm("r1") = (uint32_t)funcs; - register uint32_t r2 __asm("r2") = flags; - register uint32_t r3 __asm("r3") = (uint32_t)&ret; + volatile int ret = 0; + uint32_t args[2] = { (uint32_t)funcs, flags }; __asm("\ mov r0, 0; \ mov r1, %0; \ mov r2, %1; \ - mov r3, %2; \ svc 3; \ - " :: "r" (r1), "r" (r2), "r" (r3)); + " :: "r" (&ret), "r" (args)); return ret; } +NOOPTIMIZE int open(const char *path, uint32_t flags) { - int ret = 0; - register uint32_t r1 __asm("r1") = (uint32_t)path; - register uint32_t r2 __asm("r2") = flags; - register uint32_t r3 __asm("r3") = (uint32_t)&ret; + volatile int ret = 0; + uint32_t args[2] = { (uint32_t)path, flags }; __asm("\ mov r0, 1; \ mov r1, %0; \ mov r2, %1; \ - mov r3, %2; \ svc 3; \ - " :: "r" (r1), "r" (r2), "r" (r3)); + " :: "r" (&ret), "r" (args)); return ret; } +NOOPTIMIZE int close(int fd) { - int ret = 0; - register uint32_t r1 __asm("r1") = fd; - register uint32_t r2 __asm("r2") = (uint32_t)&ret; + volatile int ret = 0; + uint32_t args[1] = { fd }; __asm("\ mov r0, 2; \ mov r1, %0; \ mov r2, %1; \ svc 3; \ - " :: "r" (r1), "r" (r2)); + " :: "r" (&ret), "r" (args)); return ret; } +NOOPTIMIZE int read(int fd, uint32_t count, uint8_t *buffer) { - int ret = 0; - register uint32_t r1 __asm("r1") = fd; - register uint32_t r2 __asm("r2") = count; - register uint32_t r3 __asm("r3") = (uint32_t)buffer; - register uint32_t r12 __asm("r12") = (uint32_t)&ret; + volatile int ret = 0; + uint32_t args[3] = { fd, count, (uint32_t)buffer }; __asm("\ mov r0, 3; \ mov r1, %0; \ mov r2, %1; \ - mov r3, %2; \ - mov r12, %3; \ svc 3; \ - " :: "r" (r1), "r" (r2), "r" (r3), "r" (r12)); + " :: "r" (&ret), "r" (args)); return ret; } +NOOPTIMIZE int write(int fd, uint32_t count, const uint8_t *buffer) { - int ret = 0; - register uint32_t r1 __asm("r1") = fd; - register uint32_t r2 __asm("r2") = count; - register uint32_t r3 __asm("r3") = (uint32_t)buffer; - register uint32_t r12 __asm("r12") = (uint32_t)&ret; + volatile int ret = 0; + uint32_t args[3] = { fd, count, (uint32_t)buffer }; __asm("\ mov r0, 4; \ mov r1, %0; \ mov r2, %1; \ - mov r3, %2; \ - mov r12, %3; \ svc 3; \ - " :: "r" (r1), "r" (r2), "r" (r3), "r" (r12)); + " :: "r" (&ret), "r" (args)); return ret; } |