X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/6a3d653c3ef38efa52448d6db0d2efab098224a5..HEAD:/base/regdump.h diff --git a/base/regdump.h b/base/regdump.h index a07072df..4934f5ca 100644 --- a/base/regdump.h +++ b/base/regdump.h @@ -187,10 +187,10 @@ union gp64 { uint64 u64; int64 i64; PTR64 }; #if !__ASSEMBLER__ #if CPUFAM_X86 -typedef union gp32 gpreg; + typedef union gp32 gpreg; #endif #if CPUFAM_AMD64 -typedef union gp64 gpreg; + typedef union gp64 gpreg; #endif struct gpsave { @@ -203,7 +203,7 @@ union stmmx { #if FLT_RADIX == 2 && LDBL_MANT_DIG == 64 long double f80; #endif -unsigned char _pad[16]; + unsigned char _pad[16]; }; union xmm { SIMD_COMMON(128); }; @@ -263,9 +263,23 @@ struct regmap { #else .extern regdump_gpsave + // Save general-purpose registers at r/esp; flags, r/eax, and, on + // x86, ebx, should have been filled in already, together with the + // focus address, in `REGIX_ADDR', if relevant. Return required + // extended save area size in ecx, and leave r/ebp pointing to the + // save area. + .extern regdump_xtsave + // Save extended registers at r/esp, leaving r/ebp pointing to the + // register map. + .extern regdump_xtrstr + // Restore extended registers from register map in r/ebp, leaving + // r/ebp pointing to general-purpose save area. + .extern regdump_gprstr + // Restore general-purpose registers, except r/esp, from save area + // at r/ebp. regmap_gp = 0*WORDSZ regmap_fx = 1*WORDSZ @@ -385,8 +399,8 @@ DO8(REGDEF_SIMD) mov [SP - REGDUMP_SPADJ + (REGIX_AX - 1)*WORDSZ], AX .ifnes "\addr", "nil" - // Collect the effective address for the following dump, leaving it - // in the `addr' slot of the dump. + // Collect the focus address for the following dump, leaving it in + // the `addr' slot of the dump. lea AX, \addr mov [SP - REGDUMP_SPADJ + (REGIX_ADDR - 1)*WORDSZ], AX .endif @@ -546,9 +560,22 @@ struct regmap { #else .extern regdump_gpsave + // Save general-purpose registers at r13; r12 and r14 should have + // been filled in already, along with the focus address in + // `REGIX_ADDR', if relevant. Return required extended save area + // size in r0, leave r4 pointing to the save area, and set r6 to + // the focus address. + .extern regdump_xtsave + // Save extended registers at r13, leaving r5 pointing to the + // register map. + .extern regdump_xtrstr + // Restore extended registers from register map at r5. + .extern regdump_gprstr + // Restore general-purpose registers, except r13 and r14, from save + // area at r4. regmap_gp = 0 regmap_fp = 4 @@ -598,8 +625,8 @@ DO16(REGDEF_NEONQ) str r14, [r13, #-REGDUMP_GPSIZE + 14*4] .ifnes "\base,\off", "nil,#0" - // Collect the effective address for the following dump, leaving it - // in the `addr' slot of the dump. + // Collect the focus address for the following dump, leaving it in + // the `addr' slot of the dump. .ifeqs "\base", "nil" adrl r14, \off .else @@ -699,9 +726,22 @@ struct regmap { #else .extern regdump_gpsave + // Save general-purpose registers at sp; x16, x17, and x30, should + // have been filled in already, along with the focus address in + // `REGIX_ADDR', if relevant. Return required extended save area + // size in x0, leave x20 pointing to the save area, and set x22 to + // the focus address. + .extern regdump_xtsave + // Save extended registers at sp, leaving x21 pointing to the + // register map. + .extern regdump_xtrstr + // Restore extended registers from register map at x21. + .extern regdump_gprstr + // Restore general-purpose registers, except sp and x30, from save + // area at x20. regmap_gp = 0 regmap_fp = 8 @@ -761,8 +801,8 @@ DO32(REGDEF_FP) str x30, [sp, #-REGDUMP_GPSIZE + 30*8] .ifnes "\base,\off", "nil,#0" - // Collect the effective address for the following dump, leaving it - // in the `addr' slot of the dump. + // Collect the focus address for the following dump, leaving it in + // the `addr' slot of the dump. .ifeqs "\base", "nil" adr x30, \off .else @@ -774,8 +814,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.