diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index eeba773384a55aff4a16e26d151e2d6b2434fd82..cd56e2a96659b90f1ae69fa6afbd59d1d09a0725 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -40,6 +40,7 @@ const arch_bits = switch (native_arch) { .loongarch32 => @import("linux/loongarch32.zig"), .loongarch64 => @import("linux/loongarch64.zig"), .m68k => @import("linux/m68k.zig"), + .microblaze, .microblazeel => @import("linux/microblaze.zig"), .mips, .mipsel => @import("linux/mips.zig"), .mips64, .mips64el => switch (builtin.abi) { .gnuabin32, .muslabin32 => @import("linux/mipsn32.zig"), @@ -297,6 +298,8 @@ pub const MAP = switch (native_arch) { .csky, .hexagon, .m68k, + .microblaze, + .microblazeel, .or1k, .s390x, => packed struct(u32) { @@ -527,6 +530,8 @@ pub const O = switch (native_arch) { .arceb, .csky, .hexagon, + .microblaze, + .microblazeel, .or1k, .s390x, .xtensa, @@ -6982,6 +6987,8 @@ pub const MINSIGSTKSZ = switch (native_arch) { .mipsel, .mips64, .mips64el, + .microblaze, + .microblazeel, .or1k, .powerpc, .powerpcle, @@ -7020,6 +7027,8 @@ pub const SIGSTKSZ = switch (native_arch) { .mipsel, .mips64, .mips64el, + .microblaze, + .microblazeel, .or1k, .powerpc, .powerpcle, @@ -10723,6 +10732,7 @@ pub const AUDIT = struct { .loongarch32 => .LOONGARCH32, .loongarch64 => .LOONGARCH64, .m68k => .M68K, + .microblaze, .microblazeel => .MICROBLAZE, .mips => .MIPS, .mipsel => .MIPSEL, .mips64 => switch (native_abi) { diff --git a/lib/std/os/linux/microblaze.zig b/lib/std/os/linux/microblaze.zig new file mode 100644 index 0000000000000000000000000000000000000000..99455dd2a87047f329a968ad746b8c1c4f56ede6 --- /dev/null +++ b/lib/std/os/linux/microblaze.zig @@ -0,0 +1,170 @@ +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 ("brki r14, 0x8" + : [ret] "={r3}" (-> u32), + : [number] "{r12}" (@intFromEnum(number)), + : .{ .r4 = true, .memory = true }); +} + +pub fn syscall1( + number: SYS, + arg1: syscall_arg_t, +) u32 { + return asm volatile ("brki r14, 0x8" + : [ret] "={r3}" (-> u32), + : [number] "{r12}" (@intFromEnum(number)), + [arg1] "{r5}" (arg1), + : .{ .r4 = true, .memory = true }); +} + +pub fn syscall2( + number: SYS, + arg1: syscall_arg_t, + arg2: syscall_arg_t, +) u32 { + return asm volatile ("brki r14, 0x8" + : [ret] "={r3}" (-> u32), + : [number] "{r12}" (@intFromEnum(number)), + [arg1] "{r5}" (arg1), + [arg2] "{r6}" (arg2), + : .{ .r4 = true, .memory = true }); +} + +pub fn syscall3( + number: SYS, + arg1: syscall_arg_t, + arg2: syscall_arg_t, + arg3: syscall_arg_t, +) u32 { + return asm volatile ("brki r14, 0x8" + : [ret] "={r3}" (-> u32), + : [number] "{r12}" (@intFromEnum(number)), + [arg1] "{r5}" (arg1), + [arg2] "{r6}" (arg2), + [arg3] "{r7}" (arg3), + : .{ .r4 = true, .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 ("brki r14, 0x8" + : [ret] "={r3}" (-> u32), + : [number] "{r12}" (@intFromEnum(number)), + [arg1] "{r5}" (arg1), + [arg2] "{r6}" (arg2), + [arg3] "{r7}" (arg3), + [arg4] "{r8}" (arg4), + : .{ .r4 = true, .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 ("brki r14, 0x8" + : [ret] "={r3}" (-> u32), + : [number] "{r12}" (@intFromEnum(number)), + [arg1] "{r5}" (arg1), + [arg2] "{r6}" (arg2), + [arg3] "{r7}" (arg3), + [arg4] "{r8}" (arg4), + [arg5] "{r9}" (arg5), + : .{ .r4 = true, .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 ("brki r14, 0x8" + : [ret] "={r3}" (-> u32), + : [number] "{r12}" (@intFromEnum(number)), + [arg1] "{r5}" (arg1), + [arg2] "{r6}" (arg2), + [arg3] "{r7}" (arg3), + [arg4] "{r8}" (arg4), + [arg5] "{r9}" (arg5), + [arg6] "{r10}" (arg6), + : .{ .r4 = true, .memory = true }); +} + +pub fn clone() callconv(.naked) u32 { + // __clone(func, stack, flags, arg, ptid, tls, ctid) + // r5, r6, r7, r8, r9, r10, +28 + // + // syscall(SYS_clone, flags, stack, ptid, ctid, tls) + // r12 r5, r6, r8, r9, r10 + asm volatile ( + \\ andi r6, r6, -4 + \\ + \\ addi r6, r6, -8 + \\ swi r5, r6, 0 + \\ swi r8, r6, 4 + \\ + \\ ori r12, r0, 120 # SYS_clone + \\ ori r5, r7, 0 + \\ ori r7, r0, 0 # stack size + \\ ori r8, r9, 0 + \\ lwi r9, r1, 28 + \\ brki r14, 0x8 + \\ beqi r3, 1f + \\ + \\ // parent + \\ rtsd r15, 8 + \\ nop + \\ + \\ // child + \\1: + \\ ori r15, r0, 0 + \\ ori r19, r0, 0 + \\ + \\ lwi r3, r1, 0 + \\ lwi r5, r1, 4 + \\ brald r15, r3 + \\ nop + \\ + \\ ori r12, r0, 1 # SYS_exit + \\ brki r14, 0x8 + ); +} + +pub fn restore() callconv(.naked) noreturn { + asm volatile ( + \\ brki r14, 0x8 + : + : [number] "{r7}" (@intFromEnum(SYS.sigreturn)), + ); +} + +pub fn restore_rt() callconv(.naked) noreturn { + asm volatile ( + \\ brki r14, 0x8 + : + : [number] "{r7}" (@intFromEnum(SYS.rt_sigreturn)), + ); +} + +pub const time_t = i32; + +pub const VDSO = void;