authorgravatar for koachan@protonmail.comKoakuma <koachan@protonmail.com> 2020-08-17 15:07:57+07:00
committergravatar for koachan@protonmail.comKoakuma <koachan@protonmail.com> 2020-10-24 19:59:04+07:00
loge5a11020cc838019de12955437b371511b4745e5
treecb1eecd257227b2fa2503063224632421fc75209
parent91a1c20e74a8919b7d96366a5c220af79fe67168

Add sparc64 syscall interface


2 files changed, 137 insertions(+), 0 deletions(-)

lib/std/os/linux.zig+1
......@@ -24,6 +24,7 @@ pub usingnamespace switch (builtin.arch) {
2424 .aarch64 => @import("linux/arm64.zig"),
2525 .arm => @import("linux/arm-eabi.zig"),
2626 .riscv64 => @import("linux/riscv64.zig"),
27 .sparcv9 => @import("linux/sparc64.zig"),
2728 .mips, .mipsel => @import("linux/mips.zig"),
2829 .powerpc64, .powerpc64le => @import("linux/powerpc64.zig"),
2930 else => struct {},
lib/std/os/linux/sparc64.zig created+136
......@@ -0,0 +1,136 @@
1usingnamespace @import("../bits.zig");
2
3// TODO: Handle the case of pipe(2) returning multiple values.
4// From syscall(2)'s manual page:
5// Some architectures (namely, Alpha, IA-64, MIPS, SuperH, sparc/32, and sparc/64)
6// use an additional register ("Retval2" in the above table) to pass back a second
7// return value from the pipe(2) system call; Alpha uses this technique in the
8// architecture-specific getxpid(2), getxuid(2), and getxgid(2) system calls
9// as well. Other architectures do not use the second return value register in
10// the system call interface, even if it is defined in the System V ABI.
11
12pub fn syscall0(number: SYS) usize {
13 return asm volatile (
14 \\ t 0x6d
15 \\ bcc %%xcc, 1f
16 \\ neg %%o0
17 \\ 1:
18 : [ret] "={%o0}" (-> usize)
19 : [number] "{%g1}" (@enumToInt(number))
20 : "memory", "%o1", "%o2", "%o3", "%o4", "%o5", "%o7"
21 );
22}
23
24pub fn syscall1(number: SYS, arg1: usize) usize {
25 return asm volatile (
26 \\ t 0x6d
27 \\ bcc %%xcc, 1f
28 \\ neg %%o0
29 \\ 1:
30 : [ret] "={%o0}" (-> usize)
31 : [number] "{%g1}" (@enumToInt(number)),
32 [arg1] "{%o0}" (arg1)
33 : "memory", "%o1", "%o2", "%o3", "%o4", "%o5", "%o7"
34 );
35}
36
37pub fn syscall2(number: SYS, arg1: usize, arg2: usize) usize {
38 return asm volatile (
39 \\ t 0x6d
40 \\ bcc %%xcc, 1f
41 \\ neg %%o0
42 \\ 1:
43 : [ret] "={%o0}" (-> usize)
44 : [number] "{%g1}" (@enumToInt(number)),
45 [arg1] "{%o0}" (arg1),
46 [arg2] "{%o1}" (arg2)
47 : "memory", "%o1", "%o2", "%o3", "%o4", "%o5", "%o7"
48 );
49}
50
51pub fn syscall3(number: SYS, arg1: usize, arg2: usize, arg3: usize) usize {
52 return asm volatile (
53 \\ t 0x6d
54 \\ bcc %%xcc, 1f
55 \\ neg %%o0
56 \\ 1:
57 : [ret] "={%o0}" (-> usize)
58 : [number] "{%g1}" (@enumToInt(number)),
59 [arg1] "{%o0}" (arg1),
60 [arg2] "{%o1}" (arg2),
61 [arg3] "{%o2}" (arg3)
62 : "memory", "%o1", "%o2", "%o3", "%o4", "%o5", "%o7"
63 );
64}
65
66pub fn syscall4(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize) usize {
67 return asm volatile (
68 \\ t 0x6d
69 \\ bcc %%xcc, 1f
70 \\ neg %%o0
71 \\ 1:
72 : [ret] "={%o0}" (-> usize)
73 : [number] "{%g1}" (@enumToInt(number)),
74 [arg1] "{%o0}" (arg1),
75 [arg2] "{%o1}" (arg2),
76 [arg3] "{%o2}" (arg3),
77 [arg4] "{%o3}" (arg4)
78 : "memory", "%o1", "%o2", "%o3", "%o4", "%o5", "%o7"
79 );
80}
81
82pub fn syscall5(number: SYS, arg1: usize, arg2: usize, arg3: usize, arg4: usize, arg5: usize) usize {
83 return asm volatile (
84 \\ t 0x6d
85 \\ bcc %%xcc, 1f
86 \\ neg %%o0
87 \\ 1:
88 : [ret] "={%o0}" (-> usize)
89 : [number] "{%g1}" (@enumToInt(number)),
90 [arg1] "{%o0}" (arg1),
91 [arg2] "{%o1}" (arg2),
92 [arg3] "{%o2}" (arg3),
93 [arg4] "{%o3}" (arg4),
94 [arg5] "{%o4}" (arg5),
95 : "memory", "%o1", "%o2", "%o3", "%o4", "%o5", "%o7"
96 );
97}
98
99pub fn syscall6(
100 number: SYS,
101 arg1: usize,
102 arg2: usize,
103 arg3: usize,
104 arg4: usize,
105 arg5: usize,
106 arg6: usize,
107) usize {
108 return asm volatile (
109 \\ t 0x6d
110 \\ bcc %%xcc, 1f
111 \\ neg %%o0
112 \\ 1:
113 : [ret] "={%o0}" (-> usize)
114 : [number] "{%g1}" (@enumToInt(number)),
115 [arg1] "{%o0}" (arg1),
116 [arg2] "{%o1}" (arg2),
117 [arg3] "{%o2}" (arg3),
118 [arg4] "{%o3}" (arg4),
119 [arg5] "{%o4}" (arg5),
120 [arg6] "{%o5}" (arg6),
121 : "memory", "%o1", "%o2", "%o3", "%o4", "%o5", "%o7"
122 );
123}
124
125/// This matches the libc clone function.
126pub extern fn clone(func: fn (arg: usize) callconv(.C) u8, stack: usize, flags: usize, arg: usize, ptid: *i32, tls: usize, ctid: *i32) usize;
127
128pub const restore = restore_rt;
129
130pub fn restore_rt() callconv(.Naked) void {
131 return asm volatile ("t 0x6d"
132 :
133 : [number] "{%g1}" (@enumToInt(SYS.rt_sigreturn))
134 : "memory", "%o0", "%o1", "%o2", "%o3", "%o4", "%o5", "%o7"
135 );
136}