137 lines
3.2 KiB
Rust
137 lines
3.2 KiB
Rust
// Copyright (c) 2025 shibedrill
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
#![allow(dead_code, unused_variables)]
|
|
|
|
// The system call API for x86_64.
|
|
|
|
use crate::syscall::*;
|
|
|
|
#[inline(always)]
|
|
pub fn caller_syscall_0(call: u64) -> u64 {
|
|
let returncode: u64;
|
|
unsafe {
|
|
core::arch::asm!(
|
|
"syscall",
|
|
inlateout("rax") call => returncode,
|
|
out("rcx") _,
|
|
out("r11") _,
|
|
options(nostack, preserves_flags)
|
|
);
|
|
}
|
|
returncode
|
|
}
|
|
#[inline(always)]
|
|
pub fn caller_syscall_1(call: u64, one: u64) -> u64 {
|
|
let returncode: u64;
|
|
unsafe {
|
|
core::arch::asm!(
|
|
"syscall",
|
|
inlateout("rax") call => returncode,
|
|
in("rdi") one,
|
|
out("rcx") _,
|
|
out("r11") _,
|
|
options(nostack, preserves_flags)
|
|
);
|
|
}
|
|
returncode
|
|
}
|
|
#[inline(always)]
|
|
pub fn caller_syscall_2(call: u64, one: u64, two: u64) -> u64 {
|
|
let returncode: u64;
|
|
unsafe {
|
|
core::arch::asm!(
|
|
"syscall",
|
|
inlateout("rax") call => returncode,
|
|
in("rdi") one,
|
|
in("rsi") two,
|
|
out("rcx") _,
|
|
out("r11") _,
|
|
options(nostack, preserves_flags)
|
|
);
|
|
}
|
|
returncode
|
|
}
|
|
#[inline(always)]
|
|
pub fn caller_syscall_3(call: u64, one: u64, two: u64, three: u64) -> u64 {
|
|
let returncode: u64;
|
|
unsafe {
|
|
core::arch::asm!(
|
|
"syscall",
|
|
inlateout("rax") call => returncode,
|
|
in("rdi") one,
|
|
in("rsi") two,
|
|
in("rdx") three,
|
|
out("rcx") _,
|
|
out("r11") _,
|
|
options(nostack, preserves_flags)
|
|
);
|
|
}
|
|
returncode
|
|
}
|
|
#[inline(always)]
|
|
pub fn caller_syscall_4(call: u64, one: u64, two: u64, three: u64, four: u64) -> u64 {
|
|
let returncode: u64;
|
|
unsafe {
|
|
core::arch::asm!(
|
|
"syscall",
|
|
inlateout("rax") call => returncode,
|
|
in("rdi") one,
|
|
in("rsi") two,
|
|
in("rdx") three,
|
|
in("r10") four,
|
|
out("rcx") _,
|
|
out("r11") _,
|
|
options(nostack, preserves_flags)
|
|
);
|
|
}
|
|
returncode
|
|
}
|
|
#[inline(always)]
|
|
pub fn caller_syscall_5(call: u64, one: u64, two: u64, three: u64, four: u64, five: u64) -> u64 {
|
|
let returncode: u64;
|
|
unsafe {
|
|
core::arch::asm!(
|
|
"syscall",
|
|
inlateout("rax") call => returncode,
|
|
in("rdi") one,
|
|
in("rsi") two,
|
|
in("rdx") three,
|
|
in("r10") four,
|
|
in("r8") five,
|
|
out("rcx") _,
|
|
out("r11") _,
|
|
options(nostack, preserves_flags)
|
|
);
|
|
}
|
|
returncode
|
|
}
|
|
#[inline(always)]
|
|
pub fn caller_syscall_6(
|
|
call: u64,
|
|
one: u64,
|
|
two: u64,
|
|
three: u64,
|
|
four: u64,
|
|
five: u64,
|
|
six: u64,
|
|
) -> u64 {
|
|
let returncode: u64;
|
|
unsafe {
|
|
core::arch::asm!(
|
|
"syscall",
|
|
inlateout("rax") call => returncode,
|
|
in("rdi") one,
|
|
in("rsi") two,
|
|
in("rdx") three,
|
|
in("r10") four,
|
|
in("r8") five,
|
|
in("r9") six,
|
|
out("rcx") _,
|
|
out("r11") _,
|
|
options(nostack, preserves_flags)
|
|
);
|
|
}
|
|
returncode
|
|
}
|