@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.
- package/c/math.zig +10 -0
- package/compiler/Maker/Step/TranslateC.zig +8 -4
- package/compiler_rt/log.zig +230 -3
- package/compiler_rt/log10.zig +228 -3
- package/compiler_rt/log2.zig +221 -3
- package/compiler_rt/log_f128.zig +173 -0
- package/package.json +1 -1
- package/std/Io/Writer.zig +6 -2
- package/std/Thread.zig +22 -2
- package/std/c/darwin.zig +6 -0
- package/std/c.zig +26 -5
- package/std/compress/flate/Compress.zig +4 -2
- package/std/crypto/ff.zig +3 -1
- package/std/crypto/tls/Client.zig +17 -2
- package/std/debug/cpu_context.zig +3 -3
- package/std/heap/BrkAllocator.zig +1 -1
- package/std/json/static.zig +2 -1
- package/std/math/isnan.zig +5 -0
- package/std/math/log1p.zig +13 -19
- package/std/math.zig +5 -0
- package/std/meta.zig +3 -12
- package/std/os/linux/csky.zig +165 -0
- package/std/os/linux/microblaze.zig +170 -0
- package/std/os/linux/sh.zig +239 -0
- package/std/os/linux/sparc.zig +277 -0
- package/std/os/linux/sparc64.zig +44 -30
- package/std/os/linux/syscalls.zig +1718 -12
- package/std/os/linux.zig +37 -8
- package/std/os/uefi/protocol/file.zig +16 -0
- package/std/os.zig +0 -10
- package/std/start.zig +5 -5
- package/std/static_string_map.zig +59 -1
- package/std/zig/LibCInstallation.zig +2 -2
- package/std/zig/Parse.zig +1 -1
- package/std/zig/PkgConfig.zig +5 -0
- package/std/zig/system/darwin/macos.zig +11 -7
- package/std/zig/system.zig +1 -1
- package/zig.h +38 -10
- package/libc/musl/src/math/i386/log1p.s +0 -25
- package/libc/musl/src/math/i386/log1pf.s +0 -26
- package/libc/musl/src/math/log1p.c +0 -122
- 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;
|
package/std/os/linux/sparc64.zig
CHANGED
|
@@ -10,9 +10,9 @@ pub fn syscall0(
|
|
|
10
10
|
return asm volatile (
|
|
11
11
|
\\ t 0x6d
|
|
12
12
|
\\ bcc,pt %%xcc, 1f
|
|
13
|
-
\\
|
|
13
|
+
\\ nop
|
|
14
14
|
\\ neg %%o0
|
|
15
|
-
\\
|
|
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
|
-
\\
|
|
28
|
+
\\ nop
|
|
29
29
|
\\ neg %%o0
|
|
30
|
-
\\
|
|
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
|
-
\\
|
|
45
|
+
\\ nop
|
|
46
46
|
\\ neg %%o0
|
|
47
|
-
\\
|
|
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
|
-
\\
|
|
64
|
+
\\ nop
|
|
65
65
|
\\ neg %%o0
|
|
66
|
-
\\
|
|
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
|
-
\\
|
|
85
|
+
\\ nop
|
|
86
86
|
\\ neg %%o0
|
|
87
|
-
\\
|
|
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
|
-
\\
|
|
108
|
+
\\ nop
|
|
109
109
|
\\ neg %%o0
|
|
110
|
-
\\
|
|
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
|
-
\\
|
|
133
|
+
\\ nop
|
|
134
134
|
\\ neg %%o0
|
|
135
|
-
\\
|
|
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
|
-
\\
|
|
154
|
+
\\ nop
|
|
155
155
|
\\ # Return the error code
|
|
156
156
|
\\ ba 2f
|
|
157
|
-
\\
|
|
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
|
-
\\
|
|
178
|
+
\\ nop
|
|
179
179
|
\\ ba 2f
|
|
180
|
-
\\
|
|
181
|
-
\\
|
|
180
|
+
\\ neg %%o0
|
|
181
|
+
\\1:
|
|
182
182
|
\\ # Clear the child's %%o0
|
|
183
183
|
\\ dec %%o1
|
|
184
184
|
\\ and %%o1, %%o0, %%o0
|
|
185
|
-
\\
|
|
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
|
-
\\
|
|
206
|
-
\\
|
|
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 +
|
|
221
|
+
\\ ldx [%%fp + 176 + 2047], %%o4
|
|
210
222
|
\\ t 0x6d
|
|
211
223
|
\\ bcs,pn %%xcc, 1f
|
|
212
|
-
\\
|
|
224
|
+
\\ nop
|
|
213
225
|
\\ # The child pid is returned in o0 while o1 tells if this
|
|
214
|
-
\\ # process is
|
|
226
|
+
\\ # process is the child (=1) or the parent (=0).
|
|
215
227
|
\\ brnz %%o1, 2f
|
|
216
|
-
\\
|
|
228
|
+
\\ nop
|
|
229
|
+
\\
|
|
217
230
|
\\ # Parent process, return the child pid
|
|
218
231
|
\\ mov %%o0, %%i0
|
|
219
232
|
\\ ret
|
|
220
|
-
\\
|
|
233
|
+
\\ restore
|
|
234
|
+
\\
|
|
221
235
|
\\1:
|
|
222
236
|
\\ # The syscall failed
|
|
223
237
|
\\ sub %%g0, %%o0, %%i0
|
|
224
238
|
\\ ret
|
|
225
|
-
\\
|
|
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
|
-
\\
|
|
253
|
+
\\ mov %%g3, %%o0
|
|
240
254
|
\\ # Exit
|
|
241
255
|
\\ mov 1, %%g1 // SYS_exit
|
|
242
256
|
\\ t 0x6d
|