aboutsummaryrefslogtreecommitdiffstats
path: root/src/user/syscalls.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/user/syscalls.h')
-rw-r--r--src/user/syscalls.h146
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_