basic-lib.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. #define GNU_ATTRIBUTE(attr) __attribute__((attr))
  6. #define NORETURN GNU_ATTRIBUTE(noreturn)
  7. static inline uint32_t syscall(uint32_t num, uint32_t arg1, uint32_t arg2)
  8. {
  9. asm volatile(
  10. "movl %1, %%edi\n"
  11. "movl %2, %%esi\n"
  12. "movl %3, %%eax\n"
  13. "int $0x80\n"
  14. "movl %%eax, %0"
  15. : "=g"(num)
  16. : "g"(arg1), "g"(arg2), "g"(num)
  17. : "eax", "edx", "edi", "esi");
  18. return num;
  19. }
  20. static inline void NORETURN syscall_noreturn(uint32_t num, uint32_t arg1, uint32_t arg2)
  21. {
  22. asm volatile(
  23. "movl %1, %%edi\n"
  24. "movl %2, %%esi\n"
  25. "movl %3, %%eax\n"
  26. "int $0x80\n"
  27. "movl %%eax, %0"
  28. : "=g"(num)
  29. : "g"(arg1), "g"(arg2), "g"(num)
  30. : "eax", "edx", "edi", "esi");
  31. // crash
  32. syscall_noreturn(0x05, 0, 0);
  33. }
  34. static inline int fork(void)
  35. {
  36. return syscall(0x00, 0, 0);
  37. }
  38. static inline uint32_t write(const char* buf)
  39. {
  40. return syscall(0x01, (uint32_t)buf, 0);
  41. }
  42. static inline void sleep(void)
  43. {
  44. syscall(0x02, 0, 0);
  45. }
  46. static inline void NORETURN exec(const char* bin, const char** argv)
  47. {
  48. syscall_noreturn(0x04, (uint32_t)bin, (uint32_t)argv);
  49. }
  50. static inline void NORETURN exit(int exit_code)
  51. {
  52. syscall_noreturn(0x05, exit_code, 0);
  53. }
  54. static inline uint32_t wait(void)
  55. {
  56. return syscall(0x06, 0, 0);
  57. }