From 1221e393f7e1ab5efaafdc4c168f2b3467efd2d2 Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 3 Jan 2025 09:29:39 -0500 Subject: [PATCH] add 32 bit Sig_Info and remove ppoll_time64 call --- core/sys/linux/sys.odin | 9 +- core/sys/linux/types.odin | 219 +++++++++++++++++++++++++++----------- 2 files changed, 156 insertions(+), 72 deletions(-) diff --git a/core/sys/linux/sys.odin b/core/sys/linux/sys.odin index 2117d7d43..fee385fe8 100644 --- a/core/sys/linux/sys.odin +++ b/core/sys/linux/sys.odin @@ -2699,13 +2699,8 @@ faccessat :: proc "contextless" (dirfd: Fd, name: cstring, mode: Mode = F_OK) -> Available since Linux 2.6.16. */ ppoll :: proc "contextless" (fds: []Poll_Fd, timeout: ^Time_Spec, sigmask: ^Sig_Set) -> (i32, Errno) { - when size_of(int) == 8 { - ret := syscall(SYS_ppoll, raw_data(fds), len(fds), timeout, sigmask, size_of(Sig_Set)) - return errno_unwrap(ret, i32) - } else { - ret := syscall(SYS_ppoll_time64, raw_data(fds), len(fds), timeout, sigmask, size_of(Sig_Set)) - return errno_unwrap(ret, i32) - } + ret := syscall(SYS_ppoll, raw_data(fds), len(fds), timeout, sigmask, size_of(Sig_Set)) + return errno_unwrap(ret, i32) } // TODO(flysand): unshare diff --git a/core/sys/linux/types.odin b/core/sys/linux/types.odin index 2c01d072d..dcc72f72b 100644 --- a/core/sys/linux/types.odin +++ b/core/sys/linux/types.odin @@ -517,79 +517,79 @@ Pid_FD_Flags :: bit_set[Pid_FD_Flags_Bits; i32] Sig_Set :: [_SIGSET_NWORDS]uint @private SI_MAX_SIZE :: 128 -@private SI_ARCH_PREAMBLE :: 4 * size_of(i32) +@private SI_ARCH_PREAMBLE :: 4 * size_of(i32) when size_of(rawptr) == 8 else 3 * size_of(i32) @private SI_PAD_SIZE :: SI_MAX_SIZE - SI_ARCH_PREAMBLE Sig_Handler_Fn :: #type proc "c" (sig: Signal) Sig_Restore_Fn :: #type proc "c" () -> ! -Sig_Info :: struct #packed { - signo: Signal, - errno: Errno, - code: i32, - _pad0: i32, - using _union: struct #raw_union { - _pad1: [SI_PAD_SIZE]u8, - using _kill: struct { - pid: Pid, /* sender's pid */ - uid: Uid, /* sender's uid */ - }, - using _timer: struct { - timerid: i32, /* timer id */ - overrun: i32, /* overrun count */ - value: Sig_Val, /* timer value */ - }, - /* POSIX.1b signals */ - using _rt: struct { - _pid0: Pid, /* sender's pid */ - _uid0: Uid, /* sender's uid */ - }, - /* SIGCHLD */ - using _sigchld: struct { - _pid1: Pid, /* which child */ - _uid1: Uid, /* sender's uid */ - status: i32, /* exit code */ - utime: uint, - stime: uint, //clock_t - }, - /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ - using _sigfault: struct { - addr: rawptr, /* faulting insn/memory ref. */ - using _: struct #raw_union { - trapno: i32, /* Trap number that caused signal */ - addr_lsb: i16, /* LSB of the reported address */ - using _addr_bnd: struct { - _pad2: u64, - lower: rawptr, /* lower bound during fault */ - upper: rawptr, /* upper bound during fault */ - }, - using _addr_pkey: struct { - _pad3: u64, - pkey: u32, /* protection key on PTE that faulted */ - }, - using _perf: struct { - perf_data: u64, - perf_type: u32, - perf_flags: u32, +when size_of(rawptr) == 8 { + Sig_Info :: struct #packed { + signo: Signal, + errno: Errno, + code: i32, + _pad0: i32, + using _union: struct #raw_union { + _pad1: [SI_PAD_SIZE]u8, + using _kill: struct { + pid: Pid, /* sender's pid */ + uid: Uid, /* sender's uid */ + }, + using _timer: struct { + timerid: i32, /* timer id */ + overrun: i32, /* overrun count */ + value: Sig_Val, /* timer value */ + }, + /* POSIX.1b signals */ + using _rt: struct { + _pid0: Pid, /* sender's pid */ + _uid0: Uid, /* sender's uid */ + }, + /* SIGCHLD */ + using _sigchld: struct { + _pid1: Pid, /* which child */ + _uid1: Uid, /* sender's uid */ + status: i32, /* exit code */ + utime: uint, + stime: uint, //clock_t + }, + /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ + using _sigfault: struct { + addr: rawptr, /* faulting insn/memory ref. */ + using _: struct #raw_union { + trapno: i32, /* Trap number that caused signal */ + addr_lsb: i16, /* LSB of the reported address */ + using _addr_bnd: struct { + _pad2: u64, + lower: rawptr, /* lower bound during fault */ + upper: rawptr, /* upper bound during fault */ + }, + using _addr_pkey: struct { + _pad3: u64, + pkey: u32, /* protection key on PTE that faulted */ + }, + using _perf: struct { + perf_data: u64, + perf_type: u32, + perf_flags: u32, + }, }, }, + /* SIGPOLL */ + using _sigpoll: struct { + band: int, /* POLL_IN, POLL_OUT, POLL_MSG */ + fd: Fd, + }, + /* SIGSYS */ + using _sigsys: struct { + call_addr: rawptr, /* calling user insn */ + syscall: i32, /* triggering system call number */ + arch: u32, /* AUDIT_ARCH_* of syscall */ + }, }, - /* SIGPOLL */ - using _sigpoll: struct { - band: int, /* POLL_IN, POLL_OUT, POLL_MSG */ - fd: Fd, - }, - /* SIGSYS */ - using _sigsys: struct { - call_addr: rawptr, /* calling user insn */ - syscall: i32, /* triggering system call number */ - arch: u32, /* AUDIT_ARCH_* of syscall */ - }, - }, -} + } -#assert(size_of(Sig_Info) == 128) -when ODIN_ARCH == .amd64 || ODIN_ARCH == .arm64 { + #assert(size_of(Sig_Info) == 128) #assert(offset_of(Sig_Info, signo) == 0x00) #assert(offset_of(Sig_Info, errno) == 0x04) #assert(offset_of(Sig_Info, code) == 0x08) @@ -616,7 +616,96 @@ when ODIN_ARCH == .amd64 || ODIN_ARCH == .arm64 { #assert(offset_of(Sig_Info, syscall) == 0x18) #assert(offset_of(Sig_Info, arch) == 0x1C) } else { - // TODO + Sig_Info :: struct { + signo: Signal, + errno: Errno, + code: i32, + using _union: struct #raw_union { + _pad1: [SI_PAD_SIZE]u8, + using _kill: struct { + pid: Pid, /* sender's pid */ + uid: Uid, /* sender's uid */ + }, + using _timer: struct { + timerid: i32, /* timer id */ + overrun: i32, /* overrun count */ + value: Sig_Val, /* timer value */ + }, + /* POSIX.1b signals */ + using _rt: struct { + _pid0: Pid, /* sender's pid */ + _uid0: Uid, /* sender's uid */ + }, + /* SIGCHLD */ + using _sigchld: struct { + _pid1: Pid, /* which child */ + _uid1: Uid, /* sender's uid */ + status: i32, /* exit code */ + utime: uint, + stime: uint, //clock_t + }, + /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ + using _sigfault: struct { + addr: rawptr, /* faulting insn/memory ref. */ + using _: struct #raw_union { + trapno: i32, /* Trap number that caused signal */ + addr_lsb: i16, /* LSB of the reported address */ + using _addr_bnd: struct { + _pad2: u32, + lower: rawptr, /* lower bound during fault */ + upper: rawptr, /* upper bound during fault */ + }, + using _addr_pkey: struct { + _pad3: u32, + pkey: u32, /* protection key on PTE that faulted */ + }, + using _perf: struct { + perf_data: u32, + perf_type: u32, + perf_flags: u32, + }, + }, + }, + /* SIGPOLL */ + using _sigpoll: struct { + band: int, /* POLL_IN, POLL_OUT, POLL_MSG */ + fd: Fd, + }, + /* SIGSYS */ + using _sigsys: struct { + call_addr: rawptr, /* calling user insn */ + syscall: i32, /* triggering system call number */ + arch: u32, /* AUDIT_ARCH_* of syscall */ + }, + }, + } + + #assert(size_of(Sig_Info) == 128) + #assert(offset_of(Sig_Info, signo) == 0x00) + #assert(offset_of(Sig_Info, errno) == 0x04) + #assert(offset_of(Sig_Info, code) == 0x08) + #assert(offset_of(Sig_Info, pid) == 0x0c) + #assert(offset_of(Sig_Info, uid) == 0x10) + #assert(offset_of(Sig_Info, timerid) == 0x0c) + #assert(offset_of(Sig_Info, overrun) == 0x10) + #assert(offset_of(Sig_Info, value) == 0x14) + #assert(offset_of(Sig_Info, status) == 0x14) + #assert(offset_of(Sig_Info, utime) == 0x18) + #assert(offset_of(Sig_Info, stime) == 0x1c) + #assert(offset_of(Sig_Info, addr) == 0x0c) + #assert(offset_of(Sig_Info, addr_lsb) == 0x10) + #assert(offset_of(Sig_Info, trapno) == 0x10) + #assert(offset_of(Sig_Info, lower) == 0x14) + #assert(offset_of(Sig_Info, upper) == 0x18) + #assert(offset_of(Sig_Info, pkey) == 0x14) + #assert(offset_of(Sig_Info, perf_data) == 0x10) + #assert(offset_of(Sig_Info, perf_type) == 0x14) + #assert(offset_of(Sig_Info, perf_flags) == 0x18) + #assert(offset_of(Sig_Info, band) == 0x0c) + #assert(offset_of(Sig_Info, fd) == 0x10) + #assert(offset_of(Sig_Info, call_addr) == 0x0c) + #assert(offset_of(Sig_Info, syscall) == 0x10) + #assert(offset_of(Sig_Info, arch) == 0x14) } SIGEV_MAX_SIZE :: 64