|  | @@ -1,10 +1,7 @@
 | 
	
		
			
				|  |  | -typedef __UINT32_TYPE__ uint32_t;
 | 
	
		
			
				|  |  | -typedef __UINT16_TYPE__ uint16_t;
 | 
	
		
			
				|  |  | -typedef __UINT8_TYPE__ uint8_t;
 | 
	
		
			
				|  |  | +#include <stdint.h>
 | 
	
		
			
				|  |  | +#include <sys/types.h>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -typedef uint32_t pid_t;
 | 
	
		
			
				|  |  | -typedef uint32_t size_t;
 | 
	
		
			
				|  |  | -typedef size_t ino_t;
 | 
	
		
			
				|  |  | +typedef uint32_t ino_t;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #define GNU_ATTRIBUTE(attr) __attribute__((attr))
 | 
	
		
			
				|  |  |  #define NORETURN GNU_ATTRIBUTE(noreturn)
 | 
	
	
		
			
				|  | @@ -25,66 +22,6 @@ typedef size_t ino_t;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #define DT_MAX (S_DT_MASK + 1) /* 16 */
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -static inline uint32_t syscall(uint32_t num, uint32_t arg1, uint32_t arg2, uint32_t arg3)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    asm volatile(
 | 
	
		
			
				|  |  | -        "movl %1, %%edi\n"
 | 
	
		
			
				|  |  | -        "movl %2, %%esi\n"
 | 
	
		
			
				|  |  | -        "movl %3, %%edx\n"
 | 
	
		
			
				|  |  | -        "movl %4, %%eax\n"
 | 
	
		
			
				|  |  | -        "int $0x80\n"
 | 
	
		
			
				|  |  | -        "movl %%eax, %0"
 | 
	
		
			
				|  |  | -        : "=g"(num)
 | 
	
		
			
				|  |  | -        : "g"(arg1), "g"(arg2), "g"(arg3), "g"(num)
 | 
	
		
			
				|  |  | -        : "eax", "edx", "edi", "esi");
 | 
	
		
			
				|  |  | -    return num;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -static inline void NORETURN syscall_noreturn(uint32_t num, uint32_t arg1, uint32_t arg2, uint32_t arg3)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    asm volatile(
 | 
	
		
			
				|  |  | -        "movl %1, %%edi\n"
 | 
	
		
			
				|  |  | -        "movl %2, %%esi\n"
 | 
	
		
			
				|  |  | -        "movl %3, %%edx\n"
 | 
	
		
			
				|  |  | -        "movl %4, %%eax\n"
 | 
	
		
			
				|  |  | -        "int $0x80\n"
 | 
	
		
			
				|  |  | -        "movl %%eax, %0"
 | 
	
		
			
				|  |  | -        : "=g"(num)
 | 
	
		
			
				|  |  | -        : "g"(arg1), "g"(arg2), "g"(arg3), "g"(num)
 | 
	
		
			
				|  |  | -        : "eax", "edx", "edi", "esi");
 | 
	
		
			
				|  |  | -    // crash
 | 
	
		
			
				|  |  | -    syscall_noreturn(0x05, 0, 0, 0);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -static inline int fork(void)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    return syscall(0x00, 0, 0, 0);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -static inline uint32_t write(int fd, const char* buf, size_t count)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    return syscall(0x01, fd, (uint32_t)buf, count);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -static inline uint32_t read(int fd, char* buf, size_t count)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    return syscall(0x07, fd, (uint32_t)buf, count);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -static inline void sleep(void)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    syscall(0x02, 0, 0, 0);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -static inline void NORETURN exec(const char* bin, const char** argv)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    syscall_noreturn(0x04, (uint32_t)bin, (uint32_t)argv, 0);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -static inline void NORETURN exit(int exit_code)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    syscall_noreturn(0x05, exit_code, 0, 0);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -static inline uint32_t wait(int* return_value)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    return syscall(0x06, (uint32_t)return_value, 0, 0);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  struct __attribute__((__packed__)) user_dirent {
 | 
	
		
			
				|  |  |      ino_t d_ino; // inode number
 | 
	
		
			
				|  |  |      uint32_t d_off; // ignored
 | 
	
	
		
			
				|  | @@ -93,12 +30,7 @@ struct __attribute__((__packed__)) user_dirent {
 | 
	
		
			
				|  |  |      // uint8_t d_type; // file type, with offset of (d_reclen - 1)
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -static inline size_t getdents(int fd, struct user_dirent* buf, size_t cnt)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    return syscall(0x08, fd, (uint32_t)buf, cnt);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -static inline int open(const char* path, uint32_t flags)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    return syscall(0x09, (uint32_t)path, flags, 0);
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +// static inline size_t getdents(int fd, struct user_dirent* buf, size_t cnt)
 | 
	
		
			
				|  |  | +// {
 | 
	
		
			
				|  |  | +//     return syscall(0x08, fd, (uint32_t)buf, cnt);
 | 
	
		
			
				|  |  | +// }
 |