Since POWER8, PowerPC 64 supports Hardware Transactional Memory, which has three special purpose registers associated to it: tfhar, tfiar, and texasr. This commit add HTM SPRs set as known note type so it's possible to use 'readelf --notes' to inspect the HTM SPRs in a coredump file generated in such a machines.
Signed-off-by: Gustavo Romero <grom...@linux.vnet.ibm.com> --- backends/ChangeLog | 5 +++++ backends/ppc_corenote.c | 13 ++++++++++++- backends/ppc_regs.c | 10 +++++++++- libebl/ChangeLog | 4 ++++ libebl/eblcorenotetypename.c | 1 + libelf/ChangeLog | 4 ++++ libelf/elf.h | 1 + tests/ChangeLog | 5 +++++ tests/run-addrcfi.sh | 18 +++++++++--------- tests/run-allregs.sh | 12 ++++++------ 10 files changed, 56 insertions(+), 17 deletions(-) diff --git a/backends/ChangeLog b/backends/ChangeLog index d628245..6cecdf9 100644 --- a/backends/ChangeLog +++ b/backends/ChangeLog @@ -1,3 +1,8 @@ +2017-07-19 Gustavo Romero <grom...@linux.vnet.ibm.com> + + * ppc_corenote.c: Add offsets for ppc64 HTM SPRs: thfar, tfiar, and texasr. + * ppc_regs.c: Add names for ppc64 HTM SPRs mappings. + 2017-06-17 Mark Wielaard <m...@klomp.org> * s390_initreg.c: Swap sys/ptrace.h and asm/ptrace.h include order. diff --git a/backends/ppc_corenote.c b/backends/ppc_corenote.c index 9ac8871..2b4ada7 100644 --- a/backends/ppc_corenote.c +++ b/backends/ppc_corenote.c @@ -94,9 +94,20 @@ static const Ebl_Register_Location spe_regs[] = { .offset = 34 * 4, .regno = 612, .count = 1, .bits = 32 } }; +static const Ebl_Register_Location tm_spr_regs[] = + { + /* tfhar */ + { .offset = 0, .regno = 114, .count = 1, .bits = 64 }, + /* texasr */ + { .offset = 8, .regno = 116, .count = 1, .bits = 64 }, + /* tfiar */ + { .offset = 16, .regno = 115, .count = 1, .bits = 64 } + }; + #define EXTRA_NOTES \ EXTRA_REGSET (NT_PPC_VMX, 34 * 16, altivec_regs) \ - EXTRA_REGSET (NT_PPC_SPE, 35 * 4, spe_regs) + EXTRA_REGSET (NT_PPC_SPE, 35 * 4, spe_regs) \ + EXTRA_REGSET (NT_PPC_TM_SPR, 3 * 8, tm_spr_regs) #if BITS == 32 # define ULONG uint32_t diff --git a/backends/ppc_regs.c b/backends/ppc_regs.c index bcf4f7a..c2d5011 100644 --- a/backends/ppc_regs.c +++ b/backends/ppc_regs.c @@ -149,7 +149,15 @@ ppc_register_info (Ebl *ebl __attribute__ ((unused)), namelen = 4; break; - case 110 ... 117: + case 114: + return stpcpy (name, "tfhar") + 1 - name; + case 115: + return stpcpy (name, "tfiar") + 1 - name; + case 116: + return stpcpy (name, "texasr") + 1 - name; + + case 110 ... 113: + case 117: case 120 ... 121: case 123 ... 199: name[0] = 's'; diff --git a/libebl/ChangeLog b/libebl/ChangeLog index 506915b..efeb7c3 100644 --- a/libebl/ChangeLog +++ b/libebl/ChangeLog @@ -1,3 +1,7 @@ +2017-07-19 Gustavo Romero <grom...@linux.vnet.ibm.com> + + * eblcorenotetypename.c: Add ppc64 HTM SPRs note as known type. + 2017-04-20 Ulf Hermann <ulf.herm...@qt.io> * libebl.h: Use __pure_attribute__. diff --git a/libebl/eblcorenotetypename.c b/libebl/eblcorenotetypename.c index fa81dbe..d3a56fa 100644 --- a/libebl/eblcorenotetypename.c +++ b/libebl/eblcorenotetypename.c @@ -75,6 +75,7 @@ ebl_core_note_type_name (Ebl *ebl, uint32_t type, char *buf, size_t len) KNOWNSTYPE (PPC_VMX); KNOWNSTYPE (PPC_SPE); KNOWNSTYPE (PPC_VSX); + KNOWNSTYPE (PPC_TM_SPR); KNOWNSTYPE (386_TLS); KNOWNSTYPE (386_IOPERM); KNOWNSTYPE (X86_XSTATE); diff --git a/libelf/ChangeLog b/libelf/ChangeLog index 594bec9..e5529e9 100644 --- a/libelf/ChangeLog +++ b/libelf/ChangeLog @@ -1,3 +1,7 @@ +2017-07-19 Gustavo Romero <grom...@linux.vnet.ibm.com> + + * elf.h: Add known type in notes segment descriptor for HTM SPRs. + 2017-04-20 Ulf Hermann <ulf.herm...@qt.io> * libelfP.h: Don't include config.h. diff --git a/libelf/elf.h b/libelf/elf.h index b6112d9..fa35203 100644 --- a/libelf/elf.h +++ b/libelf/elf.h @@ -763,6 +763,7 @@ typedef struct #define NT_PPC_SPE 0x101 /* PowerPC SPE/EVR registers */ #define NT_PPC_VSX 0x102 /* PowerPC VSX registers */ #define NT_386_TLS 0x200 /* i386 TLS slots (struct user_desc) */ +#define NT_PPC_TM_SPR 0x10c /* PowerPC HW Transactional Memory SPRs */ #define NT_386_IOPERM 0x201 /* x86 io permission bitmap (1=deny) */ #define NT_X86_XSTATE 0x202 /* x86 extended state using xsave */ #define NT_S390_HIGH_GPRS 0x300 /* s390 upper register halves */ diff --git a/tests/ChangeLog b/tests/ChangeLog index 3dd6f2a..84742c6 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,8 @@ +2017-07-19 Gustavo Romero <grom...@linux.vnet.ibm.com> + + * run-addrcfi.sh: Update generic SPRs names to HTM SPRs names + * run-allregs.sh: Update generic SPRs names to HTM SPRs names + 2017-07-14 Mark Wielaard <m...@klomp.org> * run-strip-remove-keep.sh: New test. diff --git a/tests/run-addrcfi.sh b/tests/run-addrcfi.sh index c864eea..376a6dc 100755 --- a/tests/run-addrcfi.sh +++ b/tests/run-addrcfi.sh @@ -397,9 +397,9 @@ dwarf_cfi_addrframe (.eh_frame): no matching address range privileged reg111 (spr11): undefined privileged reg112 (spr12): undefined privileged reg113 (spr13): undefined - privileged reg114 (spr14): undefined - privileged reg115 (spr15): undefined - privileged reg116 (spr16): undefined + privileged reg114 (tfhar): undefined + privileged reg115 (tfiar): undefined + privileged reg116 (texasr): undefined privileged reg117 (spr17): undefined privileged reg118 (dsisr): undefined privileged reg119 (dar): undefined @@ -1419,9 +1419,9 @@ testrun_compare ${abs_builddir}/addrcfi -e testfileppc32 0x100004d2 <<\EOF privileged reg111 (spr11): undefined privileged reg112 (spr12): undefined privileged reg113 (spr13): undefined - privileged reg114 (spr14): undefined - privileged reg115 (spr15): undefined - privileged reg116 (spr16): undefined + privileged reg114 (tfhar): undefined + privileged reg115 (tfiar): undefined + privileged reg116 (texasr): undefined privileged reg117 (spr17): undefined privileged reg118 (dsisr): undefined privileged reg119 (dar): undefined @@ -2447,9 +2447,9 @@ dwarf_cfi_addrframe (.eh_frame): no matching address range privileged reg111 (spr11): undefined privileged reg112 (spr12): undefined privileged reg113 (spr13): undefined - privileged reg114 (spr14): undefined - privileged reg115 (spr15): undefined - privileged reg116 (spr16): undefined + privileged reg114 (tfhar): undefined + privileged reg115 (tfiar): undefined + privileged reg116 (texasr): undefined privileged reg117 (spr17): undefined privileged reg118 (dsisr): undefined privileged reg119 (dar): undefined diff --git a/tests/run-allregs.sh b/tests/run-allregs.sh index d82f37e..7ddd452 100755 --- a/tests/run-allregs.sh +++ b/tests/run-allregs.sh @@ -253,9 +253,9 @@ privileged registers: 111: spr11 (spr11), unsigned 32 bits 112: spr12 (spr12), unsigned 32 bits 113: spr13 (spr13), unsigned 32 bits - 114: spr14 (spr14), unsigned 32 bits - 115: spr15 (spr15), unsigned 32 bits - 116: spr16 (spr16), unsigned 32 bits + 114: tfhar (tfhar), unsigned 32 bits + 115: tfiar (tfiar), unsigned 32 bits + 116: texasr (texasr), unsigned 32 bits 117: spr17 (spr17), unsigned 32 bits 118: dsisr (dsisr), unsigned 32 bits 119: dar (dar), unsigned 32 bits @@ -1276,9 +1276,9 @@ privileged registers: 111: spr11 (spr11), unsigned 64 bits 112: spr12 (spr12), unsigned 64 bits 113: spr13 (spr13), unsigned 64 bits - 114: spr14 (spr14), unsigned 64 bits - 115: spr15 (spr15), unsigned 64 bits - 116: spr16 (spr16), unsigned 64 bits + 114: tfhar (tfhar), unsigned 64 bits + 115: tfiar (tfiar), unsigned 64 bits + 116: texasr (texasr), unsigned 64 bits 117: spr17 (spr17), unsigned 64 bits 118: dsisr (dsisr), unsigned 64 bits 119: dar (dar), unsigned 64 bits -- 2.7.4