authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-04-01 11:03:36+02:00
committergravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-04-01 12:11:19+02:00
log070ace4b22810116f7816eeccbc1ce600be5b2a2
tree28a88e7a1aa8567d3549c4a92548ec9e11dd23cf
parenta5af78c376fc41424b81ea83766b38a0a1d17870

std: Fix more NetBSD bits

Fix some more libc definitions.

4 files changed, 160 insertions(+), 42 deletions(-)

lib/std/c/netbsd.zig+33-11
......@@ -10,36 +10,58 @@ pub const dl_iterate_phdr_callback = extern fn (info: *dl_phdr_info, size: usize
1010pub extern "c" fn dl_iterate_phdr(callback: dl_iterate_phdr_callback, data: ?*c_void) c_int;
1111
1212pub extern "c" fn __fstat50(fd: fd_t, buf: *Stat) c_int;
13pub extern "c" fn __stat50(path: [*:0]const u8, buf: *Stat) c_int;
1314pub extern "c" fn __clock_gettime50(clk_id: c_int, tp: *timespec) c_int;
1415pub extern "c" fn __clock_getres50(clk_id: c_int, tp: *timespec) c_int;
1516pub extern "c" fn __getdents30(fd: c_int, buf_ptr: [*]u8, nbytes: usize) c_int;
1617pub extern "c" fn __sigaltstack14(ss: ?*stack_t, old_ss: ?*stack_t) c_int;
18pub extern "c" fn __nanosleep50(rqtp: *const timespec, rmtp: ?*timespec) c_int;
19pub extern "c" fn __sigaction14(sig: c_int, noalias act: *const Sigaction, noalias oact: ?*Sigaction) c_int;
20pub extern "c" fn __sigprocmask14(how: c_int, noalias set: ?*const sigset_t, noalias oset: ?*sigset_t) c_int;
21pub extern "c" fn __socket30(domain: c_uint, sock_type: c_uint, protocol: c_uint) c_int;
22pub extern "c" fn __gettimeofday50(noalias tv: ?*timeval, noalias tz: ?*timezone) c_int;
23pub extern "c" fn __getrusage50(who: c_int, usage: *rusage) c_int;
24// instead of sched_yield
25pub extern "c" fn __libc_thr_yield() c_int;
1726
1827pub const pthread_mutex_t = extern struct {
19 ptm_magic: c_uint = 0x33330003,
20 ptm_errorcheck: padded_spin_t = 0,
21 ptm_unused: padded_spin_t = 0,
28 ptm_magic: u32 = 0x33330003,
29 ptm_errorcheck: padded_pthread_spin_t = 0,
30 ptm_ceiling: padded_pthread_spin_t = 0,
2231 ptm_owner: usize = 0,
2332 ptm_waiters: ?*u8 = null,
24 ptm_recursed: c_uint = 0,
33 ptm_recursed: u32 = 0,
2534 ptm_spare2: ?*c_void = null,
2635};
36
2737pub const pthread_cond_t = extern struct {
28 ptc_magic: c_uint = 0x55550005,
38 ptc_magic: u32 = 0x55550005,
2939 ptc_lock: pthread_spin_t = 0,
3040 ptc_waiters_first: ?*u8 = null,
3141 ptc_waiters_last: ?*u8 = null,
3242 ptc_mutex: ?*pthread_mutex_t = null,
3343 ptc_private: ?*c_void = null,
3444};
35const pthread_spin_t = if (builtin.arch == .arm or .arch == .powerpc) c_int else u8;
36const padded_spin_t = switch (builtin.arch) {
37 .sparc, .sparcel, .sparcv9, .i386, .x86_64, .le64 => u32,
38 else => spin_t,
45
46const pthread_spin_t = switch (builtin.arch) {
47 .aarch64, .aarch64_be, .aarch64_32 => u8,
48 .mips, .mipsel, .mips64, .mips64el => u32,
49 .powerpc, .powerpc64, .powerpc64le => i32,
50 .i386, .x86_64 => u8,
51 .arm, .armeb, .thumb, .thumbeb => i32,
52 .sparc, .sparcel, .sparcv9 => u8,
53 .riscv32, .riscv64 => u32,
54 else => @compileError("undefined pthread_spin_t for this arch"),
55};
56
57const padded_pthread_spin_t = switch (builtin.arch) {
58 .i386, .x86_64 => u32,
59 .sparc, .sparcel, .sparcv9 => u32,
60 else => pthread_spin_t,
3961};
4062
4163pub const pthread_attr_t = extern struct {
4264 pta_magic: u32,
43 pta_flags: c_int,
44 pta_private: *c_void,
65 pta_flags: i32,
66 pta_private: ?*c_void,
4567};
lib/std/debug.zig+11-3
......@@ -1666,7 +1666,11 @@ fn getDebugInfoAllocator() *mem.Allocator {
16661666}
16671667
16681668/// Whether or not the current target can print useful debug information when a segfault occurs.
1669pub const have_segfault_handling_support = builtin.os.tag == .linux or builtin.os.tag == .windows;
1669pub const have_segfault_handling_support = switch (builtin.os.tag) {
1670 .linux, .netbsd => true,
1671 .windows => true,
1672 else => false,
1673};
16701674pub const enable_segfault_handler: bool = if (@hasDecl(root, "enable_segfault_handler"))
16711675 root.enable_segfault_handler
16721676else
......@@ -1718,13 +1722,17 @@ fn resetSegfaultHandler() void {
17181722 os.sigaction(os.SIGBUS, &act, null);
17191723}
17201724
1721fn handleSegfaultLinux(sig: i32, info: *const os.siginfo_t, ctx_ptr: *const c_void) callconv(.C) noreturn {
1725fn handleSegfaultLinux(sig: i32, info: *const os.siginfo_t, ctx_ptr: ?*const c_void) callconv(.C) noreturn {
17221726 // Reset to the default handler so that if a segfault happens in this handler it will crash
17231727 // the process. Also when this handler returns, the original instruction will be repeated
17241728 // and the resulting segfault will crash the process rather than continually dump stack traces.
17251729 resetSegfaultHandler();
17261730
1727 const addr = @ptrToInt(info.fields.sigfault.addr);
1731 const addr = switch (builtin.os.tag) {
1732 .linux => @ptrToInt(info.fields.sigfault.addr),
1733 .netbsd => @ptrToInt(info.info.reason.fault.addr),
1734 else => unreachable,
1735 };
17281736 switch (sig) {
17291737 os.SIGSEGV => std.debug.warn("Segmentation fault at address 0x{x}\n", .{addr}),
17301738 os.SIGILL => std.debug.warn("Illegal instruction at address 0x{x}\n", .{addr}),
lib/std/os/bits/linux.zig+2-2
......@@ -813,13 +813,13 @@ pub const app_mask: sigset_t = [2]u32{ 0xfffffffc, 0x7fffffff } ++ [_]u32{0xffff
813813pub const k_sigaction = if (is_mips)
814814 extern struct {
815815 flags: usize,
816 sigaction: ?extern fn (i32, *siginfo_t, *c_void) void,
816 sigaction: ?extern fn (i32, *siginfo_t, ?*c_void) void,
817817 mask: [4]u32,
818818 restorer: extern fn () void,
819819 }
820820else
821821 extern struct {
822 sigaction: ?extern fn (i32, *siginfo_t, *c_void) void,
822 sigaction: ?extern fn (i32, *siginfo_t, ?*c_void) void,
823823 flags: usize,
824824 restorer: extern fn () void,
825825 mask: [2]u32,
lib/std/os/bits/netbsd.zig+114-26
......@@ -1,12 +1,22 @@
11const std = @import("../../std.zig");
2const builtin = std.builtin;
23const maxInt = std.math.maxInt;
34
5pub const blkcnt_t = i64;
6pub const blksize_t = i32;
7pub const clock_t = u32;
8pub const dev_t = u64;
49pub const fd_t = i32;
5pub const pid_t = i32;
6pub const mode_t = u32;
10pub const gid_t = u32;
711pub const ino_t = u64;
12pub const mode_t = u32;
13pub const nlink_t = u32;
814pub const off_t = i64;
15pub const pid_t = i32;
916pub const socklen_t = u32;
17pub const time_t = i64;
18pub const uid_t = u32;
19pub const lwpid_t = i32;
1020
1121/// Renamed from `kevent` to `Kevent` to avoid conflict with function name.
1222pub const Kevent = extern struct {
......@@ -137,23 +147,20 @@ pub const msghdr_const = extern struct {
137147/// in C, macros are used to hide the differences. Here we use
138148/// methods to accomplish this.
139149pub const Stat = extern struct {
140 dev: u64,
141 mode: u32,
150 dev: dev_t,
151 mode: mode_t,
142152 ino: ino_t,
143 nlink: usize,
144
145 uid: u32,
146 gid: u32,
147 rdev: u64,
148
153 nlink: nlink_t,
154 uid: uid_t,
155 gid: gid_t,
156 rdev: dev_t,
149157 atim: timespec,
150158 mtim: timespec,
151159 ctim: timespec,
152160 birthtim: timespec,
153
154161 size: off_t,
155 blocks: i64,
156 blksize: isize,
162 blocks: blkcnt_t,
163 blksize: blksize_t,
157164 flags: u32,
158165 gen: u32,
159166 __spare: [2]u32,
......@@ -176,12 +183,14 @@ pub const timespec = extern struct {
176183 tv_nsec: isize,
177184};
178185
186pub const MAXNAMLEN = 511;
187
179188pub const dirent = extern struct {
180 d_fileno: u64,
189 d_fileno: ino_t,
181190 d_reclen: u16,
182191 d_namlen: u16,
183192 d_type: u8,
184 d_name: [512]u8,
193 d_name: [MAXNAMLEN:0]u8,
185194
186195 pub fn reclen(self: dirent) u16 {
187196 return self.d_reclen;
......@@ -685,23 +694,74 @@ pub const winsize = extern struct {
685694
686695const NSIG = 32;
687696
688pub const SIG_ERR = @intToPtr(extern fn (i32) void, maxInt(usize));
689pub const SIG_DFL = @intToPtr(extern fn (i32) void, 0);
690pub const SIG_IGN = @intToPtr(extern fn (i32) void, 1);
697pub const SIG_ERR = @intToPtr(?Sigaction.sigaction_fn, maxInt(usize));
698pub const SIG_DFL = @intToPtr(?Sigaction.sigaction_fn, 0);
699pub const SIG_IGN = @intToPtr(?Sigaction.sigaction_fn, 1);
691700
692701/// Renamed from `sigaction` to `Sigaction` to avoid conflict with the syscall.
693702pub const Sigaction = extern struct {
703 pub const sigaction_fn = fn (i32, *siginfo_t, ?*c_void) callconv(.C) void;
694704 /// signal handler
695 __sigaction_u: extern union {
696 __sa_handler: extern fn (i32) void,
697 __sa_sigaction: extern fn (i32, *__siginfo, usize) void,
698 },
705 sigaction: ?sigaction_fn,
706 /// signal mask to apply
707 mask: sigset_t,
708 /// signal options
709 flags: u32,
710};
699711
700 /// see signal options
701 sa_flags: u32,
712pub const sigval_t = extern union {
713 int: i32,
714 ptr: ?*c_void,
715};
702716
703 /// signal mask to apply
704 sa_mask: sigset_t,
717pub const siginfo_t = extern union {
718 pad: [128]u8,
719 info: _ksiginfo,
720};
721
722pub const _ksiginfo = extern struct {
723 signo: i32,
724 code: i32,
725 errno: i32,
726 // 64bit architectures insert 4bytes of padding here, this is done by
727 // correctly aligning the reason field
728 reason: extern union {
729 rt: extern struct {
730 pid: pid_t,
731 uid: uid_t,
732 value: sigval_t,
733 },
734 child: extern struct {
735 pid: pid_t,
736 uid: uid_t,
737 status: i32,
738 utime: clock_t,
739 stime: clock_t,
740 },
741 fault: extern struct {
742 addr: ?*c_void,
743 trap: i32,
744 trap2: i32,
745 trap3: i32,
746 },
747 poll: extern struct {
748 band: i32,
749 fd: i32,
750 },
751 syscall: extern struct {
752 sysnum: i32,
753 retval: [2]i32,
754 @"error": i32,
755 args: [8]u64,
756 },
757 ptrace_state: extern struct {
758 pe_report_event: i32,
759 option: extern union {
760 pe_other_pid: pid_t,
761 pe_lwp: lwpid_t,
762 },
763 },
764 } align(@sizeOf(usize)),
705765};
706766
707767pub const _SIG_WORDS = 4;
......@@ -724,6 +784,34 @@ pub const sigset_t = extern struct {
724784 __bits: [_SIG_WORDS]u32,
725785};
726786
787pub const empty_sigset = sigset_t{ .__bits = [_]u32{0} ** _SIG_WORDS };
788
789// XXX x86_64 specific
790pub const mcontext_t = extern struct {
791 gregs: [26]u64,
792 mc_tlsbase: u64,
793 fpregs: [512]u8 align(8),
794};
795
796pub const REG_RBP = 12;
797pub const REG_RIP = 21;
798pub const REG_RSP = 24;
799
800pub const ucontext_t = extern struct {
801 flags: u32,
802 link: ?*ucontext_t,
803 sigmask: sigset_t,
804 stack: stack_t,
805 mcontext: mcontext_t,
806 __pad: [switch (builtin.arch) {
807 .i386 => 4,
808 .mips, .mipsel, .mips64, .mips64el => 14,
809 .arm, .armeb, .thumb, .thumbeb => 1,
810 .sparc, .sparcel, .sparcv9 => if (@sizeOf(usize) == 4) 43 else 8,
811 else => 0,
812 }]u32,
813};
814
727815pub const EPERM = 1; // Operation not permitted
728816pub const ENOENT = 2; // No such file or directory
729817pub const ESRCH = 3; // No such process