better riscv syscalls

This commit is contained in:
Andrew Kelley 2019-07-18 18:15:50 -04:00
parent 03a3b1ca39
commit 70da0762f7
No known key found for this signature in database
GPG Key ID: 7C5F548F728501A9

View File

@ -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"
);
}