commit 70da0762f7aa2d800da4a238499fc3f31dc4d31f (tree)
parent 03a3b1ca39e73c7edf615d26bb7647d7565a09f7
Author: Andrew Kelley <andrew@ziglang.org>
Date: Thu, 18 Jul 2019 18:15:50 -0400
better riscv syscalls
Diffstat:
1 file changed, 42 insertions(+), 84 deletions(-)
diff --git a/std/os/linux/riscv64.zig b/std/os/linux/riscv64.zig
@@ -1,95 +1,62 @@
pub fn syscall0(number: usize) usize {
- return asm volatile (
- \\ mv a7, %[number]
- \\ ecall
- \\ mv %[ret], a0
- : [ret] "=r" (-> usize)
- : [number] "r" (number)
+ return asm volatile ("ecall"
+ : [ret] "={x10}" (-> usize)
+ : [number] "{x17}" (number)
: "memory"
);
}
pub fn syscall1(number: usize, arg1: usize) usize {
- return asm volatile (
- \\ mv a7, %[number]
- \\ mv a0, %[arg1]
- \\ ecall
- \\ mv %[ret], a0
- : [ret] "=r" (-> usize)
- : [number] "r" (number),
- [arg1] "r" (arg1)
+ return asm volatile ("ecall"
+ : [ret] "={x10}" (-> usize)
+ : [number] "{x17}" (number),
+ [arg1] "{x10}" (arg1)
: "memory"
);
}
pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize {
- return asm volatile (
- \\ mv a7, %[number]
- \\ mv a0, %[arg1]
- \\ mv a1, %[arg2]
- \\ ecall
- \\ mv %[ret], a0
- : [ret] "=r" (-> usize)
- : [number] "r" (number),
- [arg1] "r" (arg1),
- [arg2] "r" (arg2)
+ return asm volatile ("ecall"
+ : [ret] "={x10}" (-> usize)
+ : [number] "{x17}" (number),
+ [arg1] "{x10}" (arg1),
+ [arg2] "{x11}" (arg2)
: "memory"
);
}
pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {
- return asm volatile (
- \\ mv a7, %[number]
- \\ mv a0, %[arg1]
- \\ mv a1, %[arg2]
- \\ mv a2, %[arg3]
- \\ ecall
- \\ mv %[ret], a0
- : [ret] "=r" (-> usize)
- : [number] "r" (number),
- [arg1] "r" (arg1),
- [arg2] "r" (arg2),
- [arg3] "r" (arg3)
+ return asm volatile ("ecall"
+ : [ret] "={x10}" (-> usize)
+ : [number] "{x17}" (number),
+ [arg1] "{x10}" (arg1),
+ [arg2] "{x11}" (arg2),
+ [arg3] "{x12}" (arg3)
: "memory"
);
}
pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
- return asm volatile (
- \\ mv a7, %[number]
- \\ mv a0, %[arg1]
- \\ mv a1, %[arg2]
- \\ mv a2, %[arg3]
- \\ mv a3, %[arg4]
- \\ ecall
- \\ mv %[ret], a0
- : [ret] "=r" (-> usize)
- : [number] "r" (number),
- [arg1] "r" (arg1),
- [arg2] "r" (arg2),
- [arg3] "r" (arg3),
- [arg4] "r" (arg4)
+ return asm volatile ("ecall"
+ : [ret] "={x10}" (-> usize)
+ : [number] "{x17}" (number),
+ [arg1] "{x10}" (arg1),
+ [arg2] "{x11}" (arg2),
+ [arg3] "{x12}" (arg3),
+ [arg4] "{x13}" (arg4)
: "memory"
);
}
pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
- return asm volatile (
- \\ mv a7, %[number]
- \\ mv a0, %[arg1]
- \\ mv a1, %[arg2]
- \\ mv a2, %[arg3]
- \\ mv a3, %[arg4]
- \\ mv a4, %[arg5]
- \\ ecall
- \\ mv %[ret], a0
- : [ret] "=r" (-> usize)
- : [number] "r" (number),
- [arg1] "r" (arg1),
- [arg2] "r" (arg2),
- [arg3] "r" (arg3),
- [arg4] "r" (arg4),
- [arg5] "r" (arg5)
+ return asm volatile ("ecall"
+ : [ret] "={x10}" (-> usize)
+ : [number] "{x17}" (number),
+ [arg1] "{x10}" (arg1),
+ [arg2] "{x11}" (arg2),
+ [arg3] "{x12}" (arg3),
+ [arg4] "{x13}" (arg4),
+ [arg5] "{x14}" (arg5)
: "memory"
);
}
@@ -103,24 +70,15 @@ pub fn syscall6(
arg5: usize,
arg6: usize,
) usize {
- return asm volatile (
- \\ mv a7, %[number]
- \\ mv a0, %[arg1]
- \\ mv a1, %[arg2]
- \\ mv a2, %[arg3]
- \\ mv a3, %[arg4]
- \\ mv a4, %[arg5]
- \\ mv a5, %[arg6]
- \\ ecall
- \\ mv %[ret], a0
- : [ret] "=r" (-> usize)
- : [number] "r" (number),
- [arg1] "r" (arg1),
- [arg2] "r" (arg2),
- [arg3] "r" (arg3),
- [arg4] "r" (arg4),
- [arg5] "r" (arg5),
- [arg6] "r" (arg6)
+ return asm volatile ("ecall"
+ : [ret] "={x10}" (-> usize)
+ : [number] "{x17}" (number),
+ [arg1] "{x10}" (arg1),
+ [arg2] "{x11}" (arg2),
+ [arg3] "{x12}" (arg3),
+ [arg4] "{x13}" (arg4),
+ [arg5] "{x14}" (arg5),
+ [arg6] "{x15}" (arg6)
: "memory"
);
}