> Так где там разные структуры?Папа, где море? (c)
> Вызов системного вызова по номеру и передача параметров им. Без интерпретации содержимого.
Сам что-то придумал, сам потребовал опровергнуть ... истинный Воен!
> Где сами системные вызовы разные на разных платформах?
pub unsafe fn syscall2(n: Sysno, arg1: usize, arg2: usize) -> usize {
let mut ret: usize;
asm!(
"syscall",
inlateout("rax") n as usize => ret,
in("rdi") arg1,
in("rsi") arg2,
out("rcx") _, // rcx is used to store old rip
out("r11") _, // r11 is used to store old rflags
options(nostack, preserves_flags)
);
ret
}
...
pub unsafe fn syscall2(n: Sysno, arg1: usize, arg2: usize) -> usize {
let mut ret: usize;
asm!(
"svc 0",
in("r7") n as usize,
inlateout("r0") arg1 => ret,
in("r1") arg2,
options(nostack, preserves_flags)
);
ret
}
...
pub unsafe fn syscall2(n: Sysno, arg1: usize, arg2: usize) -> usize {
let mut ret: usize;
asm!(
"ecall",
in("a7") n as usize,
inlateout("a0") arg1 => ret,
in("a1") arg2,
options(nostack, preserves_flags)
);
ret
}
...
pub unsafe fn syscall2(n: Sysno, arg1: usize, arg2: usize) -> usize {
let mut err: usize;
let mut ret: usize;
asm!(
"syscall",
inlateout("$2") n as usize => ret,
lateout("$7") err,
in("$4") arg1,
in("$5") arg2,
// All temporary registers are always clobbered
lateout("$8") _,
lateout("$9") _,
lateout("$10") _,
lateout("$11") _,
lateout("$12") _,
lateout("$13") _,
lateout("$14") _,
lateout("$15") _,
lateout("$24") _,
lateout("$25") _,
options(nostack, preserves_flags)
);
if err == 0 {
ret
} else {
ret.wrapping_neg()
}
}