X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/a90d420cbe87490c844ae422c966e746d3134b07..818bad9b1b5e68bdd26595a0ec5f513fe56ba174:/base/regdump.h diff --git a/base/regdump.h b/base/regdump.h index 3ada7eac..3a6d59cb 100644 --- a/base/regdump.h +++ b/base/regdump.h @@ -135,6 +135,7 @@ union gp64 { uint64 u64; int64 i64; PTR64 }; #define REGSRC_SIMD 0x04000000 /* SIMD vector register */ #define REGSRC_STMMX 0x05000000 /* x86-specific: x87/MMX register */ #define REGSRC_SEG 0x06000000 /* x86-specific: segment register */ +#define REGSRC_NONE 0x0f000000 /* just a message */ /* Where to find the values. */ #define REGF_WDMASK 0xf0000000 @@ -432,6 +433,17 @@ DO8(REGDEF_SIMD) lea SP, [SP + REGDUMP_SPADJ] .endm +.macro _nilbase +# if CPUFAM_X86 + xor eax, eax + mov [SP + 0], eax +# elif ABI_SYSV + xor edi, edi +# elif ABI_WIN + xor ecx, ecx +# endif +.endm + .macro _regbase # if CPUFAM_X86 mov [SP + 0], BP @@ -600,6 +612,8 @@ DO16(REGDEF_NEONQ) sub r13, r13, #REGDUMP_GPSIZE // Save flags and general-purpose registers. + mrs r14, cpsr + str r14, [r13, #4*REGIX_CPSR] str r12, [r13, #4*12] bl regdump_gpsave @@ -625,6 +639,10 @@ DO16(REGDEF_NEONQ) add r13, r13, #REGDUMP_GPSIZE .endm +.macro _nilbase + mov r0, #0 +.endm + .macro _regbase mov r0, r5 .endm @@ -756,8 +774,15 @@ DO32(REGDEF_FP) // Make space for the register save area. sub sp, sp, #REGDUMP_GPSIZE - // Save flags and general-purpose registers. - stp x16, x17, [sp, #8*16] + // Save flags and general-purpose registers. The PLT linkage code + // makes free with x8--x17, so we must save those here. + mrs x30, nzcv + str x30, [sp, #8*REGIX_NZCV] + stp x8, x9, [sp, #64] + stp x10, x11, [sp, #80] + stp x12, x13, [sp, #96] + stp x14, x15, [sp, #112] + stp x16, x17, [sp, #128] bl regdump_gpsave // Make space for the extended registers. @@ -776,6 +801,10 @@ DO32(REGDEF_FP) add sp, sp, #REGDUMP_GPSIZE .endm +.macro _nilbase + mov x0, #0 +.endm + .macro _regbase mov x0, x21 .endm @@ -889,6 +918,15 @@ extern void regdump_freshline(void); _rstrregs .endm +.macro msg lbl + _saveregs + _nilbase + _reglbl "\lbl" + _regfmt REGSRC_NONE | (1 << REGF_WDSHIFT) + callext F(regdump) + _rstrregs +.endm + .macro reg lbl, rn, fmt=0 _saveregs _regbase