Files
zing/user/arch/aarch64.zig
T
2025-03-27 23:37:11 +02:00

56 lines
1.8 KiB
Zig

const abi = @import("abi");
pub const syscall = struct {
pub fn send(handle: u32, msg: *const [5]usize) usize {
return asm volatile ("svc #0"
: [result] "={x0}" (-> usize),
: [a0] "{x0}" (handle),
[a1] "{x1}" (msg[0]),
[a2] "{x2}" (msg[1]),
[a3] "{x3}" (msg[2]),
[a4] "{x4}" (msg[3]),
[a5] "{x5}" (msg[4]),
[func] "{x8}" (@intFromEnum(abi.SyscallNumber.SYS_send)),
: "memory"
);
}
pub fn sendrecv(handle: u32, msg: *const[5]usize, buffer: *[5]usize) usize {
return asm volatile (
\\ svc #0
\\ stp x1, x2, [%[buf], #16 * 0]
\\ stp x3, x4, [%[buf], #16 * 1]
\\ str x5, [%[buf], #16 * 2]
: [result] "={x0}" (-> usize),
: [a0] "{x0}" (handle),
[a1] "{x1}" (msg[0]),
[a2] "{x2}" (msg[1]),
[a3] "{x3}" (msg[2]),
[a4] "{x4}" (msg[3]),
[a5] "{x5}" (msg[4]),
[func] "{x8}" (@intFromEnum(abi.SyscallNumber.SYS_sendrecv)),
[buf] "r" (buffer),
: "memory"
);
}
// pub fn syscall1(func: abi.SyscallNumber, arg0: usize) usize {
// return asm volatile ("svc #0"
// : [result] "={x0}" (-> usize),
// : [arg0] "{x0}" (arg0),
// [func] "{x8}" (@intFromEnum(func)),
// : "memory"
// );
// }
// pub fn syscall2(func: abi.SyscallNumber, arg0: usize, arg1: usize) usize {
// return asm volatile ("svc #0"
// : [result] "={x0}" (-> usize),
// : [arg0] "{x0}" (arg0),
// [arg1] "{x1}" (arg1),
// [func] "{x8}" (@intFromEnum(func)),
// : "memory"
// );
// }
};