@zigc/lib 0.17.0-dev.704 → 0.17.0-dev.813

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/c/math.zig +10 -0
  2. package/compiler/Maker/Step/TranslateC.zig +8 -4
  3. package/compiler_rt/log.zig +230 -3
  4. package/compiler_rt/log10.zig +228 -3
  5. package/compiler_rt/log2.zig +221 -3
  6. package/compiler_rt/log_f128.zig +173 -0
  7. package/package.json +1 -1
  8. package/std/Io/Writer.zig +6 -2
  9. package/std/Thread.zig +22 -2
  10. package/std/c/darwin.zig +6 -0
  11. package/std/c.zig +26 -5
  12. package/std/compress/flate/Compress.zig +4 -2
  13. package/std/crypto/ff.zig +3 -1
  14. package/std/crypto/tls/Client.zig +17 -2
  15. package/std/debug/cpu_context.zig +3 -3
  16. package/std/heap/BrkAllocator.zig +1 -1
  17. package/std/json/static.zig +2 -1
  18. package/std/math/isnan.zig +5 -0
  19. package/std/math/log1p.zig +13 -19
  20. package/std/math.zig +5 -0
  21. package/std/meta.zig +3 -12
  22. package/std/os/linux/csky.zig +165 -0
  23. package/std/os/linux/microblaze.zig +170 -0
  24. package/std/os/linux/sh.zig +239 -0
  25. package/std/os/linux/sparc.zig +277 -0
  26. package/std/os/linux/sparc64.zig +44 -30
  27. package/std/os/linux/syscalls.zig +1718 -12
  28. package/std/os/linux.zig +37 -8
  29. package/std/os/uefi/protocol/file.zig +16 -0
  30. package/std/os.zig +0 -10
  31. package/std/start.zig +5 -5
  32. package/std/static_string_map.zig +59 -1
  33. package/std/zig/LibCInstallation.zig +2 -2
  34. package/std/zig/Parse.zig +1 -1
  35. package/std/zig/PkgConfig.zig +5 -0
  36. package/std/zig/system/darwin/macos.zig +11 -7
  37. package/std/zig/system.zig +1 -1
  38. package/zig.h +38 -10
  39. package/libc/musl/src/math/i386/log1p.s +0 -25
  40. package/libc/musl/src/math/i386/log1pf.s +0 -26
  41. package/libc/musl/src/math/log1p.c +0 -122
  42. package/libc/musl/src/math/log1pf.c +0 -77
