diff options
author | tcsullivan <tullivan99@gmail.com> | 2018-11-17 13:02:57 -0500 |
---|---|---|
committer | tcsullivan <tullivan99@gmail.com> | 2018-11-17 13:02:57 -0500 |
commit | c6ef89664b8c0d7aa85bddd5c7014aa6df82cbe7 (patch) | |
tree | d1f9d09412a46bdf4344fe30392455070a72993d /src/user/syscalls.h | |
parent | db38c4b9dac461de0ed75bf6d079dacba1b31bc9 (diff) |
added pdclib, removed sash
Diffstat (limited to 'src/user/syscalls.h')
-rw-r--r-- | src/user/syscalls.h | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/src/user/syscalls.h b/src/user/syscalls.h new file mode 100644 index 0000000..c6a0c61 --- /dev/null +++ b/src/user/syscalls.h @@ -0,0 +1,146 @@ +#ifndef SYSCALLS_H_ +#define SYSCALLS_H_ + +#include <stdint.h> + +// +// Task-related calls + +inline void _exit(int code) +{ + register uint32_t r1 __asm("r1") = code; + __asm("\ + mov r0, 0; \ + mov r1, %0; \ + svc 0; \ + " :: "r" (r1)); +} + +inline int fork(void) +{ + int ret = 0; + register uint32_t r1 __asm("r1") = (uint32_t)&ret; + __asm("\ + mov r0, 1; \ + mov r1, %0; \ + svc 0; \ + " :: "r" (r1)); + return ret; +} + +inline int getpid(void) +{ + int ret = 0; + register uint32_t r1 __asm("r1") = (uint32_t)&ret; + __asm("\ + mov r0, 2; \ + mov r1, %0; \ + svc 0; \ + " :: "r" (r1)); + return ret; +} + +inline void *sbrk(unsigned int bytes) +{ + void *ret = 0; + register uint32_t r1 __asm("r1") = bytes; + register uint32_t r2 __asm("r2") = (uint32_t)&ret; + __asm("\ + mov r0, 4; \ + mov r1, %0; \ + mov r2, %1; \ + svc 0; \ + " :: "r" (r1), "r" (r2)); + return ret; +} + +// +// File-related calls + +// Indicates mounted volume +#define VFS_MOUNTED (1 << 0) +// Set if filesystem is read-only +#define VFS_READONLY (1 << 1) + +// Indicates an opened file +#define VFS_FILE_OPEN (1 << 0) +// Indicates read permission on file +#define VFS_FILE_READ (1 << 1) +// Indicates write permission on file +#define VFS_FILE_WRITE (1 << 2) +// Set if EOF has been reached +#define VFS_EOF (1 << 3) + +#define EOF (-1) + +struct dirent { + char name[32]; +}; + +struct vfs_volume_funcs_t; +typedef struct vfs_volume_funcs_t vfs_volume_funcs; + +inline 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; + __asm("\ + mov r0, 0; \ + mov r1, %0; \ + mov r2, %1; \ + mov r3, %2; \ + svc 3; \ + " :: "r" (r1), "r" (r2), "r" (r3)); + return ret; +} + +inline 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; + __asm("\ + mov r0, 1; \ + mov r1, %0; \ + mov r2, %1; \ + mov r3, %2; \ + svc 3; \ + " :: "r" (r1), "r" (r2), "r" (r3)); + return ret; +} + +inline int close(int fd) +{ + int ret = 0; + register uint32_t r1 __asm("r1") = fd; + register uint32_t r2 __asm("r2") = (uint32_t)&ret; + __asm("\ + mov r0, 2; \ + mov r1, %0; \ + mov r2, %1; \ + svc 3; \ + " :: "r" (r1), "r" (r2)); +} + +inline 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 r4 __asm("r4") = (uint32_t)&ret; + __asm("\ + mov r0, 3; \ + mov r1, %0; \ + mov r2, %1; \ + mov r3, %2; \ + mov r4, %3; \ + svc 3; \ + " :: "r" (r1), "r" (r2), "r" (r3), "r" (r4)); + return ret; +} + +#endif // SYSCALLS_H_ |