authorgravatar for dev@sgregoratto.meStephen Gregoratto <dev@sgregoratto.me> 2023-01-19 00:55:51+11:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-01-21 23:20:50+02:00
log7f635ae7bdf63da19d09763c7fdbdc61fa035282
tree02bdc2a4af9b840364b15b3eb1fd89913e45d3d4
parent38eebf3c4d68239e1d29118234a3165355a3a5fc

FreeBSD: add mcontext_t for aarch64

What isn't disabled for test-std mostly passes, except for the copysign and signbit tests for f16. Seemingly related to #14366.

3 files changed, 93 insertions(+), 51 deletions(-)

lib/std/c/freebsd.zig+89-51
...@@ -155,6 +155,8 @@ pub const EAI = enum(c_int) {...@@ -155,6 +155,8 @@ pub const EAI = enum(c_int) {
155155
156pub const EAI_MAX = 15;156pub const EAI_MAX = 15;
157157
158pub const IFNAMESIZE = 16;
159
158pub const AI = struct {160pub const AI = struct {
159 /// get address to use bind()161 /// get address to use bind()
160 pub const PASSIVE = 0x00000001;162 pub const PASSIVE = 0x00000001;
...@@ -1271,62 +1273,98 @@ pub const siginfo_t = extern struct {...@@ -1271,62 +1273,98 @@ pub const siginfo_t = extern struct {
1271 },1273 },
1272};1274};
12731275
1274pub usingnamespace switch (builtin.cpu.arch) {1276pub const mcontext_t = switch (builtin.cpu.arch) {
1275 .x86_64 => struct {1277 .x86_64 => extern struct {
1276 pub const ucontext_t = extern struct {1278 onstack: u64,
1277 sigmask: sigset_t,1279 rdi: u64,
1278 mcontext: mcontext_t,1280 rsi: u64,
1279 link: ?*ucontext_t,1281 rdx: u64,
1280 stack: stack_t,1282 rcx: u64,
1281 flags: c_int,1283 r8: u64,
1282 __spare__: [4]c_int,1284 r9: u64,
1283 };1285 rax: u64,
12841286 rbx: u64,
1285 /// XXX x86_64 specific1287 rbp: u64,
1286 pub const mcontext_t = extern struct {1288 r10: u64,
1287 onstack: u64,1289 r11: u64,
1288 rdi: u64,1290 r12: u64,
1289 rsi: u64,1291 r13: u64,
1290 rdx: u64,1292 r14: u64,
1291 rcx: u64,1293 r15: u64,
1292 r8: u64,1294 trapno: u32,
1293 r9: u64,1295 fs: u16,
1294 rax: u64,1296 gs: u16,
1295 rbx: u64,1297 addr: u64,
1296 rbp: u64,1298 flags: u32,
1297 r10: u64,1299 es: u16,
1298 r11: u64,1300 ds: u16,
1299 r12: u64,1301 err: u64,
1300 r13: u64,1302 rip: u64,
1301 r14: u64,1303 cs: u64,
1302 r15: u64,1304 rflags: u64,
1303 trapno: u32,1305 rsp: u64,
1304 fs: u16,1306 ss: u64,
1305 gs: u16,1307 len: u64,
1306 addr: u64,1308 fpformat: u64,
1309 ownedfp: u64,
1310 fpstate: [64]u64 align(16),
1311 fsbase: u64,
1312 gsbase: u64,
1313 xfpustate: u64,
1314 xfpustate_len: u64,
1315 spare: [4]u64,
1316 },
1317 .aarch64 => extern struct {
1318 gpregs: extern struct {
1319 x: [30]u64,
1320 lr: u64,
1321 sp: u64,
1322 elr: u64,
1323 spsr: u32,
1324 _pad: u32,
1325 },
1326 fpregs: extern struct {
1327 q: [32]u128,
1328 sr: u32,
1329 cr: u32,
1307 flags: u32,1330 flags: u32,
1308 es: u16,1331 _pad: u32,
1309 ds: u16,1332 },
1310 err: u64,1333 flags: u32,
1311 rip: u64,1334 _pad: u32,
1312 cs: u64,1335 _spare: [8]u64,
1313 rflags: u64,1336 },
1314 rsp: u64,1337 else => struct {},
1315 ss: u64,1338};
1316 len: u64,1339
1317 fpformat: u64,1340pub const REG = switch (builtin.cpu.arch) {
1318 ownedfp: u64,1341 .aarch64 => struct {
1319 fpstate: [64]u64 align(16),1342 pub const FP = 29;
1320 fsbase: u64,1343 pub const SP = 31;
1321 gsbase: u64,1344 pub const PC = 32;
1322 xfpustate: u64,1345 },
1323 xfpustate_len: u64,1346 .arm => struct {
1324 spare: [4]u64,1347 pub const FP = 11;
1325 };1348 pub const SP = 13;
1349 pub const PC = 15;
1350 },
1351 .x86_64 => struct {
1352 pub const RBP = 12;
1353 pub const RIP = 21;
1354 pub const RSP = 24;
1326 },1355 },
1327 else => struct {},1356 else => struct {},
1328};1357};
13291358
1359pub const ucontext_t = extern struct {
1360 sigmask: sigset_t,
1361 mcontext: mcontext_t,
1362 link: ?*ucontext_t,
1363 stack: stack_t,
1364 flags: c_int,
1365 __spare__: [4]c_int,
1366};
1367
1330pub const E = enum(u16) {1368pub const E = enum(u16) {
1331 /// No error occurred.1369 /// No error occurred.
1332 SUCCESS = 0,1370 SUCCESS = 0,
lib/std/debug.zig+2
...@@ -1986,12 +1986,14 @@ fn handleSegfaultPosix(sig: i32, info: *const os.siginfo_t, ctx_ptr: ?*const any...@@ -1986,12 +1986,14 @@ fn handleSegfaultPosix(sig: i32, info: *const os.siginfo_t, ctx_ptr: ?*const any
1986 const ip = switch (native_os) {1986 const ip = switch (native_os) {
1987 .macos => @intCast(usize, ctx.mcontext.ss.pc),1987 .macos => @intCast(usize, ctx.mcontext.ss.pc),
1988 .netbsd => @intCast(usize, ctx.mcontext.gregs[os.REG.PC]),1988 .netbsd => @intCast(usize, ctx.mcontext.gregs[os.REG.PC]),
1989 .freebsd => @intCast(usize, ctx.mcontext.gpregs.elr),
1989 else => @intCast(usize, ctx.mcontext.pc),1990 else => @intCast(usize, ctx.mcontext.pc),
1990 };1991 };
1991 // x29 is the ABI-designated frame pointer1992 // x29 is the ABI-designated frame pointer
1992 const bp = switch (native_os) {1993 const bp = switch (native_os) {
1993 .macos => @intCast(usize, ctx.mcontext.ss.fp),1994 .macos => @intCast(usize, ctx.mcontext.ss.fp),
1994 .netbsd => @intCast(usize, ctx.mcontext.gregs[os.REG.FP]),1995 .netbsd => @intCast(usize, ctx.mcontext.gregs[os.REG.FP]),
1996 .freebsd => @intCast(usize, ctx.mcontext.gpregs.x[os.REG.FP]),
1995 else => @intCast(usize, ctx.mcontext.regs[29]),1997 else => @intCast(usize, ctx.mcontext.regs[29]),
1996 };1998 };
1997 dumpStackTraceFromBase(bp, ip);1999 dumpStackTraceFromBase(bp, ip);
src/crash_report.zig+2
...@@ -238,12 +238,14 @@ fn handleSegfaultPosix(sig: i32, info: *const os.siginfo_t, ctx_ptr: ?*const any...@@ -238,12 +238,14 @@ fn handleSegfaultPosix(sig: i32, info: *const os.siginfo_t, ctx_ptr: ?*const any
238 const ip = switch (native_os) {238 const ip = switch (native_os) {
239 .macos => @intCast(usize, ctx.mcontext.ss.pc),239 .macos => @intCast(usize, ctx.mcontext.ss.pc),
240 .netbsd => @intCast(usize, ctx.mcontext.gregs[os.REG.PC]),240 .netbsd => @intCast(usize, ctx.mcontext.gregs[os.REG.PC]),
241 .freebsd => @intCast(usize, ctx.mcontext.gpregs.elr),
241 else => @intCast(usize, ctx.mcontext.pc),242 else => @intCast(usize, ctx.mcontext.pc),
242 };243 };
243 // x29 is the ABI-designated frame pointer244 // x29 is the ABI-designated frame pointer
244 const bp = switch (native_os) {245 const bp = switch (native_os) {
245 .macos => @intCast(usize, ctx.mcontext.ss.fp),246 .macos => @intCast(usize, ctx.mcontext.ss.fp),
246 .netbsd => @intCast(usize, ctx.mcontext.gregs[os.REG.FP]),247 .netbsd => @intCast(usize, ctx.mcontext.gregs[os.REG.FP]),
248 .freebsd => @intCast(usize, ctx.mcontext.gpregs.x[os.REG.FP]),
247 else => @intCast(usize, ctx.mcontext.regs[29]),249 else => @intCast(usize, ctx.mcontext.regs[29]),
248 };250 };
249 break :ctx StackContext{ .exception = .{ .bp = bp, .ip = ip } };251 break :ctx StackContext{ .exception = .{ .bp = bp, .ip = ip } };