syscalls_linux.odin 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package unix
  2. import "core:intrinsics"
  3. // Linux has inconsistent system call numbering across architectures,
  4. // for largely historical reasons. This attempts to provide a unified
  5. // Odin-side interface for system calls that are required for the core
  6. // library to work.
  7. // For authorative system call numbers, the following files in the kernel
  8. // source can be used:
  9. //
  10. // amd64: arch/x86/entry/syscalls/syscall_64.tbl
  11. // arm64: include/uapi/asm-generic/unistd.h
  12. // 386: arch/x86/entry/syscalls/sycall_32.tbl
  13. // arm: arch/arm/tools/syscall.tbl
  14. when ODIN_ARCH == "amd64" {
  15. SYS_mmap : uintptr : 9
  16. SYS_mprotect : uintptr : 10
  17. SYS_munmap : uintptr : 11
  18. SYS_madvise : uintptr : 28
  19. SYS_futex : uintptr : 202
  20. SYS_gettid : uintptr : 186
  21. SYS_getrandom : uintptr : 318
  22. } else when ODIN_ARCH == "arm64" {
  23. SYS_mmap : uintptr : 222
  24. SYS_mprotect : uintptr : 226
  25. SYS_munmap : uintptr : 215
  26. SYS_madvise : uintptr : 233
  27. SYS_futex : uintptr : 98
  28. SYS_gettid : uintptr : 178
  29. SYS_getrandom : uintptr : 278
  30. } else when ODIN_ARCH == "386" {
  31. SYS_mmap : uintptr : 192 // 90 is "sys_old_mmap", we want mmap2
  32. SYS_mprotect : uintptr : 125
  33. SYS_munmap : uintptr : 91
  34. SYS_madvise : uintptr : 219
  35. SYS_futex : uintptr : 240
  36. SYS_gettid : uintptr : 224
  37. SYS_getrandom : uintptr : 355
  38. } else when ODIN_ARCH == "arm" {
  39. SYS_mmap : uintptr : 192 // 90 is "sys_old_mmap", we want mmap2
  40. SYS_mprotect : uintptr : 125
  41. SYS_munmap: uintptr : 91
  42. SYS_madvise: uintptr : 220
  43. SYS_futex : uintptr : 240
  44. SYS_gettid : uintptr: 224
  45. SYS_getrandom : uintptr : 384
  46. } else {
  47. #panic("Unsupported architecture")
  48. }
  49. sys_gettid :: proc "contextless" () -> int {
  50. return cast(int)intrinsics.syscall(SYS_gettid)
  51. }
  52. sys_getrandom :: proc "contextless" (buf: ^byte, buflen: int, flags: uint) -> int {
  53. return cast(int)intrinsics.syscall(SYS_getrandom, buf, cast(uintptr)(buflen), cast(uintptr)(flags))
  54. }