#ifndef PLAND_SYSCALL_H #define PLAND_SYSCALL_H #include #include typedef uint32_t _file_handle_t; typedef uint32_t _task_handle_t; typedef uint32_t _drive_number_t; typedef uint32_t _pages_t; typedef uint32_t _process_handle_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, _SCN_MEMORY_INFO, _SCN_WAIT_FOR_TASK, _SCN_ENUMERATE_DIR }; typedef struct { bool is_dir; char name[100]; uint32_t size; } _dir_info_entry; 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" : : : "eax"); } __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 _process_handle_t _start_task(_drive_number_t drive_number, const char *path, const char *pass) { return _sc3(_SCN_START_TASK, drive_number, (uint32_t)path, (uint32_t)pass); } 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(_pages_t pages) { return (void *)_sc1(_SCN_ALLOCATE_RAM, pages); } static inline _pages_t _kernel_dynamic_area_size() { return _sc1(_SCN_MEMORY_INFO, 0x0); } static inline _pages_t _kernel_dynamic_area_left() { return _sc1(_SCN_MEMORY_INFO, 0x1); } static inline _pages_t _total_userspace_size() { return _sc1(_SCN_MEMORY_INFO, 0x2); } static inline _pages_t _total_userspace_left() { return _sc1(_SCN_MEMORY_INFO, 0x3); } static inline _pages_t _this_process_memory_left() { return _sc1(_SCN_MEMORY_INFO, 0x4); } static inline void _wait_for_task(_process_handle_t handle) { _sc1(_SCN_WAIT_FOR_TASK, handle); } static inline uint32_t _enumerate_dir(_drive_number_t drive_number, const char *path, _dir_info_entry *buffer, uint32_t max_count) { return _sc4(_SCN_ENUMERATE_DIR, drive_number, (uint32_t)path, (uint32_t)buffer, max_count); } #endif