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) {
155155
156156pub const EAI_MAX = 15;
157157
158pub const IFNAMESIZE = 16;
159
158160pub const AI = struct {
159161 /// get address to use bind()
160162 pub const PASSIVE = 0x00000001;
......@@ -1271,62 +1273,98 @@ pub const siginfo_t = extern struct {
12711273 },
12721274};
12731275
1274pub usingnamespace switch (builtin.cpu.arch) {
1275 .x86_64 => struct {
1276 pub const ucontext_t = extern struct {
1277 sigmask: sigset_t,
1278 mcontext: mcontext_t,
1279 link: ?*ucontext_t,
1280 stack: stack_t,
1281 flags: c_int,
1282 __spare__: [4]c_int,
1283 };
1284
1285 /// XXX x86_64 specific
1286 pub const mcontext_t = extern struct {
1287 onstack: u64,
1288 rdi: u64,
1289 rsi: u64,
1290 rdx: u64,
1291 rcx: u64,
1292 r8: u64,
1293 r9: u64,
1294 rax: u64,
1295 rbx: u64,
1296 rbp: u64,
1297 r10: u64,
1298 r11: u64,
1299 r12: u64,
1300 r13: u64,
1301 r14: u64,
1302 r15: u64,
1303 trapno: u32,
1304 fs: u16,
1305 gs: u16,
1306 addr: u64,
1276pub const mcontext_t = switch (builtin.cpu.arch) {
1277 .x86_64 => extern struct {
1278 onstack: u64,
1279 rdi: u64,
1280 rsi: u64,
1281 rdx: u64,
1282 rcx: u64,
1283 r8: u64,
1284 r9: u64,
1285 rax: u64,
1286 rbx: u64,
1287 rbp: u64,
1288 r10: u64,
1289 r11: u64,
1290 r12: u64,
1291 r13: u64,
1292 r14: u64,
1293 r15: u64,
1294 trapno: u32,
1295 fs: u16,
1296 gs: u16,
1297 addr: u64,
1298 flags: u32,
1299 es: u16,
1300 ds: u16,
1301 err: u64,
1302 rip: u64,
1303 cs: u64,
1304 rflags: u64,
1305 rsp: u64,
1306 ss: u64,
1307 len: 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,
13071330 flags: u32,
1308 es: u16,
1309 ds: u16,
1310 err: u64,
1311 rip: u64,
1312 cs: u64,
1313 rflags: u64,
1314 rsp: u64,
1315 ss: u64,
1316 len: u64,
1317 fpformat: u64,
1318 ownedfp: u64,
1319 fpstate: [64]u64 align(16),
1320 fsbase: u64,
1321 gsbase: u64,
1322 xfpustate: u64,
1323 xfpustate_len: u64,
1324 spare: [4]u64,
1325 };
1331 _pad: u32,
1332 },
1333 flags: u32,
1334 _pad: u32,
1335 _spare: [8]u64,
1336 },
1337 else => struct {},
1338};
1339
1340pub const REG = switch (builtin.cpu.arch) {
1341 .aarch64 => struct {
1342 pub const FP = 29;
1343 pub const SP = 31;
1344 pub const PC = 32;
1345 },
1346 .arm => struct {
1347 pub const FP = 11;
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;
13261355 },
13271356 else => struct {},
13281357};
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
13301368pub const E = enum(u16) {
13311369 /// No error occurred.
13321370 SUCCESS = 0,
lib/std/debug.zig+2
......@@ -1986,12 +1986,14 @@ fn handleSegfaultPosix(sig: i32, info: *const os.siginfo_t, ctx_ptr: ?*const any
19861986 const ip = switch (native_os) {
19871987 .macos => @intCast(usize, ctx.mcontext.ss.pc),
19881988 .netbsd => @intCast(usize, ctx.mcontext.gregs[os.REG.PC]),
1989 .freebsd => @intCast(usize, ctx.mcontext.gpregs.elr),
19891990 else => @intCast(usize, ctx.mcontext.pc),
19901991 };
19911992 // x29 is the ABI-designated frame pointer
19921993 const bp = switch (native_os) {
19931994 .macos => @intCast(usize, ctx.mcontext.ss.fp),
19941995 .netbsd => @intCast(usize, ctx.mcontext.gregs[os.REG.FP]),
1996 .freebsd => @intCast(usize, ctx.mcontext.gpregs.x[os.REG.FP]),
19951997 else => @intCast(usize, ctx.mcontext.regs[29]),
19961998 };
19971999 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
238238 const ip = switch (native_os) {
239239 .macos => @intCast(usize, ctx.mcontext.ss.pc),
240240 .netbsd => @intCast(usize, ctx.mcontext.gregs[os.REG.PC]),
241 .freebsd => @intCast(usize, ctx.mcontext.gpregs.elr),
241242 else => @intCast(usize, ctx.mcontext.pc),
242243 };
243244 // x29 is the ABI-designated frame pointer
244245 const bp = switch (native_os) {
245246 .macos => @intCast(usize, ctx.mcontext.ss.fp),
246247 .netbsd => @intCast(usize, ctx.mcontext.gregs[os.REG.FP]),
248 .freebsd => @intCast(usize, ctx.mcontext.gpregs.x[os.REG.FP]),
247249 else => @intCast(usize, ctx.mcontext.regs[29]),
248250 };
249251 break :ctx StackContext{ .exception = .{ .bp = bp, .ip = ip } };