From c85d18294c18f1b4a80c535789b991f700ea1bd7 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sat, 2 Mar 2024 12:02:39 +0000 Subject: [PATCH] base/reggump.h, base/regdump-*.S: Commentary and formatting improvements. No code change at all. --- base/regdump-arm.S | 3 ++- base/regdump-arm64.S | 3 ++- base/regdump.h | 58 ++++++++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/base/regdump-arm.S b/base/regdump-arm.S index 6adcbdda..cd7ae670 100644 --- a/base/regdump-arm.S +++ b/base/regdump-arm.S @@ -104,7 +104,8 @@ FUNC(regdump_xtsave) endprologue // On entry, r13 points to an extended save area, of size determined // by `regdump_gpsave' above. On exit, the save area is filled in - // and a handy map placed at its base. + // and a handy map placed at its base, and r5 is left pointing to the + // reigster map. // Set up the map/extended save area pointer. add r5, r13, #7 diff --git a/base/regdump-arm64.S b/base/regdump-arm64.S index 183d38f0..1dacf2c8 100644 --- a/base/regdump-arm64.S +++ b/base/regdump-arm64.S @@ -119,7 +119,8 @@ FUNC(regdump_xtsave) endprologue // On entry, sp points to an extended save area, of size determined // by `regdump_gpsave' above. On exit, the save area is filled in - // and a handy map placed at its base. + // and a handy map placed at its base, and x21 is left pointing + // pointing to the register map. // Set up the map/extended save area pointer. mov x21, sp diff --git a/base/regdump.h b/base/regdump.h index 3a6d59cb..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 -- 2.11.0