authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-03-19 19:52:11+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-03-19 19:53:03+01:00
loga62d8e332330dbae2681bca6ca353dd26c9c7b3a
tree8af8dd7ed7735d50f6356c24b9513c9c45875b06
parent57db8498df5db731e0680ec979e01da0c0eae2cf
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

std.os.linux: add loongarch32 arch bits

closes https://codeberg.org/ziglang/zig/issues/30948

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

lib/std/os/linux.zig+5-2
......@@ -33,6 +33,7 @@ const arch_bits = switch (native_arch) {
3333 .aarch64, .aarch64_be => @import("linux/aarch64.zig"),
3434 .arm, .armeb, .thumb, .thumbeb => @import("linux/arm.zig"),
3535 .hexagon => @import("linux/hexagon.zig"),
36 .loongarch32 => @import("linux/loongarch32.zig"),
3637 .loongarch64 => @import("linux/loongarch64.zig"),
3738 .m68k => @import("linux/m68k.zig"),
3839 .mips, .mipsel => @import("linux/mips.zig"),
......@@ -194,7 +195,7 @@ pub const MAP = switch (native_arch) {
194195 UNINITIALIZED: bool = false,
195196 _: u5 = 0,
196197 },
197 .riscv32, .riscv64, .loongarch64 => packed struct(u32) {
198 .riscv32, .riscv64, .loongarch32, .loongarch64 => packed struct(u32) {
198199 TYPE: MAP_TYPE,
199200 FIXED: bool = false,
200201 ANONYMOUS: bool = false,
......@@ -330,7 +331,7 @@ pub const O = switch (native_arch) {
330331 TMPFILE: bool = false,
331332 _23: u9 = 0,
332333 },
333 .x86, .riscv32, .riscv64, .loongarch64 => packed struct(u32) {
334 .x86, .riscv32, .riscv64, .loongarch32, .loongarch64 => packed struct(u32) {
334335 ACCMODE: ACCMODE = .RDONLY,
335336 _2: u4 = 0,
336337 CREAT: bool = false,
......@@ -6345,6 +6346,7 @@ pub const MINSIGSTKSZ = switch (native_arch) {
63456346 .xtensa,
63466347 .xtensaeb,
63476348 => 2048,
6349 .loongarch32,
63486350 .loongarch64,
63496351 .sparc,
63506352 .sparc64,
......@@ -6384,6 +6386,7 @@ pub const SIGSTKSZ = switch (native_arch) {
63846386 => 8192,
63856387 .aarch64,
63866388 .aarch64_be,
6389 .loongarch32,
63876390 .loongarch64,
63886391 .sparc,
63896392 .sparc64,
lib/std/os/linux/loongarch32.zig created+135
......@@ -0,0 +1,135 @@
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 (
7 \\ syscall 0
8 : [ret] "={$r4}" (-> u32),
9 : [number] "{$r11}" (@intFromEnum(number)),
10 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
11}
12
13pub fn syscall1(number: SYS, arg1: u32) u32 {
14 return asm volatile (
15 \\ syscall 0
16 : [ret] "={$r4}" (-> u32),
17 : [number] "{$r11}" (@intFromEnum(number)),
18 [arg1] "{$r4}" (arg1),
19 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
20}
21
22pub fn syscall2(number: SYS, arg1: u32, arg2: u32) u32 {
23 return asm volatile (
24 \\ syscall 0
25 : [ret] "={$r4}" (-> u32),
26 : [number] "{$r11}" (@intFromEnum(number)),
27 [arg1] "{$r4}" (arg1),
28 [arg2] "{$r5}" (arg2),
29 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
30}
31
32pub fn syscall3(number: SYS, arg1: u32, arg2: u32, arg3: u32) u32 {
33 return asm volatile (
34 \\ syscall 0
35 : [ret] "={$r4}" (-> u32),
36 : [number] "{$r11}" (@intFromEnum(number)),
37 [arg1] "{$r4}" (arg1),
38 [arg2] "{$r5}" (arg2),
39 [arg3] "{$r6}" (arg3),
40 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
41}
42
43pub fn syscall4(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32) u32 {
44 return asm volatile (
45 \\ syscall 0
46 : [ret] "={$r4}" (-> u32),
47 : [number] "{$r11}" (@intFromEnum(number)),
48 [arg1] "{$r4}" (arg1),
49 [arg2] "{$r5}" (arg2),
50 [arg3] "{$r6}" (arg3),
51 [arg4] "{$r7}" (arg4),
52 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
53}
54
55pub fn syscall5(number: SYS, arg1: u32, arg2: u32, arg3: u32, arg4: u32, arg5: u32) u32 {
56 return asm volatile (
57 \\ syscall 0
58 : [ret] "={$r4}" (-> u32),
59 : [number] "{$r11}" (@intFromEnum(number)),
60 [arg1] "{$r4}" (arg1),
61 [arg2] "{$r5}" (arg2),
62 [arg3] "{$r6}" (arg3),
63 [arg4] "{$r7}" (arg4),
64 [arg5] "{$r8}" (arg5),
65 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
66}
67
68pub fn syscall6(
69 number: SYS,
70 arg1: u32,
71 arg2: u32,
72 arg3: u32,
73 arg4: u32,
74 arg5: u32,
75 arg6: u32,
76) u32 {
77 return asm volatile (
78 \\ syscall 0
79 : [ret] "={$r4}" (-> u32),
80 : [number] "{$r11}" (@intFromEnum(number)),
81 [arg1] "{$r4}" (arg1),
82 [arg2] "{$r5}" (arg2),
83 [arg3] "{$r6}" (arg3),
84 [arg4] "{$r7}" (arg4),
85 [arg5] "{$r8}" (arg5),
86 [arg6] "{$r9}" (arg6),
87 : .{ .r12 = true, .r13 = true, .r14 = true, .r15 = true, .r16 = true, .r17 = true, .r18 = true, .r19 = true, .r20 = true, .memory = true });
88}
89
90// FIXME
91pub fn clone() callconv(.naked) u32 {
92 // __clone(func, stack, flags, arg, ptid, tls, ctid)
93 // a0, a1, a2, a3, a4, a5, a6
94 // sys_clone(flags, stack, ptid, ctid, tls)
95 // a0, a1, a2, a3, a4
96 asm volatile (
97 \\ srli.w $a1, $a1, 4
98 \\ slli.w $a1, $a1, 4
99 \\
100 \\ # Save function pointer and argument pointer on new thread stack
101 \\ addi.w $a1, $a1, -16
102 \\ st.w $a0, $a1, 0 # save function pointer
103 \\ st.w $a3, $a1, 4 # save argument pointer
104 \\ or $a0, $a2, $zero
105 \\ or $a2, $a4, $zero
106 \\ or $a3, $a6, $zero
107 \\ or $a4, $a5, $zero
108 \\ ori $a7, $zero, 220 # SYS_clone
109 \\ syscall 0
110 \\
111 \\ beq $a0, $zero, 1f
112 \\ jirl $zero, $ra, 0
113 \\1:
114 );
115 if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile (
116 \\ .cfi_undefined 1
117 );
118 asm volatile (
119 \\ move $fp, $zero
120 \\ move $ra, $zero
121 \\
122 \\ ld.w $t8, $sp, 0 # function pointer
123 \\ ld.w $a0, $sp, 4 # argument pointer
124 \\ jirl $ra, $t8, 0 # call the user's function
125 \\ ori $a7, $zero, 93 # SYS_exit
126 \\ syscall 0 # child process exit
127 );
128}
129
130pub const time_t = i64;
131
132pub const VDSO = struct {
133 pub const CGT_SYM = "__vdso_clock_gettime";
134 pub const CGT_VER = "LINUX_5.10";
135};