1const builtin = @import("builtin");
2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;
4
5pub const syscall_arg_t = u32;
6
7pub fn syscall0(
8 number: SYS,
9) u32 {
10 return asm volatile (
11 \\ l.sys 1
12 : [ret] "={r11}" (-> u32),
13 : [number] "{r11}" (@backingInt(number)),
14 : .{ .r3 = true, .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r12 = true, .r13 = true, .r15 = true, .r17 = true, .r19 = true, .r21 = true, .r23 = true, .r25 = true, .r27 = true, .r29 = true, .r31 = true, .memory = true });
15}
16
17pub fn syscall1(
18 number: SYS,
19 arg1: syscall_arg_t,
20) u32 {
21 return asm volatile (
22 \\ l.sys 1
23 : [ret] "={r11}" (-> u32),
24 : [number] "{r11}" (@backingInt(number)),
25 [arg1] "{r3}" (arg1),
26 : .{ .r4 = true, .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r12 = true, .r13 = true, .r15 = true, .r17 = true, .r19 = true, .r21 = true, .r23 = true, .r25 = true, .r27 = true, .r29 = true, .r31 = true, .memory = true });
27}
28
29pub fn syscall2(
30 number: SYS,
31 arg1: syscall_arg_t,
32 arg2: syscall_arg_t,
33) u32 {
34 return asm volatile (
35 \\ l.sys 1
36 : [ret] "={r11}" (-> u32),
37 : [number] "{r11}" (@backingInt(number)),
38 [arg1] "{r3}" (arg1),
39 [arg2] "{r4}" (arg2),
40 : .{ .r5 = true, .r6 = true, .r7 = true, .r8 = true, .r12 = true, .r13 = true, .r15 = true, .r17 = true, .r19 = true, .r21 = true, .r23 = true, .r25 = true, .r27 = true, .r29 = true, .r31 = true, .memory = true });
41}
42
43pub fn syscall3(
44 number: SYS,
45 arg1: syscall_arg_t,
46 arg2: syscall_arg_t,
47 arg3: syscall_arg_t,
48) u32 {
49 return asm volatile (
50 \\ l.sys 1
51 : [ret] "={r11}" (-> u32),
52 : [number] "{r11}" (@backingInt(number)),
53 [arg1] "{r3}" (arg1),
54 [arg2] "{r4}" (arg2),
55 [arg3] "{r5}" (arg3),
56 : .{ .r6 = true, .r7 = true, .r8 = true, .r12 = true, .r13 = true, .r15 = true, .r17 = true, .r19 = true, .r21 = true, .r23 = true, .r25 = true, .r27 = true, .r29 = true, .r31 = true, .memory = true });
57}
58
59pub fn syscall4(
60 number: SYS,
61 arg1: syscall_arg_t,
62 arg2: syscall_arg_t,
63 arg3: syscall_arg_t,
64 arg4: syscall_arg_t,
65) u32 {
66 return asm volatile (
67 \\ l.sys 1
68 : [ret] "={r11}" (-> u32),
69 : [number] "{r11}" (@backingInt(number)),
70 [arg1] "{r3}" (arg1),
71 [arg2] "{r4}" (arg2),
72 [arg3] "{r5}" (arg3),
73 [arg4] "{r6}" (arg4),
74 : .{ .r7 = true, .r8 = true, .r12 = true, .r13 = true, .r15 = true, .r17 = true, .r19 = true, .r21 = true, .r23 = true, .r25 = true, .r27 = true, .r29 = true, .r31 = true, .memory = true });
75}
76
77pub fn syscall5(
78 number: SYS,
79 arg1: syscall_arg_t,
80 arg2: syscall_arg_t,
81 arg3: syscall_arg_t,
82 arg4: syscall_arg_t,
83 arg5: syscall_arg_t,
84) u32 {
85 return asm volatile (
86 \\ l.sys 1
87 : [ret] "={r11}" (-> u32),
88 : [number] "{r11}" (@backingInt(number)),
89 [arg1] "{r3}" (arg1),
90 [arg2] "{r4}" (arg2),
91 [arg3] "{r5}" (arg3),
92 [arg4] "{r6}" (arg4),
93 [arg5] "{r7}" (arg5),
94 : .{ .r8 = true, .r12 = true, .r13 = true, .r15 = true, .r17 = true, .r19 = true, .r21 = true, .r23 = true, .r25 = true, .r27 = true, .r29 = true, .r31 = true, .memory = true });
95}
96
97pub fn syscall6(
98 number: SYS,
99 arg1: syscall_arg_t,
100 arg2: syscall_arg_t,
101 arg3: syscall_arg_t,
102 arg4: syscall_arg_t,
103 arg5: syscall_arg_t,
104 arg6: syscall_arg_t,
105) u32 {
106 return asm volatile (
107 \\ l.sys 1
108 : [ret] "={r11}" (-> u32),
109 : [number] "{r11}" (@backingInt(number)),
110 [arg1] "{r3}" (arg1),
111 [arg2] "{r4}" (arg2),
112 [arg3] "{r5}" (arg3),
113 [arg4] "{r6}" (arg4),
114 [arg5] "{r7}" (arg5),
115 [arg6] "{r8}" (arg6),
116 : .{ .r12 = true, .r13 = true, .r15 = true, .r17 = true, .r19 = true, .r21 = true, .r23 = true, .r25 = true, .r27 = true, .r29 = true, .r31 = true, .memory = true });
117}
118
119pub fn clone() callconv(.naked) u32 {
120 // __clone(func, stack, flags, arg, ptid, tls, ctid)
121 // r3, r4, r5, r6, r7, r8, +0
122 //
123 // syscall(SYS_clone, flags, stack, ptid, tls, ctid)
124 // r11 r3, r4, r5, r6, r7
125 asm volatile (
126 \\ # Save function pointer and argument pointer on new thread stack
127 \\ l.addi r13, r0, -4
128 \\ l.and r4, r4, r13
129 \\ l.addi r4, r4, -8
130 \\ l.sw 0(r4), r3
131 \\ l.sw 4(r4), r6
132 \\
133 \\ # Shuffle (fn,sp,fl,arg,ptid,tls,ctid) to (fl,sp,ptid,tls,ctid)
134 \\ l.ori r11, r0, 220 # SYS_clone
135 \\ l.ori r3, r5, 0
136 \\ l.ori r5, r7, 0
137 \\ l.ori r6, r8, 0
138 \\ l.lwz r7, 0(r1)
139 \\ l.sys 1
140 \\ l.sfeqi r11, 0
141 \\ l.bf 1f
142 \\ l.nop
143 \\ l.jr r9
144 \\ l.nop
145 \\1:
146 );
147 if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile (
148 \\ .cfi_undefined r9
149 );
150 asm volatile (
151 \\ l.ori r2, r0, 0
152 \\ l.ori r9, r0, 0
153 \\
154 \\ l.lwz r11, 0(r1)
155 \\ l.lwz r3, 4(r1)
156 \\ l.jalr r11
157 \\ l.nop
158 \\
159 \\ l.ori r3, r11, 0
160 \\ l.ori r11, r0, 93 # SYS_exit
161 \\ l.sys 1
162 );
163}
164
165pub const VDSO = void;
166
167pub const time_t = i32;