added threads.h header file for example program
parent
a720f34482
commit
e69cfa8a5a
@ -0,0 +1,55 @@
|
|||||||
|
#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);
|
||||||
|
|
||||||
|
__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();
|
||||||
|
}
|
Loading…
Reference in New Issue