| ... | ... | @@ -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 | 2321 | fn handleSegfaultWindowsExtra(info: *windows.EXCEPTION_POINTERS, comptime msg: u8, comptime format: ?[]const u8) noreturn { |
| 2322 | 2322 | const exception_address = @ptrToInt(info.ExceptionRecord.ExceptionAddress); |
| 2323 | | if (comptime windows_exception_context.haveContext) { |
| 2324 | | const regs = windows_exception_context.getRegs(info.ContextRecord); |
| 2323 | if (@hasDecl(windows, "CONTEXT")) { |
| 2324 | const regs = info.ContextRecord.getRegs(); |
| 2325 | 2325 | switch (msg) { |
| 2326 | 2326 | 0 => std.debug.warn("{}\n", .{format.?}), |
| 2327 | 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 | 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 | 2344 | pub fn dumpStackPointerAddr(prefix: []const u8) void { |
| 2590 | 2345 | const sp = asm ("" |
| 2591 | 2346 | : [argc] "={rsp}" (-> usize) |