authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-18 18:15:50-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-07-18 18:15:50-04:00
log70da0762f7aa2d800da4a238499fc3f31dc4d31f
tree335aaf342e118932a7c74f672991683a4b602cf9
parent03a3b1ca39e73c7edf615d26bb7647d7565a09f7
signaturelock-open Commit is signed but in an unrecognized format.

better riscv syscalls


1 files changed, 42 insertions(+), 84 deletions(-)

std/os/linux/riscv64.zig+42-84
...@@ -1,95 +1,62 @@...@@ -1,95 +1,62 @@
1pub fn syscall0(number: usize) usize {1pub fn syscall0(number: usize) usize {
2 return asm volatile (2 return asm volatile ("ecall"
3 \\ mv a7, %[number]3 : [ret] "={x10}" (-> usize)
4 \\ ecall4 : [number] "{x17}" (number)
5 \\ mv %[ret], a0
6 : [ret] "=r" (-> usize)
7 : [number] "r" (number)
8 : "memory"5 : "memory"
9 );6 );
10}7}
118
12pub fn syscall1(number: usize, arg1: usize) usize {9pub fn syscall1(number: usize, arg1: usize) usize {
13 return asm volatile (10 return asm volatile ("ecall"
14 \\ mv a7, %[number]11 : [ret] "={x10}" (-> usize)
15 \\ mv a0, %[arg1]12 : [number] "{x17}" (number),
16 \\ ecall13 [arg1] "{x10}" (arg1)
17 \\ mv %[ret], a0
18 : [ret] "=r" (-> usize)
19 : [number] "r" (number),
20 [arg1] "r" (arg1)
21 : "memory"14 : "memory"
22 );15 );
23}16}
2417
25pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize {18pub fn syscall2(number: usize, arg1: usize, arg2: usize) usize {
26 return asm volatile (19 return asm volatile ("ecall"
27 \\ mv a7, %[number]20 : [ret] "={x10}" (-> usize)
28 \\ mv a0, %[arg1]21 : [number] "{x17}" (number),
29 \\ mv a1, %[arg2]22 [arg1] "{x10}" (arg1),
30 \\ ecall23 [arg2] "{x11}" (arg2)
31 \\ mv %[ret], a0
32 : [ret] "=r" (-> usize)
33 : [number] "r" (number),
34 [arg1] "r" (arg1),
35 [arg2] "r" (arg2)
36 : "memory"24 : "memory"
37 );25 );
38}26}
3927
40pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {28pub fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) usize {
41 return asm volatile (29 return asm volatile ("ecall"
42 \\ mv a7, %[number]30 : [ret] "={x10}" (-> usize)
43 \\ mv a0, %[arg1]31 : [number] "{x17}" (number),
44 \\ mv a1, %[arg2]32 [arg1] "{x10}" (arg1),
45 \\ mv a2, %[arg3]33 [arg2] "{x11}" (arg2),
46 \\ ecall34 [arg3] "{x12}" (arg3)
47 \\ mv %[ret], a0
48 : [ret] "=r" (-> usize)
49 : [number] "r" (number),
50 [arg1] "r" (arg1),
51 [arg2] "r" (arg2),
52 [arg3] "r" (arg3)
53 : "memory"35 : "memory"
54 );36 );
55}37}
5638
57pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {39pub fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
58 return asm volatile (40 return asm volatile ("ecall"
59 \\ mv a7, %[number]41 : [ret] "={x10}" (-> usize)
60 \\ mv a0, %[arg1]42 : [number] "{x17}" (number),
61 \\ mv a1, %[arg2]43 [arg1] "{x10}" (arg1),
62 \\ mv a2, %[arg3]44 [arg2] "{x11}" (arg2),
63 \\ mv a3, %[arg4]45 [arg3] "{x12}" (arg3),
64 \\ ecall46 [arg4] "{x13}" (arg4)
65 \\ mv %[ret], a0
66 : [ret] "=r" (-> usize)
67 : [number] "r" (number),
68 [arg1] "r" (arg1),
69 [arg2] "r" (arg2),
70 [arg3] "r" (arg3),
71 [arg4] "r" (arg4)
72 : "memory"47 : "memory"
73 );48 );
74}49}
7550
76pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {51pub fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
77 return asm volatile (52 return asm volatile ("ecall"
78 \\ mv a7, %[number]53 : [ret] "={x10}" (-> usize)
79 \\ mv a0, %[arg1]54 : [number] "{x17}" (number),
80 \\ mv a1, %[arg2]55 [arg1] "{x10}" (arg1),
81 \\ mv a2, %[arg3]56 [arg2] "{x11}" (arg2),
82 \\ mv a3, %[arg4]57 [arg3] "{x12}" (arg3),
83 \\ mv a4, %[arg5]58 [arg4] "{x13}" (arg4),
84 \\ ecall59 [arg5] "{x14}" (arg5)
85 \\ mv %[ret], a0
86 : [ret] "=r" (-> usize)
87 : [number] "r" (number),
88 [arg1] "r" (arg1),
89 [arg2] "r" (arg2),
90 [arg3] "r" (arg3),
91 [arg4] "r" (arg4),
92 [arg5] "r" (arg5)
93 : "memory"60 : "memory"
94 );61 );
95}62}
...@@ -103,24 +70,15 @@ pub fn syscall6(...@@ -103,24 +70,15 @@ pub fn syscall6(
103 arg5: usize,70 arg5: usize,
104 arg6: usize,71 arg6: usize,
105) usize {72) usize {
106 return asm volatile (73 return asm volatile ("ecall"
107 \\ mv a7, %[number]74 : [ret] "={x10}" (-> usize)
108 \\ mv a0, %[arg1]75 : [number] "{x17}" (number),
109 \\ mv a1, %[arg2]76 [arg1] "{x10}" (arg1),
110 \\ mv a2, %[arg3]77 [arg2] "{x11}" (arg2),
111 \\ mv a3, %[arg4]78 [arg3] "{x12}" (arg3),
112 \\ mv a4, %[arg5]79 [arg4] "{x13}" (arg4),
113 \\ mv a5, %[arg6]80 [arg5] "{x14}" (arg5),
114 \\ ecall81 [arg6] "{x15}" (arg6)
115 \\ mv %[ret], a0
116 : [ret] "=r" (-> usize)
117 : [number] "r" (number),
118 [arg1] "r" (arg1),
119 [arg2] "r" (arg2),
120 [arg3] "r" (arg3),
121 [arg4] "r" (arg4),
122 [arg5] "r" (arg5),
123 [arg6] "r" (arg6)
124 : "memory"82 : "memory"
125 );83 );
126}84}