summaryrefslogtreecommitdiff
path: root/src/user/include/pland/syscall.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/user/include/pland/syscall.h')
-rw-r--r--src/user/include/pland/syscall.h139
1 files changed, 139 insertions, 0 deletions
diff --git a/src/user/include/pland/syscall.h b/src/user/include/pland/syscall.h
new file mode 100644
index 0000000..01f7151
--- /dev/null
+++ b/src/user/include/pland/syscall.h
@@ -0,0 +1,139 @@
+#ifndef PLAND_SYSCALL_H
+#define PLAND_SYSCALL_H
+
+#include <stdint.h>
+
+typedef uint32_t _file_handle_t;
+typedef uint32_t _task_handle_t;
+typedef uint32_t _drive_number_t;
+typedef enum {
+ _KEY_BACKSPACE = '\b',
+ _KEY_RETURN = '\n',
+ //etc.
+
+ _KEY_LSHIFT = 0x00000100,
+ _KEY_RSHIFT = 0x00000200,
+ _KEY_CAPS = 0x00000400,
+ _KEY_INSERT = 0x00000800,
+ _KEY_NUM = 0x00001000,
+ _KEY_SCROLL = 0x00002000,
+ _KEY_LALT = 0x00004000,
+ _KEY_RALT = 0x00008000,
+ _KEY_LCTRL = 0x00010000,
+ _KEY_RCTRL = 0x00020000,
+ _KEY_LMETA = 0x00040000,
+ _KEY_RMETA = 0x00080000,
+
+ _KEY_SHIFT = 0x00000300,
+ _KEY_SCAPS = 0x00000700,
+ _KEY_ALT = 0x0000c000,
+ _KEY_CTRL = 0x00030000,
+ _KEY_META = 0x000c0000,
+} _key_code_t;
+
+enum _scn {
+ _SCN_OPEN_FILE,
+ _SCN_CLOSE_FILE,
+ _SCN_FILE_READ,
+ _SCN_FILE_SIZE,
+ _SCN_START_TASK,
+ _SCN_LOG_STRING,
+ _SCN_GET_KEY,
+ _SCN_ALLOCATE_RAM
+};
+
+static inline uint32_t _sc0(enum _scn eax) {
+ volatile uint32_t out;
+ asm (
+ "int $0x30"
+ : "=a" (out) : "a" (eax) : "ecx", "edx");
+ return out;
+}
+
+static inline uint32_t _sc1(enum _scn eax, uint32_t ebx) {
+ volatile uint32_t out;
+ asm (
+ "int $0x30"
+ : "=a" (out) : "a" (eax), "b" (ebx) : "ecx", "edx");
+ return out;
+}
+
+static inline uint32_t _sc2(enum _scn eax, uint32_t ebx, uint32_t ecx) {
+ volatile uint32_t out;
+ asm (
+ "int $0x30"
+ : "=a" (out) : "a" (eax), "b" (ebx), "c" (ecx) : "edx");
+ return out;
+}
+
+static inline uint32_t _sc3(enum _scn eax, uint32_t ebx, uint32_t ecx, uint32_t edx) {
+ volatile uint32_t out;
+ asm (
+ "int $0x30"
+ : "=a" (out) : "a" (eax), "b" (ebx), "c" (ecx), "d" (edx));
+ return out;
+}
+
+static inline uint32_t _sc4(enum _scn eax, uint32_t ebx, uint32_t ecx, uint32_t edx, uint32_t esi) {
+ volatile uint32_t out;
+ asm (
+ "int $0x30"
+ : "=a" (out) : "a" (eax), "b" (ebx), "c" (ecx), "d" (edx), "S" (esi));
+ return out;
+}
+
+static inline uint32_t _sc5(enum _scn eax, uint32_t ebx, uint32_t ecx, uint32_t edx, uint32_t esi, uint32_t edi) {
+ volatile uint32_t out;
+ asm (
+ "int $0x30"
+ : "=a" (out) : "a" (eax), "b" (ebx), "c" (ecx), "d" (edx), "S" (esi), "D" (edi));
+ return out;
+}
+
+static inline void _yield_task() {
+ asm (
+ "int $0x39"
+ );
+}
+
+__attribute__ ((noreturn))
+static inline void _exit_task() {
+ asm (
+ "int $0x38"
+ );
+ __builtin_unreachable();
+}
+
+static inline _file_handle_t _open_file(_drive_number_t drive_number, const char *path) {
+ return _sc2(_SCN_OPEN_FILE, drive_number, (uint32_t)path);
+}
+
+static inline void _close_file(_file_handle_t handle) {
+ _sc1(_SCN_CLOSE_FILE, handle);
+}
+
+static inline uint32_t _file_read(_file_handle_t handle, uint32_t file_offset, uint32_t count, void *buffer) {
+ return _sc4(_SCN_FILE_READ, handle, file_offset, count, (uint32_t)buffer);
+}
+
+static inline uint32_t _file_size(_file_handle_t handle) {
+ return _sc1(_SCN_FILE_SIZE, handle);
+}
+
+static inline void _start_task(_drive_number_t drive_number, char *path) {
+ _sc2(_SCN_START_TASK, drive_number, (uint32_t)path);
+}
+
+static inline void _log_string(const char *sz) {
+ _sc1(_SCN_LOG_STRING, (uint32_t)sz);
+}
+
+static inline _key_code_t _get_key() {
+ return _sc0(_SCN_GET_KEY);
+}
+
+static inline void *_allocate_ram(uint32_t pages) {
+ return (void *)_sc1(_SCN_ALLOCATE_RAM, pages);
+}
+
+#endif \ No newline at end of file