From 70da0762f7aa2d800da4a238499fc3f31dc4d31f Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 18 Jul 2019 18:15:50 -0400 Subject: [PATCH] better riscv syscalls --- std/os/linux/riscv64.zig | 126 +++++++++++++-------------------------- 1 file changed, 42 insertions(+), 84 deletions(-) diff --git a/std/os/linux/riscv64.zig b/std/os/linux/riscv64.zig index 5cda2afa0a..3f5053c973 100644 --- 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" ); }