|
@@ -2,6 +2,11 @@ typedef __UINT32_TYPE__ uint32_t;
|
|
|
typedef __UINT16_TYPE__ uint16_t;
|
|
|
typedef __UINT8_TYPE__ uint8_t;
|
|
|
|
|
|
+typedef uint32_t pid_t;
|
|
|
+
|
|
|
+#define GNU_ATTRIBUTE(attr) __attribute__((attr))
|
|
|
+#define NORETURN GNU_ATTRIBUTE(noreturn)
|
|
|
+
|
|
|
static inline uint32_t syscall(uint32_t num, uint32_t arg1, uint32_t arg2)
|
|
|
{
|
|
|
asm volatile(
|
|
@@ -15,3 +20,43 @@ static inline uint32_t syscall(uint32_t num, uint32_t arg1, uint32_t arg2)
|
|
|
: "eax", "edx", "edi", "esi");
|
|
|
return num;
|
|
|
}
|
|
|
+
|
|
|
+static inline void NORETURN syscall_noreturn(uint32_t num, uint32_t arg1, uint32_t arg2)
|
|
|
+{
|
|
|
+ asm volatile(
|
|
|
+ "movl %1, %%edi\n"
|
|
|
+ "movl %2, %%esi\n"
|
|
|
+ "movl %3, %%eax\n"
|
|
|
+ "int $0x80\n"
|
|
|
+ "movl %%eax, %0"
|
|
|
+ : "=g"(num)
|
|
|
+ : "g"(arg1), "g"(arg2), "g"(num)
|
|
|
+ : "eax", "edx", "edi", "esi");
|
|
|
+ // crash
|
|
|
+ syscall_noreturn(0x05, 0, 0);
|
|
|
+}
|
|
|
+
|
|
|
+static inline int fork(void)
|
|
|
+{
|
|
|
+ return syscall(0x00, 0, 0);
|
|
|
+}
|
|
|
+static inline uint32_t write(const char* buf)
|
|
|
+{
|
|
|
+ return syscall(0x01, (uint32_t)buf, 0);
|
|
|
+}
|
|
|
+static inline void sleep(void)
|
|
|
+{
|
|
|
+ syscall(0x02, 0, 0);
|
|
|
+}
|
|
|
+static inline void NORETURN exec(const char* bin, const char** argv)
|
|
|
+{
|
|
|
+ syscall_noreturn(0x04, (uint32_t)bin, (uint32_t)argv);
|
|
|
+}
|
|
|
+static inline void NORETURN exit(int exit_code)
|
|
|
+{
|
|
|
+ syscall_noreturn(0x05, exit_code, 0);
|
|
|
+}
|
|
|
+static inline uint32_t wait(void)
|
|
|
+{
|
|
|
+ return syscall(0x06, 0, 0);
|
|
|
+}
|