diff --git a/lib/std/Thread.zig b/lib/std/Thread.zig index 338d17a487a1526c7cac741f92c8628735b79736..caa22ea4cb4548363d40007e4e2b58a4e829cec8 100644 --- a/lib/std/Thread.zig +++ b/lib/std/Thread.zig @@ -1217,8 +1217,8 @@ const LinuxThreadImpl = struct { \\ ldi $16, 0 \\ callsys : - : [ptr] "{r16}" (@intFromPtr(self.mapped.ptr)), - [len] "{r17}" (self.mapped.len), + : [ptr] "{$16}" (@intFromPtr(self.mapped.ptr)), + [len] "{$17}" (self.mapped.len), ), .hexagon => asm volatile ( \\ r6 = #215 // SYS_munmap diff --git a/lib/std/debug/Dwarf.zig b/lib/std/debug/Dwarf.zig index 126b55d5d87be33eab8212dc289616186fbe78ba..28d83d463bd9eef5b0edf815ff132b1c24d35c92 100644 --- a/lib/std/debug/Dwarf.zig +++ b/lib/std/debug/Dwarf.zig @@ -1436,6 +1436,7 @@ pub fn compactUnwindToDwarfRegNumber(unwind_reg_number: u3) !u16 { pub fn ipRegNum(arch: std.Target.Cpu.Arch) ?u16 { return switch (arch) { .aarch64, .aarch64_be => 32, + .alpha => 64, .arc, .arceb => 160, .arm, .armeb, .thumb, .thumbeb => 15, .csky => 64, @@ -1460,6 +1461,7 @@ pub fn ipRegNum(arch: std.Target.Cpu.Arch) ?u16 { pub fn fpRegNum(arch: std.Target.Cpu.Arch) u16 { return switch (arch) { .aarch64, .aarch64_be => 29, + .alpha => 15, .arc, .arceb => 27, .arm, .armeb, .thumb, .thumbeb => 11, .csky => 14, @@ -1484,6 +1486,7 @@ pub fn fpRegNum(arch: std.Target.Cpu.Arch) u16 { pub fn spRegNum(arch: std.Target.Cpu.Arch) u16 { return switch (arch) { .aarch64, .aarch64_be => 31, + .alpha => 30, .arc, .arceb => 28, .arm, .armeb, .thumb, .thumbeb => 13, .csky => 14, diff --git a/lib/std/debug/cpu_context.zig b/lib/std/debug/cpu_context.zig index 2c6355531b91abecf86f1b663220f7c406435b88..4766a124caa8bd2199320bb1f8c2bba8dff4b8a1 100644 --- a/lib/std/debug/cpu_context.zig +++ b/lib/std/debug/cpu_context.zig @@ -5,6 +5,7 @@ pub const Native = if (@hasDecl(root, "debug") and @hasDecl(root.debug, "CpuCont root.debug.CpuContext else switch (native_arch) { .aarch64, .aarch64_be => Aarch64, + .alpha => Alpha, .arc, .arceb => Arc, .arm, .armeb, .thumb, .thumbeb => Arm, .csky => Csky, @@ -103,6 +104,10 @@ pub fn fromPosixSignalContext(ctx_ptr: ?*const anyopaque) ?Native { .sp = uc.mcontext.sp, .pc = uc.mcontext.pc, }, + .alpha => .{ + .r = uc.mcontext.r, + .pc = uc.mcontext.pc, + }, .csky => .{ .r = uc.mcontext.r0_13 ++ [_]u32{ uc.mcontext.r14, uc.mcontext.r15 } ++ @@ -293,6 +298,75 @@ const Aarch64 = extern struct { } }; +const Alpha = extern struct { + /// The numbered general-purpose registers R0 - R31. + r: [32]u64, + pc: u64, + + pub inline fn current() Alpha { + var ctx: Alpha = undefined; + asm volatile ( + \\ stq $0 , 0x000($0) + \\ stq $1 , 0x008($0) + \\ stq $2 , 0x010($0) + \\ stq $3 , 0x018($0) + \\ stq $4 , 0x020($0) + \\ stq $5 , 0x028($0) + \\ stq $6 , 0x030($0) + \\ stq $7 , 0x038($0) + \\ stq $8 , 0x040($0) + \\ stq $9 , 0x048($0) + \\ stq $10, 0x050($0) + \\ stq $11, 0x058($0) + \\ stq $12, 0x060($0) + \\ stq $13, 0x068($0) + \\ stq $14, 0x070($0) + \\ stq $15, 0x078($0) + \\ stq $16, 0x080($0) + \\ stq $17, 0x088($0) + \\ stq $18, 0x090($0) + \\ stq $19, 0x098($0) + \\ stq $20, 0x0a0($0) + \\ stq $21, 0x0a8($0) + \\ stq $22, 0x0b0($0) + \\ stq $23, 0x0b8($0) + \\ stq $24, 0x0c0($0) + \\ stq $25, 0x0c8($0) + \\ stq $26, 0x0d0($0) + \\ stq $27, 0x0d8($0) + \\ stq $28, 0x0e0($0) + \\ stq $29, 0x0e8($0) + \\ stq $30, 0x0f0($0) + \\ + \\ br $1, 1f + \\1: + \\ stq $1, 0x100($0) + : + : [ctx] "{r0}" (&ctx), + : .{ .r1 = true, .memory = true }); + return ctx; + } + + pub fn getFp(ctx: *const Alpha) u64 { + return ctx.r[15]; + } + pub fn getPc(ctx: *const Alpha) u64 { + return ctx.pc; + } + + pub fn dwarfRegisterBytes(ctx: *Aarch64, register_num: u16) DwarfRegisterError![]u8 { + switch (register_num) { + 0...31 => return @ptrCast(&ctx.r[register_num]), + 64 => return @ptrCast(&ctx.pc), + + 32...63 => return error.UnsupportedRegister, // f0 - f31 + 66 => return error.UnsupportedRegister, // uniq + + else => return error.InvalidRegister, + } + } +}; + /// This is an `extern struct` so that inline assembly in `current` can use field offsets. const Arc = extern struct { /// The numbered general-purpose registers r0 - r31. diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 0df906340ef804685e6bca37df379b1fddb8ec4d..1b07a0d136289e72bbfcf7e5f61efa61bded7d43 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -31,6 +31,7 @@ test { const arch_bits = switch (native_arch) { .aarch64, .aarch64_be => @import("linux/aarch64.zig"), + .alpha => @import("linux/alpha.zig"), .arc, .arceb => @import("linux/arc.zig"), .arm, .armeb, .thumb, .thumbeb => @import("linux/arm.zig"), .hexagon => @import("linux/hexagon.zig"), @@ -124,6 +125,7 @@ pub const syscalls = @import("linux/syscalls.zig"); pub const SYS = switch (native_arch) { .arc, .arceb => syscalls.Arc, .aarch64, .aarch64_be => syscalls.Arm64, + .alpha => syscalls.Alpha, .arm, .armeb, .thumb, .thumbeb => syscalls.Arm, .csky => syscalls.CSky, .hexagon => syscalls.Hexagon, @@ -311,6 +313,30 @@ pub const MAP = switch (native_arch) { UNINITIALIZED: bool = false, _: u5 = 0, }, + .alpha => packed struct(u32) { + TYPE: MAP_TYPE, + ANONYMOUS: bool = false, + _3: u1 = 0, + _4: u1 = 0, + _5: u1 = 0, + FIXED: bool = false, + _7: u1 = 0, + _8: u1 = 0, + _9: u1 = 0, + GROWSDOWN: bool = false, + DENYWRITE: bool = false, + EXECUTABLE: bool = false, + LOCKED: bool = false, + NORESERVE: bool = false, + POPULATE: bool = false, + NONBLOCK: bool = false, + STACK: bool = false, + HUGHETLB: bool = false, + FIXED_NOREPLACE: bool = false, + _19: u4 = 0, + _20: u1 = 0, + _: u5 = 0, + }, else => @compileError("missing std.os.linux.MAP constants for this architecture"), }; @@ -520,6 +546,29 @@ pub const O = switch (native_arch) { PATH: bool = false, _22: u10 = 0, }, + .alpha => packed struct(u32) { + ACCMODE: ACCMODE = .RDONLY, + NONBLOCK: bool = false, + APPEND: bool = false, + _4: u5 = 0, + CREAT: bool = false, + TRUNC: bool = false, + EXCL: bool = false, + NOCTTY: bool = false, + _9: u1 = 0, + DSYNC: bool = false, + DIRECTORY: bool = false, + NOFOLLOW: bool = false, + LARGEFILE: bool = false, + _14: u1 = 0, + DIRECT: bool = false, + NOATIME: bool = false, + CLOEXEC: bool = false, + SYNC: bool = false, + PATH: bool = false, + TMPFILE: bool = false, + _: u7 = 0, + }, else => @compileError("missing std.os.linux.O constants for this architecture"), }; @@ -2217,7 +2266,10 @@ pub fn getsid(pid: pid_t) usize { pub fn getpid() pid_t { // Casts result to a pid_t, safety-checking >= 0, because getpid() cannot fail - return @intCast(@as(u32, @truncate(syscall0(.getpid)))); + return @intCast(@as(u32, @truncate(syscall0(comptime switch (native_arch) { + .alpha => .getxpid, + else => .getpid, + })))); } pub fn getppid() pid_t { @@ -4061,6 +4113,51 @@ pub const SIG = if (is_mips) enum(u32) { USR1 = 30, USR2 = 31, _, +} else if (native_arch == .alpha) enum(u32) { + pub const BLOCK = 1; + pub const UNBLOCK = 2; + pub const SETMASK = 3; + + pub const ERR: ?Sigaction.handler_fn = @ptrFromInt(maxInt(usize)); + pub const DFL: ?Sigaction.handler_fn = @ptrFromInt(0); + pub const IGN: ?Sigaction.handler_fn = @ptrFromInt(1); + + pub const POLL: SIG = .IO; + pub const PWR: SIG = .INFO; + pub const IOT: SIG = .ABRT; + + HUP = 1, + INT = 2, + QUIT = 3, + ILL = 4, + TRAP = 5, + ABRT = 6, + EMT = 7, + FPE = 8, + KILL = 9, + BUS = 10, + SEGV = 11, + SYS = 12, + PIPE = 13, + ALRM = 14, + TERM = 15, + URG = 16, + STOP = 17, + TSTP = 18, + CONT = 19, + CHLD = 20, + TTIN = 21, + TTOU = 22, + IO = 23, + XCPU = 24, + XFSZ = 25, + VTALRM = 26, + PROF = 27, + WINCH = 28, + INFO = 29, + USR1 = 30, + USR2 = 31, + _, } else enum(u32) { pub const BLOCK = 0; pub const UNBLOCK = 1; diff --git a/lib/std/os/linux/alpha.zig b/lib/std/os/linux/alpha.zig new file mode 100644 index 0000000000000000000000000000000000000000..20bf4bd14bbceacc74e2e9328dcfac74c7603b46 --- /dev/null +++ b/lib/std/os/linux/alpha.zig @@ -0,0 +1,358 @@ +const builtin = @import("builtin"); +const std = @import("../../std.zig"); +const SYS = std.os.linux.SYS; + +pub fn syscall0(number: SYS) u64 { + return asm volatile ( + \\ callsys + \\ beq $19, 1f + \\ negq $0, $0 + \\1: + : [ret] "={$0}" (-> u64), + : [number] "{$0}" (number), + : .{ + .r1 = true, + .r2 = true, + .r3 = true, + .r4 = true, + .r5 = true, + .r6 = true, + .r7 = true, + .r8 = true, + .r22 = true, + .r23 = true, + .r24 = true, + .r25 = true, + .r27 = true, + .r28 = true, + .memory = true, + .r16 = true, + .r17 = true, + .r18 = true, + .r20 = true, + .r21 = true, + }); +} + +pub fn syscall1(number: SYS, arg1: u64) u64 { + // These registers are both inputs and clobbers. + var r16_out: u64 = undefined; + return asm volatile ( + \\ callsys + \\ beq $19, 1f + \\ negq $0, $0 + \\1: + : [ret] "={$0}" (-> u64), + [r16_out] "={$16}" (r16_out), + : [number] "{$0}" (number), + [arg1] "{$16}" (arg1), + : .{ + .r1 = true, + .r2 = true, + .r3 = true, + .r4 = true, + .r5 = true, + .r6 = true, + .r7 = true, + .r8 = true, + .r22 = true, + .r23 = true, + .r24 = true, + .r25 = true, + .r27 = true, + .r28 = true, + .memory = true, + .r17 = true, + .r18 = true, + .r20 = true, + .r21 = true, + }); +} + +pub fn syscall2(number: SYS, arg1: u64, arg2: u64) u64 { + // These registers are both inputs and clobbers. + var r16_out: u64 = undefined; + var r17_out: u64 = undefined; + return asm volatile ( + \\ callsys + \\ beq $19, 1f + \\ negq $0, $0 + \\1: + : [ret] "={$0}" (-> u64), + [r16_out] "={$16}" (r16_out), + [r17_out] "={$17}" (r17_out), + : [number] "{$0}" (number), + [arg1] "{$16}" (arg1), + [arg2] "{$17}" (arg2), + : .{ + .r1 = true, + .r2 = true, + .r3 = true, + .r4 = true, + .r5 = true, + .r6 = true, + .r7 = true, + .r8 = true, + .r22 = true, + .r23 = true, + .r24 = true, + .r25 = true, + .r27 = true, + .r28 = true, + .memory = true, + .r18 = true, + .r20 = true, + .r21 = true, + }); +} + +pub fn syscall3(number: SYS, arg1: u64, arg2: u64, arg3: u64) u64 { + // These registers are both inputs and clobbers. + var r16_out: u64 = undefined; + var r17_out: u64 = undefined; + var r18_out: u64 = undefined; + return asm volatile ( + \\ callsys + \\ beq $19, 1f + \\ negq $0, $0 + \\1: + : [ret] "={$0}" (-> u64), + [r16_out] "={$16}" (r16_out), + [r17_out] "={$17}" (r17_out), + [r18_out] "={$18}" (r18_out), + : [number] "{$0}" (number), + [arg1] "{$16}" (arg1), + [arg2] "{$17}" (arg2), + [arg3] "{$18}" (arg3), + : .{ + .r1 = true, + .r2 = true, + .r3 = true, + .r4 = true, + .r5 = true, + .r6 = true, + .r7 = true, + .r8 = true, + .r22 = true, + .r23 = true, + .r24 = true, + .r25 = true, + .r27 = true, + .r28 = true, + .memory = true, + .r20 = true, + .r21 = true, + }); +} + +pub fn syscall4(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64) u64 { + // These registers are both inputs and clobbers. + var r16_out: u64 = undefined; + var r17_out: u64 = undefined; + var r18_out: u64 = undefined; + var r19_out: u64 = undefined; + return asm volatile ( + \\ callsys + \\ beq $19, 1f + \\ negq $0, $0 + \\1: + : [ret] "={$0}" (-> u64), + [r16_out] "={$16}" (r16_out), + [r17_out] "={$17}" (r17_out), + [r18_out] "={$18}" (r18_out), + [r19_out] "={$19}" (r19_out), + : [number] "{$0}" (number), + [arg1] "{$16}" (arg1), + [arg2] "{$17}" (arg2), + [arg3] "{$18}" (arg3), + [arg4] "{$19}" (arg4), + : .{ + .r1 = true, + .r2 = true, + .r3 = true, + .r4 = true, + .r5 = true, + .r6 = true, + .r7 = true, + .r8 = true, + .r22 = true, + .r23 = true, + .r24 = true, + .r25 = true, + .r27 = true, + .r28 = true, + .memory = true, + .r20 = true, + .r21 = true, + }); +} + +pub fn syscall5(number: SYS, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) u64 { + // These registers are both inputs and clobbers. + var r16_out: u64 = undefined; + var r17_out: u64 = undefined; + var r18_out: u64 = undefined; + var r19_out: u64 = undefined; + var r20_out: u64 = undefined; + return asm volatile ( + \\ callsys + \\ beq $19, 1f + \\ negq $0, $0 + \\1: + : [ret] "={$0}" (-> u64), + [r16_out] "={$16}" (r16_out), + [r17_out] "={$17}" (r17_out), + [r18_out] "={$18}" (r18_out), + [r19_out] "={$19}" (r19_out), + [r20_out] "={$20}" (r20_out), + : [number] "{$0}" (number), + [arg1] "{$16}" (arg1), + [arg2] "{$17}" (arg2), + [arg3] "{$18}" (arg3), + [arg4] "{$19}" (arg4), + [arg5] "{$20}" (arg5), + : .{ + .r1 = true, + .r2 = true, + .r3 = true, + .r4 = true, + .r5 = true, + .r6 = true, + .r7 = true, + .r8 = true, + .r22 = true, + .r23 = true, + .r24 = true, + .r25 = true, + .r27 = true, + .r28 = true, + .memory = true, + .r21 = true, + }); +} + +pub fn syscall6( + number: SYS, + arg1: u64, + arg2: u64, + arg3: u64, + arg4: u64, + arg5: u64, + arg6: u64, +) u64 { + // These registers are both inputs and clobbers. + var r16_out: u64 = undefined; + var r17_out: u64 = undefined; + var r18_out: u64 = undefined; + var r19_out: u64 = undefined; + var r20_out: u64 = undefined; + var r21_out: u64 = undefined; + return asm volatile ( + \\ callsys + \\ beq $19, 1f + \\ negq $0, $0 + \\1: + : [ret] "={$0}" (-> u64), + [r16_out] "={$16}" (r16_out), + [r17_out] "={$17}" (r17_out), + [r18_out] "={$18}" (r18_out), + [r19_out] "={$19}" (r19_out), + [r20_out] "={$20}" (r20_out), + [r21_out] "={$21}" (r21_out), + : [number] "{$0}" (number), + [arg1] "{$16}" (arg1), + [arg2] "{$17}" (arg2), + [arg3] "{$18}" (arg3), + [arg4] "{$19}" (arg4), + [arg5] "{$20}" (arg5), + [arg6] "{$21}" (arg6), + : .{ + .r1 = true, + .r2 = true, + .r3 = true, + .r4 = true, + .r5 = true, + .r6 = true, + .r7 = true, + .r8 = true, + .r22 = true, + .r23 = true, + .r24 = true, + .r25 = true, + .r27 = true, + .r28 = true, + .memory = true, + }); +} + +pub fn clone() callconv(.naked) u64 { + // __clone(func, stack, flags, arg, ptid, tls, ctid) + // a0, a1, a2, a3, a4, a5, +0 + // + // syscall(SYS_clone, flags, stack, ptid, ctid, tls) + // v0 a0, a1, a2, a3, a4 + asm volatile ( + // a0 = $16, a1 = $17, a2 = $18, a3 = $19, + // a4 = $20, a5 = $21, sp = $30, v0 = $0 + \\ # Save function pointer and argument pointer on new thread stack + \\ ldi $1, -8 + \\ and $17, $17, $1 + \\ lda $17, -16($17) + \\ stq $16, 0($17) + \\ stq $19, 8($17) + \\ + \\ # Shuffle (fn,sp,fl,arg,ptid,tls,ctid) to (fl,sp,ptid,ctid,tls) + \\ mov $18, $16 + \\ mov $20, $18 + \\ ldq $19, 0($30) + \\ mov $21, $20 + \\ + \\ # Actual syscall + \\ ldi $0, 312 # SYS_clone + \\ callsys + \\ beq $19, 1f + \\ negq $0, $0 + \\ ret + \\1: + \\ beq $0, 2f + \\ ret + \\2: + ); + if (builtin.unwind_tables != .none or !builtin.strip_debug_info) asm volatile ( + // ra = $26 + \\ .cfi_undefined $26 + ); + asm volatile ( + // v0 = $0, t9 = $23, a0 = $16, ra = $26, sp = $30, fp = $15 + \\ mov 0, $15 + \\ + \\ ldq $23, 0($30) + \\ ldq $16, 8($30) + \\ lda $30, 16($30) + \\ jsr $26, ($23) + \\ + \\ mov $0, $16 + \\ ldi $0, 1 # SYS_EXIT + \\ callsys + ); +} + +pub fn restore() noreturn { + asm volatile ( + // v0 = $0, a0 = $16, sp = $30 + \\ mov $30, $16 + \\ ldi $0, 103 # SIGRETURN + \\ callsys + ); +} + +pub fn restore_rt() noreturn { + asm volatile ( + // v0 = $0, a0 = $16, sp = $30 + \\ mov $30, $16 + \\ ldi $0, 351 # RT_SIGRETURN + \\ callsys + ); +} + +pub const VDSO = void; diff --git a/lib/std/os/linux/syscalls.zig b/lib/std/os/linux/syscalls.zig index afd41fc65b7c2097cccc059cb9b32a8bc9bec6fc..7b1bde6841ea837a2765616ff729ee59652132fb 100644 --- a/lib/std/os/linux/syscalls.zig +++ b/lib/std/os/linux/syscalls.zig @@ -5851,6 +5851,508 @@ pub const Xtensa = enum(usize) { rseq_slice_yield = 471, }; +pub const Alpha = enum(usize) { + osf_syscall = 0, + exit = 1, + fork = 2, + read = 3, + write = 4, + osf_old_open = 5, + close = 6, + osf_wait4 = 7, + osf_old_creat = 8, + link = 9, + unlink = 10, + osf_execve = 11, + chdir = 12, + fchdir = 13, + mknod = 14, + chmod = 15, + chown = 16, + brk = 17, + osf_getfsstat = 18, + lseek = 19, + getxpid = 20, + osf_mount = 21, + umount2 = 22, + setuid = 23, + getxuid = 24, + exec_with_loader = 25, + ptrace = 26, + osf_nrecvmsg = 27, + osf_nsendmsg = 28, + osf_nrecvfrom = 29, + osf_naccept = 30, + osf_ngetpeername = 31, + osf_ngetsockname = 32, + access = 33, + osf_chflags = 34, + osf_fchflags = 35, + sync = 36, + kill = 37, + osf_old_stat = 38, + setpgid = 39, + osf_old_lstat = 40, + dup = 41, + pipe = 42, + osf_set_program_attributes = 43, + osf_profil = 44, + open = 45, + osf_old_sigaction = 46, + getxgid = 47, + osf_sigprocmask = 48, + osf_getlogin = 49, + osf_setlogin = 50, + acct = 51, + sigpending = 52, + ioctl = 54, + osf_reboot = 55, + osf_revoke = 56, + symlink = 57, + readlink = 58, + execve = 59, + umask = 60, + chroot = 61, + osf_old_fstat = 62, + getpgrp = 63, + getpagesize = 64, + osf_mremap = 65, + vfork = 66, + stat = 67, + lstat = 68, + osf_sbrk = 69, + osf_sstk = 70, + mmap = 71, + osf_old_vadvise = 72, + munmap = 73, + mprotect = 74, + madvise = 75, + vhangup = 76, + osf_kmodcall = 77, + osf_mincore = 78, + getgroups = 79, + setgroups = 80, + osf_old_getpgrp = 81, + setpgrp = 82, + osf_setitimer = 83, + osf_old_wait = 84, + osf_table = 85, + osf_getitimer = 86, + gethostname = 87, + sethostname = 88, + getdtablesize = 89, + dup2 = 90, + fstat = 91, + fcntl = 92, + osf_select = 93, + poll = 94, + fsync = 95, + setpriority = 96, + socket = 97, + connect = 98, + accept = 99, + getpriority = 100, + send = 101, + recv = 102, + sigreturn = 103, + bind = 104, + setsockopt = 105, + listen = 106, + osf_plock = 107, + osf_old_sigvec = 108, + osf_old_sigblock = 109, + osf_old_sigsetmask = 110, + sigsuspend = 111, + osf_sigstack = 112, + recvmsg = 113, + sendmsg = 114, + osf_old_vtrace = 115, + osf_gettimeofday = 116, + osf_getrusage = 117, + getsockopt = 118, + readv = 120, + writev = 121, + osf_settimeofday = 122, + fchown = 123, + fchmod = 124, + recvfrom = 125, + setreuid = 126, + setregid = 127, + rename = 128, + truncate = 129, + ftruncate = 130, + flock = 131, + setgid = 132, + sendto = 133, + shutdown = 134, + socketpair = 135, + mkdir = 136, + rmdir = 137, + osf_utimes = 138, + osf_old_sigreturn = 139, + osf_adjtime = 140, + getpeername = 141, + osf_gethostid = 142, + osf_sethostid = 143, + getrlimit = 144, + setrlimit = 145, + osf_old_killpg = 146, + setsid = 147, + quotactl = 148, + osf_oldquota = 149, + getsockname = 150, + osf_pid_block = 153, + osf_pid_unblock = 154, + sigaction = 156, + osf_sigwaitprim = 157, + osf_nfssvc = 158, + osf_getdirentries = 159, + osf_statfs = 160, + osf_fstatfs = 161, + osf_asynch_daemon = 163, + osf_getfh = 164, + osf_getdomainname = 165, + setdomainname = 166, + osf_exportfs = 169, + osf_alt_plock = 181, + osf_getmnt = 184, + osf_alt_sigpending = 187, + osf_alt_setsid = 188, + osf_swapon = 199, + msgctl = 200, + msgget = 201, + msgrcv = 202, + msgsnd = 203, + semctl = 204, + semget = 205, + semop = 206, + osf_utsname = 207, + lchown = 208, + shmat = 209, + shmctl = 210, + shmdt = 211, + shmget = 212, + osf_mvalid = 213, + osf_getaddressconf = 214, + osf_msleep = 215, + osf_mwakeup = 216, + msync = 217, + osf_signal = 218, + osf_utc_gettime = 219, + osf_utc_adjtime = 220, + osf_security = 222, + osf_kloadcall = 223, + osf_stat = 224, + osf_lstat = 225, + osf_fstat = 226, + osf_statfs64 = 227, + osf_fstatfs64 = 228, + getpgid = 233, + getsid = 234, + sigaltstack = 235, + osf_waitid = 236, + osf_priocntlset = 237, + osf_sigsendset = 238, + osf_set_speculative = 239, + osf_msfs_syscall = 240, + osf_sysinfo = 241, + osf_uadmin = 242, + osf_fuser = 243, + osf_proplist_syscall = 244, + osf_ntp_adjtime = 245, + osf_ntp_gettime = 246, + osf_pathconf = 247, + osf_fpathconf = 248, + osf_uswitch = 250, + osf_usleep_thread = 251, + osf_audcntl = 252, + osf_audgen = 253, + sysfs = 254, + osf_subsys_info = 255, + osf_getsysinfo = 256, + osf_setsysinfo = 257, + osf_afs_syscall = 258, + osf_swapctl = 259, + osf_memcntl = 260, + osf_fdatasync = 261, + bdflush = 300, + sethae = 301, + mount = 302, + old_adjtimex = 303, + swapoff = 304, + getdents = 305, + create_module = 306, + init_module = 307, + delete_module = 308, + get_kernel_syms = 309, + syslog = 310, + reboot = 311, + clone = 312, + uselib = 313, + mlock = 314, + munlock = 315, + mlockall = 316, + munlockall = 317, + sysinfo = 318, + sysctl = 319, + oldumount = 321, + swapon = 322, + times = 323, + personality = 324, + setfsuid = 325, + setfsgid = 326, + ustat = 327, + statfs = 328, + fstatfs = 329, + sched_setparam = 330, + sched_getparam = 331, + sched_setscheduler = 332, + sched_getscheduler = 333, + sched_yield = 334, + sched_get_priority_max = 335, + sched_get_priority_min = 336, + sched_rr_get_interval = 337, + afs_syscall = 338, + uname = 339, + nanosleep = 340, + mremap = 341, + nfsservctl = 342, + setresuid = 343, + getresuid = 344, + pciconfig_read = 345, + pciconfig_write = 346, + query_module = 347, + prctl = 348, + pread64 = 349, + pwrite64 = 350, + rt_sigreturn = 351, + rt_sigaction = 352, + rt_sigprocmask = 353, + rt_sigpending = 354, + rt_sigtimedwait = 355, + rt_sigqueueinfo = 356, + rt_sigsuspend = 357, + select = 358, + gettimeofday = 359, + settimeofday = 360, + getitimer = 361, + setitimer = 362, + utimes = 363, + getrusage = 364, + wait4 = 365, + adjtimex = 366, + getcwd = 367, + capget = 368, + capset = 369, + sendfile = 370, + setresgid = 371, + getresgid = 372, + dipc = 373, + pivot_root = 374, + mincore = 375, + pciconfig_iobase = 376, + getdents64 = 377, + gettid = 378, + readahead = 379, + tkill = 381, + setxattr = 382, + lsetxattr = 383, + fsetxattr = 384, + getxattr = 385, + lgetxattr = 386, + fgetxattr = 387, + listxattr = 388, + llistxattr = 389, + flistxattr = 390, + removexattr = 391, + lremovexattr = 392, + fremovexattr = 393, + futex = 394, + sched_setaffinity = 395, + sched_getaffinity = 396, + tuxcall = 397, + io_setup = 398, + io_destroy = 399, + io_getevents = 400, + io_submit = 401, + io_cancel = 402, + exit_group = 405, + lookup_dcookie = 406, + epoll_create = 407, + epoll_ctl = 408, + epoll_wait = 409, + remap_file_pages = 410, + set_tid_address = 411, + restart_syscall = 412, + fadvise64 = 413, + timer_create = 414, + timer_settime = 415, + timer_gettime = 416, + timer_getoverrun = 417, + timer_delete = 418, + clock_settime = 419, + clock_gettime = 420, + clock_getres = 421, + clock_nanosleep = 422, + semtimedop = 423, + tgkill = 424, + stat64 = 425, + lstat64 = 426, + fstat64 = 427, + vserver = 428, + mbind = 429, + get_mempolicy = 430, + set_mempolicy = 431, + mq_open = 432, + mq_unlink = 433, + mq_timedsend = 434, + mq_timedreceive = 435, + mq_notify = 436, + mq_getsetattr = 437, + waitid = 438, + add_key = 439, + request_key = 440, + keyctl = 441, + ioprio_set = 442, + ioprio_get = 443, + inotify_init = 444, + inotify_add_watch = 445, + inotify_rm_watch = 446, + fdatasync = 447, + kexec_load = 448, + migrate_pages = 449, + openat = 450, + mkdirat = 451, + mknodat = 452, + fchownat = 453, + futimesat = 454, + fstatat64 = 455, + unlinkat = 456, + renameat = 457, + linkat = 458, + symlinkat = 459, + readlinkat = 460, + fchmodat = 461, + faccessat = 462, + pselect6 = 463, + ppoll = 464, + unshare = 465, + set_robust_list = 466, + get_robust_list = 467, + splice = 468, + sync_file_range = 469, + tee = 470, + vmsplice = 471, + move_pages = 472, + getcpu = 473, + epoll_pwait = 474, + utimensat = 475, + signalfd = 476, + timerfd = 477, + eventfd = 478, + recvmmsg = 479, + fallocate = 480, + timerfd_create = 481, + timerfd_settime = 482, + timerfd_gettime = 483, + signalfd4 = 484, + eventfd2 = 485, + epoll_create1 = 486, + dup3 = 487, + pipe2 = 488, + inotify_init1 = 489, + preadv = 490, + pwritev = 491, + rt_tgsigqueueinfo = 492, + perf_event_open = 493, + fanotify_init = 494, + fanotify_mark = 495, + prlimit64 = 496, + name_to_handle_at = 497, + open_by_handle_at = 498, + clock_adjtime = 499, + syncfs = 500, + setns = 501, + accept4 = 502, + sendmmsg = 503, + process_vm_readv = 504, + process_vm_writev = 505, + kcmp = 506, + finit_module = 507, + sched_setattr = 508, + sched_getattr = 509, + renameat2 = 510, + getrandom = 511, + memfd_create = 512, + execveat = 513, + seccomp = 514, + bpf = 515, + userfaultfd = 516, + membarrier = 517, + mlock2 = 518, + copy_file_range = 519, + preadv2 = 520, + pwritev2 = 521, + statx = 522, + io_pgetevents = 523, + pkey_mprotect = 524, + pkey_alloc = 525, + pkey_free = 526, + rseq = 527, + statfs64 = 528, + fstatfs64 = 529, + getegid = 530, + geteuid = 531, + getppid = 532, + pidfd_send_signal = 534, + io_uring_setup = 535, + io_uring_enter = 536, + io_uring_register = 537, + open_tree = 538, + move_mount = 539, + fsopen = 540, + fsconfig = 541, + fsmount = 542, + fspick = 543, + pidfd_open = 544, + clone3 = 545, + close_range = 546, + openat2 = 547, + pidfd_getfd = 548, + faccessat2 = 549, + process_madvise = 550, + epoll_pwait2 = 551, + mount_setattr = 552, + quotactl_fd = 553, + landlock_create_ruleset = 554, + landlock_add_rule = 555, + landlock_restrict_self = 556, + process_mrelease = 558, + futex_waitv = 559, + set_mempolicy_home_node = 560, + cachestat = 561, + fchmodat2 = 562, + map_shadow_stack = 563, + futex_wake = 564, + futex_wait = 565, + futex_requeue = 566, + statmount = 567, + listmount = 568, + lsm_get_self_attr = 569, + lsm_set_self_attr = 570, + lsm_list_modules = 571, + mseal = 572, + setxattrat = 573, + getxattrat = 574, + listxattrat = 575, + removexattrat = 576, + open_tree_attr = 577, + file_getattr = 578, + file_setattr = 579, + listns = 580, + rseq_slice_yield = 581, +}; + pub const Arm64 = enum(usize) { io_setup = 0, io_destroy = 1, diff --git a/lib/std/os/linux/tls.zig b/lib/std/os/linux/tls.zig index 3d180f05dce1bc8e3a7a3fb7d818651bd9cf6055..e188f954626cb7b6ad9b78faf5d723ffc2eae4cd 100644 --- a/lib/std/os/linux/tls.zig +++ b/lib/std/os/linux/tls.zig @@ -256,7 +256,7 @@ pub fn setThreadPointer(addr: usize) void { }, .alpha => { asm volatile ( - \\ lda a0, %[addr] + \\ lda $16, 0(%[addr]) \\ wruniq : : [addr] "r" (addr), diff --git a/tools/generate_linux_syscalls.zig b/tools/generate_linux_syscalls.zig index de537563127047c338ea71390c717589e9e426f1..5c53c970afaf730f01ec1042b42ee46f78c2759e 100644 --- a/tools/generate_linux_syscalls.zig +++ b/tools/generate_linux_syscalls.zig @@ -156,6 +156,7 @@ const architectures: []const Arch = &.{ .{ .@"var" = "PowerPC64", .table = .{ .specific = "arch/powerpc/kernel/syscalls/syscall.tbl" }, .abi = &.{ .common, .@"64", .nospu } }, .{ .@"var" = "S390x", .table = .{ .specific = "arch/s390/kernel/syscalls/syscall.tbl" }, .abi = &.{ .common, .@"64" } }, .{ .@"var" = "Xtensa", .table = .{ .specific = "arch/xtensa/kernel/syscalls/syscall.tbl" } }, + .{ .@"var" = "Alpha", .table = .{ .specific = "arch/alpha/kernel/syscalls/syscall.tbl" } }, .{ .@"var" = "Arm64", .table = .generic, .abi = &.{ .common, .@"64", .renameat, .rlimit, .memfd_secret } }, .{ .@"var" = "RiscV32", .table = .generic, .abi = &.{ .common, .@"32", .riscv, .memfd_secret } }, .{ .@"var" = "RiscV64", .table = .generic, .abi = &.{ .common, .@"64", .riscv, .rlimit, .memfd_secret } },