basic-lib.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. typedef __UINT32_TYPE__ uint32_t;
  2. typedef __UINT16_TYPE__ uint16_t;
  3. typedef __UINT8_TYPE__ uint8_t;
  4. typedef uint32_t pid_t;
  5. typedef uint32_t size_t;
  6. #define GNU_ATTRIBUTE(attr) __attribute__((attr))
  7. #define NORETURN GNU_ATTRIBUTE(noreturn)
  8. static inline uint32_t syscall(uint32_t num, uint32_t arg1, uint32_t arg2, uint32_t arg3)
  9. {
  10. asm volatile(
  11. "movl %1, %%edi\n"
  12. "movl %2, %%esi\n"
  13. "movl %3, %%edx\n"
  14. "movl %4, %%eax\n"
  15. "int $0x80\n"
  16. "movl %%eax, %0"
  17. : "=g"(num)
  18. : "g"(arg1), "g"(arg2), "g"(arg3), "g"(num)
  19. : "eax", "edx", "edi", "esi");
  20. return num;
  21. }
  22. static inline void NORETURN syscall_noreturn(uint32_t num, uint32_t arg1, uint32_t arg2, uint32_t arg3)
  23. {
  24. asm volatile(
  25. "movl %1, %%edi\n"
  26. "movl %2, %%esi\n"
  27. "movl %3, %%edx\n"
  28. "movl %4, %%eax\n"
  29. "int $0x80\n"
  30. "movl %%eax, %0"
  31. : "=g"(num)
  32. : "g"(arg1), "g"(arg2), "g"(arg3), "g"(num)
  33. : "eax", "edx", "edi", "esi");
  34. // crash
  35. syscall_noreturn(0x05, 0, 0, 0);
  36. }
  37. static inline int fork(void)
  38. {
  39. return syscall(0x00, 0, 0, 0);
  40. }
  41. static inline uint32_t write(int fd, const char* buf, size_t count)
  42. {
  43. return syscall(0x01, fd, (uint32_t)buf, count);
  44. }
  45. static inline uint32_t read(int fd, char* buf, size_t count)
  46. {
  47. return syscall(0x07, fd, (uint32_t)buf, count);
  48. }
  49. static inline void sleep(void)
  50. {
  51. syscall(0x02, 0, 0, 0);
  52. }
  53. static inline void NORETURN exec(const char* bin, const char** argv)
  54. {
  55. syscall_noreturn(0x04, (uint32_t)bin, (uint32_t)argv, 0);
  56. }
  57. static inline void NORETURN exit(int exit_code)
  58. {
  59. syscall_noreturn(0x05, exit_code, 0, 0);
  60. }
  61. static inline uint32_t wait(int* return_value)
  62. {
  63. return syscall(0x06, (uint32_t)return_value, 0, 0);
  64. }