#pragma once #define TEXT_IO_ADDR 0xff0000 #define TEXT_IO_BUFLEN 64 // these parts are taken from the ktypes.h file enum error_code { ENOCODE = 1, // invalid syscall code EINVAL = 2, // invalid argument value ENOMEM = 3, // not enough memory ENOBUFS = 4, // no space left in buffer ESRCH = 5, // no such process ETIMEOUT= 6 // timeout while waiting }; struct optional_int { enum error_code error; int value; }; // has_value and has_error are not dependent on the value type // therefore we can define them as macros #define has_value(optional) (optional.error == 0) #define has_error(optional) (!has_value(optional)) void dbgln(char*, int); char* itoa(int value, char* str, int base); int thread(void* args); // ignore unused parameter errors only for these functions #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" __attribute__((naked)) struct optional_int spawn(int (*target)(void*), void* args) { __asm__ ( "li a7, 1\n" "ecall\n" "ret" ); __builtin_unreachable(); } __attribute__((naked)) struct optional_int join(int pid, int timeout) { __asm__ ( "li a7, 3\n" "ecall\n" "ret" ); __builtin_unreachable(); } __attribute__((naked)) struct optional_int sleep(int timeout) { __asm__ ( "li a7, 2\n" "ecall\n" "ret" ); __builtin_unreachable(); } #pragma GCC diagnostic pop