diff options
Diffstat (limited to 'user/include/weenix/trap.h')
-rw-r--r-- | user/include/weenix/trap.h | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/user/include/weenix/trap.h b/user/include/weenix/trap.h new file mode 100644 index 0000000..fade1eb --- /dev/null +++ b/user/include/weenix/trap.h @@ -0,0 +1,26 @@ +#pragma once + +#include "errno.h" +#include "stddef.h" +#include "sys/types.h" +#include "weenix/syscall.h" + +#define TRAP_INTR_STRING QUOTE(INTR_SYSCALL) + +/* ssize_t will be 32 bits or 64 bits wide as appropriate. + args are passed via %(r/e)ax and %(r/e)dx, so they need + to be the size of a register. */ + +static inline ssize_t trap(ssize_t num, ssize_t arg) +{ + ssize_t ret; + __asm__ volatile("int $" TRAP_INTR_STRING + : "=a"(ret) + : "a"(num), "d"(arg)); + + /* Copy in errno */ + __asm__ volatile("int $" TRAP_INTR_STRING + : "=a"(errno) + : "a"(SYS_errno)); + return ret; +} |