| ... | @@ -2317,11 +2317,11 @@ fn handleSegfaultWindows(info: *windows.EXCEPTION_POINTERS) callconv(.Stdcall) c | ... | @@ -2317,11 +2317,11 @@ fn handleSegfaultWindows(info: *windows.EXCEPTION_POINTERS) callconv(.Stdcall) c |
| 2317 | } | 2317 | } |
| 2318 | } | 2318 | } |
| 2319 | | 2319 | |
| 2320 | // zig won't let me use an anon enum here | 2320 | // zig won't let me use an anon enum here https://github.com/ziglang/zig/issues/3707 |
| 2321 | fn handleSegfaultWindowsExtra(info: *windows.EXCEPTION_POINTERS, comptime msg: u8, comptime format: ?[]const u8) noreturn { | 2321 | fn handleSegfaultWindowsExtra(info: *windows.EXCEPTION_POINTERS, comptime msg: u8, comptime format: ?[]const u8) noreturn { |
| 2322 | const exception_address = @ptrToInt(info.ExceptionRecord.ExceptionAddress); | 2322 | const exception_address = @ptrToInt(info.ExceptionRecord.ExceptionAddress); |
| 2323 | if (comptime windows_exception_context.haveContext) { | 2323 | if (@hasDecl(windows, "CONTEXT")) { |
| 2324 | const regs = windows_exception_context.getRegs(info.ContextRecord); | 2324 | const regs = info.ContextRecord.getRegs(); |
| 2325 | switch (msg) { | 2325 | switch (msg) { |
| 2326 | 0 => std.debug.warn("{}\n", .{format.?}), | 2326 | 0 => std.debug.warn("{}\n", .{format.?}), |
| 2327 | 1 => std.debug.warn("Segmentation fault at address 0x{x}\n", .{info.ExceptionRecord.ExceptionInformation[1]}), | 2327 | 1 => std.debug.warn("Segmentation fault at address 0x{x}\n", .{info.ExceptionRecord.ExceptionInformation[1]}), |
| ... | @@ -2341,251 +2341,6 @@ fn handleSegfaultWindowsExtra(info: *windows.EXCEPTION_POINTERS, comptime msg: u | ... | @@ -2341,251 +2341,6 @@ fn handleSegfaultWindowsExtra(info: *windows.EXCEPTION_POINTERS, comptime msg: u |
| 2341 | } | 2341 | } |
| 2342 | } | 2342 | } |
| 2343 | | 2343 | |
| 2344 | pub const windows_exception_context = switch (builtin.arch) { | | |
| 2345 | .i386 => struct { | | |
| 2346 | pub const haveContext = true; | | |
| 2347 | | | |
| 2348 | pub fn getRegs(ptr: *c_void) struct {bp: usize, ip: usize} { | | |
| 2349 | const ctx = @ptrCast(*const CONTEXT, @alignCast(@alignOf(CONTEXT), ptr)); | | |
| 2350 | return .{.bp = @intCast(usize, ctx.Ebp), .ip = @intCast(usize, ctx.Eip)}; | | |
| 2351 | } | | |
| 2352 | | | |
| 2353 | pub const CONTEXT = extern struct { | | |
| 2354 | ContextFlags: DWORD, | | |
| 2355 | Dr0: DWORD, | | |
| 2356 | Dr1: DWORD, | | |
| 2357 | Dr2: DWORD, | | |
| 2358 | Dr3: DWORD, | | |
| 2359 | Dr6: DWORD, | | |
| 2360 | Dr7: DWORD, | | |
| 2361 | FloatSave: FLOATING_SAVE_AREA, | | |
| 2362 | SegGs: DWORD, | | |
| 2363 | SegFs: DWORD, | | |
| 2364 | SegEs: DWORD, | | |
| 2365 | SegDs: DWORD, | | |
| 2366 | Edi: DWORD, | | |
| 2367 | Esi: DWORD, | | |
| 2368 | Ebx: DWORD, | | |
| 2369 | Edx: DWORD, | | |
| 2370 | Ecx: DWORD, | | |
| 2371 | Eax: DWORD, | | |
| 2372 | Ebp: DWORD, | | |
| 2373 | Eip: DWORD, | | |
| 2374 | SegCs: DWORD, | | |
| 2375 | EFlags: DWORD, | | |
| 2376 | Esp: DWORD, | | |
| 2377 | SegSs: DWORD, | | |
| 2378 | ExtendedRegisters: [512]BYTE, | | |
| 2379 | }; | | |
| 2380 | | | |
| 2381 | pub const FLOATING_SAVE_AREA = extern struct { | | |
| 2382 | ControlWord: DWORD, | | |
| 2383 | StatusWord: DWORD, | | |
| 2384 | TagWord: DWORD, | | |
| 2385 | ErrorOffset: DWORD, | | |
| 2386 | ErrorSelector: DWORD, | | |
| 2387 | DataOffset: DWORD, | | |
| 2388 | DataSelector: DWORD, | | |
| 2389 | RegisterArea: [80]BYTE, | | |
| 2390 | Cr0NpxState: DWORD, | | |
| 2391 | }; | | |
| 2392 | | | |
| 2393 | pub const BYTE = u8; | | |
| 2394 | pub const DWORD = c_ulong; | | |
| 2395 | }, | | |
| 2396 | .x86_64 => struct { | | |
| 2397 | pub const haveContext = true; | | |
| 2398 | | | |
| 2399 | pub fn getRegs(ptr: *c_void) struct {bp: usize, ip: usize} { | | |
| 2400 | const ctx = @ptrCast(*const CONTEXT, @alignCast(@alignOf(CONTEXT), ptr)); | | |
| 2401 | return .{.bp = @intCast(usize, ctx.Rbp), .ip = @intCast(usize, ctx.Rip)}; | | |
| 2402 | } | | |
| 2403 | | | |
| 2404 | pub const CONTEXT = extern struct { | | |
| 2405 | P1Home: DWORD64, | | |
| 2406 | P2Home: DWORD64, | | |
| 2407 | P3Home: DWORD64, | | |
| 2408 | P4Home: DWORD64, | | |
| 2409 | P5Home: DWORD64, | | |
| 2410 | P6Home: DWORD64, | | |
| 2411 | ContextFlags: DWORD, | | |
| 2412 | MxCsr: DWORD, | | |
| 2413 | SegCs: WORD, | | |
| 2414 | SegDs: WORD, | | |
| 2415 | SegEs: WORD, | | |
| 2416 | SegFs: WORD, | | |
| 2417 | SegGs: WORD, | | |
| 2418 | SegSs: WORD, | | |
| 2419 | EFlags: DWORD, | | |
| 2420 | Dr0: DWORD64, | | |
| 2421 | Dr1: DWORD64, | | |
| 2422 | Dr2: DWORD64, | | |
| 2423 | Dr3: DWORD64, | | |
| 2424 | Dr6: DWORD64, | | |
| 2425 | Dr7: DWORD64, | | |
| 2426 | Rax: DWORD64, | | |
| 2427 | Rcx: DWORD64, | | |
| 2428 | Rdx: DWORD64, | | |
| 2429 | Rbx: DWORD64, | | |
| 2430 | Rsp: DWORD64, | | |
| 2431 | Rbp: DWORD64, | | |
| 2432 | Rsi: DWORD64, | | |
| 2433 | Rdi: DWORD64, | | |
| 2434 | R8: DWORD64, | | |
| 2435 | R9: DWORD64, | | |
| 2436 | R10: DWORD64, | | |
| 2437 | R11: DWORD64, | | |
| 2438 | R12: DWORD64, | | |
| 2439 | R13: DWORD64, | | |
| 2440 | R14: DWORD64, | | |
| 2441 | R15: DWORD64, | | |
| 2442 | Rip: DWORD64, | | |
| 2443 | DUMMYUNIONNAME: extern union { | | |
| 2444 | FltSave: XMM_SAVE_AREA32, | | |
| 2445 | FloatSave: XMM_SAVE_AREA32, | | |
| 2446 | DUMMYSTRUCTNAME: extern struct { | | |
| 2447 | Header: [2]M128A, | | |
| 2448 | Legacy: [8]M128A, | | |
| 2449 | Xmm0: M128A, | | |
| 2450 | Xmm1: M128A, | | |
| 2451 | Xmm2: M128A, | | |
| 2452 | Xmm3: M128A, | | |
| 2453 | Xmm4: M128A, | | |
| 2454 | Xmm5: M128A, | | |
| 2455 | Xmm6: M128A, | | |
| 2456 | Xmm7: M128A, | | |
| 2457 | Xmm8: M128A, | | |
| 2458 | Xmm9: M128A, | | |
| 2459 | Xmm10: M128A, | | |
| 2460 | Xmm11: M128A, | | |
| 2461 | Xmm12: M128A, | | |
| 2462 | Xmm13: M128A, | | |
| 2463 | Xmm14: M128A, | | |
| 2464 | Xmm15: M128A, | | |
| 2465 | }, | | |
| 2466 | }, | | |
| 2467 | VectorRegister: [26]M128A, | | |
| 2468 | VectorControl: DWORD64, | | |
| 2469 | DebugControl: DWORD64, | | |
| 2470 | LastBranchToRip: DWORD64, | | |
| 2471 | LastBranchFromRip: DWORD64, | | |
| 2472 | LastExceptionToRip: DWORD64, | | |
| 2473 | LastExceptionFromRip: DWORD64, | | |
| 2474 | }; | | |
| 2475 | | | |
| 2476 | pub const XMM_SAVE_AREA32 = extern struct { | | |
| 2477 | ControlWord: WORD, | | |
| 2478 | StatusWord: WORD, | | |
| 2479 | TagWord: BYTE, | | |
| 2480 | Reserved1: BYTE, | | |
| 2481 | ErrorOpcode: WORD, | | |
| 2482 | ErrorOffset: DWORD, | | |
| 2483 | ErrorSelector: WORD, | | |
| 2484 | Reserved2: WORD, | | |
| 2485 | DataOffset: DWORD, | | |
| 2486 | DataSelector: WORD, | | |
| 2487 | Reserved3: WORD, | | |
| 2488 | MxCsr: DWORD, | | |
| 2489 | MxCsr_Mask: DWORD, | | |
| 2490 | FloatRegisters: [8]M128A, | | |
| 2491 | XmmRegisters: [16]M128A, | | |
| 2492 | Reserved4: [96]BYTE, | | |
| 2493 | }; | | |
| 2494 | | | |
| 2495 | pub const M128A = extern struct { | | |
| 2496 | Low: ULONGLONG, | | |
| 2497 | High: LONGLONG, | | |
| 2498 | }; | | |
| 2499 | | | |
| 2500 | pub const BYTE = u8; | | |
| 2501 | pub const WORD = u16; | | |
| 2502 | pub const DWORD = u32; | | |
| 2503 | pub const DWORD64 = u64; | | |
| 2504 | pub const LONGLONG = c_longlong; | | |
| 2505 | pub const ULONGLONG = c_ulonglong; | | |
| 2506 | }, | | |
| 2507 | .aarch64 => struct { | | |
| 2508 | pub const haveContext = true; | | |
| 2509 | | | |
| 2510 | pub fn getRegs(ptr: *c_void) struct {bp: usize, ip: usize} { | | |
| 2511 | const ctx = @ptrCast(*const CONTEXT, @alignCast(@alignOf(CONTEXT), ptr)); | | |
| 2512 | return .{.bp = @intCast(usize, ctx.Fp), .ip = @intCast(usize, ctx.Pc)}; | | |
| 2513 | } | | |
| 2514 | | | |
| 2515 | pub const CONTEXT = extern struct { | | |
| 2516 | ContextFlags: ULONG, | | |
| 2517 | Cpsr: ULONG, | | |
| 2518 | DUMMYUNIONNAME: extern union { | | |
| 2519 | DUMMYSTRUCTNAME: extern struct { | | |
| 2520 | X0: DWORD64, | | |
| 2521 | X1: DWORD64, | | |
| 2522 | X2: DWORD64, | | |
| 2523 | X3: DWORD64, | | |
| 2524 | X4: DWORD64, | | |
| 2525 | X5: DWORD64, | | |
| 2526 | X6: DWORD64, | | |
| 2527 | X7: DWORD64, | | |
| 2528 | X8: DWORD64, | | |
| 2529 | X9: DWORD64, | | |
| 2530 | X10: DWORD64, | | |
| 2531 | X11: DWORD64, | | |
| 2532 | X12: DWORD64, | | |
| 2533 | X13: DWORD64, | | |
| 2534 | X14: DWORD64, | | |
| 2535 | X15: DWORD64, | | |
| 2536 | X16: DWORD64, | | |
| 2537 | X17: DWORD64, | | |
| 2538 | X18: DWORD64, | | |
| 2539 | X19: DWORD64, | | |
| 2540 | X20: DWORD64, | | |
| 2541 | X21: DWORD64, | | |
| 2542 | X22: DWORD64, | | |
| 2543 | X23: DWORD64, | | |
| 2544 | X24: DWORD64, | | |
| 2545 | X25: DWORD64, | | |
| 2546 | X26: DWORD64, | | |
| 2547 | X27: DWORD64, | | |
| 2548 | X28: DWORD64, | | |
| 2549 | Fp: DWORD64, | | |
| 2550 | Lr: DWORD64, | | |
| 2551 | }, | | |
| 2552 | X: [31]DWORD64, | | |
| 2553 | }, | | |
| 2554 | Sp: DWORD64, | | |
| 2555 | Pc: DWORD64, | | |
| 2556 | V: [32]NEON128, | | |
| 2557 | Fpcr: DWORD, | | |
| 2558 | Fpsr: DWORD, | | |
| 2559 | Bcr: [8]DWORD, | | |
| 2560 | Bvr: [8]DWORD64, | | |
| 2561 | Wcr: [2]DWORD, | | |
| 2562 | Wvr: [2]DWORD64, | | |
| 2563 | }; | | |
| 2564 | | | |
| 2565 | pub const NEON128 = extern union { | | |
| 2566 | DUMMYSTRUCTNAME: extern struct { | | |
| 2567 | Low: ULONGLONG, | | |
| 2568 | High: LONGLONG, | | |
| 2569 | }, | | |
| 2570 | D: [2]f64, | | |
| 2571 | S: [4]f32, | | |
| 2572 | H: [8]WORD, | | |
| 2573 | B: [16]BYTE, | | |
| 2574 | }; | | |
| 2575 | | | |
| 2576 | pub const ULONG = c_ulong; | | |
| 2577 | pub const LONGLONG = c_longlong; | | |
| 2578 | pub const ULONGLONG = c_ulonglong; | | |
| 2579 | pub const BYTE = u8; | | |
| 2580 | pub const WORD = c_ushort; | | |
| 2581 | pub const DWORD = c_ulong; | | |
| 2582 | pub const DWORD64 = c_ulonglong; | | |
| 2583 | }, | | |
| 2584 | else => struct { | | |
| 2585 | pub const haveContext = false; | | |
| 2586 | }, | | |
| 2587 | }; | | |
| 2588 | | | |
| 2589 | pub fn dumpStackPointerAddr(prefix: []const u8) void { | 2344 | pub fn dumpStackPointerAddr(prefix: []const u8) void { |
| 2590 | const sp = asm ("" | 2345 | const sp = asm ("" |
| 2591 | : [argc] "={rsp}" (-> usize) | 2346 | : [argc] "={rsp}" (-> usize) |