diff --git a/src/platform/macos-x86_64/mod.rs b/src/platform/macos-x86_64/mod.rs index e12e0d5..5241d81 100644 --- a/src/platform/macos-x86_64/mod.rs +++ b/src/platform/macos-x86_64/mod.rs @@ -11,11 +11,19 @@ pub mod nr; +/// Add the unix syscall class to the syscall number +/// +/// https://opensource.apple.com/source/xnu/xnu-4570.41.2/osfmk/mach/i386/syscall_sw.h.auto.html +#[inline(always)] +pub fn syscall_construct_unix(n: usize) -> usize { + (2usize << 24) | (n & !(0xFFusize << 24)) +} + #[inline(always)] pub unsafe fn syscall0(n: usize) -> usize { let ret: usize; asm!("syscall" : "={rax}"(ret) - : "{rax}"(n) + : "{rax}"(syscall_construct_unix(n)) : "rcx", "r11", "memory" : "volatile"); ret @@ -25,7 +33,7 @@ pub unsafe fn syscall0(n: usize) -> usize { pub unsafe fn syscall1(n: usize, a1: usize) -> usize { let ret: usize; asm!("syscall" : "={rax}"(ret) - : "{rax}"(n), "{rdi}"(a1) + : "{rax}"(syscall_construct_unix(n)), "{rdi}"(a1) : "rcx", "r11", "memory" : "volatile"); ret @@ -35,7 +43,7 @@ pub unsafe fn syscall1(n: usize, a1: usize) -> usize { pub unsafe fn syscall2(n: usize, a1: usize, a2: usize) -> usize { let ret: usize; asm!("syscall" : "={rax}"(ret) - : "{rax}"(n), "{rdi}"(a1), "{rsi}"(a2) + : "{rax}"(syscall_construct_unix(n)), "{rdi}"(a1), "{rsi}"(a2) : "rcx", "r11", "memory" : "volatile"); ret @@ -45,7 +53,7 @@ pub unsafe fn syscall2(n: usize, a1: usize, a2: usize) -> usize { pub unsafe fn syscall3(n: usize, a1: usize, a2: usize, a3: usize) -> usize { let ret: usize; asm!("syscall" : "={rax}"(ret) - : "{rax}"(n), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3) + : "{rax}"(syscall_construct_unix(n)), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3) : "rcx", "r11", "memory" : "volatile"); ret @@ -60,7 +68,7 @@ pub unsafe fn syscall4(n: usize, -> usize { let ret: usize; asm!("syscall" : "={rax}"(ret) - : "{rax}"(n), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3), + : "{rax}"(syscall_construct_unix(n)), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3), "{r10}"(a4) : "rcx", "r11", "memory" : "volatile"); @@ -77,7 +85,7 @@ pub unsafe fn syscall5(n: usize, -> usize { let ret: usize; asm!("syscall" : "={rax}"(ret) - : "{rax}"(n), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3), + : "{rax}"(syscall_construct_unix(n)), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3), "{r10}"(a4), "{r8}"(a5) : "rcx", "r11", "memory" : "volatile"); @@ -95,7 +103,7 @@ pub unsafe fn syscall6(n: usize, -> usize { let ret: usize; asm!("syscall" : "={rax}"(ret) - : "{rax}"(n), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3), + : "{rax}"(syscall_construct_unix(n)), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3), "{r10}"(a4), "{r8}"(a5), "{r9}"(a6) : "rcx", "r11", "memory" : "volatile");