@@ -0,0 +1,239 @@
1
+ const builtin = @import("builtin");
2
+ const std = @import("../../std.zig");
3
+ const SYS = std.os.linux.SYS;
4
+
5
+ pub const syscall_arg_t = u32;
6
+
7
+ pub fn syscall0(
8
+ number: SYS,
9
+ ) u32 {
10
+ return asm volatile (
11
+ \\ trapa #31
12
+ \\ or r0, r0
13
+ \\ or r0, r0
14
+ \\ or r0, r0
15
+ \\ or r0, r0
16
+ \\ or r0, r0
17
+ : [ret] "={r0}" (-> u32),
18
+ : [number] "{r3}" (@intFromEnum(number)),
19
+ : .{ .memory = true });
20
+ }
21
+
22
+ pub fn syscall1(
23
+ number: SYS,
24
+ arg1: syscall_arg_t,
25
+ ) u32 {
26
+ return asm volatile (
27
+ \\ trapa #31
28
+ \\ or r0, r0
29
+ \\ or r0, r0
30
+ \\ or r0, r0
31
+ \\ or r0, r0
32
+ \\ or r0, r0
33
+ : [ret] "={r0}" (-> u32),
34
+ : [number] "{r3}" (@intFromEnum(number)),
35
+ [arg1] "{r4}" (arg1),
36
+ : .{ .memory = true });
37
+ }
38
+
39
+ pub fn syscall2(
40
+ number: SYS,
41
+ arg1: syscall_arg_t,
42
+ arg2: syscall_arg_t,
43
+ ) u32 {
44
+ return asm volatile (
45
+ \\ trapa #31
46
+ \\ or r0, r0
47
+ \\ or r0, r0
48
+ \\ or r0, r0
49
+ \\ or r0, r0
50
+ \\ or r0, r0
51
+ : [ret] "={r0}" (-> u32),
52
+ : [number] "{r3}" (@intFromEnum(number)),
53
+ [arg1] "{r4}" (arg1),
54
+ [arg2] "{r5}" (arg2),
55
+ : .{ .memory = true });
56
+ }
57
+
58
+ pub fn syscall3(
59
+ number: SYS,
60
+ arg1: syscall_arg_t,
61
+ arg2: syscall_arg_t,
62
+ arg3: syscall_arg_t,
63
+ ) u32 {
64
+ return asm volatile (
65
+ \\ trapa #31
66
+ \\ or r0, r0
67
+ \\ or r0, r0
68
+ \\ or r0, r0
69
+ \\ or r0, r0
70
+ \\ or r0, r0
71
+ : [ret] "={r0}" (-> u32),
72
+ : [number] "{r3}" (@intFromEnum(number)),
73
+ [arg1] "{r4}" (arg1),
74
+ [arg2] "{r5}" (arg2),
75
+ [arg3] "{r6}" (arg3),
76
+ : .{ .memory = true });
77
+ }
78
+
79
+ pub fn syscall4(
80
+ number: SYS,
81
+ arg1: syscall_arg_t,
82
+ arg2: syscall_arg_t,
83
+ arg3: syscall_arg_t,
84
+ arg4: syscall_arg_t,
85
+ ) u32 {
86
+ return asm volatile (
87
+ \\ trapa #31
88
+ \\ or r0, r0
89
+ \\ or r0, r0
90
+ \\ or r0, r0
91
+ \\ or r0, r0
92
+ \\ or r0, r0
93
+ : [ret] "={r0}" (-> u32),
94
+ : [number] "{r3}" (@intFromEnum(number)),
95
+ [arg1] "{r4}" (arg1),
96
+ [arg2] "{r5}" (arg2),
97
+ [arg3] "{r6}" (arg3),
98
+ [arg4] "{r7}" (arg4),
99
+ : .{ .memory = true });
100
+ }
101
+
102
+ pub fn syscall5(
103
+ number: SYS,
104
+ arg1: syscall_arg_t,
105
+ arg2: syscall_arg_t,
106
+ arg3: syscall_arg_t,
107
+ arg4: syscall_arg_t,
108
+ arg5: syscall_arg_t,
109
+ ) u32 {
110
+ return asm volatile (
111
+ \\ trapa #31
112
+ \\ or r0, r0
113
+ \\ or r0, r0
114
+ \\ or r0, r0
115
+ \\ or r0, r0
116
+ \\ or r0, r0
117
+ : [ret] "={r0}" (-> u32),
118
+ : [number] "{r3}" (@intFromEnum(number)),
119
+ [arg1] "{r4}" (arg1),
120
+ [arg2] "{r5}" (arg2),
121
+ [arg3] "{r6}" (arg3),
122
+ [arg4] "{r7}" (arg4),
123
+ [arg5] "{r0}" (arg5),
124
+ : .{ .memory = true });
125
+ }
126
+
127
+ pub fn syscall6(
128
+ number: SYS,
129
+ arg1: syscall_arg_t,
130
+ arg2: syscall_arg_t,
131
+ arg3: syscall_arg_t,
132
+ arg4: syscall_arg_t,
133
+ arg5: syscall_arg_t,
134
+ arg6: syscall_arg_t,
135
+ ) u32 {
136
+ return asm volatile (
137
+ \\ trapa #31
138
+ \\ or r0, r0
139
+ \\ or r0, r0
140
+ \\ or r0, r0
141
+ \\ or r0, r0
142
+ \\ or r0, r0
143
+ : [ret] "={r0}" (-> u32),
144
+ : [number] "{r3}" (@intFromEnum(number)),
145
+ [arg1] "{r4}" (arg1),
146
+ [arg2] "{r5}" (arg2),
147
+ [arg3] "{r6}" (arg3),
148
+ [arg4] "{r7}" (arg4),
149
+ [arg5] "{r0}" (arg5),
150
+ [arg6] "{r1}" (arg6),
151
+ : .{ .memory = true });
152
+ }
153
+
154
+ pub fn clone() callconv(.naked) u32 {
155
+ // __clone(func, stack, flags, arg, ptid, tls, ctid)
156
+ // r4, r5, r6, r7, +0, +4, +8
157
+ //
158
+ // syscall(SYS_clone, flags, stack, ptid, ctid, tls)
159
+ // r3 r4, r5, r6, r7, r0
160
+ asm volatile (
161
+ \\ mov #-4, r0
162
+ \\ and r0, r5
163
+ \\
164
+ \\ mov r4, r1
165
+ \\ mov r7, r2
166
+ \\
167
+ \\ mov #120, r3 ! SYS_clone
168
+ \\ mov r6, r4
169
+ \\ mov.l @r15, r6
170
+ \\ mov.l @(r15, 8), r7
171
+ \\ mov.l @(r15, 4), r0
172
+ \\ trapa #31
173
+ \\ or r0, r0
174
+ \\ or r0, r0
175
+ \\ or r0, r0
176
+ \\ or r0, r0
177
+ \\ or r0, r0
178
+ \\
179
+ \\ cmp/eq #0, r0
180
+ \\ bt 1f
181
+ \\
182
+ \\ // parent
183
+ \\ rts
184
+ \\ nop
185
+ \\
186
+ \\ // child
187
+ \\1:
188
+ );
189
+ if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile (
190
+ \\ .cfi_undefined pr
191
+ );
192
+ asm volatile (
193
+ \\ mov #0, r0
194
+ \\ lds r0, pr
195
+ \\ mov r0, r14
196
+ \\
197
+ \\ mov r2, r4
198
+ \\ jsr @r1
199
+ \\ nop
200
+ \\
201
+ \\ mov #1, r3 ! SYS_exit
202
+ \\ trapa #31
203
+ \\ or r0, r0
204
+ \\ or r0, r0
205
+ \\ or r0, r0
206
+ \\ or r0, r0
207
+ \\ or r0, r0
208
+ );
209
+ }
210
+
211
+ pub fn restore() callconv(.naked) noreturn {
212
+ asm volatile (
213
+ \\ trapa #31
214
+ \\ or r0, r0
215
+ \\ or r0, r0
216
+ \\ or r0, r0
217
+ \\ or r0, r0
218
+ \\ or r0, r0
219
+ :
220
+ : [number] "{r3}" (@intFromEnum(SYS.sigreturn)),
221
+ );
222
+ }
223
+
224
+ pub fn restore_rt() callconv(.naked) noreturn {
225
+ asm volatile (
226
+ \\ trapa #31
227
+ \\ or r0, r0
228
+ \\ or r0, r0
229
+ \\ or r0, r0
230
+ \\ or r0, r0
231
+ \\ or r0, r0
232
+ :
233
+ : [number] "{r3}" (@intFromEnum(SYS.rt_sigreturn)),
234
+ );
235
+ }
236
+
237
+ pub const time_t = i32;
238
+
239
+ pub const VDSO = void;
@@ -0,0 +1,277 @@
1
+ const builtin = @import("builtin");
2
+ const std = @import("../../std.zig");
3
+ const SYS = std.os.linux.SYS;
4
+
5
+ pub const syscall_arg_t = u32;
6
+
7
+ pub fn syscall0(
8
+ number: SYS,
9
+ ) u32 {
10
+ return asm volatile (
11
+ \\ t 0x10
12
+ \\ bcc 1f
13
+ \\ nop
14
+ \\ neg %%o0
15
+ \\1:
16
+ : [ret] "={o0}" (-> u32),
17
+ : [number] "{g1}" (@intFromEnum(number)),
18
+ : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
19
+ }
20
+
21
+ pub fn syscall1(
22
+ number: SYS,
23
+ arg1: syscall_arg_t,
24
+ ) u32 {
25
+ return asm volatile (
26
+ \\ t 0x10
27
+ \\ bcc 1f
28
+ \\ nop
29
+ \\ neg %%o0
30
+ \\1:
31
+ : [ret] "={o0}" (-> u32),
32
+ : [number] "{g1}" (@intFromEnum(number)),
33
+ [arg1] "{o0}" (arg1),
34
+ : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
35
+ }
36
+
37
+ pub fn syscall2(
38
+ number: SYS,
39
+ arg1: syscall_arg_t,
40
+ arg2: syscall_arg_t,
41
+ ) u32 {
42
+ return asm volatile (
43
+ \\ t 0x10
44
+ \\ bcc 1f
45
+ \\ nop
46
+ \\ neg %%o0
47
+ \\1:
48
+ : [ret] "={o0}" (-> u32),
49
+ : [number] "{g1}" (@intFromEnum(number)),
50
+ [arg1] "{o0}" (arg1),
51
+ [arg2] "{o1}" (arg2),
52
+ : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
53
+ }
54
+
55
+ pub fn syscall3(
56
+ number: SYS,
57
+ arg1: syscall_arg_t,
58
+ arg2: syscall_arg_t,
59
+ arg3: syscall_arg_t,
60
+ ) u32 {
61
+ return asm volatile (
62
+ \\ t 0x10
63
+ \\ bcc 1f
64
+ \\ nop
65
+ \\ neg %%o0
66
+ \\1:
67
+ : [ret] "={o0}" (-> u32),
68
+ : [number] "{g1}" (@intFromEnum(number)),
69
+ [arg1] "{o0}" (arg1),
70
+ [arg2] "{o1}" (arg2),
71
+ [arg3] "{o2}" (arg3),
72
+ : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
73
+ }
74
+
75
+ pub fn syscall4(
76
+ number: SYS,
77
+ arg1: syscall_arg_t,
78
+ arg2: syscall_arg_t,
79
+ arg3: syscall_arg_t,
80
+ arg4: syscall_arg_t,
81
+ ) u32 {
82
+ return asm volatile (
83
+ \\ t 0x10
84
+ \\ bcc 1f
85
+ \\ nop
86
+ \\ neg %%o0
87
+ \\1:
88
+ : [ret] "={o0}" (-> u32),
89
+ : [number] "{g1}" (@intFromEnum(number)),
90
+ [arg1] "{o0}" (arg1),
91
+ [arg2] "{o1}" (arg2),
92
+ [arg3] "{o2}" (arg3),
93
+ [arg4] "{o3}" (arg4),
94
+ : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
95
+ }
96
+
97
+ pub fn syscall5(
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
+ ) u32 {
105
+ return asm volatile (
106
+ \\ t 0x10
107
+ \\ bcc 1f
108
+ \\ nop
109
+ \\ neg %%o0
110
+ \\1:
111
+ : [ret] "={o0}" (-> u32),
112
+ : [number] "{g1}" (@intFromEnum(number)),
113
+ [arg1] "{o0}" (arg1),
114
+ [arg2] "{o1}" (arg2),
115
+ [arg3] "{o2}" (arg3),
116
+ [arg4] "{o3}" (arg4),
117
+ [arg5] "{o4}" (arg5),
118
+ : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
119
+ }
120
+
121
+ pub fn syscall6(
122
+ number: SYS,
123
+ arg1: syscall_arg_t,
124
+ arg2: syscall_arg_t,
125
+ arg3: syscall_arg_t,
126
+ arg4: syscall_arg_t,
127
+ arg5: syscall_arg_t,
128
+ arg6: syscall_arg_t,
129
+ ) u32 {
130
+ return asm volatile (
131
+ \\ t 0x10
132
+ \\ bcc 1f
133
+ \\ nop
134
+ \\ neg %%o0
135
+ \\1:
136
+ : [ret] "={o0}" (-> u32),
137
+ : [number] "{g1}" (@intFromEnum(number)),
138
+ [arg1] "{o0}" (arg1),
139
+ [arg2] "{o1}" (arg2),
140
+ [arg3] "{o2}" (arg3),
141
+ [arg4] "{o3}" (arg4),
142
+ [arg5] "{o4}" (arg5),
143
+ [arg6] "{o5}" (arg6),
144
+ : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
145
+ }
146
+
147
+ pub fn syscall_pipe(
148
+ fd: *[2]std.os.linux.fd_t,
149
+ ) u32 {
150
+ return asm volatile (
151
+ \\ mov %[arg], %%g3
152
+ \\ t 0x10
153
+ \\ bcc 1f
154
+ \\ nop
155
+ \\ # Return the error code
156
+ \\ ba 2f
157
+ \\ neg %%o0
158
+ \\1:
159
+ \\ st %%o0, [%%g3+0]
160
+ \\ st %%o1, [%%g3+4]
161
+ \\ clr %%o0
162
+ \\2:
163
+ : [ret] "={o0}" (-> u32),
164
+ : [number] "{g1}" (@intFromEnum(SYS.pipe)),
165
+ [arg] "r" (fd),
166
+ : .{ .memory = true, .g3 = true });
167
+ }
168
+
169
+ pub fn syscall_fork() u32 {
170
+ // Linux/sparc fork() returns two values in %o0 and %o1:
171
+ // - On the parent's side, %o0 is the child's PID and %o1 is 0.
172
+ // - On the child's side, %o0 is the parent's PID and %o1 is 1.
173
+ // We need to clear the child's %o0 so that the return values
174
+ // conform to the libc convention.
175
+ return asm volatile (
176
+ \\ t 0x10
177
+ \\ bcc 1f
178
+ \\ nop
179
+ \\ ba 2f
180
+ \\ neg %%o0
181
+ \\1:
182
+ \\ # Clear the child's %%o0
183
+ \\ dec %%o1
184
+ \\ and %%o1, %%o0, %%o0
185
+ \\2:
186
+ : [ret] "={o0}" (-> u32),
187
+ : [number] "{g1}" (@intFromEnum(SYS.fork)),
188
+ : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
189
+ }
190
+
191
+ pub fn clone() callconv(.naked) u32 {
192
+ // __clone(func, stack, flags, arg, ptid, tls, ctid)
193
+ // i0, i1, i2, i3, i4, i5, sp
194
+ //
195
+ // syscall(SYS_clone, flags, stack, ptid, tls, ctid)
196
+ // g1 o0, o1, o2, o3, o4
197
+ asm volatile (
198
+ \\ save %%sp, -96, %%sp
199
+ \\
200
+ \\ // clone() on SPARC can fail with EFAULT if %%sp points to uncommitted memory, so flush
201
+ \\ // all register windows up to this point to ensure that the kernel has enough committed
202
+ \\ // memory for its stack frame.
203
+ \\ save %%sp, -96, %%sp
204
+ \\ t 0x3
205
+ \\ restore
206
+ \\
207
+ \\ # Save the func pointer and the arg pointer
208
+ \\ mov %%i0, %%g2
209
+ \\ mov %%i3, %%g3
210
+ \\
211
+ \\ # Shuffle the arguments
212
+ \\ mov 217, %%g1 // SYS_clone
213
+ \\ mov %%i2, %%o0
214
+ \\
215
+ \\ # Align, and add some extra space for the initial frame
216
+ \\ and %%i1, -8, %%i1
217
+ \\ sub %%i1, 96 + 2047, %%o1
218
+ \\
219
+ \\ mov %%i4, %%o2
220
+ \\ mov %%i5, %%o3
221
+ \\ ld [%%fp + 92 + 2047], %%o4
222
+ \\ t 0x10
223
+ \\ bcs 1f
224
+ \\ nop
225
+ \\ # The child pid is returned in o0 while o1 tells if this
226
+ \\ # process is the child (=1) or the parent (=0).
227
+ \\ tst %%o1
228
+ \\ bne 2f
229
+ \\ nop
230
+ \\
231
+ \\ # Parent process, return the child pid
232
+ \\ mov %%o0, %%i0
233
+ \\ ret
234
+ \\ restore
235
+ \\
236
+ \\1:
237
+ \\ # The syscall failed
238
+ \\ sub %%g0, %%o0, %%i0
239
+ \\ ret
240
+ \\ restore
241
+ \\
242
+ \\2:
243
+ \\ # Child process
244
+ );
245
+ if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile (
246
+ \\ .cfi_undefined %%i7
247
+ );
248
+ asm volatile (
249
+ \\ mov %%g0, %%fp
250
+ \\ mov %%g0, %%i7
251
+ \\
252
+ \\ # call func(arg)
253
+ \\ call %%g2
254
+ \\ mov %%g3, %%o0
255
+ \\ # Exit
256
+ \\ mov 1, %%g1 // SYS_exit
257
+ \\ t 0x10
258
+ );
259
+ }
260
+
261
+ pub const restore = restore_rt;
262
+
263
+ // Need to use C ABI here instead of naked
264
+ // to prevent an infinite loop when calling rt_sigreturn.
265
+ pub fn restore_rt() callconv(.c) void {
266
+ return asm volatile ("t 0x10"
267
+ :
268
+ : [number] "{g1}" (@intFromEnum(SYS.rt_sigreturn)),
269
+ : .{ .memory = true, .xcc = true, .o0 = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
270
+ }
271
+
272
+ pub const VDSO = struct {
273
+ pub const CGT_SYM = "__vdso_clock_gettime";
274
+ pub const CGT_VER = "LINUX_2.6";
275
+ };
276
+
277
+ pub const time_t = i32;
@@ -10,9 +10,9 @@ pub fn syscall0(
10
10
  return asm volatile (
11
11
  \\ t 0x6d
12
12
  \\ bcc,pt %%xcc, 1f
13
- \\ nop
13
+ \\ nop
14
14
  \\ neg %%o0
15
- \\ 1:
15
+ \\1:
16
16
  : [ret] "={o0}" (-> u64),
17
17
  : [number] "{g1}" (@intFromEnum(number)),
18
18
  : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
@@ -25,9 +25,9 @@ pub fn syscall1(
25
25
  return asm volatile (
26
26
  \\ t 0x6d
27
27
  \\ bcc,pt %%xcc, 1f
28
- \\ nop
28
+ \\ nop
29
29
  \\ neg %%o0
30
- \\ 1:
30
+ \\1:
31
31
  : [ret] "={o0}" (-> u64),
32
32
  : [number] "{g1}" (@intFromEnum(number)),
33
33
  [arg1] "{o0}" (arg1),
@@ -42,9 +42,9 @@ pub fn syscall2(
42
42
  return asm volatile (
43
43
  \\ t 0x6d
44
44
  \\ bcc,pt %%xcc, 1f
45
- \\ nop
45
+ \\ nop
46
46
  \\ neg %%o0
47
- \\ 1:
47
+ \\1:
48
48
  : [ret] "={o0}" (-> u64),
49
49
  : [number] "{g1}" (@intFromEnum(number)),
50
50
  [arg1] "{o0}" (arg1),
@@ -61,9 +61,9 @@ pub fn syscall3(
61
61
  return asm volatile (
62
62
  \\ t 0x6d
63
63
  \\ bcc,pt %%xcc, 1f
64
- \\ nop
64
+ \\ nop
65
65
  \\ neg %%o0
66
- \\ 1:
66
+ \\1:
67
67
  : [ret] "={o0}" (-> u64),
68
68
  : [number] "{g1}" (@intFromEnum(number)),
69
69
  [arg1] "{o0}" (arg1),
@@ -82,9 +82,9 @@ pub fn syscall4(
82
82
  return asm volatile (
83
83
  \\ t 0x6d
84
84
  \\ bcc,pt %%xcc, 1f
85
- \\ nop
85
+ \\ nop
86
86
  \\ neg %%o0
87
- \\ 1:
87
+ \\1:
88
88
  : [ret] "={o0}" (-> u64),
89
89
  : [number] "{g1}" (@intFromEnum(number)),
90
90
  [arg1] "{o0}" (arg1),
@@ -105,9 +105,9 @@ pub fn syscall5(
105
105
  return asm volatile (
106
106
  \\ t 0x6d
107
107
  \\ bcc,pt %%xcc, 1f
108
- \\ nop
108
+ \\ nop
109
109
  \\ neg %%o0
110
- \\ 1:
110
+ \\1:
111
111
  : [ret] "={o0}" (-> u64),
112
112
  : [number] "{g1}" (@intFromEnum(number)),
113
113
  [arg1] "{o0}" (arg1),
@@ -130,9 +130,9 @@ pub fn syscall6(
130
130
  return asm volatile (
131
131
  \\ t 0x6d
132
132
  \\ bcc,pt %%xcc, 1f
133
- \\ nop
133
+ \\ nop
134
134
  \\ neg %%o0
135
- \\ 1:
135
+ \\1:
136
136
  : [ret] "={o0}" (-> u64),
137
137
  : [number] "{g1}" (@intFromEnum(number)),
138
138
  [arg1] "{o0}" (arg1),
@@ -151,10 +151,10 @@ pub fn syscall_pipe(
151
151
  \\ mov %[arg], %%g3
152
152
  \\ t 0x6d
153
153
  \\ bcc,pt %%xcc, 1f
154
- \\ nop
154
+ \\ nop
155
155
  \\ # Return the error code
156
156
  \\ ba 2f
157
- \\ neg %%o0
157
+ \\ neg %%o0
158
158
  \\1:
159
159
  \\ st %%o0, [%%g3+0]
160
160
  \\ st %%o1, [%%g3+4]
@@ -175,14 +175,14 @@ pub fn syscall_fork() u64 {
175
175
  return asm volatile (
176
176
  \\ t 0x6d
177
177
  \\ bcc,pt %%xcc, 1f
178
- \\ nop
178
+ \\ nop
179
179
  \\ ba 2f
180
- \\ neg %%o0
181
- \\ 1:
180
+ \\ neg %%o0
181
+ \\1:
182
182
  \\ # Clear the child's %%o0
183
183
  \\ dec %%o1
184
184
  \\ and %%o1, %%o0, %%o0
185
- \\ 2:
185
+ \\2:
186
186
  : [ret] "={o0}" (-> u64),
187
187
  : [number] "{g1}" (@intFromEnum(SYS.fork)),
188
188
  : .{ .memory = true, .xcc = true, .o1 = true, .o2 = true, .o3 = true, .o4 = true, .o5 = true, .o7 = true });
@@ -196,33 +196,48 @@ pub fn clone() callconv(.naked) u64 {
196
196
  // g1 o0, o1, o2, o3, o4
197
197
  asm volatile (
198
198
  \\ save %%sp, -192, %%sp
199
+ \\
200
+ \\ // clone() on SPARC can fail with EFAULT if %%sp points to uncommitted memory, so flush
201
+ \\ // all register windows up to this point to ensure that the kernel has enough committed
202
+ \\ // memory for its stack frame.
203
+ \\ save %%sp, -192, %%sp
204
+ \\ flushw
205
+ \\ restore
206
+ \\
199
207
  \\ # Save the func pointer and the arg pointer
200
208
  \\ mov %%i0, %%g2
201
209
  \\ mov %%i3, %%g3
210
+ \\
202
211
  \\ # Shuffle the arguments
203
212
  \\ mov 217, %%g1 // SYS_clone
204
213
  \\ mov %%i2, %%o0
205
- \\ # Add some extra space for the initial frame
206
- \\ sub %%i1, 176 + 2047, %%o1
214
+ \\
215
+ \\ # Align, and add some extra space for the initial frame
216
+ \\ and %%i1, -16, %%i1
217
+ \\ sub %%i1, 192 + 2047, %%o1
218
+ \\
207
219
  \\ mov %%i4, %%o2
208
220
  \\ mov %%i5, %%o3
209
- \\ ldx [%%fp + 0x8af], %%o4
221
+ \\ ldx [%%fp + 176 + 2047], %%o4
210
222
  \\ t 0x6d
211
223
  \\ bcs,pn %%xcc, 1f
212
- \\ nop
224
+ \\ nop
213
225
  \\ # The child pid is returned in o0 while o1 tells if this
214
- \\ # process is # the child (=1) or the parent (=0).
226
+ \\ # process is the child (=1) or the parent (=0).
215
227
  \\ brnz %%o1, 2f
216
- \\ nop
228
+ \\ nop
229
+ \\
217
230
  \\ # Parent process, return the child pid
218
231
  \\ mov %%o0, %%i0
219
232
  \\ ret
220
- \\ restore
233
+ \\ restore
234
+ \\
221
235
  \\1:
222
236
  \\ # The syscall failed
223
237
  \\ sub %%g0, %%o0, %%i0
224
238
  \\ ret
225
- \\ restore
239
+ \\ restore
240
+ \\
226
241
  \\2:
227
242
  \\ # Child process
228
243
  );
@@ -234,9 +249,8 @@ pub fn clone() callconv(.naked) u64 {
234
249
  \\ mov %%g0, %%i7
235
250
  \\
236
251
  \\ # call func(arg)
237
- \\ mov %%g0, %%fp
238
252
  \\ call %%g2
239
- \\ mov %%g3, %%o0
253
+ \\ mov %%g3, %%o0
240
254
  \\ # Exit
241
255
  \\ mov 1, %%g1 // SYS_exit
242
256
  \\ t 0x6d