aboutsummaryrefslogtreecommitdiffstats
path: root/src/pdclib/platform
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/pdclib/platform
parentb92ccff9b1d3dd33fc97b0796b193852027678ba (diff)
Fixed syscalls, initrd program works
Diffstat (limited to 'src/pdclib/platform')
-rw-r--r--src/pdclib/platform/stmos/functions/os/syscalls.c118
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;
}