authorgravatar for krystiannowak212@gmail.comkrystiann <krystiannowak212@gmail.com> 2026-03-18 00:30:11-07:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-04-14 12:51:44+02:00
log8578b07faaa61f772e928961e3546156c14677dd
tree6d9134a5c57ba4055f30f7d39930b3f9dbb0dc1d
parent7977ef80f9ca1603633e9d7f66f59d57ac887da3

std.os.linux: add arc arch bits


2 files changed, 158 insertions(+), 2 deletions(-)

lib/std/os/linux.zig+14-2
...@@ -31,6 +31,7 @@ test {...@@ -31,6 +31,7 @@ test {
3131
32const arch_bits = switch (native_arch) {32const arch_bits = switch (native_arch) {
33 .aarch64, .aarch64_be => @import("linux/aarch64.zig"),33 .aarch64, .aarch64_be => @import("linux/aarch64.zig"),
34 .arc, .arceb => @import("linux/arc.zig"),
34 .arm, .armeb, .thumb, .thumbeb => @import("linux/arm.zig"),35 .arm, .armeb, .thumb, .thumbeb => @import("linux/arm.zig"),
35 .hexagon => @import("linux/hexagon.zig"),36 .hexagon => @import("linux/hexagon.zig"),
36 .loongarch32 => @import("linux/loongarch32.zig"),37 .loongarch32 => @import("linux/loongarch32.zig"),
...@@ -274,7 +275,13 @@ pub const MAP = switch (native_arch) {...@@ -274,7 +275,13 @@ pub const MAP = switch (native_arch) {
274 UNINITIALIZED: bool = false,275 UNINITIALIZED: bool = false,
275 _: u5 = 0,276 _: u5 = 0,
276 },277 },
277 .hexagon, .m68k, .or1k, .s390x => packed struct(u32) {278 .arc,
279 .arceb,
280 .hexagon,
281 .m68k,
282 .or1k,
283 .s390x,
284 => packed struct(u32) {
278 TYPE: MAP_TYPE,285 TYPE: MAP_TYPE,
279 FIXED: bool = false,286 FIXED: bool = false,
280 ANONYMOUS: bool = false,287 ANONYMOUS: bool = false,
...@@ -451,7 +458,12 @@ pub const O = switch (native_arch) {...@@ -451,7 +458,12 @@ pub const O = switch (native_arch) {
451 TMPFILE: bool = false,458 TMPFILE: bool = false,
452 _23: u9 = 0,459 _23: u9 = 0,
453 },460 },
454 .hexagon, .or1k, .s390x => packed struct(u32) {461 .arc,
462 .arceb,
463 .hexagon,
464 .or1k,
465 .s390x,
466 => packed struct(u32) {
455 ACCMODE: ACCMODE = .RDONLY,467 ACCMODE: ACCMODE = .RDONLY,
456 _2: u4 = 0,468 _2: u4 = 0,
457 CREAT: bool = false,469 CREAT: bool = false,
lib/std/os/linux/arc.zig created+144
...@@ -0,0 +1,144 @@
1const builtin = @import("builtin");
2const std = @import("../../std.zig");
3const SYS = std.os.linux.SYS;
4
5pub fn syscall0(number: SYS) u32 {
6 return asm volatile ("trap_s 0"
7 : [ret] "={r0}" (-> u32),
8 : [number] "{r8}" (@intFromEnum(number)),
9 : .{ .memory = true });
10}
11
12pub fn syscall1(number: SYS, arg1: u32) u32 {
13 return asm volatile ("trap_s 0"
14 : [ret] "={r0}" (-> u32),
15 : [number] "{r8}" (@intFromEnum(number)),
16 [arg1] "{r0}" (arg1),
17 : .{ .memory = true });
18}
19
20pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
21 return asm volatile ("trap_s 0"
22 : [ret] "={r0}" (-> u32),
23 : [number] "{r8}" (@intFromEnum(number)),
24 [arg1] "{r0}" (arg1),
25 [arg2] "{r1}" (arg2),
26 : .{ .memory = true });
27}
28
29pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
30 return asm volatile ("trap_s 0"
31 : [ret] "={r0}" (-> u32),
32 : [number] "{r8}" (@intFromEnum(number)),
33 [arg1] "{r0}" (arg1),
34 [arg2] "{r1}" (arg2),
35 [arg3] "{r2}" (arg3),
36 : .{ .memory = true });
37}
38
39pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
40 return asm volatile ("trap_s 0"
41 : [ret] "={r0}" (-> u32),
42 : [number] "{r8}" (@intFromEnum(number)),
43 [arg1] "{r0}" (arg1),
44 [arg2] "{r1}" (arg2),
45 [arg3] "{r2}" (arg3),
46 [arg4] "{r3}" (arg4),
47 : .{ .memory = true });
48}
49
50pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
51 return asm volatile ("trap_s 0"
52 : [ret] "={r0}" (-> u32),
53 : [number] "{r8}" (@intFromEnum(number)),
54 [arg1] "{r0}" (arg1),
55 [arg2] "{r1}" (arg2),
56 [arg3] "{r2}" (arg3),
57 [arg4] "{r3}" (arg4),
58 [arg5] "{r4}" (arg5),
59 : .{ .memory = true });
60}
61
62pub fn syscall6(
63 number: SYS,
64 arg1: u32,
65 arg2: u32,
66 arg3: u32,
67 arg4: u32,
68 arg5: u32,
69 arg6: u32,
70) u32 {
71 return asm volatile ("trap_s 0"
72 : [ret] "={r0}" (-> u32),
73 : [number] "{r8}" (@intFromEnum(number)),
74 [arg1] "{r0}" (arg1),
75 [arg2] "{r1}" (arg2),
76 [arg3] "{r2}" (arg3),
77 [arg4] "{r3}" (arg4),
78 [arg5] "{r4}" (arg5),
79 [arg6] "{r5}" (arg6),
80 : .{ .memory = true });
81}
82
83pub fn clone() callconv(.naked) u32 {
84 // __clone(func, stack, flags, arg, ptid, tls, ctid)
85 // r0, r1, r2, r3, r4, r5, r6
86 //
87 // syscall(SYS_clone, flags, stack, ptid, tls, ctid)
88 // r8 r0, r1, r2, r3, r4
89 asm volatile (
90 \\ // Align stack pointer
91 \\ and r1, r1, -16
92 \\ mov r10, r0
93 \\ mov r11, r3
94 \\ // Setup the arguments
95 \\ mov r0, r2
96 \\ mov r2, r4
97 \\ mov r3, r5
98 \\ mov r4, r6
99 \\ mov r8, 220 // SYS_clone
100 \\ trap_s 0
101 \\ cmp r0, 0
102 \\ beq 1f
103 \\ j [blink]
104 \\ // Child
105 \\ 1:
106 );
107 if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile (
108 \\ .cfi_undefined blink
109 );
110
111 asm volatile (
112 \\ mov fp, 0
113 \\ mov blink, 0
114 \\
115 \\ mov r0, r11
116 \\ jl [r10]
117 \\
118 \\ // Exit
119 \\ mov r8, 93 // SYS_exit
120 \\ trap_s 0
121 );
122}
123
124pub const restore = restore_rt;
125
126pub fn restore_rt() callconv(.naked) noreturn {
127 switch (builtin.zig_backend) {
128 .stage2_c => asm volatile (
129 \\ mov r8, %[number]
130 \\ trap_s 0
131 :
132 : [number] "I" (@intFromEnum(SYS.rt_sigreturn)),
133 ),
134 else => asm volatile (
135 \\ trap_s 0
136 :
137 : [number] "{r8}" (@intFromEnum(SYS.rt_sigreturn)),
138 ),
139 }
140}
141
142pub const time_t = i64;
143
144pub const VDSO = void;