std.os.linux: add csky arch bits

closes https://codeberg.org/ziglang/zig/issues/30942
This commit is contained in:
Alex Rønne Petersen
2026-05-30 18:59:33 +02:00
parent 9c58eb4a84
commit df144ea863
2 changed files with 169 additions and 1 deletions
+4 -1
View File
@@ -35,6 +35,7 @@ const arch_bits = switch (native_arch) {
.alpha => @import("linux/alpha.zig"),
.arc, .arceb => @import("linux/arc.zig"),
.arm, .armeb, .thumb, .thumbeb => @import("linux/arm.zig"),
.csky => @import("linux/csky.zig"),
.hexagon => @import("linux/hexagon.zig"),
.loongarch32 => @import("linux/loongarch32.zig"),
.loongarch64 => @import("linux/loongarch64.zig"),
@@ -288,6 +289,7 @@ pub const MAP = switch (native_arch) {
},
.arc,
.arceb,
.csky,
.hexagon,
.m68k,
.or1k,
@@ -518,6 +520,7 @@ pub const O = switch (native_arch) {
},
.arc,
.arceb,
.csky,
.hexagon,
.or1k,
.s390x,
@@ -6633,7 +6636,7 @@ pub const k_sigaction = switch (native_arch) {
handler: k_sigaction_funcs.handler,
mask: sigset_t,
},
.hexagon, .loongarch32, .loongarch64, .or1k, .riscv32, .riscv64 => extern struct {
.csky, .hexagon, .loongarch32, .loongarch64, .or1k, .riscv32, .riscv64 => extern struct {
handler: k_sigaction_funcs.handler,
flags: c_ulong,
mask: sigset_t,
+165
View File
@@ -0,0 +1,165 @@
const builtin = @import("builtin");
const std = @import("../../std.zig");
const SYS = std.os.linux.SYS;
pub const syscall_arg_t = u32;
pub fn syscall0(
number: SYS,
) u32 {
return asm volatile ("trap 0"
: [ret] "={r0}" (-> u32),
: [number] "{r7}" (@intFromEnum(number)),
: .{ .memory = true });
}
pub fn syscall1(
number: SYS,
arg1: syscall_arg_t,
) u32 {
return asm volatile ("trap 0"
: [ret] "={r0}" (-> u32),
: [number] "{r7}" (@intFromEnum(number)),
[arg1] "{r0}" (arg1),
: .{ .memory = true });
}
pub fn syscall2(
number: SYS,
arg1: syscall_arg_t,
arg2: syscall_arg_t,
) u32 {
return asm volatile ("trap 0"
: [ret] "={r0}" (-> u32),
: [number] "{r7}" (@intFromEnum(number)),
[arg1] "{r0}" (arg1),
[arg2] "{r1}" (arg2),
: .{ .memory = true });
}
pub fn syscall3(
number: SYS,
arg1: syscall_arg_t,
arg2: syscall_arg_t,
arg3: syscall_arg_t,
) u32 {
return asm volatile ("trap 0"
: [ret] "={r0}" (-> u32),
: [number] "{r7}" (@intFromEnum(number)),
[arg1] "{r0}" (arg1),
[arg2] "{r1}" (arg2),
[arg3] "{r2}" (arg3),
: .{ .memory = true });
}
pub fn syscall4(
number: SYS,
arg1: syscall_arg_t,
arg2: syscall_arg_t,
arg3: syscall_arg_t,
arg4: syscall_arg_t,
) u32 {
return asm volatile ("trap 0"
: [ret] "={r0}" (-> u32),
: [number] "{r7}" (@intFromEnum(number)),
[arg1] "{r0}" (arg1),
[arg2] "{r1}" (arg2),
[arg3] "{r2}" (arg3),
[arg4] "{r3}" (arg4),
: .{ .memory = true });
}
pub fn syscall5(
number: SYS,
arg1: syscall_arg_t,
arg2: syscall_arg_t,
arg3: syscall_arg_t,
arg4: syscall_arg_t,
arg5: syscall_arg_t,
) u32 {
return asm volatile ("trap 0"
: [ret] "={r0}" (-> u32),
: [number] "{r7}" (@intFromEnum(number)),
[arg1] "{r0}" (arg1),
[arg2] "{r1}" (arg2),
[arg3] "{r2}" (arg3),
[arg4] "{r3}" (arg4),
[arg5] "{r4}" (arg5),
: .{ .memory = true });
}
pub fn syscall6(
number: SYS,
arg1: syscall_arg_t,
arg2: syscall_arg_t,
arg3: syscall_arg_t,
arg4: syscall_arg_t,
arg5: syscall_arg_t,
arg6: syscall_arg_t,
) u32 {
return asm volatile ("trap 0"
: [ret] "={r0}" (-> u32),
: [number] "{r7}" (@intFromEnum(number)),
[arg1] "{r0}" (arg1),
[arg2] "{r1}" (arg2),
[arg3] "{r2}" (arg3),
[arg4] "{r3}" (arg4),
[arg5] "{r4}" (arg5),
[arg6] "{r5}" (arg6),
: .{ .memory = true });
}
pub fn clone() callconv(.naked) u32 {
// __clone(func, stack, flags, arg, ptid, tls, ctid)
// r0, r1, r2, r3, +0, +4, +8
//
// syscall(SYS_clone, flags, stack, ptid, tls, ctid)
// r7 r0, r1, r2, r3, r4
asm volatile (
\\ // Preserve callee-saved registers.
\\ mov t0, r4
\\ mov t1, r7
\\
\\ andi r1, r1, -8
\\
\\ subi r1, 8
\\ stw r0, (r1, 0)
\\ stw r3, (r1, 4)
\\
\\ movi r7, 220 // SYS_clone
\\ mov r0, r2
\\ ldw r2, (sp, 0)
\\ ldw r3, (sp, 8)
\\ ldw r4, (sp, 4)
\\ trap 0
\\
\\ cmpnei r0, 0
\\ jbf 1f
\\
\\ // parent
\\ mov r7, t1
\\ mov r4, t0
\\ rts
\\
\\ // child
\\1:
);
if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile (
\\ .cfi_undefined lr
);
asm volatile (
\\ movi r8, 0
\\ movi lr, 0
\\
\\ ldw r0, (sp, 4)
\\ ldw r1, (sp, 0)
\\ jsr r1
\\
\\ movi r7, 93 // SYS_exit
\\ trap 0
);
}
pub const time_t = i32;
pub const VDSO = void;