authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-05-30 18:59:33+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-05-30 20:55:08+02:00
logdf144ea8638aa0ad75ecd05dc6435d2f736e027b
tree8046a9d332c5d34139391c4a9835a461fa1036e5
parent9c58eb4a84362a33d3818db509f8134c5d54b910
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

std.os.linux: add csky arch bits

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

2 files changed, 169 insertions(+), 1 deletions(-)

lib/std/os/linux.zig+4-1
......@@ -35,6 +35,7 @@ const arch_bits = switch (native_arch) {
3535 .alpha => @import("linux/alpha.zig"),
3636 .arc, .arceb => @import("linux/arc.zig"),
3737 .arm, .armeb, .thumb, .thumbeb => @import("linux/arm.zig"),
38 .csky => @import("linux/csky.zig"),
3839 .hexagon => @import("linux/hexagon.zig"),
3940 .loongarch32 => @import("linux/loongarch32.zig"),
4041 .loongarch64 => @import("linux/loongarch64.zig"),
......@@ -288,6 +289,7 @@ pub const MAP = switch (native_arch) {
288289 },
289290 .arc,
290291 .arceb,
292 .csky,
291293 .hexagon,
292294 .m68k,
293295 .or1k,
......@@ -518,6 +520,7 @@ pub const O = switch (native_arch) {
518520 },
519521 .arc,
520522 .arceb,
523 .csky,
521524 .hexagon,
522525 .or1k,
523526 .s390x,
......@@ -6633,7 +6636,7 @@ pub const k_sigaction = switch (native_arch) {
66336636 handler: k_sigaction_funcs.handler,
66346637 mask: sigset_t,
66356638 },
6636 .hexagon, .loongarch32, .loongarch64, .or1k, .riscv32, .riscv64 => extern struct {
6639 .csky, .hexagon, .loongarch32, .loongarch64, .or1k, .riscv32, .riscv64 => extern struct {
66376640 handler: k_sigaction_funcs.handler,
66386641 flags: c_ulong,
66396642 mask: sigset_t,
lib/std/os/linux/csky.zig created+165
......@@ -0,0 +1,165 @@
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 ("trap 0"
11 : [ret] "={r0}" (-> u32),
12 : [number] "{r7}" (@intFromEnum(number)),
13 : .{ .memory = true });
14}
15
16pub fn syscall1(
17 number: SYS,
18 arg1: syscall_arg_t,
19) u32 {
20 return asm volatile ("trap 0"
21 : [ret] "={r0}" (-> u32),
22 : [number] "{r7}" (@intFromEnum(number)),
23 [arg1] "{r0}" (arg1),
24 : .{ .memory = true });
25}
26
27pub fn syscall2(
28 number: SYS,
29 arg1: syscall_arg_t,
30 arg2: syscall_arg_t,
31) u32 {
32 return asm volatile ("trap 0"
33 : [ret] "={r0}" (-> u32),
34 : [number] "{r7}" (@intFromEnum(number)),
35 [arg1] "{r0}" (arg1),
36 [arg2] "{r1}" (arg2),
37 : .{ .memory = true });
38}
39
40pub fn syscall3(
41 number: SYS,
42 arg1: syscall_arg_t,
43 arg2: syscall_arg_t,
44 arg3: syscall_arg_t,
45) u32 {
46 return asm volatile ("trap 0"
47 : [ret] "={r0}" (-> u32),
48 : [number] "{r7}" (@intFromEnum(number)),
49 [arg1] "{r0}" (arg1),
50 [arg2] "{r1}" (arg2),
51 [arg3] "{r2}" (arg3),
52 : .{ .memory = true });
53}
54
55pub fn syscall4(
56 number: SYS,
57 arg1: syscall_arg_t,
58 arg2: syscall_arg_t,
59 arg3: syscall_arg_t,
60 arg4: syscall_arg_t,
61) u32 {
62 return asm volatile ("trap 0"
63 : [ret] "={r0}" (-> u32),
64 : [number] "{r7}" (@intFromEnum(number)),
65 [arg1] "{r0}" (arg1),
66 [arg2] "{r1}" (arg2),
67 [arg3] "{r2}" (arg3),
68 [arg4] "{r3}" (arg4),
69 : .{ .memory = true });
70}
71
72pub fn syscall5(
73 number: SYS,
74 arg1: syscall_arg_t,
75 arg2: syscall_arg_t,
76 arg3: syscall_arg_t,
77 arg4: syscall_arg_t,
78 arg5: syscall_arg_t,
79) u32 {
80 return asm volatile ("trap 0"
81 : [ret] "={r0}" (-> u32),
82 : [number] "{r7}" (@intFromEnum(number)),
83 [arg1] "{r0}" (arg1),
84 [arg2] "{r1}" (arg2),
85 [arg3] "{r2}" (arg3),
86 [arg4] "{r3}" (arg4),
87 [arg5] "{r4}" (arg5),
88 : .{ .memory = true });
89}
90
91pub fn syscall6(
92 number: SYS,
93 arg1: syscall_arg_t,
94 arg2: syscall_arg_t,
95 arg3: syscall_arg_t,
96 arg4: syscall_arg_t,
97 arg5: syscall_arg_t,
98 arg6: syscall_arg_t,
99) u32 {
100 return asm volatile ("trap 0"
101 : [ret] "={r0}" (-> u32),
102 : [number] "{r7}" (@intFromEnum(number)),
103 [arg1] "{r0}" (arg1),
104 [arg2] "{r1}" (arg2),
105 [arg3] "{r2}" (arg3),
106 [arg4] "{r3}" (arg4),
107 [arg5] "{r4}" (arg5),
108 [arg6] "{r5}" (arg6),
109 : .{ .memory = true });
110}
111
112pub fn clone() callconv(.naked) u32 {
113 // __clone(func, stack, flags, arg, ptid, tls, ctid)
114 // r0, r1, r2, r3, +0, +4, +8
115 //
116 // syscall(SYS_clone, flags, stack, ptid, tls, ctid)
117 // r7 r0, r1, r2, r3, r4
118 asm volatile (
119 \\ // Preserve callee-saved registers.
120 \\ mov t0, r4
121 \\ mov t1, r7
122 \\
123 \\ andi r1, r1, -8
124 \\
125 \\ subi r1, 8
126 \\ stw r0, (r1, 0)
127 \\ stw r3, (r1, 4)
128 \\
129 \\ movi r7, 220 // SYS_clone
130 \\ mov r0, r2
131 \\ ldw r2, (sp, 0)
132 \\ ldw r3, (sp, 8)
133 \\ ldw r4, (sp, 4)
134 \\ trap 0
135 \\
136 \\ cmpnei r0, 0
137 \\ jbf 1f
138 \\
139 \\ // parent
140 \\ mov r7, t1
141 \\ mov r4, t0
142 \\ rts
143 \\
144 \\ // child
145 \\1:
146 );
147 if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile (
148 \\ .cfi_undefined lr
149 );
150 asm volatile (
151 \\ movi r8, 0
152 \\ movi lr, 0
153 \\
154 \\ ldw r0, (sp, 4)
155 \\ ldw r1, (sp, 0)
156 \\ jsr r1
157 \\
158 \\ movi r7, 93 // SYS_exit
159 \\ trap 0
160 );
161}
162
163pub const time_t = i32;
164
165pub const VDSO = void;