OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gdb?expand=0&rev=199
8169 lines
290 KiB
Diff
8169 lines
290 KiB
Diff
This is an amalgamation of the following commits to
|
|
implement access to/display of POWER8 registers in gdb and
|
|
implements fate#326129 and fate#325178 .
|
|
The first two are prerequisite patches, the others the actual
|
|
feature. Other prerequisites are the gdb-rhbz1187581-power8-regs*.patch
|
|
files.
|
|
|
|
(The git show output was edited to remove patching of all ChangeLog
|
|
files).
|
|
|
|
ff36536c9273734af6f84832b583c10f44c5010e Fix gdb/remote.c build failure
|
|
cb2366c198d4c22b4bae6fca8f9ab4b0234c64aa Add grok/write functions for new ppc core note sections
|
|
afde3032dde478a2bbb2e0c4b0cb4256b27eb949 Zero-initialize linux note sections
|
|
5c849b222b154cd5f481fee9d6f3971bd2eeddc2 [PowerPC] Don't zero-initialize vector register buffers
|
|
7ed29001c4a965520f6a243ec7ad41c156f96a20 Add decfloat registers to float reggroup
|
|
500f01a0e2f79d64cc08011ad70c6ffa1e1c7694 [PowerPC] Remove rs6000_pseudo_register_reggroup_p
|
|
3d907528ca584b522125ce4ac818f45dfe7a9a24 [PowerPC] Fix two if statements in gdb/ppc-linux-nat.c
|
|
71733a7bf696fd54b1c75a2c9c16fd61819c0ddb [PowerPC] Fix indentation in arch/ppc-linux-common.c
|
|
93b4691f0fe1f8249de3c3f9d2e271cb0ba3254e [PowerPC] Refactor have_ initializers in rs6000-tdep.c
|
|
7ca18ed6d22398dd3009ba72d3a1e7747e40753d [PowerPC] Add support for PPR and DSCR
|
|
f2cf6173f33bbb562881c571bfecd129fe94b158 [PowerPC] Add support for TAR
|
|
232bfb8644f0a083969d8359a37bc23764642611 [PowerPC] Add support for EBB and PMU registers
|
|
81ab84fd6cdaab121988e0c424f8cdc0ae472e14 [PowerPC] Reject tdescs with VSX and no FPU or Altivec
|
|
8d619c01db64c533df3ffc706b694f293347f0d8 [PowerPC] Add support for HTM registers
|
|
|
|
Index: gdb-8.2/gdb/remote.c
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/remote.c 2019-01-18 14:26:13.000000000 +0100
|
|
+++ gdb-8.2/gdb/remote.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -12808,7 +12808,7 @@ remote_target::download_tracepoint (stru
|
|
struct tracepoint *t = (struct tracepoint *) b;
|
|
struct remote_state *rs = get_remote_state ();
|
|
int ret;
|
|
- char *err_msg = _("Tracepoint packet too large for target.");
|
|
+ const char *err_msg = _("Tracepoint packet too large for target.");
|
|
size_t size_left;
|
|
|
|
/* We use a buffer other than rs->buf because we'll build strings
|
|
Index: gdb-8.2/bfd/elf-bfd.h
|
|
===================================================================
|
|
--- gdb-8.2.orig/bfd/elf-bfd.h 2018-09-05 09:44:28.000000000 +0200
|
|
+++ gdb-8.2/bfd/elf-bfd.h 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -2569,6 +2569,32 @@ extern char *elfcore_write_ppc_vmx
|
|
(bfd *, char *, int *, const void *, int);
|
|
extern char *elfcore_write_ppc_vsx
|
|
(bfd *, char *, int *, const void *, int);
|
|
+extern char *elfcore_write_ppc_tar
|
|
+ (bfd *, char *, int *, const void *, int);
|
|
+extern char *elfcore_write_ppc_ppr
|
|
+ (bfd *, char *, int *, const void *, int);
|
|
+extern char *elfcore_write_ppc_dscr
|
|
+ (bfd *, char *, int *, const void *, int);
|
|
+extern char *elfcore_write_ppc_ebb
|
|
+ (bfd *, char *, int *, const void *, int);
|
|
+extern char *elfcore_write_ppc_pmu
|
|
+ (bfd *, char *, int *, const void *, int);
|
|
+extern char *elfcore_write_ppc_tm_cgpr
|
|
+ (bfd *, char *, int *, const void *, int);
|
|
+extern char *elfcore_write_ppc_tm_cfpr
|
|
+ (bfd *, char *, int *, const void *, int);
|
|
+extern char *elfcore_write_ppc_tm_cvmx
|
|
+ (bfd *, char *, int *, const void *, int);
|
|
+extern char *elfcore_write_ppc_tm_cvsx
|
|
+ (bfd *, char *, int *, const void *, int);
|
|
+extern char *elfcore_write_ppc_tm_spr
|
|
+ (bfd *, char *, int *, const void *, int);
|
|
+extern char *elfcore_write_ppc_tm_ctar
|
|
+ (bfd *, char *, int *, const void *, int);
|
|
+extern char *elfcore_write_ppc_tm_cppr
|
|
+ (bfd *, char *, int *, const void *, int);
|
|
+extern char *elfcore_write_ppc_tm_cdscr
|
|
+ (bfd *, char *, int *, const void *, int);
|
|
extern char *elfcore_write_s390_timer
|
|
(bfd *, char *, int *, const void *, int);
|
|
extern char *elfcore_write_s390_todcmp
|
|
Index: gdb-8.2/bfd/elf.c
|
|
===================================================================
|
|
--- gdb-8.2.orig/bfd/elf.c 2018-09-05 09:44:28.000000000 +0200
|
|
+++ gdb-8.2/bfd/elf.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -9239,6 +9239,84 @@ elfcore_grok_ppc_vsx (bfd *abfd, Elf_Int
|
|
}
|
|
|
|
static bfd_boolean
|
|
+elfcore_grok_ppc_tar (bfd *abfd, Elf_Internal_Note *note)
|
|
+{
|
|
+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tar", note);
|
|
+}
|
|
+
|
|
+static bfd_boolean
|
|
+elfcore_grok_ppc_ppr (bfd *abfd, Elf_Internal_Note *note)
|
|
+{
|
|
+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-ppr", note);
|
|
+}
|
|
+
|
|
+static bfd_boolean
|
|
+elfcore_grok_ppc_dscr (bfd *abfd, Elf_Internal_Note *note)
|
|
+{
|
|
+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-dscr", note);
|
|
+}
|
|
+
|
|
+static bfd_boolean
|
|
+elfcore_grok_ppc_ebb (bfd *abfd, Elf_Internal_Note *note)
|
|
+{
|
|
+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-ebb", note);
|
|
+}
|
|
+
|
|
+static bfd_boolean
|
|
+elfcore_grok_ppc_pmu (bfd *abfd, Elf_Internal_Note *note)
|
|
+{
|
|
+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-pmu", note);
|
|
+}
|
|
+
|
|
+static bfd_boolean
|
|
+elfcore_grok_ppc_tm_cgpr (bfd *abfd, Elf_Internal_Note *note)
|
|
+{
|
|
+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cgpr", note);
|
|
+}
|
|
+
|
|
+static bfd_boolean
|
|
+elfcore_grok_ppc_tm_cfpr (bfd *abfd, Elf_Internal_Note *note)
|
|
+{
|
|
+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cfpr", note);
|
|
+}
|
|
+
|
|
+static bfd_boolean
|
|
+elfcore_grok_ppc_tm_cvmx (bfd *abfd, Elf_Internal_Note *note)
|
|
+{
|
|
+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cvmx", note);
|
|
+}
|
|
+
|
|
+static bfd_boolean
|
|
+elfcore_grok_ppc_tm_cvsx (bfd *abfd, Elf_Internal_Note *note)
|
|
+{
|
|
+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cvsx", note);
|
|
+}
|
|
+
|
|
+static bfd_boolean
|
|
+elfcore_grok_ppc_tm_spr (bfd *abfd, Elf_Internal_Note *note)
|
|
+{
|
|
+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-spr", note);
|
|
+}
|
|
+
|
|
+static bfd_boolean
|
|
+elfcore_grok_ppc_tm_ctar (bfd *abfd, Elf_Internal_Note *note)
|
|
+{
|
|
+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-ctar", note);
|
|
+}
|
|
+
|
|
+static bfd_boolean
|
|
+elfcore_grok_ppc_tm_cppr (bfd *abfd, Elf_Internal_Note *note)
|
|
+{
|
|
+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cppr", note);
|
|
+}
|
|
+
|
|
+static bfd_boolean
|
|
+elfcore_grok_ppc_tm_cdscr (bfd *abfd, Elf_Internal_Note *note)
|
|
+{
|
|
+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cdscr", note);
|
|
+}
|
|
+
|
|
+static bfd_boolean
|
|
elfcore_grok_s390_high_gprs (bfd *abfd, Elf_Internal_Note *note)
|
|
{
|
|
return elfcore_make_note_pseudosection (abfd, ".reg-s390-high-gprs", note);
|
|
@@ -9717,6 +9795,97 @@ elfcore_grok_note (bfd *abfd, Elf_Intern
|
|
else
|
|
return TRUE;
|
|
|
|
+ case NT_PPC_TAR:
|
|
+ if (note->namesz == 6
|
|
+ && strcmp (note->namedata, "LINUX") == 0)
|
|
+ return elfcore_grok_ppc_tar (abfd, note);
|
|
+ else
|
|
+ return TRUE;
|
|
+
|
|
+ case NT_PPC_PPR:
|
|
+ if (note->namesz == 6
|
|
+ && strcmp (note->namedata, "LINUX") == 0)
|
|
+ return elfcore_grok_ppc_ppr (abfd, note);
|
|
+ else
|
|
+ return TRUE;
|
|
+
|
|
+ case NT_PPC_DSCR:
|
|
+ if (note->namesz == 6
|
|
+ && strcmp (note->namedata, "LINUX") == 0)
|
|
+ return elfcore_grok_ppc_dscr (abfd, note);
|
|
+ else
|
|
+ return TRUE;
|
|
+
|
|
+ case NT_PPC_EBB:
|
|
+ if (note->namesz == 6
|
|
+ && strcmp (note->namedata, "LINUX") == 0)
|
|
+ return elfcore_grok_ppc_ebb (abfd, note);
|
|
+ else
|
|
+ return TRUE;
|
|
+
|
|
+ case NT_PPC_PMU:
|
|
+ if (note->namesz == 6
|
|
+ && strcmp (note->namedata, "LINUX") == 0)
|
|
+ return elfcore_grok_ppc_pmu (abfd, note);
|
|
+ else
|
|
+ return TRUE;
|
|
+
|
|
+ case NT_PPC_TM_CGPR:
|
|
+ if (note->namesz == 6
|
|
+ && strcmp (note->namedata, "LINUX") == 0)
|
|
+ return elfcore_grok_ppc_tm_cgpr (abfd, note);
|
|
+ else
|
|
+ return TRUE;
|
|
+
|
|
+ case NT_PPC_TM_CFPR:
|
|
+ if (note->namesz == 6
|
|
+ && strcmp (note->namedata, "LINUX") == 0)
|
|
+ return elfcore_grok_ppc_tm_cfpr (abfd, note);
|
|
+ else
|
|
+ return TRUE;
|
|
+
|
|
+ case NT_PPC_TM_CVMX:
|
|
+ if (note->namesz == 6
|
|
+ && strcmp (note->namedata, "LINUX") == 0)
|
|
+ return elfcore_grok_ppc_tm_cvmx (abfd, note);
|
|
+ else
|
|
+ return TRUE;
|
|
+
|
|
+ case NT_PPC_TM_CVSX:
|
|
+ if (note->namesz == 6
|
|
+ && strcmp (note->namedata, "LINUX") == 0)
|
|
+ return elfcore_grok_ppc_tm_cvsx (abfd, note);
|
|
+ else
|
|
+ return TRUE;
|
|
+
|
|
+ case NT_PPC_TM_SPR:
|
|
+ if (note->namesz == 6
|
|
+ && strcmp (note->namedata, "LINUX") == 0)
|
|
+ return elfcore_grok_ppc_tm_spr (abfd, note);
|
|
+ else
|
|
+ return TRUE;
|
|
+
|
|
+ case NT_PPC_TM_CTAR:
|
|
+ if (note->namesz == 6
|
|
+ && strcmp (note->namedata, "LINUX") == 0)
|
|
+ return elfcore_grok_ppc_tm_ctar (abfd, note);
|
|
+ else
|
|
+ return TRUE;
|
|
+
|
|
+ case NT_PPC_TM_CPPR:
|
|
+ if (note->namesz == 6
|
|
+ && strcmp (note->namedata, "LINUX") == 0)
|
|
+ return elfcore_grok_ppc_tm_cppr (abfd, note);
|
|
+ else
|
|
+ return TRUE;
|
|
+
|
|
+ case NT_PPC_TM_CDSCR:
|
|
+ if (note->namesz == 6
|
|
+ && strcmp (note->namedata, "LINUX") == 0)
|
|
+ return elfcore_grok_ppc_tm_cdscr (abfd, note);
|
|
+ else
|
|
+ return TRUE;
|
|
+
|
|
case NT_S390_HIGH_GPRS:
|
|
if (note->namesz == 6
|
|
&& strcmp (note->namedata, "LINUX") == 0)
|
|
@@ -10817,6 +10986,162 @@ elfcore_write_ppc_vsx (bfd *abfd,
|
|
note_name, NT_PPC_VSX, ppc_vsx, size);
|
|
}
|
|
|
|
+char *
|
|
+elfcore_write_ppc_tar (bfd *abfd,
|
|
+ char *buf,
|
|
+ int *bufsiz,
|
|
+ const void *ppc_tar,
|
|
+ int size)
|
|
+{
|
|
+ char *note_name = "LINUX";
|
|
+ return elfcore_write_note (abfd, buf, bufsiz,
|
|
+ note_name, NT_PPC_TAR, ppc_tar, size);
|
|
+}
|
|
+
|
|
+char *
|
|
+elfcore_write_ppc_ppr (bfd *abfd,
|
|
+ char *buf,
|
|
+ int *bufsiz,
|
|
+ const void *ppc_ppr,
|
|
+ int size)
|
|
+{
|
|
+ char *note_name = "LINUX";
|
|
+ return elfcore_write_note (abfd, buf, bufsiz,
|
|
+ note_name, NT_PPC_PPR, ppc_ppr, size);
|
|
+}
|
|
+
|
|
+char *
|
|
+elfcore_write_ppc_dscr (bfd *abfd,
|
|
+ char *buf,
|
|
+ int *bufsiz,
|
|
+ const void *ppc_dscr,
|
|
+ int size)
|
|
+{
|
|
+ char *note_name = "LINUX";
|
|
+ return elfcore_write_note (abfd, buf, bufsiz,
|
|
+ note_name, NT_PPC_DSCR, ppc_dscr, size);
|
|
+}
|
|
+
|
|
+char *
|
|
+elfcore_write_ppc_ebb (bfd *abfd,
|
|
+ char *buf,
|
|
+ int *bufsiz,
|
|
+ const void *ppc_ebb,
|
|
+ int size)
|
|
+{
|
|
+ char *note_name = "LINUX";
|
|
+ return elfcore_write_note (abfd, buf, bufsiz,
|
|
+ note_name, NT_PPC_EBB, ppc_ebb, size);
|
|
+}
|
|
+
|
|
+char *
|
|
+elfcore_write_ppc_pmu (bfd *abfd,
|
|
+ char *buf,
|
|
+ int *bufsiz,
|
|
+ const void *ppc_pmu,
|
|
+ int size)
|
|
+{
|
|
+ char *note_name = "LINUX";
|
|
+ return elfcore_write_note (abfd, buf, bufsiz,
|
|
+ note_name, NT_PPC_PMU, ppc_pmu, size);
|
|
+}
|
|
+
|
|
+char *
|
|
+elfcore_write_ppc_tm_cgpr (bfd *abfd,
|
|
+ char *buf,
|
|
+ int *bufsiz,
|
|
+ const void *ppc_tm_cgpr,
|
|
+ int size)
|
|
+{
|
|
+ char *note_name = "LINUX";
|
|
+ return elfcore_write_note (abfd, buf, bufsiz,
|
|
+ note_name, NT_PPC_TM_CGPR, ppc_tm_cgpr, size);
|
|
+}
|
|
+
|
|
+char *
|
|
+elfcore_write_ppc_tm_cfpr (bfd *abfd,
|
|
+ char *buf,
|
|
+ int *bufsiz,
|
|
+ const void *ppc_tm_cfpr,
|
|
+ int size)
|
|
+{
|
|
+ char *note_name = "LINUX";
|
|
+ return elfcore_write_note (abfd, buf, bufsiz,
|
|
+ note_name, NT_PPC_TM_CFPR, ppc_tm_cfpr, size);
|
|
+}
|
|
+
|
|
+char *
|
|
+elfcore_write_ppc_tm_cvmx (bfd *abfd,
|
|
+ char *buf,
|
|
+ int *bufsiz,
|
|
+ const void *ppc_tm_cvmx,
|
|
+ int size)
|
|
+{
|
|
+ char *note_name = "LINUX";
|
|
+ return elfcore_write_note (abfd, buf, bufsiz,
|
|
+ note_name, NT_PPC_TM_CVMX, ppc_tm_cvmx, size);
|
|
+}
|
|
+
|
|
+char *
|
|
+elfcore_write_ppc_tm_cvsx (bfd *abfd,
|
|
+ char *buf,
|
|
+ int *bufsiz,
|
|
+ const void *ppc_tm_cvsx,
|
|
+ int size)
|
|
+{
|
|
+ char *note_name = "LINUX";
|
|
+ return elfcore_write_note (abfd, buf, bufsiz,
|
|
+ note_name, NT_PPC_TM_CVSX, ppc_tm_cvsx, size);
|
|
+}
|
|
+
|
|
+char *
|
|
+elfcore_write_ppc_tm_spr (bfd *abfd,
|
|
+ char *buf,
|
|
+ int *bufsiz,
|
|
+ const void *ppc_tm_spr,
|
|
+ int size)
|
|
+{
|
|
+ char *note_name = "LINUX";
|
|
+ return elfcore_write_note (abfd, buf, bufsiz,
|
|
+ note_name, NT_PPC_TM_SPR, ppc_tm_spr, size);
|
|
+}
|
|
+
|
|
+char *
|
|
+elfcore_write_ppc_tm_ctar (bfd *abfd,
|
|
+ char *buf,
|
|
+ int *bufsiz,
|
|
+ const void *ppc_tm_ctar,
|
|
+ int size)
|
|
+{
|
|
+ char *note_name = "LINUX";
|
|
+ return elfcore_write_note (abfd, buf, bufsiz,
|
|
+ note_name, NT_PPC_TM_CTAR, ppc_tm_ctar, size);
|
|
+}
|
|
+
|
|
+char *
|
|
+elfcore_write_ppc_tm_cppr (bfd *abfd,
|
|
+ char *buf,
|
|
+ int *bufsiz,
|
|
+ const void *ppc_tm_cppr,
|
|
+ int size)
|
|
+{
|
|
+ char *note_name = "LINUX";
|
|
+ return elfcore_write_note (abfd, buf, bufsiz,
|
|
+ note_name, NT_PPC_TM_CPPR, ppc_tm_cppr, size);
|
|
+}
|
|
+
|
|
+char *
|
|
+elfcore_write_ppc_tm_cdscr (bfd *abfd,
|
|
+ char *buf,
|
|
+ int *bufsiz,
|
|
+ const void *ppc_tm_cdscr,
|
|
+ int size)
|
|
+{
|
|
+ char *note_name = "LINUX";
|
|
+ return elfcore_write_note (abfd, buf, bufsiz,
|
|
+ note_name, NT_PPC_TM_CDSCR, ppc_tm_cdscr, size);
|
|
+}
|
|
+
|
|
static char *
|
|
elfcore_write_s390_high_gprs (bfd *abfd,
|
|
char *buf,
|
|
@@ -11045,6 +11370,32 @@ elfcore_write_register_note (bfd *abfd,
|
|
return elfcore_write_ppc_vmx (abfd, buf, bufsiz, data, size);
|
|
if (strcmp (section, ".reg-ppc-vsx") == 0)
|
|
return elfcore_write_ppc_vsx (abfd, buf, bufsiz, data, size);
|
|
+ if (strcmp (section, ".reg-ppc-tar") == 0)
|
|
+ return elfcore_write_ppc_tar (abfd, buf, bufsiz, data, size);
|
|
+ if (strcmp (section, ".reg-ppc-ppr") == 0)
|
|
+ return elfcore_write_ppc_ppr (abfd, buf, bufsiz, data, size);
|
|
+ if (strcmp (section, ".reg-ppc-dscr") == 0)
|
|
+ return elfcore_write_ppc_dscr (abfd, buf, bufsiz, data, size);
|
|
+ if (strcmp (section, ".reg-ppc-ebb") == 0)
|
|
+ return elfcore_write_ppc_ebb (abfd, buf, bufsiz, data, size);
|
|
+ if (strcmp (section, ".reg-ppc-pmu") == 0)
|
|
+ return elfcore_write_ppc_pmu (abfd, buf, bufsiz, data, size);
|
|
+ if (strcmp (section, ".reg-ppc-tm-cgpr") == 0)
|
|
+ return elfcore_write_ppc_tm_cgpr (abfd, buf, bufsiz, data, size);
|
|
+ if (strcmp (section, ".reg-ppc-tm-cfpr") == 0)
|
|
+ return elfcore_write_ppc_tm_cfpr (abfd, buf, bufsiz, data, size);
|
|
+ if (strcmp (section, ".reg-ppc-tm-cvmx") == 0)
|
|
+ return elfcore_write_ppc_tm_cvmx (abfd, buf, bufsiz, data, size);
|
|
+ if (strcmp (section, ".reg-ppc-tm-cvsx") == 0)
|
|
+ return elfcore_write_ppc_tm_cvsx (abfd, buf, bufsiz, data, size);
|
|
+ if (strcmp (section, ".reg-ppc-tm-spr") == 0)
|
|
+ return elfcore_write_ppc_tm_spr (abfd, buf, bufsiz, data, size);
|
|
+ if (strcmp (section, ".reg-ppc-tm-ctar") == 0)
|
|
+ return elfcore_write_ppc_tm_ctar (abfd, buf, bufsiz, data, size);
|
|
+ if (strcmp (section, ".reg-ppc-tm-cppr") == 0)
|
|
+ return elfcore_write_ppc_tm_cppr (abfd, buf, bufsiz, data, size);
|
|
+ if (strcmp (section, ".reg-ppc-tm-cdscr") == 0)
|
|
+ return elfcore_write_ppc_tm_cdscr (abfd, buf, bufsiz, data, size);
|
|
if (strcmp (section, ".reg-s390-high-gprs") == 0)
|
|
return elfcore_write_s390_high_gprs (abfd, buf, bufsiz, data, size);
|
|
if (strcmp (section, ".reg-s390-timer") == 0)
|
|
Index: gdb-8.2/gdb/linux-tdep.c
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/linux-tdep.c 2019-01-18 14:26:14.000000000 +0100
|
|
+++ gdb-8.2/gdb/linux-tdep.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -1584,7 +1584,6 @@ linux_collect_regset_section_cb (const c
|
|
int collect_size, const struct regset *regset,
|
|
const char *human_name, void *cb_data)
|
|
{
|
|
- char *buf;
|
|
struct linux_collect_regset_section_cb_data *data
|
|
= (struct linux_collect_regset_section_cb_data *) cb_data;
|
|
bool variable_size_section = (regset != NULL
|
|
@@ -1598,19 +1597,22 @@ linux_collect_regset_section_cb (const c
|
|
|
|
gdb_assert (regset && regset->collect_regset);
|
|
|
|
- buf = (char *) xmalloc (collect_size);
|
|
- regset->collect_regset (regset, data->regcache, -1, buf, collect_size);
|
|
+ /* This is intentionally zero-initialized by using std::vector, so
|
|
+ that any padding bytes in the core file will show as 0. */
|
|
+ std::vector<gdb_byte> buf (collect_size);
|
|
+
|
|
+ regset->collect_regset (regset, data->regcache, -1, buf.data (),
|
|
+ collect_size);
|
|
|
|
/* PRSTATUS still needs to be treated specially. */
|
|
if (strcmp (sect_name, ".reg") == 0)
|
|
data->note_data = (char *) elfcore_write_prstatus
|
|
(data->obfd, data->note_data, data->note_size, data->lwp,
|
|
- gdb_signal_to_host (data->stop_signal), buf);
|
|
+ gdb_signal_to_host (data->stop_signal), buf.data ());
|
|
else
|
|
data->note_data = (char *) elfcore_write_register_note
|
|
(data->obfd, data->note_data, data->note_size,
|
|
- sect_name, buf, collect_size);
|
|
- xfree (buf);
|
|
+ sect_name, buf.data (), collect_size);
|
|
|
|
if (data->note_data == NULL)
|
|
data->abort_iteration = 1;
|
|
Index: gdb-8.2/gdb/gdbserver/linux-ppc-low.c
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/gdbserver/linux-ppc-low.c 2018-09-05 09:27:13.000000000 +0200
|
|
+++ gdb-8.2/gdb/gdbserver/linux-ppc-low.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -20,6 +20,8 @@
|
|
#include "server.h"
|
|
#include "linux-low.h"
|
|
|
|
+#include "elf/common.h"
|
|
+#include <sys/uio.h>
|
|
#include <elf.h>
|
|
#include <asm/ptrace.h>
|
|
|
|
@@ -41,8 +43,14 @@
|
|
#define PPC_LI(insn) (PPC_SEXT (PPC_FIELD (insn, 6, 24), 24) << 2)
|
|
#define PPC_BD(insn) (PPC_SEXT (PPC_FIELD (insn, 16, 14), 14) << 2)
|
|
|
|
+/* Holds the AT_HWCAP auxv entry. */
|
|
+
|
|
static unsigned long ppc_hwcap;
|
|
|
|
+/* Holds the AT_HWCAP2 auxv entry. */
|
|
+
|
|
+static unsigned long ppc_hwcap2;
|
|
+
|
|
|
|
#define ppc_num_regs 73
|
|
|
|
@@ -116,6 +124,24 @@ static int ppc_regmap_e500[] =
|
|
};
|
|
#endif
|
|
|
|
+/* Check whether the kernel provides a register set with number
|
|
+ REGSET_ID of size REGSETSIZE for process/thread TID. */
|
|
+
|
|
+static int
|
|
+ppc_check_regset (int tid, int regset_id, int regsetsize)
|
|
+{
|
|
+ void *buf = alloca (regsetsize);
|
|
+ struct iovec iov;
|
|
+
|
|
+ iov.iov_base = buf;
|
|
+ iov.iov_len = regsetsize;
|
|
+
|
|
+ if (ptrace (PTRACE_GETREGSET, tid, regset_id, &iov) >= 0
|
|
+ || errno == ENODATA)
|
|
+ return 1;
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static int
|
|
ppc_cannot_store_register (int regno)
|
|
{
|
|
@@ -459,6 +485,273 @@ static void ppc_fill_gregset (struct reg
|
|
ppc_collect_ptrace_register (regcache, i, (char *) buf + ppc_regmap[i]);
|
|
}
|
|
|
|
+/* Program Priority Register regset fill function. */
|
|
+
|
|
+static void
|
|
+ppc_fill_pprregset (struct regcache *regcache, void *buf)
|
|
+{
|
|
+ char *ppr = (char *) buf;
|
|
+
|
|
+ collect_register_by_name (regcache, "ppr", ppr);
|
|
+}
|
|
+
|
|
+/* Program Priority Register regset store function. */
|
|
+
|
|
+static void
|
|
+ppc_store_pprregset (struct regcache *regcache, const void *buf)
|
|
+{
|
|
+ const char *ppr = (const char *) buf;
|
|
+
|
|
+ supply_register_by_name (regcache, "ppr", ppr);
|
|
+}
|
|
+
|
|
+/* Data Stream Control Register regset fill function. */
|
|
+
|
|
+static void
|
|
+ppc_fill_dscrregset (struct regcache *regcache, void *buf)
|
|
+{
|
|
+ char *dscr = (char *) buf;
|
|
+
|
|
+ collect_register_by_name (regcache, "dscr", dscr);
|
|
+}
|
|
+
|
|
+/* Data Stream Control Register regset store function. */
|
|
+
|
|
+static void
|
|
+ppc_store_dscrregset (struct regcache *regcache, const void *buf)
|
|
+{
|
|
+ const char *dscr = (const char *) buf;
|
|
+
|
|
+ supply_register_by_name (regcache, "dscr", dscr);
|
|
+}
|
|
+
|
|
+/* Target Address Register regset fill function. */
|
|
+
|
|
+static void
|
|
+ppc_fill_tarregset (struct regcache *regcache, void *buf)
|
|
+{
|
|
+ char *tar = (char *) buf;
|
|
+
|
|
+ collect_register_by_name (regcache, "tar", tar);
|
|
+}
|
|
+
|
|
+/* Target Address Register regset store function. */
|
|
+
|
|
+static void
|
|
+ppc_store_tarregset (struct regcache *regcache, const void *buf)
|
|
+{
|
|
+ const char *tar = (const char *) buf;
|
|
+
|
|
+ supply_register_by_name (regcache, "tar", tar);
|
|
+}
|
|
+
|
|
+/* Event-Based Branching regset store function. Unless the inferior
|
|
+ has a perf event open, ptrace can return in error when reading and
|
|
+ writing to the regset, with ENODATA. For reading, the registers
|
|
+ will correctly show as unavailable. For writing, gdbserver
|
|
+ currently only caches any register writes from P and G packets and
|
|
+ the stub always tries to write all the regsets when resuming the
|
|
+ inferior, which would result in frequent warnings. For this
|
|
+ reason, we don't define a fill function. This also means that the
|
|
+ client-side regcache will be dirty if the user tries to write to
|
|
+ the EBB registers. G packets that the client sends to write to
|
|
+ unrelated registers will also include data for EBB registers, even
|
|
+ if they are unavailable. */
|
|
+
|
|
+static void
|
|
+ppc_store_ebbregset (struct regcache *regcache, const void *buf)
|
|
+{
|
|
+ const char *regset = (const char *) buf;
|
|
+
|
|
+ /* The order in the kernel regset is: EBBRR, EBBHR, BESCR. In the
|
|
+ .dat file is BESCR, EBBHR, EBBRR. */
|
|
+ supply_register_by_name (regcache, "ebbrr", ®set[0]);
|
|
+ supply_register_by_name (regcache, "ebbhr", ®set[8]);
|
|
+ supply_register_by_name (regcache, "bescr", ®set[16]);
|
|
+}
|
|
+
|
|
+/* Performance Monitoring Unit regset fill function. */
|
|
+
|
|
+static void
|
|
+ppc_fill_pmuregset (struct regcache *regcache, void *buf)
|
|
+{
|
|
+ char *regset = (char *) buf;
|
|
+
|
|
+ /* The order in the kernel regset is SIAR, SDAR, SIER, MMCR2, MMCR0.
|
|
+ In the .dat file is MMCR0, MMCR2, SIAR, SDAR, SIER. */
|
|
+ collect_register_by_name (regcache, "siar", ®set[0]);
|
|
+ collect_register_by_name (regcache, "sdar", ®set[8]);
|
|
+ collect_register_by_name (regcache, "sier", ®set[16]);
|
|
+ collect_register_by_name (regcache, "mmcr2", ®set[24]);
|
|
+ collect_register_by_name (regcache, "mmcr0", ®set[32]);
|
|
+}
|
|
+
|
|
+/* Performance Monitoring Unit regset store function. */
|
|
+
|
|
+static void
|
|
+ppc_store_pmuregset (struct regcache *regcache, const void *buf)
|
|
+{
|
|
+ const char *regset = (const char *) buf;
|
|
+
|
|
+ supply_register_by_name (regcache, "siar", ®set[0]);
|
|
+ supply_register_by_name (regcache, "sdar", ®set[8]);
|
|
+ supply_register_by_name (regcache, "sier", ®set[16]);
|
|
+ supply_register_by_name (regcache, "mmcr2", ®set[24]);
|
|
+ supply_register_by_name (regcache, "mmcr0", ®set[32]);
|
|
+}
|
|
+
|
|
+/* Hardware Transactional Memory special-purpose register regset fill
|
|
+ function. */
|
|
+
|
|
+static void
|
|
+ppc_fill_tm_sprregset (struct regcache *regcache, void *buf)
|
|
+{
|
|
+ int i, base;
|
|
+ char *regset = (char *) buf;
|
|
+
|
|
+ base = find_regno (regcache->tdesc, "tfhar");
|
|
+ for (i = 0; i < 3; i++)
|
|
+ collect_register (regcache, base + i, ®set[i * 8]);
|
|
+}
|
|
+
|
|
+/* Hardware Transactional Memory special-purpose register regset store
|
|
+ function. */
|
|
+
|
|
+static void
|
|
+ppc_store_tm_sprregset (struct regcache *regcache, const void *buf)
|
|
+{
|
|
+ int i, base;
|
|
+ const char *regset = (const char *) buf;
|
|
+
|
|
+ base = find_regno (regcache->tdesc, "tfhar");
|
|
+ for (i = 0; i < 3; i++)
|
|
+ supply_register (regcache, base + i, ®set[i * 8]);
|
|
+}
|
|
+
|
|
+/* For the same reasons as the EBB regset, none of the HTM
|
|
+ checkpointed regsets have a fill function. These registers are
|
|
+ only available if the inferior is in a transaction. */
|
|
+
|
|
+/* Hardware Transactional Memory checkpointed general-purpose regset
|
|
+ store function. */
|
|
+
|
|
+static void
|
|
+ppc_store_tm_cgprregset (struct regcache *regcache, const void *buf)
|
|
+{
|
|
+ int i, base, size, endian_offset;
|
|
+ const char *regset = (const char *) buf;
|
|
+
|
|
+ base = find_regno (regcache->tdesc, "cr0");
|
|
+ size = register_size (regcache->tdesc, base);
|
|
+
|
|
+ gdb_assert (size == 4 || size == 8);
|
|
+
|
|
+ for (i = 0; i < 32; i++)
|
|
+ supply_register (regcache, base + i, ®set[i * size]);
|
|
+
|
|
+ endian_offset = 0;
|
|
+
|
|
+ if ((size == 8) && (__BYTE_ORDER == __BIG_ENDIAN))
|
|
+ endian_offset = 4;
|
|
+
|
|
+ supply_register_by_name (regcache, "ccr",
|
|
+ ®set[PT_CCR * size + endian_offset]);
|
|
+
|
|
+ supply_register_by_name (regcache, "cxer",
|
|
+ ®set[PT_XER * size + endian_offset]);
|
|
+
|
|
+ supply_register_by_name (regcache, "clr", ®set[PT_LNK * size]);
|
|
+ supply_register_by_name (regcache, "cctr", ®set[PT_CTR * size]);
|
|
+}
|
|
+
|
|
+/* Hardware Transactional Memory checkpointed floating-point regset
|
|
+ store function. */
|
|
+
|
|
+static void
|
|
+ppc_store_tm_cfprregset (struct regcache *regcache, const void *buf)
|
|
+{
|
|
+ int i, base;
|
|
+ const char *regset = (const char *) buf;
|
|
+
|
|
+ base = find_regno (regcache->tdesc, "cf0");
|
|
+
|
|
+ for (i = 0; i < 32; i++)
|
|
+ supply_register (regcache, base + i, ®set[i * 8]);
|
|
+
|
|
+ supply_register_by_name (regcache, "cfpscr", ®set[32 * 8]);
|
|
+}
|
|
+
|
|
+/* Hardware Transactional Memory checkpointed vector regset store
|
|
+ function. */
|
|
+
|
|
+static void
|
|
+ppc_store_tm_cvrregset (struct regcache *regcache, const void *buf)
|
|
+{
|
|
+ int i, base;
|
|
+ const char *regset = (const char *) buf;
|
|
+ int vscr_offset = 0;
|
|
+
|
|
+ base = find_regno (regcache->tdesc, "cvr0");
|
|
+
|
|
+ for (i = 0; i < 32; i++)
|
|
+ supply_register (regcache, base + i, ®set[i * 16]);
|
|
+
|
|
+ if (__BYTE_ORDER == __BIG_ENDIAN)
|
|
+ vscr_offset = 12;
|
|
+
|
|
+ supply_register_by_name (regcache, "cvscr",
|
|
+ ®set[32 * 16 + vscr_offset]);
|
|
+
|
|
+ supply_register_by_name (regcache, "cvrsave", ®set[33 * 16]);
|
|
+}
|
|
+
|
|
+/* Hardware Transactional Memory checkpointed vector-scalar regset
|
|
+ store function. */
|
|
+
|
|
+static void
|
|
+ppc_store_tm_cvsxregset (struct regcache *regcache, const void *buf)
|
|
+{
|
|
+ int i, base;
|
|
+ const char *regset = (const char *) buf;
|
|
+
|
|
+ base = find_regno (regcache->tdesc, "cvs0h");
|
|
+ for (i = 0; i < 32; i++)
|
|
+ supply_register (regcache, base + i, ®set[i * 8]);
|
|
+}
|
|
+
|
|
+/* Hardware Transactional Memory checkpointed Program Priority
|
|
+ Register regset store function. */
|
|
+
|
|
+static void
|
|
+ppc_store_tm_cpprregset (struct regcache *regcache, const void *buf)
|
|
+{
|
|
+ const char *cppr = (const char *) buf;
|
|
+
|
|
+ supply_register_by_name (regcache, "cppr", cppr);
|
|
+}
|
|
+
|
|
+/* Hardware Transactional Memory checkpointed Data Stream Control
|
|
+ Register regset store function. */
|
|
+
|
|
+static void
|
|
+ppc_store_tm_cdscrregset (struct regcache *regcache, const void *buf)
|
|
+{
|
|
+ const char *cdscr = (const char *) buf;
|
|
+
|
|
+ supply_register_by_name (regcache, "cdscr", cdscr);
|
|
+}
|
|
+
|
|
+/* Hardware Transactional Memory checkpointed Target Address Register
|
|
+ regset store function. */
|
|
+
|
|
+static void
|
|
+ppc_store_tm_ctarregset (struct regcache *regcache, const void *buf)
|
|
+{
|
|
+ const char *ctar = (const char *) buf;
|
|
+
|
|
+ supply_register_by_name (regcache, "ctar", ctar);
|
|
+}
|
|
+
|
|
static void
|
|
ppc_fill_vsxregset (struct regcache *regcache, void *buf)
|
|
{
|
|
@@ -495,13 +788,9 @@ ppc_fill_vrregset (struct regcache *regc
|
|
if (__BYTE_ORDER == __BIG_ENDIAN)
|
|
vscr_offset = 12;
|
|
|
|
- /* Zero-pad the unused bytes in the fields for vscr and vrsave in
|
|
- case they get displayed somewhere. */
|
|
- memset (®set[32 * 16], 0, 16);
|
|
collect_register_by_name (regcache, "vscr",
|
|
®set[32 * 16 + vscr_offset]);
|
|
|
|
- memset (®set[33 * 16], 0, 16);
|
|
collect_register_by_name (regcache, "vrsave", ®set[33 * 16]);
|
|
}
|
|
|
|
@@ -572,6 +861,32 @@ static struct regset_info ppc_regsets[]
|
|
fetch them every time, but still fall back to PTRACE_PEEKUSER for the
|
|
general registers. Some kernels support these, but not the newer
|
|
PPC_PTRACE_GETREGS. */
|
|
+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TM_CTAR, 0, EXTENDED_REGS,
|
|
+ NULL, ppc_store_tm_ctarregset },
|
|
+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TM_CDSCR, 0, EXTENDED_REGS,
|
|
+ NULL, ppc_store_tm_cdscrregset },
|
|
+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TM_CPPR, 0, EXTENDED_REGS,
|
|
+ NULL, ppc_store_tm_cpprregset },
|
|
+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TM_CVSX, 0, EXTENDED_REGS,
|
|
+ NULL, ppc_store_tm_cvsxregset },
|
|
+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TM_CVMX, 0, EXTENDED_REGS,
|
|
+ NULL, ppc_store_tm_cvrregset },
|
|
+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TM_CFPR, 0, EXTENDED_REGS,
|
|
+ NULL, ppc_store_tm_cfprregset },
|
|
+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TM_CGPR, 0, EXTENDED_REGS,
|
|
+ NULL, ppc_store_tm_cgprregset },
|
|
+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TM_SPR, 0, EXTENDED_REGS,
|
|
+ ppc_fill_tm_sprregset, ppc_store_tm_sprregset },
|
|
+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_EBB, 0, EXTENDED_REGS,
|
|
+ NULL, ppc_store_ebbregset },
|
|
+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_PMU, 0, EXTENDED_REGS,
|
|
+ ppc_fill_pmuregset, ppc_store_pmuregset },
|
|
+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TAR, 0, EXTENDED_REGS,
|
|
+ ppc_fill_tarregset, ppc_store_tarregset },
|
|
+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_PPR, 0, EXTENDED_REGS,
|
|
+ ppc_fill_pprregset, ppc_store_pprregset },
|
|
+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_DSCR, 0, EXTENDED_REGS,
|
|
+ ppc_fill_dscrregset, ppc_store_dscrregset },
|
|
{ PTRACE_GETVSXREGS, PTRACE_SETVSXREGS, 0, 0, EXTENDED_REGS,
|
|
ppc_fill_vsxregset, ppc_store_vsxregset },
|
|
{ PTRACE_GETVRREGS, PTRACE_SETVRREGS, 0, 0, EXTENDED_REGS,
|
|
@@ -629,6 +944,7 @@ ppc_arch_setup (void)
|
|
/* The value of current_process ()->tdesc needs to be set for this
|
|
call. */
|
|
ppc_get_auxv (AT_HWCAP, &ppc_hwcap);
|
|
+ ppc_get_auxv (AT_HWCAP2, &ppc_hwcap2);
|
|
|
|
features.isa205 = ppc_linux_has_isa205 (ppc_hwcap);
|
|
|
|
@@ -638,6 +954,29 @@ ppc_arch_setup (void)
|
|
if (ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC)
|
|
features.altivec = true;
|
|
|
|
+ if ((ppc_hwcap2 & PPC_FEATURE2_DSCR)
|
|
+ && ppc_check_regset (tid, NT_PPC_DSCR, PPC_LINUX_SIZEOF_DSCRREGSET)
|
|
+ && ppc_check_regset (tid, NT_PPC_PPR, PPC_LINUX_SIZEOF_PPRREGSET))
|
|
+ {
|
|
+ features.ppr_dscr = true;
|
|
+ if ((ppc_hwcap2 & PPC_FEATURE2_ARCH_2_07)
|
|
+ && (ppc_hwcap2 & PPC_FEATURE2_TAR)
|
|
+ && (ppc_hwcap2 & PPC_FEATURE2_EBB)
|
|
+ && ppc_check_regset (tid, NT_PPC_TAR,
|
|
+ PPC_LINUX_SIZEOF_TARREGSET)
|
|
+ && ppc_check_regset (tid, NT_PPC_EBB,
|
|
+ PPC_LINUX_SIZEOF_EBBREGSET)
|
|
+ && ppc_check_regset (tid, NT_PPC_PMU,
|
|
+ PPC_LINUX_SIZEOF_PMUREGSET))
|
|
+ {
|
|
+ features.isa207 = true;
|
|
+ if ((ppc_hwcap2 & PPC_FEATURE2_HTM)
|
|
+ && ppc_check_regset (tid, NT_PPC_TM_SPR,
|
|
+ PPC_LINUX_SIZEOF_TM_SPRREGSET))
|
|
+ features.htm = true;
|
|
+ }
|
|
+ }
|
|
+
|
|
if (ppc_hwcap & PPC_FEATURE_CELL)
|
|
features.cell = true;
|
|
|
|
@@ -682,6 +1021,69 @@ ppc_arch_setup (void)
|
|
else
|
|
regset->size = 0;
|
|
break;
|
|
+ case PTRACE_GETREGSET:
|
|
+ switch (regset->nt_type)
|
|
+ {
|
|
+ case NT_PPC_PPR:
|
|
+ regset->size = (features.ppr_dscr ?
|
|
+ PPC_LINUX_SIZEOF_PPRREGSET : 0);
|
|
+ break;
|
|
+ case NT_PPC_DSCR:
|
|
+ regset->size = (features.ppr_dscr ?
|
|
+ PPC_LINUX_SIZEOF_DSCRREGSET : 0);
|
|
+ break;
|
|
+ case NT_PPC_TAR:
|
|
+ regset->size = (features.isa207 ?
|
|
+ PPC_LINUX_SIZEOF_TARREGSET : 0);
|
|
+ break;
|
|
+ case NT_PPC_EBB:
|
|
+ regset->size = (features.isa207 ?
|
|
+ PPC_LINUX_SIZEOF_EBBREGSET : 0);
|
|
+ break;
|
|
+ case NT_PPC_PMU:
|
|
+ regset->size = (features.isa207 ?
|
|
+ PPC_LINUX_SIZEOF_PMUREGSET : 0);
|
|
+ break;
|
|
+ case NT_PPC_TM_SPR:
|
|
+ regset->size = (features.htm ?
|
|
+ PPC_LINUX_SIZEOF_TM_SPRREGSET : 0);
|
|
+ break;
|
|
+ case NT_PPC_TM_CGPR:
|
|
+ if (features.wordsize == 4)
|
|
+ regset->size = (features.htm ?
|
|
+ PPC32_LINUX_SIZEOF_CGPRREGSET : 0);
|
|
+ else
|
|
+ regset->size = (features.htm ?
|
|
+ PPC64_LINUX_SIZEOF_CGPRREGSET : 0);
|
|
+ break;
|
|
+ case NT_PPC_TM_CFPR:
|
|
+ regset->size = (features.htm ?
|
|
+ PPC_LINUX_SIZEOF_CFPRREGSET : 0);
|
|
+ break;
|
|
+ case NT_PPC_TM_CVMX:
|
|
+ regset->size = (features.htm ?
|
|
+ PPC_LINUX_SIZEOF_CVMXREGSET : 0);
|
|
+ break;
|
|
+ case NT_PPC_TM_CVSX:
|
|
+ regset->size = (features.htm ?
|
|
+ PPC_LINUX_SIZEOF_CVSXREGSET : 0);
|
|
+ break;
|
|
+ case NT_PPC_TM_CPPR:
|
|
+ regset->size = (features.htm ?
|
|
+ PPC_LINUX_SIZEOF_CPPRREGSET : 0);
|
|
+ break;
|
|
+ case NT_PPC_TM_CDSCR:
|
|
+ regset->size = (features.htm ?
|
|
+ PPC_LINUX_SIZEOF_CDSCRREGSET : 0);
|
|
+ break;
|
|
+ case NT_PPC_TM_CTAR:
|
|
+ regset->size = (features.htm ?
|
|
+ PPC_LINUX_SIZEOF_CTARREGSET : 0);
|
|
+ break;
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+ break;
|
|
default:
|
|
break;
|
|
}
|
|
@@ -3057,6 +3459,12 @@ ppc_get_ipa_tdesc_idx (void)
|
|
return PPC_TDESC_ISA205_ALTIVEC;
|
|
if (tdesc == tdesc_powerpc_isa205_vsx64l)
|
|
return PPC_TDESC_ISA205_VSX;
|
|
+ if (tdesc == tdesc_powerpc_isa205_ppr_dscr_vsx64l)
|
|
+ return PPC_TDESC_ISA205_PPR_DSCR_VSX;
|
|
+ if (tdesc == tdesc_powerpc_isa207_vsx64l)
|
|
+ return PPC_TDESC_ISA207_VSX;
|
|
+ if (tdesc == tdesc_powerpc_isa207_htm_vsx64l)
|
|
+ return PPC_TDESC_ISA207_HTM_VSX;
|
|
#endif
|
|
|
|
if (tdesc == tdesc_powerpc_32l)
|
|
@@ -3073,6 +3481,12 @@ ppc_get_ipa_tdesc_idx (void)
|
|
return PPC_TDESC_ISA205_ALTIVEC;
|
|
if (tdesc == tdesc_powerpc_isa205_vsx32l)
|
|
return PPC_TDESC_ISA205_VSX;
|
|
+ if (tdesc == tdesc_powerpc_isa205_ppr_dscr_vsx32l)
|
|
+ return PPC_TDESC_ISA205_PPR_DSCR_VSX;
|
|
+ if (tdesc == tdesc_powerpc_isa207_vsx32l)
|
|
+ return PPC_TDESC_ISA207_VSX;
|
|
+ if (tdesc == tdesc_powerpc_isa207_htm_vsx32l)
|
|
+ return PPC_TDESC_ISA207_HTM_VSX;
|
|
if (tdesc == tdesc_powerpc_e500l)
|
|
return PPC_TDESC_E500;
|
|
|
|
@@ -3131,6 +3545,9 @@ initialize_low_arch (void)
|
|
init_registers_powerpc_isa205_32l ();
|
|
init_registers_powerpc_isa205_altivec32l ();
|
|
init_registers_powerpc_isa205_vsx32l ();
|
|
+ init_registers_powerpc_isa205_ppr_dscr_vsx32l ();
|
|
+ init_registers_powerpc_isa207_vsx32l ();
|
|
+ init_registers_powerpc_isa207_htm_vsx32l ();
|
|
init_registers_powerpc_e500l ();
|
|
#if __powerpc64__
|
|
init_registers_powerpc_64l ();
|
|
@@ -3140,6 +3557,9 @@ initialize_low_arch (void)
|
|
init_registers_powerpc_isa205_64l ();
|
|
init_registers_powerpc_isa205_altivec64l ();
|
|
init_registers_powerpc_isa205_vsx64l ();
|
|
+ init_registers_powerpc_isa205_ppr_dscr_vsx64l ();
|
|
+ init_registers_powerpc_isa207_vsx64l ();
|
|
+ init_registers_powerpc_isa207_htm_vsx64l ();
|
|
#endif
|
|
|
|
initialize_regsets_info (&ppc_regsets_info);
|
|
Index: gdb-8.2/gdb/ppc-linux-tdep.c
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/ppc-linux-tdep.c 2019-01-18 14:26:09.000000000 +0100
|
|
+++ gdb-8.2/gdb/ppc-linux-tdep.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -71,6 +71,9 @@
|
|
#include "features/rs6000/powerpc-isa205-32l.c"
|
|
#include "features/rs6000/powerpc-isa205-altivec32l.c"
|
|
#include "features/rs6000/powerpc-isa205-vsx32l.c"
|
|
+#include "features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c"
|
|
+#include "features/rs6000/powerpc-isa207-vsx32l.c"
|
|
+#include "features/rs6000/powerpc-isa207-htm-vsx32l.c"
|
|
#include "features/rs6000/powerpc-64l.c"
|
|
#include "features/rs6000/powerpc-altivec64l.c"
|
|
#include "features/rs6000/powerpc-cell64l.c"
|
|
@@ -78,6 +81,9 @@
|
|
#include "features/rs6000/powerpc-isa205-64l.c"
|
|
#include "features/rs6000/powerpc-isa205-altivec64l.c"
|
|
#include "features/rs6000/powerpc-isa205-vsx64l.c"
|
|
+#include "features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c"
|
|
+#include "features/rs6000/powerpc-isa207-vsx64l.c"
|
|
+#include "features/rs6000/powerpc-isa207-htm-vsx64l.c"
|
|
#include "features/rs6000/powerpc-e500l.c"
|
|
|
|
/* Shared library operations for PowerPC-Linux. */
|
|
@@ -444,24 +450,6 @@ ppc_linux_collect_gregset (const struct
|
|
}
|
|
}
|
|
|
|
-static void
|
|
-ppc_linux_collect_vrregset (const struct regset *regset,
|
|
- const struct regcache *regcache,
|
|
- int regnum, void *buf, size_t len)
|
|
-{
|
|
- gdb_byte *vrregs = (gdb_byte *) buf;
|
|
-
|
|
- /* Zero-pad the unused bytes in the fields for vscr and vrsave
|
|
- in case they get displayed somewhere (e.g. in core files). */
|
|
- if (regnum == PPC_VSCR_REGNUM || regnum == -1)
|
|
- memset (&vrregs[32 * 16], 0, 16);
|
|
-
|
|
- if (regnum == PPC_VRSAVE_REGNUM || regnum == -1)
|
|
- memset (&vrregs[33 * 16], 0, 16);
|
|
-
|
|
- regcache_collect_regset (regset, regcache, regnum, buf, len);
|
|
-}
|
|
-
|
|
/* Regset descriptions. */
|
|
static const struct ppc_reg_offsets ppc32_linux_reg_offsets =
|
|
{
|
|
@@ -544,13 +532,13 @@ static const struct regcache_map_entry p
|
|
static const struct regset ppc32_le_linux_vrregset = {
|
|
ppc32_le_linux_vrregmap,
|
|
regcache_supply_regset,
|
|
- ppc_linux_collect_vrregset
|
|
+ regcache_collect_regset
|
|
};
|
|
|
|
static const struct regset ppc32_be_linux_vrregset = {
|
|
ppc32_be_linux_vrregmap,
|
|
regcache_supply_regset,
|
|
- ppc_linux_collect_vrregset
|
|
+ regcache_collect_regset
|
|
};
|
|
|
|
static const struct regcache_map_entry ppc32_linux_vsxregmap[] =
|
|
@@ -565,6 +553,325 @@ static const struct regset ppc32_linux_v
|
|
regcache_collect_regset
|
|
};
|
|
|
|
+/* Program Priorty Register regmap. */
|
|
+
|
|
+static const struct regcache_map_entry ppc32_regmap_ppr[] =
|
|
+ {
|
|
+ { 1, PPC_PPR_REGNUM, 8 },
|
|
+ { 0 }
|
|
+ };
|
|
+
|
|
+/* Program Priorty Register regset. */
|
|
+
|
|
+const struct regset ppc32_linux_pprregset = {
|
|
+ ppc32_regmap_ppr,
|
|
+ regcache_supply_regset,
|
|
+ regcache_collect_regset
|
|
+};
|
|
+
|
|
+/* Data Stream Control Register regmap. */
|
|
+
|
|
+static const struct regcache_map_entry ppc32_regmap_dscr[] =
|
|
+ {
|
|
+ { 1, PPC_DSCR_REGNUM, 8 },
|
|
+ { 0 }
|
|
+ };
|
|
+
|
|
+/* Data Stream Control Register regset. */
|
|
+
|
|
+const struct regset ppc32_linux_dscrregset = {
|
|
+ ppc32_regmap_dscr,
|
|
+ regcache_supply_regset,
|
|
+ regcache_collect_regset
|
|
+};
|
|
+
|
|
+/* Target Address Register regmap. */
|
|
+
|
|
+static const struct regcache_map_entry ppc32_regmap_tar[] =
|
|
+ {
|
|
+ { 1, PPC_TAR_REGNUM, 8 },
|
|
+ { 0 }
|
|
+ };
|
|
+
|
|
+/* Target Address Register regset. */
|
|
+
|
|
+const struct regset ppc32_linux_tarregset = {
|
|
+ ppc32_regmap_tar,
|
|
+ regcache_supply_regset,
|
|
+ regcache_collect_regset
|
|
+};
|
|
+
|
|
+/* Event-Based Branching regmap. */
|
|
+
|
|
+static const struct regcache_map_entry ppc32_regmap_ebb[] =
|
|
+ {
|
|
+ { 1, PPC_EBBRR_REGNUM, 8 },
|
|
+ { 1, PPC_EBBHR_REGNUM, 8 },
|
|
+ { 1, PPC_BESCR_REGNUM, 8 },
|
|
+ { 0 }
|
|
+ };
|
|
+
|
|
+/* Event-Based Branching regset. */
|
|
+
|
|
+const struct regset ppc32_linux_ebbregset = {
|
|
+ ppc32_regmap_ebb,
|
|
+ regcache_supply_regset,
|
|
+ regcache_collect_regset
|
|
+};
|
|
+
|
|
+/* Performance Monitoring Unit regmap. */
|
|
+
|
|
+static const struct regcache_map_entry ppc32_regmap_pmu[] =
|
|
+ {
|
|
+ { 1, PPC_SIAR_REGNUM, 8 },
|
|
+ { 1, PPC_SDAR_REGNUM, 8 },
|
|
+ { 1, PPC_SIER_REGNUM, 8 },
|
|
+ { 1, PPC_MMCR2_REGNUM, 8 },
|
|
+ { 1, PPC_MMCR0_REGNUM, 8 },
|
|
+ { 0 }
|
|
+ };
|
|
+
|
|
+/* Performance Monitoring Unit regset. */
|
|
+
|
|
+const struct regset ppc32_linux_pmuregset = {
|
|
+ ppc32_regmap_pmu,
|
|
+ regcache_supply_regset,
|
|
+ regcache_collect_regset
|
|
+};
|
|
+
|
|
+/* Hardware Transactional Memory special-purpose register regmap. */
|
|
+
|
|
+static const struct regcache_map_entry ppc32_regmap_tm_spr[] =
|
|
+ {
|
|
+ { 1, PPC_TFHAR_REGNUM, 8 },
|
|
+ { 1, PPC_TEXASR_REGNUM, 8 },
|
|
+ { 1, PPC_TFIAR_REGNUM, 8 },
|
|
+ { 0 }
|
|
+ };
|
|
+
|
|
+/* Hardware Transactional Memory special-purpose register regset. */
|
|
+
|
|
+const struct regset ppc32_linux_tm_sprregset = {
|
|
+ ppc32_regmap_tm_spr,
|
|
+ regcache_supply_regset,
|
|
+ regcache_collect_regset
|
|
+};
|
|
+
|
|
+/* Regmaps for the Hardware Transactional Memory checkpointed
|
|
+ general-purpose regsets for 32-bit, 64-bit big-endian, and 64-bit
|
|
+ little endian targets. The ptrace and core file buffers for 64-bit
|
|
+ targets use 8-byte fields for the 4-byte registers, and the
|
|
+ position of the register in the fields depends on the endianess.
|
|
+ The 32-bit regmap is the same for both endian types because the
|
|
+ fields are all 4-byte long.
|
|
+
|
|
+ The layout of checkpointed GPR regset is the same as a regular
|
|
+ struct pt_regs, but we skip all registers that are not actually
|
|
+ checkpointed by the processor (e.g. msr, nip), except when
|
|
+ generating a core file. The 64-bit regset is 48 * 8 bytes long.
|
|
+ In some 64-bit kernels, the regset for a 32-bit inferior has the
|
|
+ same length, but all the registers are squeezed in the first half
|
|
+ (48 * 4 bytes). The pt_regs struct calls the regular cr ccr, but
|
|
+ we use ccr for "checkpointed condition register". Note that CR
|
|
+ (condition register) field 0 is not checkpointed, but the kernel
|
|
+ returns all 4 bytes. The skipped registers should not be touched
|
|
+ when writing the regset to the inferior (with
|
|
+ PTRACE_SETREGSET). */
|
|
+
|
|
+static const struct regcache_map_entry ppc32_regmap_cgpr[] =
|
|
+ {
|
|
+ { 32, PPC_CR0_REGNUM, 4 },
|
|
+ { 3, REGCACHE_MAP_SKIP, 4 }, /* nip, msr, orig_gpr3. */
|
|
+ { 1, PPC_CCTR_REGNUM, 4 },
|
|
+ { 1, PPC_CLR_REGNUM, 4 },
|
|
+ { 1, PPC_CXER_REGNUM, 4 },
|
|
+ { 1, PPC_CCR_REGNUM, 4 },
|
|
+ { 9, REGCACHE_MAP_SKIP, 4 }, /* All the rest. */
|
|
+ { 0 }
|
|
+ };
|
|
+
|
|
+static const struct regcache_map_entry ppc64_le_regmap_cgpr[] =
|
|
+ {
|
|
+ { 32, PPC_CR0_REGNUM, 8 },
|
|
+ { 3, REGCACHE_MAP_SKIP, 8 },
|
|
+ { 1, PPC_CCTR_REGNUM, 8 },
|
|
+ { 1, PPC_CLR_REGNUM, 8 },
|
|
+ { 1, PPC_CXER_REGNUM, 4 },
|
|
+ { 1, REGCACHE_MAP_SKIP, 4 }, /* CXER padding. */
|
|
+ { 1, PPC_CCR_REGNUM, 4 },
|
|
+ { 1, REGCACHE_MAP_SKIP, 4}, /* CCR padding. */
|
|
+ { 9, REGCACHE_MAP_SKIP, 8},
|
|
+ { 0 }
|
|
+ };
|
|
+
|
|
+static const struct regcache_map_entry ppc64_be_regmap_cgpr[] =
|
|
+ {
|
|
+ { 32, PPC_CR0_REGNUM, 8 },
|
|
+ { 3, REGCACHE_MAP_SKIP, 8 },
|
|
+ { 1, PPC_CCTR_REGNUM, 8 },
|
|
+ { 1, PPC_CLR_REGNUM, 8 },
|
|
+ { 1, REGCACHE_MAP_SKIP, 4}, /* CXER padding. */
|
|
+ { 1, PPC_CXER_REGNUM, 4 },
|
|
+ { 1, REGCACHE_MAP_SKIP, 4}, /* CCR padding. */
|
|
+ { 1, PPC_CCR_REGNUM, 4 },
|
|
+ { 9, REGCACHE_MAP_SKIP, 8},
|
|
+ { 0 }
|
|
+ };
|
|
+
|
|
+/* Regsets for the Hardware Transactional Memory checkpointed
|
|
+ general-purpose registers for 32-bit, 64-bit big-endian, and 64-bit
|
|
+ little endian targets.
|
|
+
|
|
+ Some 64-bit kernels generate a checkpointed gpr note section with
|
|
+ 48*8 bytes for a 32-bit thread, of which only 48*4 are actually
|
|
+ used, so we set the variable size flag in the corresponding regset
|
|
+ to accept this case. */
|
|
+
|
|
+static const struct regset ppc32_linux_cgprregset = {
|
|
+ ppc32_regmap_cgpr,
|
|
+ regcache_supply_regset,
|
|
+ regcache_collect_regset,
|
|
+ REGSET_VARIABLE_SIZE
|
|
+};
|
|
+
|
|
+static const struct regset ppc64_be_linux_cgprregset = {
|
|
+ ppc64_be_regmap_cgpr,
|
|
+ regcache_supply_regset,
|
|
+ regcache_collect_regset
|
|
+};
|
|
+
|
|
+static const struct regset ppc64_le_linux_cgprregset = {
|
|
+ ppc64_le_regmap_cgpr,
|
|
+ regcache_supply_regset,
|
|
+ regcache_collect_regset
|
|
+};
|
|
+
|
|
+/* Hardware Transactional Memory checkpointed floating-point regmap. */
|
|
+
|
|
+static const struct regcache_map_entry ppc32_regmap_cfpr[] =
|
|
+ {
|
|
+ { 32, PPC_CF0_REGNUM, 8 },
|
|
+ { 1, PPC_CFPSCR_REGNUM, 8 },
|
|
+ { 0 }
|
|
+ };
|
|
+
|
|
+/* Hardware Transactional Memory checkpointed floating-point regset. */
|
|
+
|
|
+const struct regset ppc32_linux_cfprregset = {
|
|
+ ppc32_regmap_cfpr,
|
|
+ regcache_supply_regset,
|
|
+ regcache_collect_regset
|
|
+};
|
|
+
|
|
+/* Regmaps for the Hardware Transactional Memory checkpointed vector
|
|
+ regsets, for big and little endian targets. The position of the
|
|
+ 4-byte VSCR in its 16-byte field depends on the endianess. */
|
|
+
|
|
+static const struct regcache_map_entry ppc32_le_regmap_cvmx[] =
|
|
+ {
|
|
+ { 32, PPC_CVR0_REGNUM, 16 },
|
|
+ { 1, PPC_CVSCR_REGNUM, 4 },
|
|
+ { 1, REGCACHE_MAP_SKIP, 12 },
|
|
+ { 1, PPC_CVRSAVE_REGNUM, 4 },
|
|
+ { 1, REGCACHE_MAP_SKIP, 12 },
|
|
+ { 0 }
|
|
+ };
|
|
+
|
|
+static const struct regcache_map_entry ppc32_be_regmap_cvmx[] =
|
|
+ {
|
|
+ { 32, PPC_CVR0_REGNUM, 16 },
|
|
+ { 1, REGCACHE_MAP_SKIP, 12 },
|
|
+ { 1, PPC_CVSCR_REGNUM, 4 },
|
|
+ { 1, PPC_CVRSAVE_REGNUM, 4 },
|
|
+ { 1, REGCACHE_MAP_SKIP, 12},
|
|
+ { 0 }
|
|
+ };
|
|
+
|
|
+/* Hardware Transactional Memory checkpointed vector regsets, for little
|
|
+ and big endian targets. */
|
|
+
|
|
+static const struct regset ppc32_le_linux_cvmxregset = {
|
|
+ ppc32_le_regmap_cvmx,
|
|
+ regcache_supply_regset,
|
|
+ regcache_collect_regset
|
|
+};
|
|
+
|
|
+static const struct regset ppc32_be_linux_cvmxregset = {
|
|
+ ppc32_be_regmap_cvmx,
|
|
+ regcache_supply_regset,
|
|
+ regcache_collect_regset
|
|
+};
|
|
+
|
|
+/* Hardware Transactional Memory checkpointed vector-scalar regmap. */
|
|
+
|
|
+static const struct regcache_map_entry ppc32_regmap_cvsx[] =
|
|
+ {
|
|
+ { 32, PPC_CVSR0_UPPER_REGNUM, 8 },
|
|
+ { 0 }
|
|
+ };
|
|
+
|
|
+/* Hardware Transactional Memory checkpointed vector-scalar regset. */
|
|
+
|
|
+const struct regset ppc32_linux_cvsxregset = {
|
|
+ ppc32_regmap_cvsx,
|
|
+ regcache_supply_regset,
|
|
+ regcache_collect_regset
|
|
+};
|
|
+
|
|
+/* Hardware Transactional Memory checkpointed Program Priority Register
|
|
+ regmap. */
|
|
+
|
|
+static const struct regcache_map_entry ppc32_regmap_cppr[] =
|
|
+ {
|
|
+ { 1, PPC_CPPR_REGNUM, 8 },
|
|
+ { 0 }
|
|
+ };
|
|
+
|
|
+/* Hardware Transactional Memory checkpointed Program Priority Register
|
|
+ regset. */
|
|
+
|
|
+const struct regset ppc32_linux_cpprregset = {
|
|
+ ppc32_regmap_cppr,
|
|
+ regcache_supply_regset,
|
|
+ regcache_collect_regset
|
|
+};
|
|
+
|
|
+/* Hardware Transactional Memory checkpointed Data Stream Control
|
|
+ Register regmap. */
|
|
+
|
|
+static const struct regcache_map_entry ppc32_regmap_cdscr[] =
|
|
+ {
|
|
+ { 1, PPC_CDSCR_REGNUM, 8 },
|
|
+ { 0 }
|
|
+ };
|
|
+
|
|
+/* Hardware Transactional Memory checkpointed Data Stream Control
|
|
+ Register regset. */
|
|
+
|
|
+const struct regset ppc32_linux_cdscrregset = {
|
|
+ ppc32_regmap_cdscr,
|
|
+ regcache_supply_regset,
|
|
+ regcache_collect_regset
|
|
+};
|
|
+
|
|
+/* Hardware Transactional Memory checkpointed Target Address Register
|
|
+ regmap. */
|
|
+
|
|
+static const struct regcache_map_entry ppc32_regmap_ctar[] =
|
|
+ {
|
|
+ { 1, PPC_CTAR_REGNUM, 8 },
|
|
+ { 0 }
|
|
+ };
|
|
+
|
|
+/* Hardware Transactional Memory checkpointed Target Address Register
|
|
+ regset. */
|
|
+
|
|
+const struct regset ppc32_linux_ctarregset = {
|
|
+ ppc32_regmap_ctar,
|
|
+ regcache_supply_regset,
|
|
+ regcache_collect_regset
|
|
+};
|
|
+
|
|
const struct regset *
|
|
ppc_linux_gregset (int wordsize)
|
|
{
|
|
@@ -592,6 +899,88 @@ ppc_linux_vsxregset (void)
|
|
return &ppc32_linux_vsxregset;
|
|
}
|
|
|
|
+const struct regset *
|
|
+ppc_linux_cgprregset (struct gdbarch *gdbarch)
|
|
+{
|
|
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
+
|
|
+ if (tdep->wordsize == 4)
|
|
+ {
|
|
+ return &ppc32_linux_cgprregset;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
|
|
+ return &ppc64_be_linux_cgprregset;
|
|
+ else
|
|
+ return &ppc64_le_linux_cgprregset;
|
|
+ }
|
|
+}
|
|
+
|
|
+const struct regset *
|
|
+ppc_linux_cvmxregset (struct gdbarch *gdbarch)
|
|
+{
|
|
+ if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
|
|
+ return &ppc32_be_linux_cvmxregset;
|
|
+ else
|
|
+ return &ppc32_le_linux_cvmxregset;
|
|
+}
|
|
+
|
|
+/* Collect function used to generate the core note for the
|
|
+ checkpointed GPR regset. Here, we don't want to skip the
|
|
+ "checkpointed" NIP and MSR, so that the note section we generate is
|
|
+ similar to the one generated by the kernel. To avoid having to
|
|
+ define additional registers in GDB which are not actually
|
|
+ checkpointed in the architecture, we copy TFHAR to the checkpointed
|
|
+ NIP slot, which is what the kernel does, and copy the regular MSR
|
|
+ to the checkpointed MSR slot, which will have a similar value in
|
|
+ most cases. */
|
|
+
|
|
+static void
|
|
+ppc_linux_collect_core_cpgrregset (const struct regset *regset,
|
|
+ const struct regcache *regcache,
|
|
+ int regnum, void *buf, size_t len)
|
|
+{
|
|
+ struct gdbarch *gdbarch = regcache->arch ();
|
|
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
+
|
|
+ const struct regset *cgprregset = ppc_linux_cgprregset (gdbarch);
|
|
+
|
|
+ /* We collect the checkpointed GPRs already defined in the regular
|
|
+ regmap, then overlay TFHAR/MSR on the checkpointed NIP/MSR
|
|
+ slots. */
|
|
+ cgprregset->collect_regset (cgprregset, regcache, regnum, buf, len);
|
|
+
|
|
+ /* Check that we are collecting all the registers, which should be
|
|
+ the case when generating a core file. */
|
|
+ if (regnum != -1)
|
|
+ return;
|
|
+
|
|
+ /* PT_NIP and PT_MSR are 32 and 33 for powerpc. Don't redefine
|
|
+ these symbols since this file can run on clients in other
|
|
+ architectures where they can already be defined to other
|
|
+ values. */
|
|
+ int pt_offset = 32;
|
|
+
|
|
+ /* Check that our buffer is long enough to hold two slots at
|
|
+ pt_offset * wordsize, one for NIP and one for MSR. */
|
|
+ gdb_assert ((pt_offset + 2) * tdep->wordsize <= len);
|
|
+
|
|
+ /* TFHAR is 8 bytes wide, but the NIP slot for a 32-bit thread is
|
|
+ 4-bytes long. We use raw_collect_integer which handles
|
|
+ differences in the sizes for the source and destination buffers
|
|
+ for both endian modes. */
|
|
+ (regcache->raw_collect_integer
|
|
+ (PPC_TFHAR_REGNUM, ((gdb_byte *) buf) + pt_offset * tdep->wordsize,
|
|
+ tdep->wordsize, false));
|
|
+
|
|
+ pt_offset = 33;
|
|
+
|
|
+ (regcache->raw_collect_integer
|
|
+ (PPC_MSR_REGNUM, ((gdb_byte *) buf) + pt_offset * tdep->wordsize,
|
|
+ tdep->wordsize, false));
|
|
+}
|
|
+
|
|
/* Iterate over supported core file register note sections. */
|
|
|
|
static void
|
|
@@ -603,6 +992,9 @@ ppc_linux_iterate_over_regset_sections (
|
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
int have_altivec = tdep->ppc_vr0_regnum != -1;
|
|
int have_vsx = tdep->ppc_vsr0_upper_regnum != -1;
|
|
+ int have_ppr = tdep->ppc_ppr_regnum != -1;
|
|
+ int have_dscr = tdep->ppc_dscr_regnum != -1;
|
|
+ int have_tar = tdep->ppc_tar_regnum != -1;
|
|
|
|
if (tdep->wordsize == 4)
|
|
cb (".reg", 48 * 4, 48 * 4, &ppc32_linux_gregset, NULL, cb_data);
|
|
@@ -621,6 +1013,153 @@ ppc_linux_iterate_over_regset_sections (
|
|
if (have_vsx)
|
|
cb (".reg-ppc-vsx", PPC_LINUX_SIZEOF_VSXREGSET, PPC_LINUX_SIZEOF_VSXREGSET,
|
|
&ppc32_linux_vsxregset, "POWER7 VSX", cb_data);
|
|
+
|
|
+ if (have_ppr)
|
|
+ cb (".reg-ppc-ppr", PPC_LINUX_SIZEOF_PPRREGSET,
|
|
+ PPC_LINUX_SIZEOF_PPRREGSET,
|
|
+ &ppc32_linux_pprregset, "Priority Program Register", cb_data);
|
|
+
|
|
+ if (have_dscr)
|
|
+ cb (".reg-ppc-dscr", PPC_LINUX_SIZEOF_DSCRREGSET,
|
|
+ PPC_LINUX_SIZEOF_DSCRREGSET,
|
|
+ &ppc32_linux_dscrregset, "Data Stream Control Register",
|
|
+ cb_data);
|
|
+
|
|
+ if (have_tar)
|
|
+ cb (".reg-ppc-tar", PPC_LINUX_SIZEOF_TARREGSET,
|
|
+ PPC_LINUX_SIZEOF_TARREGSET,
|
|
+ &ppc32_linux_tarregset, "Target Address Register", cb_data);
|
|
+
|
|
+ /* EBB registers are unavailable when ptrace returns ENODATA. Check
|
|
+ availability when generating a core file (regcache != NULL). */
|
|
+ if (tdep->have_ebb)
|
|
+ if (regcache == NULL
|
|
+ || REG_VALID == regcache->get_register_status (PPC_BESCR_REGNUM))
|
|
+ cb (".reg-ppc-ebb", PPC_LINUX_SIZEOF_EBBREGSET,
|
|
+ PPC_LINUX_SIZEOF_EBBREGSET,
|
|
+ &ppc32_linux_ebbregset, "Event-based Branching Registers",
|
|
+ cb_data);
|
|
+
|
|
+ if (tdep->ppc_mmcr0_regnum != -1)
|
|
+ cb (".reg-ppc-pmu", PPC_LINUX_SIZEOF_PMUREGSET,
|
|
+ PPC_LINUX_SIZEOF_PMUREGSET,
|
|
+ &ppc32_linux_pmuregset, "Performance Monitor Registers",
|
|
+ cb_data);
|
|
+
|
|
+ if (tdep->have_htm_spr)
|
|
+ cb (".reg-ppc-tm-spr", PPC_LINUX_SIZEOF_TM_SPRREGSET,
|
|
+ PPC_LINUX_SIZEOF_TM_SPRREGSET,
|
|
+ &ppc32_linux_tm_sprregset,
|
|
+ "Hardware Transactional Memory Special Purpose Registers",
|
|
+ cb_data);
|
|
+
|
|
+ /* Checkpointed registers can be unavailable, don't call back if
|
|
+ we are generating a core file. */
|
|
+
|
|
+ if (tdep->have_htm_core)
|
|
+ {
|
|
+ /* Only generate the checkpointed GPR core note if we also have
|
|
+ access to the HTM SPRs, because we need TFHAR to fill the
|
|
+ "checkpointed" NIP slot. We can read a core file without it
|
|
+ since GDB is not aware of this NIP as a visible register. */
|
|
+ if (regcache == NULL ||
|
|
+ (REG_VALID == regcache->get_register_status (PPC_CR0_REGNUM)
|
|
+ && tdep->have_htm_spr))
|
|
+ {
|
|
+ int cgpr_size = (tdep->wordsize == 4?
|
|
+ PPC32_LINUX_SIZEOF_CGPRREGSET
|
|
+ : PPC64_LINUX_SIZEOF_CGPRREGSET);
|
|
+
|
|
+ const struct regset *cgprregset =
|
|
+ ppc_linux_cgprregset (gdbarch);
|
|
+
|
|
+ if (regcache != NULL)
|
|
+ {
|
|
+ struct regset core_cgprregset = *cgprregset;
|
|
+
|
|
+ core_cgprregset.collect_regset
|
|
+ = ppc_linux_collect_core_cpgrregset;
|
|
+
|
|
+ cb (".reg-ppc-tm-cgpr",
|
|
+ cgpr_size, cgpr_size,
|
|
+ &core_cgprregset,
|
|
+ "Checkpointed General Purpose Registers", cb_data);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ cb (".reg-ppc-tm-cgpr",
|
|
+ cgpr_size, cgpr_size,
|
|
+ cgprregset,
|
|
+ "Checkpointed General Purpose Registers", cb_data);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (tdep->have_htm_fpu)
|
|
+ {
|
|
+ if (regcache == NULL ||
|
|
+ REG_VALID == regcache->get_register_status (PPC_CF0_REGNUM))
|
|
+ cb (".reg-ppc-tm-cfpr", PPC_LINUX_SIZEOF_CFPRREGSET,
|
|
+ PPC_LINUX_SIZEOF_CFPRREGSET,
|
|
+ &ppc32_linux_cfprregset,
|
|
+ "Checkpointed Floating Point Registers", cb_data);
|
|
+ }
|
|
+
|
|
+ if (tdep->have_htm_altivec)
|
|
+ {
|
|
+ if (regcache == NULL ||
|
|
+ REG_VALID == regcache->get_register_status (PPC_CVR0_REGNUM))
|
|
+ {
|
|
+ const struct regset *cvmxregset =
|
|
+ ppc_linux_cvmxregset (gdbarch);
|
|
+
|
|
+ cb (".reg-ppc-tm-cvmx", PPC_LINUX_SIZEOF_CVMXREGSET,
|
|
+ PPC_LINUX_SIZEOF_CVMXREGSET,
|
|
+ cvmxregset,
|
|
+ "Checkpointed Altivec (VMX) Registers", cb_data);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (tdep->have_htm_vsx)
|
|
+ {
|
|
+ if (regcache == NULL ||
|
|
+ (REG_VALID
|
|
+ == regcache->get_register_status (PPC_CVSR0_UPPER_REGNUM)))
|
|
+ cb (".reg-ppc-tm-cvsx", PPC_LINUX_SIZEOF_CVSXREGSET,
|
|
+ PPC_LINUX_SIZEOF_CVSXREGSET,
|
|
+ &ppc32_linux_cvsxregset,
|
|
+ "Checkpointed VSX Registers", cb_data);
|
|
+ }
|
|
+
|
|
+ if (tdep->ppc_cppr_regnum != -1)
|
|
+ {
|
|
+ if (regcache == NULL ||
|
|
+ REG_VALID == regcache->get_register_status (PPC_CPPR_REGNUM))
|
|
+ cb (".reg-ppc-tm-cppr", PPC_LINUX_SIZEOF_CPPRREGSET,
|
|
+ PPC_LINUX_SIZEOF_CPPRREGSET,
|
|
+ &ppc32_linux_cpprregset,
|
|
+ "Checkpointed Priority Program Register", cb_data);
|
|
+ }
|
|
+
|
|
+ if (tdep->ppc_cdscr_regnum != -1)
|
|
+ {
|
|
+ if (regcache == NULL ||
|
|
+ REG_VALID == regcache->get_register_status (PPC_CDSCR_REGNUM))
|
|
+ cb (".reg-ppc-tm-cdscr", PPC_LINUX_SIZEOF_CDSCRREGSET,
|
|
+ PPC_LINUX_SIZEOF_CDSCRREGSET,
|
|
+ &ppc32_linux_cdscrregset,
|
|
+ "Checkpointed Data Stream Control Register", cb_data);
|
|
+ }
|
|
+
|
|
+ if (tdep->ppc_ctar_regnum)
|
|
+ {
|
|
+ if ( regcache == NULL ||
|
|
+ REG_VALID == regcache->get_register_status (PPC_CTAR_REGNUM))
|
|
+ cb (".reg-ppc-tm-ctar", PPC_LINUX_SIZEOF_CTARREGSET,
|
|
+ PPC_LINUX_SIZEOF_CTARREGSET,
|
|
+ &ppc32_linux_ctarregset,
|
|
+ "Checkpointed Target Address Register", cb_data);
|
|
+ }
|
|
}
|
|
|
|
static void
|
|
@@ -1033,6 +1572,11 @@ ppc_linux_core_read_description (struct
|
|
asection *altivec = bfd_get_section_by_name (abfd, ".reg-ppc-vmx");
|
|
asection *vsx = bfd_get_section_by_name (abfd, ".reg-ppc-vsx");
|
|
asection *section = bfd_get_section_by_name (abfd, ".reg");
|
|
+ asection *ppr = bfd_get_section_by_name (abfd, ".reg-ppc-ppr");
|
|
+ asection *dscr = bfd_get_section_by_name (abfd, ".reg-ppc-dscr");
|
|
+ asection *tar = bfd_get_section_by_name (abfd, ".reg-ppc-tar");
|
|
+ asection *pmu = bfd_get_section_by_name (abfd, ".reg-ppc-pmu");
|
|
+ asection *htmspr = bfd_get_section_by_name (abfd, ".reg-ppc-tm-spr");
|
|
|
|
if (! section)
|
|
return NULL;
|
|
@@ -1065,6 +1609,22 @@ ppc_linux_core_read_description (struct
|
|
|
|
features.isa205 = ppc_linux_has_isa205 (hwcap);
|
|
|
|
+ if (ppr && dscr)
|
|
+ {
|
|
+ features.ppr_dscr = true;
|
|
+
|
|
+ /* We don't require the EBB note section to be present in the
|
|
+ core file to select isa207 because these registers could have
|
|
+ been unavailable when the core file was created. They will
|
|
+ be in the tdep but will show as unavailable. */
|
|
+ if (tar && pmu)
|
|
+ {
|
|
+ features.isa207 = true;
|
|
+ if (htmspr)
|
|
+ features.htm = true;
|
|
+ }
|
|
+ }
|
|
+
|
|
return ppc_linux_match_description (features);
|
|
}
|
|
|
|
@@ -1938,6 +2498,9 @@ _initialize_ppc_linux_tdep (void)
|
|
initialize_tdesc_powerpc_isa205_32l ();
|
|
initialize_tdesc_powerpc_isa205_altivec32l ();
|
|
initialize_tdesc_powerpc_isa205_vsx32l ();
|
|
+ initialize_tdesc_powerpc_isa205_ppr_dscr_vsx32l ();
|
|
+ initialize_tdesc_powerpc_isa207_vsx32l ();
|
|
+ initialize_tdesc_powerpc_isa207_htm_vsx32l ();
|
|
initialize_tdesc_powerpc_64l ();
|
|
initialize_tdesc_powerpc_altivec64l ();
|
|
initialize_tdesc_powerpc_cell64l ();
|
|
@@ -1945,5 +2508,8 @@ _initialize_ppc_linux_tdep (void)
|
|
initialize_tdesc_powerpc_isa205_64l ();
|
|
initialize_tdesc_powerpc_isa205_altivec64l ();
|
|
initialize_tdesc_powerpc_isa205_vsx64l ();
|
|
+ initialize_tdesc_powerpc_isa205_ppr_dscr_vsx64l ();
|
|
+ initialize_tdesc_powerpc_isa207_vsx64l ();
|
|
+ initialize_tdesc_powerpc_isa207_htm_vsx64l ();
|
|
initialize_tdesc_powerpc_e500l ();
|
|
}
|
|
Index: gdb-8.2/gdb/reggroups.c
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/reggroups.c 2018-01-05 05:07:23.000000000 +0100
|
|
+++ gdb-8.2/gdb/reggroups.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -202,7 +202,9 @@ default_register_reggroup_p (struct gdba
|
|
if (group == all_reggroup)
|
|
return 1;
|
|
vector_p = TYPE_VECTOR (register_type (gdbarch, regnum));
|
|
- float_p = TYPE_CODE (register_type (gdbarch, regnum)) == TYPE_CODE_FLT;
|
|
+ float_p = (TYPE_CODE (register_type (gdbarch, regnum)) == TYPE_CODE_FLT
|
|
+ || (TYPE_CODE (register_type (gdbarch, regnum))
|
|
+ == TYPE_CODE_DECFLOAT));
|
|
raw_p = regnum < gdbarch_num_regs (gdbarch);
|
|
if (group == float_reggroup)
|
|
return float_p;
|
|
Index: gdb-8.2/gdb/rs6000-tdep.c
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/rs6000-tdep.c 2019-01-18 14:26:08.000000000 +0100
|
|
+++ gdb-8.2/gdb/rs6000-tdep.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -36,7 +36,6 @@
|
|
#include "infcall.h"
|
|
#include "sim-regno.h"
|
|
#include "gdb/sim-ppc.h"
|
|
-#include "reggroups.h"
|
|
#include "dwarf2-frame.h"
|
|
#include "target-descriptions.h"
|
|
#include "user-regs.h"
|
|
@@ -106,6 +105,22 @@
|
|
&& (regnum) >= (tdep)->ppc_efpr0_regnum \
|
|
&& (regnum) < (tdep)->ppc_efpr0_regnum + ppc_num_efprs)
|
|
|
|
+/* Determine if regnum is a checkpointed decimal float
|
|
+ pseudo-register. */
|
|
+#define IS_CDFP_PSEUDOREG(tdep, regnum) ((tdep)->ppc_cdl0_regnum >= 0 \
|
|
+ && (regnum) >= (tdep)->ppc_cdl0_regnum \
|
|
+ && (regnum) < (tdep)->ppc_cdl0_regnum + 16)
|
|
+
|
|
+/* Determine if regnum is a Checkpointed POWER7 VSX register. */
|
|
+#define IS_CVSX_PSEUDOREG(tdep, regnum) ((tdep)->ppc_cvsr0_regnum >= 0 \
|
|
+ && (regnum) >= (tdep)->ppc_cvsr0_regnum \
|
|
+ && (regnum) < (tdep)->ppc_cvsr0_regnum + ppc_num_vsrs)
|
|
+
|
|
+/* Determine if regnum is a Checkpointed POWER7 Extended FP register. */
|
|
+#define IS_CEFP_PSEUDOREG(tdep, regnum) ((tdep)->ppc_cefpr0_regnum >= 0 \
|
|
+ && (regnum) >= (tdep)->ppc_cefpr0_regnum \
|
|
+ && (regnum) < (tdep)->ppc_cefpr0_regnum + ppc_num_efprs)
|
|
+
|
|
/* Holds the current set of options to be passed to the disassembler. */
|
|
static char *powerpc_disassembler_options;
|
|
|
|
@@ -2376,6 +2391,11 @@ rs6000_register_name (struct gdbarch *gd
|
|
&& regno < tdep->ppc_vsr0_upper_regnum + ppc_num_gprs)
|
|
return "";
|
|
|
|
+ /* Hide the upper halves of the cvs0~cvs31 registers. */
|
|
+ if (PPC_CVSR0_UPPER_REGNUM <= regno
|
|
+ && regno < PPC_CVSR0_UPPER_REGNUM + ppc_num_gprs)
|
|
+ return "";
|
|
+
|
|
/* Check if the SPE pseudo registers are available. */
|
|
if (IS_SPE_PSEUDOREG (tdep, regno))
|
|
{
|
|
@@ -2430,6 +2450,48 @@ rs6000_register_name (struct gdbarch *gd
|
|
return efpr_regnames[regno - tdep->ppc_efpr0_regnum];
|
|
}
|
|
|
|
+ /* Check if this is a Checkpointed DFP pseudo-register. */
|
|
+ if (IS_CDFP_PSEUDOREG (tdep, regno))
|
|
+ {
|
|
+ static const char *const cdfp128_regnames[] = {
|
|
+ "cdl0", "cdl1", "cdl2", "cdl3",
|
|
+ "cdl4", "cdl5", "cdl6", "cdl7",
|
|
+ "cdl8", "cdl9", "cdl10", "cdl11",
|
|
+ "cdl12", "cdl13", "cdl14", "cdl15"
|
|
+ };
|
|
+ return cdfp128_regnames[regno - tdep->ppc_cdl0_regnum];
|
|
+ }
|
|
+
|
|
+ /* Check if this is a Checkpointed VSX pseudo-register. */
|
|
+ if (IS_CVSX_PSEUDOREG (tdep, regno))
|
|
+ {
|
|
+ static const char *const cvsx_regnames[] = {
|
|
+ "cvs0", "cvs1", "cvs2", "cvs3", "cvs4", "cvs5", "cvs6", "cvs7",
|
|
+ "cvs8", "cvs9", "cvs10", "cvs11", "cvs12", "cvs13", "cvs14",
|
|
+ "cvs15", "cvs16", "cvs17", "cvs18", "cvs19", "cvs20", "cvs21",
|
|
+ "cvs22", "cvs23", "cvs24", "cvs25", "cvs26", "cvs27", "cvs28",
|
|
+ "cvs29", "cvs30", "cvs31", "cvs32", "cvs33", "cvs34", "cvs35",
|
|
+ "cvs36", "cvs37", "cvs38", "cvs39", "cvs40", "cvs41", "cvs42",
|
|
+ "cvs43", "cvs44", "cvs45", "cvs46", "cvs47", "cvs48", "cvs49",
|
|
+ "cvs50", "cvs51", "cvs52", "cvs53", "cvs54", "cvs55", "cvs56",
|
|
+ "cvs57", "cvs58", "cvs59", "cvs60", "cvs61", "cvs62", "cvs63"
|
|
+ };
|
|
+ return cvsx_regnames[regno - tdep->ppc_cvsr0_regnum];
|
|
+ }
|
|
+
|
|
+ /* Check if the this is a Checkpointed Extended FP pseudo-register. */
|
|
+ if (IS_CEFP_PSEUDOREG (tdep, regno))
|
|
+ {
|
|
+ static const char *const cefpr_regnames[] = {
|
|
+ "cf32", "cf33", "cf34", "cf35", "cf36", "cf37", "cf38",
|
|
+ "cf39", "cf40", "cf41", "cf42", "cf43", "cf44", "cf45",
|
|
+ "cf46", "cf47", "cf48", "cf49", "cf50", "cf51",
|
|
+ "cf52", "cf53", "cf54", "cf55", "cf56", "cf57",
|
|
+ "cf58", "cf59", "cf60", "cf61", "cf62", "cf63"
|
|
+ };
|
|
+ return cefpr_regnames[regno - tdep->ppc_cefpr0_regnum];
|
|
+ }
|
|
+
|
|
return tdesc_register_name (gdbarch, regno);
|
|
}
|
|
|
|
@@ -2441,45 +2503,26 @@ rs6000_pseudo_register_type (struct gdba
|
|
{
|
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
|
|
- /* These are the only pseudo-registers we support. */
|
|
- gdb_assert (IS_SPE_PSEUDOREG (tdep, regnum)
|
|
- || IS_DFP_PSEUDOREG (tdep, regnum)
|
|
- || IS_VSX_PSEUDOREG (tdep, regnum)
|
|
- || IS_EFP_PSEUDOREG (tdep, regnum));
|
|
-
|
|
/* These are the e500 pseudo-registers. */
|
|
if (IS_SPE_PSEUDOREG (tdep, regnum))
|
|
return rs6000_builtin_type_vec64 (gdbarch);
|
|
- else if (IS_DFP_PSEUDOREG (tdep, regnum))
|
|
+ else if (IS_DFP_PSEUDOREG (tdep, regnum)
|
|
+ || IS_CDFP_PSEUDOREG (tdep, regnum))
|
|
/* PPC decimal128 pseudo-registers. */
|
|
return builtin_type (gdbarch)->builtin_declong;
|
|
- else if (IS_VSX_PSEUDOREG (tdep, regnum))
|
|
+ else if (IS_VSX_PSEUDOREG (tdep, regnum)
|
|
+ || IS_CVSX_PSEUDOREG (tdep, regnum))
|
|
/* POWER7 VSX pseudo-registers. */
|
|
return rs6000_builtin_type_vec128 (gdbarch);
|
|
- else
|
|
+ else if (IS_EFP_PSEUDOREG (tdep, regnum)
|
|
+ || IS_CEFP_PSEUDOREG (tdep, regnum))
|
|
/* POWER7 Extended FP pseudo-registers. */
|
|
return builtin_type (gdbarch)->builtin_double;
|
|
-}
|
|
-
|
|
-/* Is REGNUM a member of REGGROUP? */
|
|
-static int
|
|
-rs6000_pseudo_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
|
|
- struct reggroup *group)
|
|
-{
|
|
- struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
-
|
|
- /* These are the only pseudo-registers we support. */
|
|
- gdb_assert (IS_SPE_PSEUDOREG (tdep, regnum)
|
|
- || IS_DFP_PSEUDOREG (tdep, regnum)
|
|
- || IS_VSX_PSEUDOREG (tdep, regnum)
|
|
- || IS_EFP_PSEUDOREG (tdep, regnum));
|
|
-
|
|
- /* These are the e500 pseudo-registers or the POWER7 VSX registers. */
|
|
- if (IS_SPE_PSEUDOREG (tdep, regnum) || IS_VSX_PSEUDOREG (tdep, regnum))
|
|
- return group == all_reggroup || group == vector_reggroup;
|
|
else
|
|
- /* PPC decimal128 or Extended FP pseudo-registers. */
|
|
- return group == all_reggroup || group == float_reggroup;
|
|
+ internal_error (__FILE__, __LINE__,
|
|
+ _("rs6000_pseudo_register_type: "
|
|
+ "called on unexpected register '%s' (%d)"),
|
|
+ gdbarch_register_name (gdbarch, regnum), regnum);
|
|
}
|
|
|
|
/* The register format for RS/6000 floating point registers is always
|
|
@@ -2655,25 +2698,35 @@ dfp_pseudo_register_read (struct gdbarch
|
|
int reg_nr, gdb_byte *buffer)
|
|
{
|
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
- int reg_index = reg_nr - tdep->ppc_dl0_regnum;
|
|
+ int reg_index, fp0;
|
|
enum register_status status;
|
|
|
|
+ if (IS_DFP_PSEUDOREG (tdep, reg_nr))
|
|
+ {
|
|
+ reg_index = reg_nr - tdep->ppc_dl0_regnum;
|
|
+ fp0 = PPC_F0_REGNUM;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ gdb_assert (IS_CDFP_PSEUDOREG (tdep, reg_nr));
|
|
+
|
|
+ reg_index = reg_nr - tdep->ppc_cdl0_regnum;
|
|
+ fp0 = PPC_CF0_REGNUM;
|
|
+ }
|
|
+
|
|
if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
|
|
{
|
|
/* Read two FP registers to form a whole dl register. */
|
|
- status = regcache->raw_read (tdep->ppc_fp0_regnum +
|
|
- 2 * reg_index, buffer);
|
|
+ status = regcache->raw_read (fp0 + 2 * reg_index, buffer);
|
|
if (status == REG_VALID)
|
|
- status = regcache->raw_read (tdep->ppc_fp0_regnum +
|
|
- 2 * reg_index + 1, buffer + 8);
|
|
+ status = regcache->raw_read (fp0 + 2 * reg_index + 1,
|
|
+ buffer + 8);
|
|
}
|
|
else
|
|
{
|
|
- status = regcache->raw_read (tdep->ppc_fp0_regnum +
|
|
- 2 * reg_index + 1, buffer);
|
|
+ status = regcache->raw_read (fp0 + 2 * reg_index + 1, buffer);
|
|
if (status == REG_VALID)
|
|
- status = regcache->raw_read (tdep->ppc_fp0_regnum +
|
|
- 2 * reg_index, buffer + 8);
|
|
+ status = regcache->raw_read (fp0 + 2 * reg_index, buffer + 8);
|
|
}
|
|
|
|
return status;
|
|
@@ -2685,23 +2738,32 @@ dfp_pseudo_register_write (struct gdbarc
|
|
int reg_nr, const gdb_byte *buffer)
|
|
{
|
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
- int reg_index = reg_nr - tdep->ppc_dl0_regnum;
|
|
+ int reg_index, fp0;
|
|
+
|
|
+ if (IS_DFP_PSEUDOREG (tdep, reg_nr))
|
|
+ {
|
|
+ reg_index = reg_nr - tdep->ppc_dl0_regnum;
|
|
+ fp0 = PPC_F0_REGNUM;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ gdb_assert (IS_CDFP_PSEUDOREG (tdep, reg_nr));
|
|
+
|
|
+ reg_index = reg_nr - tdep->ppc_cdl0_regnum;
|
|
+ fp0 = PPC_CF0_REGNUM;
|
|
+ }
|
|
|
|
if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
|
|
{
|
|
/* Write each half of the dl register into a separate
|
|
- FP register. */
|
|
- regcache->raw_write (tdep->ppc_fp0_regnum +
|
|
- 2 * reg_index, buffer);
|
|
- regcache->raw_write (tdep->ppc_fp0_regnum +
|
|
- 2 * reg_index + 1, buffer + 8);
|
|
+ FP register. */
|
|
+ regcache->raw_write (fp0 + 2 * reg_index, buffer);
|
|
+ regcache->raw_write (fp0 + 2 * reg_index + 1, buffer + 8);
|
|
}
|
|
else
|
|
{
|
|
- regcache->raw_write (tdep->ppc_fp0_regnum +
|
|
- 2 * reg_index + 1, buffer);
|
|
- regcache->raw_write (tdep->ppc_fp0_regnum +
|
|
- 2 * reg_index, buffer + 8);
|
|
+ regcache->raw_write (fp0 + 2 * reg_index + 1, buffer);
|
|
+ regcache->raw_write (fp0 + 2 * reg_index, buffer + 8);
|
|
}
|
|
}
|
|
|
|
@@ -2711,30 +2773,43 @@ vsx_pseudo_register_read (struct gdbarch
|
|
int reg_nr, gdb_byte *buffer)
|
|
{
|
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
- int reg_index = reg_nr - tdep->ppc_vsr0_regnum;
|
|
+ int reg_index, vr0, fp0, vsr0_upper;
|
|
enum register_status status;
|
|
|
|
+ if (IS_VSX_PSEUDOREG (tdep, reg_nr))
|
|
+ {
|
|
+ reg_index = reg_nr - tdep->ppc_vsr0_regnum;
|
|
+ vr0 = PPC_VR0_REGNUM;
|
|
+ fp0 = PPC_F0_REGNUM;
|
|
+ vsr0_upper = PPC_VSR0_UPPER_REGNUM;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ gdb_assert (IS_CVSX_PSEUDOREG (tdep, reg_nr));
|
|
+
|
|
+ reg_index = reg_nr - tdep->ppc_cvsr0_regnum;
|
|
+ vr0 = PPC_CVR0_REGNUM;
|
|
+ fp0 = PPC_CF0_REGNUM;
|
|
+ vsr0_upper = PPC_CVSR0_UPPER_REGNUM;
|
|
+ }
|
|
+
|
|
/* Read the portion that overlaps the VMX registers. */
|
|
if (reg_index > 31)
|
|
- status = regcache->raw_read (tdep->ppc_vr0_regnum +
|
|
- reg_index - 32, buffer);
|
|
+ status = regcache->raw_read (vr0 + reg_index - 32, buffer);
|
|
else
|
|
/* Read the portion that overlaps the FPR registers. */
|
|
if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
|
|
{
|
|
- status = regcache->raw_read (tdep->ppc_fp0_regnum +
|
|
- reg_index, buffer);
|
|
+ status = regcache->raw_read (fp0 + reg_index, buffer);
|
|
if (status == REG_VALID)
|
|
- status = regcache->raw_read (tdep->ppc_vsr0_upper_regnum +
|
|
- reg_index, buffer + 8);
|
|
+ status = regcache->raw_read (vsr0_upper + reg_index,
|
|
+ buffer + 8);
|
|
}
|
|
else
|
|
{
|
|
- status = regcache->raw_read (tdep->ppc_fp0_regnum +
|
|
- reg_index, buffer + 8);
|
|
+ status = regcache->raw_read (fp0 + reg_index, buffer + 8);
|
|
if (status == REG_VALID)
|
|
- status = regcache->raw_read (tdep->ppc_vsr0_upper_regnum +
|
|
- reg_index, buffer);
|
|
+ status = regcache->raw_read (vsr0_upper + reg_index, buffer);
|
|
}
|
|
|
|
return status;
|
|
@@ -2746,56 +2821,103 @@ vsx_pseudo_register_write (struct gdbarc
|
|
int reg_nr, const gdb_byte *buffer)
|
|
{
|
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
- int reg_index = reg_nr - tdep->ppc_vsr0_regnum;
|
|
+ int reg_index, vr0, fp0, vsr0_upper;
|
|
+
|
|
+ if (IS_VSX_PSEUDOREG (tdep, reg_nr))
|
|
+ {
|
|
+ reg_index = reg_nr - tdep->ppc_vsr0_regnum;
|
|
+ vr0 = PPC_VR0_REGNUM;
|
|
+ fp0 = PPC_F0_REGNUM;
|
|
+ vsr0_upper = PPC_VSR0_UPPER_REGNUM;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ gdb_assert (IS_CVSX_PSEUDOREG (tdep, reg_nr));
|
|
+
|
|
+ reg_index = reg_nr - tdep->ppc_cvsr0_regnum;
|
|
+ vr0 = PPC_CVR0_REGNUM;
|
|
+ fp0 = PPC_CF0_REGNUM;
|
|
+ vsr0_upper = PPC_CVSR0_UPPER_REGNUM;
|
|
+ }
|
|
|
|
/* Write the portion that overlaps the VMX registers. */
|
|
if (reg_index > 31)
|
|
- regcache->raw_write (tdep->ppc_vr0_regnum +
|
|
- reg_index - 32, buffer);
|
|
+ regcache->raw_write (vr0 + reg_index - 32, buffer);
|
|
else
|
|
/* Write the portion that overlaps the FPR registers. */
|
|
if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG)
|
|
{
|
|
- regcache->raw_write (tdep->ppc_fp0_regnum +
|
|
- reg_index, buffer);
|
|
- regcache->raw_write (tdep->ppc_vsr0_upper_regnum +
|
|
- reg_index, buffer + 8);
|
|
+ regcache->raw_write (fp0 + reg_index, buffer);
|
|
+ regcache->raw_write (vsr0_upper + reg_index, buffer + 8);
|
|
}
|
|
else
|
|
{
|
|
- regcache->raw_write (tdep->ppc_fp0_regnum +
|
|
- reg_index, buffer + 8);
|
|
- regcache->raw_write (tdep->ppc_vsr0_upper_regnum +
|
|
- reg_index, buffer);
|
|
+ regcache->raw_write (fp0 + reg_index, buffer + 8);
|
|
+ regcache->raw_write (vsr0_upper + reg_index, buffer);
|
|
}
|
|
}
|
|
|
|
/* Read method for POWER7 Extended FP pseudo-registers. */
|
|
static enum register_status
|
|
-efpr_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache,
|
|
+efp_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache,
|
|
int reg_nr, gdb_byte *buffer)
|
|
{
|
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
- int reg_index = reg_nr - tdep->ppc_efpr0_regnum;
|
|
+ int reg_index, vr0;
|
|
+
|
|
+ if (IS_EFP_PSEUDOREG (tdep, reg_nr))
|
|
+ {
|
|
+ reg_index = reg_nr - tdep->ppc_efpr0_regnum;
|
|
+ vr0 = PPC_VR0_REGNUM;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ gdb_assert (IS_CEFP_PSEUDOREG (tdep, reg_nr));
|
|
+
|
|
+ reg_index = reg_nr - tdep->ppc_cefpr0_regnum;
|
|
+ vr0 = PPC_CVR0_REGNUM;
|
|
+ }
|
|
+
|
|
int offset = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ? 0 : 8;
|
|
|
|
/* Read the portion that overlaps the VMX register. */
|
|
- return regcache->raw_read_part (tdep->ppc_vr0_regnum + reg_index,
|
|
- offset, register_size (gdbarch, reg_nr),
|
|
+ return regcache->raw_read_part (vr0 + reg_index, offset,
|
|
+ register_size (gdbarch, reg_nr),
|
|
buffer);
|
|
}
|
|
|
|
/* Write method for POWER7 Extended FP pseudo-registers. */
|
|
static void
|
|
-efpr_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
|
|
+efp_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
|
|
int reg_nr, const gdb_byte *buffer)
|
|
{
|
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
- int reg_index = reg_nr - tdep->ppc_efpr0_regnum;
|
|
+ int reg_index, vr0;
|
|
int offset = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ? 0 : 8;
|
|
|
|
+ if (IS_EFP_PSEUDOREG (tdep, reg_nr))
|
|
+ {
|
|
+ reg_index = reg_nr - tdep->ppc_efpr0_regnum;
|
|
+ vr0 = PPC_VR0_REGNUM;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ gdb_assert (IS_CEFP_PSEUDOREG (tdep, reg_nr));
|
|
+
|
|
+ reg_index = reg_nr - tdep->ppc_cefpr0_regnum;
|
|
+ vr0 = PPC_CVR0_REGNUM;
|
|
+
|
|
+ /* The call to raw_write_part fails silently if the initial read
|
|
+ of the read-update-write sequence returns an invalid status,
|
|
+ so we check this manually and throw an error if needed. */
|
|
+ regcache->raw_update (vr0 + reg_index);
|
|
+ if (regcache->get_register_status (vr0 + reg_index) != REG_VALID)
|
|
+ error (_("Cannot write to the checkpointed EFP register, "
|
|
+ "the corresponding vector register is unavailable."));
|
|
+ }
|
|
+
|
|
/* Write the portion that overlaps the VMX register. */
|
|
- regcache->raw_write_part (tdep->ppc_vr0_regnum + reg_index, offset,
|
|
+ regcache->raw_write_part (vr0 + reg_index, offset,
|
|
register_size (gdbarch, reg_nr), buffer);
|
|
}
|
|
|
|
@@ -2811,12 +2933,15 @@ rs6000_pseudo_register_read (struct gdba
|
|
|
|
if (IS_SPE_PSEUDOREG (tdep, reg_nr))
|
|
return e500_pseudo_register_read (gdbarch, regcache, reg_nr, buffer);
|
|
- else if (IS_DFP_PSEUDOREG (tdep, reg_nr))
|
|
+ else if (IS_DFP_PSEUDOREG (tdep, reg_nr)
|
|
+ || IS_CDFP_PSEUDOREG (tdep, reg_nr))
|
|
return dfp_pseudo_register_read (gdbarch, regcache, reg_nr, buffer);
|
|
- else if (IS_VSX_PSEUDOREG (tdep, reg_nr))
|
|
+ else if (IS_VSX_PSEUDOREG (tdep, reg_nr)
|
|
+ || IS_CVSX_PSEUDOREG (tdep, reg_nr))
|
|
return vsx_pseudo_register_read (gdbarch, regcache, reg_nr, buffer);
|
|
- else if (IS_EFP_PSEUDOREG (tdep, reg_nr))
|
|
- return efpr_pseudo_register_read (gdbarch, regcache, reg_nr, buffer);
|
|
+ else if (IS_EFP_PSEUDOREG (tdep, reg_nr)
|
|
+ || IS_CEFP_PSEUDOREG (tdep, reg_nr))
|
|
+ return efp_pseudo_register_read (gdbarch, regcache, reg_nr, buffer);
|
|
else
|
|
internal_error (__FILE__, __LINE__,
|
|
_("rs6000_pseudo_register_read: "
|
|
@@ -2836,12 +2961,15 @@ rs6000_pseudo_register_write (struct gdb
|
|
|
|
if (IS_SPE_PSEUDOREG (tdep, reg_nr))
|
|
e500_pseudo_register_write (gdbarch, regcache, reg_nr, buffer);
|
|
- else if (IS_DFP_PSEUDOREG (tdep, reg_nr))
|
|
+ else if (IS_DFP_PSEUDOREG (tdep, reg_nr)
|
|
+ || IS_CDFP_PSEUDOREG (tdep, reg_nr))
|
|
dfp_pseudo_register_write (gdbarch, regcache, reg_nr, buffer);
|
|
- else if (IS_VSX_PSEUDOREG (tdep, reg_nr))
|
|
+ else if (IS_VSX_PSEUDOREG (tdep, reg_nr)
|
|
+ || IS_CVSX_PSEUDOREG (tdep, reg_nr))
|
|
vsx_pseudo_register_write (gdbarch, regcache, reg_nr, buffer);
|
|
- else if (IS_EFP_PSEUDOREG (tdep, reg_nr))
|
|
- efpr_pseudo_register_write (gdbarch, regcache, reg_nr, buffer);
|
|
+ else if (IS_EFP_PSEUDOREG (tdep, reg_nr)
|
|
+ || IS_CEFP_PSEUDOREG (tdep, reg_nr))
|
|
+ efp_pseudo_register_write (gdbarch, regcache, reg_nr, buffer);
|
|
else
|
|
internal_error (__FILE__, __LINE__,
|
|
_("rs6000_pseudo_register_write: "
|
|
@@ -2849,6 +2977,97 @@ rs6000_pseudo_register_write (struct gdb
|
|
gdbarch_register_name (gdbarch, reg_nr), reg_nr);
|
|
}
|
|
|
|
+/* Set the register mask in AX with the registers that form the DFP or
|
|
+ checkpointed DFP pseudo-register REG_NR. */
|
|
+
|
|
+static void
|
|
+dfp_ax_pseudo_register_collect (struct gdbarch *gdbarch,
|
|
+ struct agent_expr *ax, int reg_nr)
|
|
+{
|
|
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
+ int reg_index, fp0;
|
|
+
|
|
+ if (IS_DFP_PSEUDOREG (tdep, reg_nr))
|
|
+ {
|
|
+ reg_index = reg_nr - tdep->ppc_dl0_regnum;
|
|
+ fp0 = PPC_F0_REGNUM;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ gdb_assert (IS_CDFP_PSEUDOREG (tdep, reg_nr));
|
|
+
|
|
+ reg_index = reg_nr - tdep->ppc_cdl0_regnum;
|
|
+ fp0 = PPC_CF0_REGNUM;
|
|
+ }
|
|
+
|
|
+ ax_reg_mask (ax, fp0 + 2 * reg_index);
|
|
+ ax_reg_mask (ax, fp0 + 2 * reg_index + 1);
|
|
+}
|
|
+
|
|
+/* Set the register mask in AX with the registers that form the VSX or
|
|
+ checkpointed VSX pseudo-register REG_NR. */
|
|
+
|
|
+static void
|
|
+vsx_ax_pseudo_register_collect (struct gdbarch *gdbarch,
|
|
+ struct agent_expr *ax, int reg_nr)
|
|
+{
|
|
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
+ int reg_index, vr0, fp0, vsr0_upper;
|
|
+
|
|
+ if (IS_VSX_PSEUDOREG (tdep, reg_nr))
|
|
+ {
|
|
+ reg_index = reg_nr - tdep->ppc_vsr0_regnum;
|
|
+ vr0 = PPC_VR0_REGNUM;
|
|
+ fp0 = PPC_F0_REGNUM;
|
|
+ vsr0_upper = PPC_VSR0_UPPER_REGNUM;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ gdb_assert (IS_CVSX_PSEUDOREG (tdep, reg_nr));
|
|
+
|
|
+ reg_index = reg_nr - tdep->ppc_cvsr0_regnum;
|
|
+ vr0 = PPC_CVR0_REGNUM;
|
|
+ fp0 = PPC_CF0_REGNUM;
|
|
+ vsr0_upper = PPC_CVSR0_UPPER_REGNUM;
|
|
+ }
|
|
+
|
|
+ if (reg_index > 31)
|
|
+ {
|
|
+ ax_reg_mask (ax, vr0 + reg_index - 32);
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ ax_reg_mask (ax, fp0 + reg_index);
|
|
+ ax_reg_mask (ax, vsr0_upper + reg_index);
|
|
+ }
|
|
+}
|
|
+
|
|
+/* Set the register mask in AX with the register that corresponds to
|
|
+ the EFP or checkpointed EFP pseudo-register REG_NR. */
|
|
+
|
|
+static void
|
|
+efp_ax_pseudo_register_collect (struct gdbarch *gdbarch,
|
|
+ struct agent_expr *ax, int reg_nr)
|
|
+{
|
|
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
+ int reg_index, vr0;
|
|
+
|
|
+ if (IS_EFP_PSEUDOREG (tdep, reg_nr))
|
|
+ {
|
|
+ reg_index = reg_nr - tdep->ppc_efpr0_regnum;
|
|
+ vr0 = PPC_VR0_REGNUM;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ gdb_assert (IS_CEFP_PSEUDOREG (tdep, reg_nr));
|
|
+
|
|
+ reg_index = reg_nr - tdep->ppc_cefpr0_regnum;
|
|
+ vr0 = PPC_CVR0_REGNUM;
|
|
+ }
|
|
+
|
|
+ ax_reg_mask (ax, vr0 + reg_index);
|
|
+}
|
|
+
|
|
static int
|
|
rs6000_ax_pseudo_register_collect (struct gdbarch *gdbarch,
|
|
struct agent_expr *ax, int reg_nr)
|
|
@@ -2860,29 +3079,20 @@ rs6000_ax_pseudo_register_collect (struc
|
|
ax_reg_mask (ax, tdep->ppc_gp0_regnum + reg_index);
|
|
ax_reg_mask (ax, tdep->ppc_ev0_upper_regnum + reg_index);
|
|
}
|
|
- else if (IS_DFP_PSEUDOREG (tdep, reg_nr))
|
|
+ else if (IS_DFP_PSEUDOREG (tdep, reg_nr)
|
|
+ || IS_CDFP_PSEUDOREG (tdep, reg_nr))
|
|
{
|
|
- int reg_index = reg_nr - tdep->ppc_dl0_regnum;
|
|
- ax_reg_mask (ax, tdep->ppc_fp0_regnum + 2 * reg_index);
|
|
- ax_reg_mask (ax, tdep->ppc_fp0_regnum + 2 * reg_index + 1);
|
|
+ dfp_ax_pseudo_register_collect (gdbarch, ax, reg_nr);
|
|
}
|
|
- else if (IS_VSX_PSEUDOREG (tdep, reg_nr))
|
|
+ else if (IS_VSX_PSEUDOREG (tdep, reg_nr)
|
|
+ || IS_CVSX_PSEUDOREG (tdep, reg_nr))
|
|
{
|
|
- int reg_index = reg_nr - tdep->ppc_vsr0_regnum;
|
|
- if (reg_index > 31)
|
|
- {
|
|
- ax_reg_mask (ax, tdep->ppc_vr0_regnum + reg_index - 32);
|
|
- }
|
|
- else
|
|
- {
|
|
- ax_reg_mask (ax, tdep->ppc_fp0_regnum + reg_index);
|
|
- ax_reg_mask (ax, tdep->ppc_vsr0_upper_regnum + reg_index);
|
|
- }
|
|
+ vsx_ax_pseudo_register_collect (gdbarch, ax, reg_nr);
|
|
}
|
|
- else if (IS_EFP_PSEUDOREG (tdep, reg_nr))
|
|
+ else if (IS_EFP_PSEUDOREG (tdep, reg_nr)
|
|
+ || IS_CEFP_PSEUDOREG (tdep, reg_nr))
|
|
{
|
|
- int reg_index = reg_nr - tdep->ppc_efpr0_regnum;
|
|
- ax_reg_mask (ax, tdep->ppc_vr0_regnum + reg_index);
|
|
+ efp_ax_pseudo_register_collect (gdbarch, ax, reg_nr);
|
|
}
|
|
else
|
|
internal_error (__FILE__, __LINE__,
|
|
@@ -4488,6 +4698,17 @@ ppc_process_record_op31 (struct gdbarch
|
|
case 570: /* Count Trailing Zeros Doubleword */
|
|
case 890: /* Extend-Sign Word and Shift Left Immediate (445) */
|
|
case 890 | 1: /* Extend-Sign Word and Shift Left Immediate (445) */
|
|
+
|
|
+ if (ext == 444 && tdep->ppc_ppr_regnum >= 0
|
|
+ && (PPC_RS (insn) == PPC_RA (insn))
|
|
+ && (PPC_RA (insn) == PPC_RB (insn))
|
|
+ && !PPC_RC (insn))
|
|
+ {
|
|
+ /* or Rx,Rx,Rx alters PRI in PPR. */
|
|
+ record_full_arch_list_add_reg (regcache, tdep->ppc_ppr_regnum);
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
if (PPC_RC (insn))
|
|
record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum);
|
|
record_full_arch_list_add_reg (regcache,
|
|
@@ -4697,6 +4918,10 @@ ppc_process_record_op31 (struct gdbarch
|
|
case 1: /* XER */
|
|
record_full_arch_list_add_reg (regcache, tdep->ppc_xer_regnum);
|
|
return 0;
|
|
+ case 3: /* DSCR */
|
|
+ if (tdep->ppc_dscr_regnum >= 0)
|
|
+ record_full_arch_list_add_reg (regcache, tdep->ppc_dscr_regnum);
|
|
+ return 0;
|
|
case 8: /* LR */
|
|
record_full_arch_list_add_reg (regcache, tdep->ppc_lr_regnum);
|
|
return 0;
|
|
@@ -4706,6 +4931,15 @@ ppc_process_record_op31 (struct gdbarch
|
|
case 256: /* VRSAVE */
|
|
record_full_arch_list_add_reg (regcache, tdep->ppc_vrsave_regnum);
|
|
return 0;
|
|
+ case 815: /* TAR */
|
|
+ if (tdep->ppc_tar_regnum >= 0)
|
|
+ record_full_arch_list_add_reg (regcache, tdep->ppc_tar_regnum);
|
|
+ return 0;
|
|
+ case 896:
|
|
+ case 898: /* PPR */
|
|
+ if (tdep->ppc_ppr_regnum >= 0)
|
|
+ record_full_arch_list_add_reg (regcache, tdep->ppc_ppr_regnum);
|
|
+ return 0;
|
|
}
|
|
|
|
goto UNKNOWN_OP;
|
|
@@ -5867,8 +6101,12 @@ rs6000_gdbarch_init (struct gdbarch_info
|
|
enum powerpc_long_double_abi long_double_abi = POWERPC_LONG_DOUBLE_AUTO;
|
|
enum powerpc_vector_abi vector_abi = powerpc_vector_abi_global;
|
|
enum powerpc_elf_abi elf_abi = POWERPC_ELF_AUTO;
|
|
- int have_fpu = 1, have_spe = 0, have_mq = 0, have_altivec = 0, have_dfp = 0,
|
|
- have_vsx = 0;
|
|
+ int have_fpu = 0, have_spe = 0, have_mq = 0, have_altivec = 0;
|
|
+ int have_dfp = 0, have_vsx = 0, have_ppr = 0, have_dscr = 0;
|
|
+ int have_tar = 0, have_ebb = 0, have_pmu = 0, have_htm_spr = 0;
|
|
+ int have_htm_core = 0, have_htm_fpu = 0, have_htm_altivec = 0;
|
|
+ int have_htm_vsx = 0, have_htm_ppr = 0, have_htm_dscr = 0;
|
|
+ int have_htm_tar = 0;
|
|
int tdesc_wordsize = -1;
|
|
const struct target_desc *tdesc = info.target_desc;
|
|
struct tdesc_arch_data *tdesc_data = NULL;
|
|
@@ -6093,7 +6331,8 @@ rs6000_gdbarch_init (struct gdbarch_info
|
|
valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
|
PPC_VSR0_UPPER_REGNUM + i,
|
|
vsx_regs[i]);
|
|
- if (!valid_p)
|
|
+
|
|
+ if (!valid_p || !have_fpu || !have_altivec)
|
|
{
|
|
tdesc_data_cleanup (tdesc_data);
|
|
return NULL;
|
|
@@ -6151,6 +6390,316 @@ rs6000_gdbarch_init (struct gdbarch_info
|
|
}
|
|
else
|
|
have_spe = 0;
|
|
+
|
|
+ /* Program Priority Register. */
|
|
+ feature = tdesc_find_feature (tdesc,
|
|
+ "org.gnu.gdb.power.ppr");
|
|
+ if (feature != NULL)
|
|
+ {
|
|
+ valid_p = 1;
|
|
+ valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
|
+ PPC_PPR_REGNUM, "ppr");
|
|
+
|
|
+ if (!valid_p)
|
|
+ {
|
|
+ tdesc_data_cleanup (tdesc_data);
|
|
+ return NULL;
|
|
+ }
|
|
+ have_ppr = 1;
|
|
+ }
|
|
+ else
|
|
+ have_ppr = 0;
|
|
+
|
|
+ /* Data Stream Control Register. */
|
|
+ feature = tdesc_find_feature (tdesc,
|
|
+ "org.gnu.gdb.power.dscr");
|
|
+ if (feature != NULL)
|
|
+ {
|
|
+ valid_p = 1;
|
|
+ valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
|
+ PPC_DSCR_REGNUM, "dscr");
|
|
+
|
|
+ if (!valid_p)
|
|
+ {
|
|
+ tdesc_data_cleanup (tdesc_data);
|
|
+ return NULL;
|
|
+ }
|
|
+ have_dscr = 1;
|
|
+ }
|
|
+ else
|
|
+ have_dscr = 0;
|
|
+
|
|
+ /* Target Address Register. */
|
|
+ feature = tdesc_find_feature (tdesc,
|
|
+ "org.gnu.gdb.power.tar");
|
|
+ if (feature != NULL)
|
|
+ {
|
|
+ valid_p = 1;
|
|
+ valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
|
+ PPC_TAR_REGNUM, "tar");
|
|
+
|
|
+ if (!valid_p)
|
|
+ {
|
|
+ tdesc_data_cleanup (tdesc_data);
|
|
+ return NULL;
|
|
+ }
|
|
+ have_tar = 1;
|
|
+ }
|
|
+ else
|
|
+ have_tar = 0;
|
|
+
|
|
+ /* Event-based Branching Registers. */
|
|
+ feature = tdesc_find_feature (tdesc,
|
|
+ "org.gnu.gdb.power.ebb");
|
|
+ if (feature != NULL)
|
|
+ {
|
|
+ static const char *const ebb_regs[] = {
|
|
+ "bescr", "ebbhr", "ebbrr"
|
|
+ };
|
|
+
|
|
+ valid_p = 1;
|
|
+ for (i = 0; i < ARRAY_SIZE (ebb_regs); i++)
|
|
+ valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
|
+ PPC_BESCR_REGNUM + i,
|
|
+ ebb_regs[i]);
|
|
+ if (!valid_p)
|
|
+ {
|
|
+ tdesc_data_cleanup (tdesc_data);
|
|
+ return NULL;
|
|
+ }
|
|
+ have_ebb = 1;
|
|
+ }
|
|
+ else
|
|
+ have_ebb = 0;
|
|
+
|
|
+ /* Subset of the ISA 2.07 Performance Monitor Registers provided
|
|
+ by Linux. */
|
|
+ feature = tdesc_find_feature (tdesc,
|
|
+ "org.gnu.gdb.power.linux.pmu");
|
|
+ if (feature != NULL)
|
|
+ {
|
|
+ valid_p = 1;
|
|
+
|
|
+ valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
|
+ PPC_MMCR0_REGNUM,
|
|
+ "mmcr0");
|
|
+ valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
|
+ PPC_MMCR2_REGNUM,
|
|
+ "mmcr2");
|
|
+ valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
|
+ PPC_SIAR_REGNUM,
|
|
+ "siar");
|
|
+ valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
|
+ PPC_SDAR_REGNUM,
|
|
+ "sdar");
|
|
+ valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
|
+ PPC_SIER_REGNUM,
|
|
+ "sier");
|
|
+
|
|
+ if (!valid_p)
|
|
+ {
|
|
+ tdesc_data_cleanup (tdesc_data);
|
|
+ return NULL;
|
|
+ }
|
|
+ have_pmu = 1;
|
|
+ }
|
|
+ else
|
|
+ have_pmu = 0;
|
|
+
|
|
+ /* Hardware Transactional Memory Registers. */
|
|
+ feature = tdesc_find_feature (tdesc,
|
|
+ "org.gnu.gdb.power.htm.spr");
|
|
+ if (feature != NULL)
|
|
+ {
|
|
+ static const char *const tm_spr_regs[] = {
|
|
+ "tfhar", "texasr", "tfiar"
|
|
+ };
|
|
+
|
|
+ valid_p = 1;
|
|
+ for (i = 0; i < ARRAY_SIZE (tm_spr_regs); i++)
|
|
+ valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
|
+ PPC_TFHAR_REGNUM + i,
|
|
+ tm_spr_regs[i]);
|
|
+ if (!valid_p)
|
|
+ {
|
|
+ tdesc_data_cleanup (tdesc_data);
|
|
+ return NULL;
|
|
+ }
|
|
+
|
|
+ have_htm_spr = 1;
|
|
+ }
|
|
+ else
|
|
+ have_htm_spr = 0;
|
|
+
|
|
+ feature = tdesc_find_feature (tdesc,
|
|
+ "org.gnu.gdb.power.htm.core");
|
|
+ if (feature != NULL)
|
|
+ {
|
|
+ static const char *const cgprs[] = {
|
|
+ "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
|
|
+ "cr8", "cr9", "cr10", "cr11", "cr12", "cr13", "cr14",
|
|
+ "cr15", "cr16", "cr17", "cr18", "cr19", "cr20", "cr21",
|
|
+ "cr22", "cr23", "cr24", "cr25", "cr26", "cr27", "cr28",
|
|
+ "cr29", "cr30", "cr31", "ccr", "cxer", "clr", "cctr"
|
|
+ };
|
|
+
|
|
+ valid_p = 1;
|
|
+
|
|
+ for (i = 0; i < ARRAY_SIZE (cgprs); i++)
|
|
+ valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
|
+ PPC_CR0_REGNUM + i,
|
|
+ cgprs[i]);
|
|
+ if (!valid_p)
|
|
+ {
|
|
+ tdesc_data_cleanup (tdesc_data);
|
|
+ return NULL;
|
|
+ }
|
|
+
|
|
+ have_htm_core = 1;
|
|
+ }
|
|
+ else
|
|
+ have_htm_core = 0;
|
|
+
|
|
+ feature = tdesc_find_feature (tdesc,
|
|
+ "org.gnu.gdb.power.htm.fpu");
|
|
+ if (feature != NULL)
|
|
+ {
|
|
+ valid_p = 1;
|
|
+
|
|
+ static const char *const cfprs[] = {
|
|
+ "cf0", "cf1", "cf2", "cf3", "cf4", "cf5", "cf6", "cf7",
|
|
+ "cf8", "cf9", "cf10", "cf11", "cf12", "cf13", "cf14", "cf15",
|
|
+ "cf16", "cf17", "cf18", "cf19", "cf20", "cf21", "cf22",
|
|
+ "cf23", "cf24", "cf25", "cf26", "cf27", "cf28", "cf29",
|
|
+ "cf30", "cf31", "cfpscr"
|
|
+ };
|
|
+
|
|
+ for (i = 0; i < ARRAY_SIZE (cfprs); i++)
|
|
+ valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
|
+ PPC_CF0_REGNUM + i,
|
|
+ cfprs[i]);
|
|
+
|
|
+ if (!valid_p)
|
|
+ {
|
|
+ tdesc_data_cleanup (tdesc_data);
|
|
+ return NULL;
|
|
+ }
|
|
+ have_htm_fpu = 1;
|
|
+ }
|
|
+ else
|
|
+ have_htm_fpu = 0;
|
|
+
|
|
+ feature = tdesc_find_feature (tdesc,
|
|
+ "org.gnu.gdb.power.htm.altivec");
|
|
+ if (feature != NULL)
|
|
+ {
|
|
+ valid_p = 1;
|
|
+
|
|
+ static const char *const cvmx[] = {
|
|
+ "cvr0", "cvr1", "cvr2", "cvr3", "cvr4", "cvr5", "cvr6",
|
|
+ "cvr7", "cvr8", "cvr9", "cvr10", "cvr11", "cvr12", "cvr13",
|
|
+ "cvr14", "cvr15","cvr16", "cvr17", "cvr18", "cvr19", "cvr20",
|
|
+ "cvr21", "cvr22", "cvr23", "cvr24", "cvr25", "cvr26",
|
|
+ "cvr27", "cvr28", "cvr29", "cvr30", "cvr31", "cvscr",
|
|
+ "cvrsave"
|
|
+ };
|
|
+
|
|
+ for (i = 0; i < ARRAY_SIZE (cvmx); i++)
|
|
+ valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
|
+ PPC_CVR0_REGNUM + i,
|
|
+ cvmx[i]);
|
|
+
|
|
+ if (!valid_p)
|
|
+ {
|
|
+ tdesc_data_cleanup (tdesc_data);
|
|
+ return NULL;
|
|
+ }
|
|
+ have_htm_altivec = 1;
|
|
+ }
|
|
+ else
|
|
+ have_htm_altivec = 0;
|
|
+
|
|
+ feature = tdesc_find_feature (tdesc,
|
|
+ "org.gnu.gdb.power.htm.vsx");
|
|
+ if (feature != NULL)
|
|
+ {
|
|
+ valid_p = 1;
|
|
+
|
|
+ static const char *const cvsx[] = {
|
|
+ "cvs0h", "cvs1h", "cvs2h", "cvs3h", "cvs4h", "cvs5h",
|
|
+ "cvs6h", "cvs7h", "cvs8h", "cvs9h", "cvs10h", "cvs11h",
|
|
+ "cvs12h", "cvs13h", "cvs14h", "cvs15h", "cvs16h", "cvs17h",
|
|
+ "cvs18h", "cvs19h", "cvs20h", "cvs21h", "cvs22h", "cvs23h",
|
|
+ "cvs24h", "cvs25h", "cvs26h", "cvs27h", "cvs28h", "cvs29h",
|
|
+ "cvs30h", "cvs31h"
|
|
+ };
|
|
+
|
|
+ for (i = 0; i < ARRAY_SIZE (cvsx); i++)
|
|
+ valid_p &= tdesc_numbered_register (feature, tdesc_data,
|
|
+ (PPC_CVSR0_UPPER_REGNUM
|
|
+ + i),
|
|
+ cvsx[i]);
|
|
+
|
|
+ if (!valid_p || !have_htm_fpu || !have_htm_altivec)
|
|
+ {
|
|
+ tdesc_data_cleanup (tdesc_data);
|
|
+ return NULL;
|
|
+ }
|
|
+ have_htm_vsx = 1;
|
|
+ }
|
|
+ else
|
|
+ have_htm_vsx = 0;
|
|
+
|
|
+ feature = tdesc_find_feature (tdesc,
|
|
+ "org.gnu.gdb.power.htm.ppr");
|
|
+ if (feature != NULL)
|
|
+ {
|
|
+ valid_p = tdesc_numbered_register (feature, tdesc_data,
|
|
+ PPC_CPPR_REGNUM, "cppr");
|
|
+
|
|
+ if (!valid_p)
|
|
+ {
|
|
+ tdesc_data_cleanup (tdesc_data);
|
|
+ return NULL;
|
|
+ }
|
|
+ have_htm_ppr = 1;
|
|
+ }
|
|
+ else
|
|
+ have_htm_ppr = 0;
|
|
+
|
|
+ feature = tdesc_find_feature (tdesc,
|
|
+ "org.gnu.gdb.power.htm.dscr");
|
|
+ if (feature != NULL)
|
|
+ {
|
|
+ valid_p = tdesc_numbered_register (feature, tdesc_data,
|
|
+ PPC_CDSCR_REGNUM, "cdscr");
|
|
+
|
|
+ if (!valid_p)
|
|
+ {
|
|
+ tdesc_data_cleanup (tdesc_data);
|
|
+ return NULL;
|
|
+ }
|
|
+ have_htm_dscr = 1;
|
|
+ }
|
|
+ else
|
|
+ have_htm_dscr = 0;
|
|
+
|
|
+ feature = tdesc_find_feature (tdesc,
|
|
+ "org.gnu.gdb.power.htm.tar");
|
|
+ if (feature != NULL)
|
|
+ {
|
|
+ valid_p = tdesc_numbered_register (feature, tdesc_data,
|
|
+ PPC_CTAR_REGNUM, "ctar");
|
|
+
|
|
+ if (!valid_p)
|
|
+ {
|
|
+ tdesc_data_cleanup (tdesc_data);
|
|
+ return NULL;
|
|
+ }
|
|
+ have_htm_tar = 1;
|
|
+ }
|
|
+ else
|
|
+ have_htm_tar = 0;
|
|
}
|
|
|
|
/* If we have a 64-bit binary on a 32-bit target, complain. Also
|
|
@@ -6345,6 +6894,32 @@ rs6000_gdbarch_init (struct gdbarch_info
|
|
tdep->ppc_ev0_upper_regnum = have_spe ? PPC_SPE_UPPER_GP0_REGNUM : -1;
|
|
tdep->ppc_acc_regnum = have_spe ? PPC_SPE_ACC_REGNUM : -1;
|
|
tdep->ppc_spefscr_regnum = have_spe ? PPC_SPE_FSCR_REGNUM : -1;
|
|
+ tdep->ppc_ppr_regnum = have_ppr ? PPC_PPR_REGNUM : -1;
|
|
+ tdep->ppc_dscr_regnum = have_dscr ? PPC_DSCR_REGNUM : -1;
|
|
+ tdep->ppc_tar_regnum = have_tar ? PPC_TAR_REGNUM : -1;
|
|
+ tdep->have_ebb = have_ebb;
|
|
+
|
|
+ /* If additional pmu registers are added, care must be taken when
|
|
+ setting new fields in the tdep below, to maintain compatibility
|
|
+ with features that only provide some of the registers. Currently
|
|
+ gdb access to the pmu registers is only supported in linux, and
|
|
+ linux only provides a subset of the pmu registers defined in the
|
|
+ architecture. */
|
|
+
|
|
+ tdep->ppc_mmcr0_regnum = have_pmu ? PPC_MMCR0_REGNUM : -1;
|
|
+ tdep->ppc_mmcr2_regnum = have_pmu ? PPC_MMCR2_REGNUM : -1;
|
|
+ tdep->ppc_siar_regnum = have_pmu ? PPC_SIAR_REGNUM : -1;
|
|
+ tdep->ppc_sdar_regnum = have_pmu ? PPC_SDAR_REGNUM : -1;
|
|
+ tdep->ppc_sier_regnum = have_pmu ? PPC_SIER_REGNUM : -1;
|
|
+
|
|
+ tdep->have_htm_spr = have_htm_spr;
|
|
+ tdep->have_htm_core = have_htm_core;
|
|
+ tdep->have_htm_fpu = have_htm_fpu;
|
|
+ tdep->have_htm_altivec = have_htm_altivec;
|
|
+ tdep->have_htm_vsx = have_htm_vsx;
|
|
+ tdep->ppc_cppr_regnum = have_htm_ppr ? PPC_CPPR_REGNUM : -1;
|
|
+ tdep->ppc_cdscr_regnum = have_htm_dscr ? PPC_CDSCR_REGNUM : -1;
|
|
+ tdep->ppc_ctar_regnum = have_htm_tar ? PPC_CTAR_REGNUM : -1;
|
|
|
|
set_gdbarch_pc_regnum (gdbarch, PPC_PC_REGNUM);
|
|
set_gdbarch_sp_regnum (gdbarch, PPC_R0_REGNUM + 1);
|
|
@@ -6367,7 +6942,7 @@ rs6000_gdbarch_init (struct gdbarch_info
|
|
else
|
|
tdep->lr_frame_offset = 4;
|
|
|
|
- if (have_spe || have_dfp || have_vsx)
|
|
+ if (have_spe || have_dfp || have_vsx || have_htm_fpu || have_htm_vsx)
|
|
{
|
|
set_gdbarch_pseudo_register_read (gdbarch, rs6000_pseudo_register_read);
|
|
set_gdbarch_pseudo_register_write (gdbarch,
|
|
@@ -6389,6 +6964,11 @@ rs6000_gdbarch_init (struct gdbarch_info
|
|
if (have_vsx)
|
|
/* Include both VSX and Extended FP registers. */
|
|
num_pseudoregs += 96;
|
|
+ if (have_htm_fpu)
|
|
+ num_pseudoregs += 16;
|
|
+ /* Include both checkpointed VSX and EFP registers. */
|
|
+ if (have_htm_vsx)
|
|
+ num_pseudoregs += 64 + 32;
|
|
|
|
set_gdbarch_num_pseudo_regs (gdbarch, num_pseudoregs);
|
|
|
|
@@ -6493,8 +7073,6 @@ rs6000_gdbarch_init (struct gdbarch_info
|
|
}
|
|
|
|
set_tdesc_pseudo_register_type (gdbarch, rs6000_pseudo_register_type);
|
|
- set_tdesc_pseudo_register_reggroup_p (gdbarch,
|
|
- rs6000_pseudo_register_reggroup_p);
|
|
tdesc_use_registers (gdbarch, tdesc, tdesc_data);
|
|
|
|
/* Override the normal target description method to make the SPE upper
|
|
@@ -6506,6 +7084,9 @@ rs6000_gdbarch_init (struct gdbarch_info
|
|
tdep->ppc_dl0_regnum = -1;
|
|
tdep->ppc_vsr0_regnum = -1;
|
|
tdep->ppc_efpr0_regnum = -1;
|
|
+ tdep->ppc_cdl0_regnum = -1;
|
|
+ tdep->ppc_cvsr0_regnum = -1;
|
|
+ tdep->ppc_cefpr0_regnum = -1;
|
|
|
|
cur_reg = gdbarch_num_regs (gdbarch);
|
|
|
|
@@ -6526,6 +7107,18 @@ rs6000_gdbarch_init (struct gdbarch_info
|
|
tdep->ppc_efpr0_regnum = cur_reg;
|
|
cur_reg += 32;
|
|
}
|
|
+ if (have_htm_fpu)
|
|
+ {
|
|
+ tdep->ppc_cdl0_regnum = cur_reg;
|
|
+ cur_reg += 16;
|
|
+ }
|
|
+ if (have_htm_vsx)
|
|
+ {
|
|
+ tdep->ppc_cvsr0_regnum = cur_reg;
|
|
+ cur_reg += 64;
|
|
+ tdep->ppc_cefpr0_regnum = cur_reg;
|
|
+ cur_reg += 32;
|
|
+ }
|
|
|
|
gdb_assert (gdbarch_num_regs (gdbarch)
|
|
+ gdbarch_num_pseudo_regs (gdbarch) == cur_reg);
|
|
Index: gdb-8.2/gdb/ppc-linux-nat.c
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/ppc-linux-nat.c 2019-01-18 14:26:09.000000000 +0100
|
|
+++ gdb-8.2/gdb/ppc-linux-nat.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -31,6 +31,7 @@
|
|
#include <signal.h>
|
|
#include <sys/user.h>
|
|
#include <sys/ioctl.h>
|
|
+#include <sys/uio.h>
|
|
#include "gdb_wait.h"
|
|
#include <fcntl.h>
|
|
#include <sys/procfs.h>
|
|
@@ -528,6 +529,78 @@ fetch_spe_register (struct regcache *reg
|
|
regcache->raw_supply (tdep->ppc_spefscr_regnum, &evrregs.spefscr);
|
|
}
|
|
|
|
+/* Use ptrace to fetch all registers from the register set with note
|
|
+ type REGSET_ID, size REGSIZE, and layout described by REGSET, from
|
|
+ process/thread TID and supply their values to REGCACHE. If ptrace
|
|
+ returns ENODATA to indicate the regset is unavailable, mark the
|
|
+ registers as unavailable in REGCACHE. */
|
|
+
|
|
+static void
|
|
+fetch_regset (struct regcache *regcache, int tid,
|
|
+ int regset_id, int regsetsize, const struct regset *regset)
|
|
+{
|
|
+ void *buf = alloca (regsetsize);
|
|
+ struct iovec iov;
|
|
+
|
|
+ iov.iov_base = buf;
|
|
+ iov.iov_len = regsetsize;
|
|
+
|
|
+ if (ptrace (PTRACE_GETREGSET, tid, regset_id, &iov) < 0)
|
|
+ {
|
|
+ if (errno == ENODATA)
|
|
+ regset->supply_regset (regset, regcache, -1, NULL, regsetsize);
|
|
+ else
|
|
+ perror_with_name (_("Couldn't get register set"));
|
|
+ }
|
|
+ else
|
|
+ regset->supply_regset (regset, regcache, -1, buf, regsetsize);
|
|
+}
|
|
+
|
|
+/* Use ptrace to store register REGNUM of the regset with note type
|
|
+ REGSET_ID, size REGSETSIZE, and layout described by REGSET, from
|
|
+ REGCACHE back to process/thread TID. If REGNUM is -1 all registers
|
|
+ in the set are collected and stored. */
|
|
+
|
|
+static void
|
|
+store_regset (const struct regcache *regcache, int tid, int regnum,
|
|
+ int regset_id, int regsetsize, const struct regset *regset)
|
|
+{
|
|
+ void *buf = alloca (regsetsize);
|
|
+ struct iovec iov;
|
|
+
|
|
+ iov.iov_base = buf;
|
|
+ iov.iov_len = regsetsize;
|
|
+
|
|
+ /* Make sure that the buffer that will be stored has up to date values
|
|
+ for the registers that won't be collected. */
|
|
+ if (ptrace (PTRACE_GETREGSET, tid, regset_id, &iov) < 0)
|
|
+ perror_with_name (_("Couldn't get register set"));
|
|
+
|
|
+ regset->collect_regset (regset, regcache, regnum, buf, regsetsize);
|
|
+
|
|
+ if (ptrace (PTRACE_SETREGSET, tid, regset_id, &iov) < 0)
|
|
+ perror_with_name (_("Couldn't set register set"));
|
|
+}
|
|
+
|
|
+/* Check whether the kernel provides a register set with number
|
|
+ REGSET_ID of size REGSETSIZE for process/thread TID. */
|
|
+
|
|
+static bool
|
|
+check_regset (int tid, int regset_id, int regsetsize)
|
|
+{
|
|
+ void *buf = alloca (regsetsize);
|
|
+ struct iovec iov;
|
|
+
|
|
+ iov.iov_base = buf;
|
|
+ iov.iov_len = regsetsize;
|
|
+
|
|
+ if (ptrace (PTRACE_GETREGSET, tid, regset_id, &iov) >= 0
|
|
+ || errno == ENODATA)
|
|
+ return true;
|
|
+ else
|
|
+ return false;
|
|
+}
|
|
+
|
|
static void
|
|
fetch_register (struct regcache *regcache, int tid, int regno)
|
|
{
|
|
@@ -554,7 +627,7 @@ fetch_register (struct regcache *regcach
|
|
AltiVec registers, fall through and return zeroes, because
|
|
regaddr will be -1 in this case. */
|
|
}
|
|
- if (vsx_register_p (gdbarch, regno))
|
|
+ else if (vsx_register_p (gdbarch, regno))
|
|
{
|
|
if (have_ptrace_getsetvsxregs)
|
|
{
|
|
@@ -567,6 +640,127 @@ fetch_register (struct regcache *regcach
|
|
fetch_spe_register (regcache, tid, regno);
|
|
return;
|
|
}
|
|
+ else if (regno == PPC_DSCR_REGNUM)
|
|
+ {
|
|
+ gdb_assert (tdep->ppc_dscr_regnum != -1);
|
|
+
|
|
+ fetch_regset (regcache, tid, NT_PPC_DSCR,
|
|
+ PPC_LINUX_SIZEOF_DSCRREGSET,
|
|
+ &ppc32_linux_dscrregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (regno == PPC_PPR_REGNUM)
|
|
+ {
|
|
+ gdb_assert (tdep->ppc_ppr_regnum != -1);
|
|
+
|
|
+ fetch_regset (regcache, tid, NT_PPC_PPR,
|
|
+ PPC_LINUX_SIZEOF_PPRREGSET,
|
|
+ &ppc32_linux_pprregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (regno == PPC_TAR_REGNUM)
|
|
+ {
|
|
+ gdb_assert (tdep->ppc_tar_regnum != -1);
|
|
+
|
|
+ fetch_regset (regcache, tid, NT_PPC_TAR,
|
|
+ PPC_LINUX_SIZEOF_TARREGSET,
|
|
+ &ppc32_linux_tarregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (PPC_IS_EBB_REGNUM (regno))
|
|
+ {
|
|
+ gdb_assert (tdep->have_ebb);
|
|
+
|
|
+ fetch_regset (regcache, tid, NT_PPC_EBB,
|
|
+ PPC_LINUX_SIZEOF_EBBREGSET,
|
|
+ &ppc32_linux_ebbregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (PPC_IS_PMU_REGNUM (regno))
|
|
+ {
|
|
+ gdb_assert (tdep->ppc_mmcr0_regnum != -1);
|
|
+
|
|
+ fetch_regset (regcache, tid, NT_PPC_PMU,
|
|
+ PPC_LINUX_SIZEOF_PMUREGSET,
|
|
+ &ppc32_linux_pmuregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (PPC_IS_TMSPR_REGNUM (regno))
|
|
+ {
|
|
+ gdb_assert (tdep->have_htm_spr);
|
|
+
|
|
+ fetch_regset (regcache, tid, NT_PPC_TM_SPR,
|
|
+ PPC_LINUX_SIZEOF_TM_SPRREGSET,
|
|
+ &ppc32_linux_tm_sprregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (PPC_IS_CKPTGP_REGNUM (regno))
|
|
+ {
|
|
+ gdb_assert (tdep->have_htm_core);
|
|
+
|
|
+ const struct regset *cgprregset = ppc_linux_cgprregset (gdbarch);
|
|
+ fetch_regset (regcache, tid, NT_PPC_TM_CGPR,
|
|
+ (tdep->wordsize == 4?
|
|
+ PPC32_LINUX_SIZEOF_CGPRREGSET
|
|
+ : PPC64_LINUX_SIZEOF_CGPRREGSET),
|
|
+ cgprregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (PPC_IS_CKPTFP_REGNUM (regno))
|
|
+ {
|
|
+ gdb_assert (tdep->have_htm_fpu);
|
|
+
|
|
+ fetch_regset (regcache, tid, NT_PPC_TM_CFPR,
|
|
+ PPC_LINUX_SIZEOF_CFPRREGSET,
|
|
+ &ppc32_linux_cfprregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (PPC_IS_CKPTVMX_REGNUM (regno))
|
|
+ {
|
|
+ gdb_assert (tdep->have_htm_altivec);
|
|
+
|
|
+ const struct regset *cvmxregset = ppc_linux_cvmxregset (gdbarch);
|
|
+ fetch_regset (regcache, tid, NT_PPC_TM_CVMX,
|
|
+ PPC_LINUX_SIZEOF_CVMXREGSET,
|
|
+ cvmxregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (PPC_IS_CKPTVSX_REGNUM (regno))
|
|
+ {
|
|
+ gdb_assert (tdep->have_htm_vsx);
|
|
+
|
|
+ fetch_regset (regcache, tid, NT_PPC_TM_CVSX,
|
|
+ PPC_LINUX_SIZEOF_CVSXREGSET,
|
|
+ &ppc32_linux_cvsxregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (regno == PPC_CPPR_REGNUM)
|
|
+ {
|
|
+ gdb_assert (tdep->ppc_cppr_regnum != -1);
|
|
+
|
|
+ fetch_regset (regcache, tid, NT_PPC_TM_CPPR,
|
|
+ PPC_LINUX_SIZEOF_CPPRREGSET,
|
|
+ &ppc32_linux_cpprregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (regno == PPC_CDSCR_REGNUM)
|
|
+ {
|
|
+ gdb_assert (tdep->ppc_cdscr_regnum != -1);
|
|
+
|
|
+ fetch_regset (regcache, tid, NT_PPC_TM_CDSCR,
|
|
+ PPC_LINUX_SIZEOF_CDSCRREGSET,
|
|
+ &ppc32_linux_cdscrregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (regno == PPC_CTAR_REGNUM)
|
|
+ {
|
|
+ gdb_assert (tdep->ppc_ctar_regnum != -1);
|
|
+
|
|
+ fetch_regset (regcache, tid, NT_PPC_TM_CTAR,
|
|
+ PPC_LINUX_SIZEOF_CTARREGSET,
|
|
+ &ppc32_linux_ctarregset);
|
|
+ return;
|
|
+ }
|
|
|
|
if (regaddr == -1)
|
|
{
|
|
@@ -763,6 +957,66 @@ fetch_ppc_registers (struct regcache *re
|
|
fetch_vsx_registers (regcache, tid, -1);
|
|
if (tdep->ppc_ev0_upper_regnum >= 0)
|
|
fetch_spe_register (regcache, tid, -1);
|
|
+ if (tdep->ppc_ppr_regnum != -1)
|
|
+ fetch_regset (regcache, tid, NT_PPC_PPR,
|
|
+ PPC_LINUX_SIZEOF_PPRREGSET,
|
|
+ &ppc32_linux_pprregset);
|
|
+ if (tdep->ppc_dscr_regnum != -1)
|
|
+ fetch_regset (regcache, tid, NT_PPC_DSCR,
|
|
+ PPC_LINUX_SIZEOF_DSCRREGSET,
|
|
+ &ppc32_linux_dscrregset);
|
|
+ if (tdep->ppc_tar_regnum != -1)
|
|
+ fetch_regset (regcache, tid, NT_PPC_TAR,
|
|
+ PPC_LINUX_SIZEOF_TARREGSET,
|
|
+ &ppc32_linux_tarregset);
|
|
+ if (tdep->have_ebb)
|
|
+ fetch_regset (regcache, tid, NT_PPC_EBB,
|
|
+ PPC_LINUX_SIZEOF_EBBREGSET,
|
|
+ &ppc32_linux_ebbregset);
|
|
+ if (tdep->ppc_mmcr0_regnum != -1)
|
|
+ fetch_regset (regcache, tid, NT_PPC_PMU,
|
|
+ PPC_LINUX_SIZEOF_PMUREGSET,
|
|
+ &ppc32_linux_pmuregset);
|
|
+ if (tdep->have_htm_spr)
|
|
+ fetch_regset (regcache, tid, NT_PPC_TM_SPR,
|
|
+ PPC_LINUX_SIZEOF_TM_SPRREGSET,
|
|
+ &ppc32_linux_tm_sprregset);
|
|
+ if (tdep->have_htm_core)
|
|
+ {
|
|
+ const struct regset *cgprregset = ppc_linux_cgprregset (gdbarch);
|
|
+ fetch_regset (regcache, tid, NT_PPC_TM_CGPR,
|
|
+ (tdep->wordsize == 4?
|
|
+ PPC32_LINUX_SIZEOF_CGPRREGSET
|
|
+ : PPC64_LINUX_SIZEOF_CGPRREGSET),
|
|
+ cgprregset);
|
|
+ }
|
|
+ if (tdep->have_htm_fpu)
|
|
+ fetch_regset (regcache, tid, NT_PPC_TM_CFPR,
|
|
+ PPC_LINUX_SIZEOF_CFPRREGSET,
|
|
+ &ppc32_linux_cfprregset);
|
|
+ if (tdep->have_htm_altivec)
|
|
+ {
|
|
+ const struct regset *cvmxregset = ppc_linux_cvmxregset (gdbarch);
|
|
+ fetch_regset (regcache, tid, NT_PPC_TM_CVMX,
|
|
+ PPC_LINUX_SIZEOF_CVMXREGSET,
|
|
+ cvmxregset);
|
|
+ }
|
|
+ if (tdep->have_htm_vsx)
|
|
+ fetch_regset (regcache, tid, NT_PPC_TM_CVSX,
|
|
+ PPC_LINUX_SIZEOF_CVSXREGSET,
|
|
+ &ppc32_linux_cvsxregset);
|
|
+ if (tdep->ppc_cppr_regnum != -1)
|
|
+ fetch_regset (regcache, tid, NT_PPC_TM_CPPR,
|
|
+ PPC_LINUX_SIZEOF_CPPRREGSET,
|
|
+ &ppc32_linux_cpprregset);
|
|
+ if (tdep->ppc_cdscr_regnum != -1)
|
|
+ fetch_regset (regcache, tid, NT_PPC_TM_CDSCR,
|
|
+ PPC_LINUX_SIZEOF_CDSCRREGSET,
|
|
+ &ppc32_linux_cdscrregset);
|
|
+ if (tdep->ppc_ctar_regnum != -1)
|
|
+ fetch_regset (regcache, tid, NT_PPC_TM_CTAR,
|
|
+ PPC_LINUX_SIZEOF_CTARREGSET,
|
|
+ &ppc32_linux_ctarregset);
|
|
}
|
|
|
|
/* Fetch registers from the child process. Fetch all registers if
|
|
@@ -933,7 +1187,7 @@ store_register (const struct regcache *r
|
|
store_altivec_registers (regcache, tid, regno);
|
|
return;
|
|
}
|
|
- if (vsx_register_p (gdbarch, regno))
|
|
+ else if (vsx_register_p (gdbarch, regno))
|
|
{
|
|
store_vsx_registers (regcache, tid, regno);
|
|
return;
|
|
@@ -943,6 +1197,127 @@ store_register (const struct regcache *r
|
|
store_spe_register (regcache, tid, regno);
|
|
return;
|
|
}
|
|
+ else if (regno == PPC_DSCR_REGNUM)
|
|
+ {
|
|
+ gdb_assert (tdep->ppc_dscr_regnum != -1);
|
|
+
|
|
+ store_regset (regcache, tid, regno, NT_PPC_DSCR,
|
|
+ PPC_LINUX_SIZEOF_DSCRREGSET,
|
|
+ &ppc32_linux_dscrregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (regno == PPC_PPR_REGNUM)
|
|
+ {
|
|
+ gdb_assert (tdep->ppc_ppr_regnum != -1);
|
|
+
|
|
+ store_regset (regcache, tid, regno, NT_PPC_PPR,
|
|
+ PPC_LINUX_SIZEOF_PPRREGSET,
|
|
+ &ppc32_linux_pprregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (regno == PPC_TAR_REGNUM)
|
|
+ {
|
|
+ gdb_assert (tdep->ppc_tar_regnum != -1);
|
|
+
|
|
+ store_regset (regcache, tid, regno, NT_PPC_TAR,
|
|
+ PPC_LINUX_SIZEOF_TARREGSET,
|
|
+ &ppc32_linux_tarregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (PPC_IS_EBB_REGNUM (regno))
|
|
+ {
|
|
+ gdb_assert (tdep->have_ebb);
|
|
+
|
|
+ store_regset (regcache, tid, regno, NT_PPC_EBB,
|
|
+ PPC_LINUX_SIZEOF_EBBREGSET,
|
|
+ &ppc32_linux_ebbregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (PPC_IS_PMU_REGNUM (regno))
|
|
+ {
|
|
+ gdb_assert (tdep->ppc_mmcr0_regnum != -1);
|
|
+
|
|
+ store_regset (regcache, tid, regno, NT_PPC_PMU,
|
|
+ PPC_LINUX_SIZEOF_PMUREGSET,
|
|
+ &ppc32_linux_pmuregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (PPC_IS_TMSPR_REGNUM (regno))
|
|
+ {
|
|
+ gdb_assert (tdep->have_htm_spr);
|
|
+
|
|
+ store_regset (regcache, tid, regno, NT_PPC_TM_SPR,
|
|
+ PPC_LINUX_SIZEOF_TM_SPRREGSET,
|
|
+ &ppc32_linux_tm_sprregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (PPC_IS_CKPTGP_REGNUM (regno))
|
|
+ {
|
|
+ gdb_assert (tdep->have_htm_core);
|
|
+
|
|
+ const struct regset *cgprregset = ppc_linux_cgprregset (gdbarch);
|
|
+ store_regset (regcache, tid, regno, NT_PPC_TM_CGPR,
|
|
+ (tdep->wordsize == 4?
|
|
+ PPC32_LINUX_SIZEOF_CGPRREGSET
|
|
+ : PPC64_LINUX_SIZEOF_CGPRREGSET),
|
|
+ cgprregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (PPC_IS_CKPTFP_REGNUM (regno))
|
|
+ {
|
|
+ gdb_assert (tdep->have_htm_fpu);
|
|
+
|
|
+ store_regset (regcache, tid, regno, NT_PPC_TM_CFPR,
|
|
+ PPC_LINUX_SIZEOF_CFPRREGSET,
|
|
+ &ppc32_linux_cfprregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (PPC_IS_CKPTVMX_REGNUM (regno))
|
|
+ {
|
|
+ gdb_assert (tdep->have_htm_altivec);
|
|
+
|
|
+ const struct regset *cvmxregset = ppc_linux_cvmxregset (gdbarch);
|
|
+ store_regset (regcache, tid, regno, NT_PPC_TM_CVMX,
|
|
+ PPC_LINUX_SIZEOF_CVMXREGSET,
|
|
+ cvmxregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (PPC_IS_CKPTVSX_REGNUM (regno))
|
|
+ {
|
|
+ gdb_assert (tdep->have_htm_vsx);
|
|
+
|
|
+ store_regset (regcache, tid, regno, NT_PPC_TM_CVSX,
|
|
+ PPC_LINUX_SIZEOF_CVSXREGSET,
|
|
+ &ppc32_linux_cvsxregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (regno == PPC_CPPR_REGNUM)
|
|
+ {
|
|
+ gdb_assert (tdep->ppc_cppr_regnum != -1);
|
|
+
|
|
+ store_regset (regcache, tid, regno, NT_PPC_TM_CPPR,
|
|
+ PPC_LINUX_SIZEOF_CPPRREGSET,
|
|
+ &ppc32_linux_cpprregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (regno == PPC_CDSCR_REGNUM)
|
|
+ {
|
|
+ gdb_assert (tdep->ppc_cdscr_regnum != -1);
|
|
+
|
|
+ store_regset (regcache, tid, regno, NT_PPC_TM_CDSCR,
|
|
+ PPC_LINUX_SIZEOF_CDSCRREGSET,
|
|
+ &ppc32_linux_cdscrregset);
|
|
+ return;
|
|
+ }
|
|
+ else if (regno == PPC_CTAR_REGNUM)
|
|
+ {
|
|
+ gdb_assert (tdep->ppc_ctar_regnum != -1);
|
|
+
|
|
+ store_regset (regcache, tid, regno, NT_PPC_TM_CTAR,
|
|
+ PPC_LINUX_SIZEOF_CTARREGSET,
|
|
+ &ppc32_linux_ctarregset);
|
|
+ return;
|
|
+ }
|
|
|
|
if (regaddr == -1)
|
|
return;
|
|
@@ -1157,6 +1532,32 @@ store_ppc_registers (const struct regcac
|
|
store_vsx_registers (regcache, tid, -1);
|
|
if (tdep->ppc_ev0_upper_regnum >= 0)
|
|
store_spe_register (regcache, tid, -1);
|
|
+ if (tdep->ppc_ppr_regnum != -1)
|
|
+ store_regset (regcache, tid, -1, NT_PPC_PPR,
|
|
+ PPC_LINUX_SIZEOF_PPRREGSET,
|
|
+ &ppc32_linux_pprregset);
|
|
+ if (tdep->ppc_dscr_regnum != -1)
|
|
+ store_regset (regcache, tid, -1, NT_PPC_DSCR,
|
|
+ PPC_LINUX_SIZEOF_DSCRREGSET,
|
|
+ &ppc32_linux_dscrregset);
|
|
+ if (tdep->ppc_tar_regnum != -1)
|
|
+ store_regset (regcache, tid, -1, NT_PPC_TAR,
|
|
+ PPC_LINUX_SIZEOF_TARREGSET,
|
|
+ &ppc32_linux_tarregset);
|
|
+
|
|
+ if (tdep->ppc_mmcr0_regnum != -1)
|
|
+ store_regset (regcache, tid, -1, NT_PPC_PMU,
|
|
+ PPC_LINUX_SIZEOF_PMUREGSET,
|
|
+ &ppc32_linux_pmuregset);
|
|
+
|
|
+ if (tdep->have_htm_spr)
|
|
+ store_regset (regcache, tid, -1, NT_PPC_TM_SPR,
|
|
+ PPC_LINUX_SIZEOF_TM_SPRREGSET,
|
|
+ &ppc32_linux_tm_sprregset);
|
|
+
|
|
+ /* Because the EBB and checkpointed HTM registers can be
|
|
+ unavailable, attempts to store them here would cause this
|
|
+ function to fail most of the time, so we ignore them. */
|
|
}
|
|
|
|
/* Fetch the AT_HWCAP entry from the aux vector. */
|
|
@@ -1171,6 +1572,19 @@ ppc_linux_get_hwcap (void)
|
|
return field;
|
|
}
|
|
|
|
+/* Fetch the AT_HWCAP2 entry from the aux vector. */
|
|
+
|
|
+static CORE_ADDR
|
|
+ppc_linux_get_hwcap2 (void)
|
|
+{
|
|
+ CORE_ADDR field;
|
|
+
|
|
+ if (target_auxv_search (current_top_target (), AT_HWCAP2, &field) != 1)
|
|
+ return 0;
|
|
+
|
|
+ return field;
|
|
+}
|
|
+
|
|
/* The cached DABR value, to install in new threads.
|
|
This variable is used when the PowerPC HWDEBUG ptrace
|
|
interface is not available. */
|
|
@@ -2233,6 +2647,7 @@ ppc_linux_nat_target::read_description (
|
|
features.wordsize = ppc_linux_target_wordsize (tid);
|
|
|
|
CORE_ADDR hwcap = ppc_linux_get_hwcap ();
|
|
+ CORE_ADDR hwcap2 = ppc_linux_get_hwcap2 ();
|
|
|
|
if (have_ptrace_getsetvsxregs
|
|
&& (hwcap & PPC_FEATURE_HAS_VSX))
|
|
@@ -2267,6 +2682,26 @@ ppc_linux_nat_target::read_description (
|
|
|
|
features.isa205 = ppc_linux_has_isa205 (hwcap);
|
|
|
|
+ if ((hwcap2 & PPC_FEATURE2_DSCR)
|
|
+ && check_regset (tid, NT_PPC_PPR, PPC_LINUX_SIZEOF_PPRREGSET)
|
|
+ && check_regset (tid, NT_PPC_DSCR, PPC_LINUX_SIZEOF_DSCRREGSET))
|
|
+ {
|
|
+ features.ppr_dscr = true;
|
|
+ if ((hwcap2 & PPC_FEATURE2_ARCH_2_07)
|
|
+ && (hwcap2 & PPC_FEATURE2_TAR)
|
|
+ && (hwcap2 & PPC_FEATURE2_EBB)
|
|
+ && check_regset (tid, NT_PPC_TAR, PPC_LINUX_SIZEOF_TARREGSET)
|
|
+ && check_regset (tid, NT_PPC_EBB, PPC_LINUX_SIZEOF_EBBREGSET)
|
|
+ && check_regset (tid, NT_PPC_PMU, PPC_LINUX_SIZEOF_PMUREGSET))
|
|
+ {
|
|
+ features.isa207 = true;
|
|
+ if ((hwcap2 & PPC_FEATURE2_HTM)
|
|
+ && check_regset (tid, NT_PPC_TM_SPR,
|
|
+ PPC_LINUX_SIZEOF_TM_SPRREGSET))
|
|
+ features.htm = true;
|
|
+ }
|
|
+ }
|
|
+
|
|
return ppc_linux_match_description (features);
|
|
}
|
|
|
|
Index: gdb-8.2/gdb/arch/ppc-linux-common.c
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/arch/ppc-linux-common.c 2018-09-05 09:27:13.000000000 +0200
|
|
+++ gdb-8.2/gdb/arch/ppc-linux-common.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -53,14 +53,17 @@ ppc_linux_match_description (struct ppc_
|
|
if (features.cell)
|
|
tdesc = tdesc_powerpc_cell64l;
|
|
else if (features.vsx)
|
|
- tdesc = features.isa205
|
|
- ? tdesc_powerpc_isa205_vsx64l : tdesc_powerpc_vsx64l;
|
|
+ tdesc = (features.htm? tdesc_powerpc_isa207_htm_vsx64l
|
|
+ : features.isa207? tdesc_powerpc_isa207_vsx64l
|
|
+ : features.ppr_dscr? tdesc_powerpc_isa205_ppr_dscr_vsx64l
|
|
+ : features.isa205? tdesc_powerpc_isa205_vsx64l
|
|
+ : tdesc_powerpc_vsx64l);
|
|
else if (features.altivec)
|
|
- tdesc = features.isa205
|
|
- ? tdesc_powerpc_isa205_altivec64l : tdesc_powerpc_altivec64l;
|
|
+ tdesc = (features.isa205? tdesc_powerpc_isa205_altivec64l
|
|
+ : tdesc_powerpc_altivec64l);
|
|
else
|
|
- tdesc = features.isa205?
|
|
- tdesc_powerpc_isa205_64l : tdesc_powerpc_64l;
|
|
+ tdesc = (features.isa205? tdesc_powerpc_isa205_64l
|
|
+ : tdesc_powerpc_64l);
|
|
}
|
|
else
|
|
{
|
|
@@ -69,14 +72,17 @@ ppc_linux_match_description (struct ppc_
|
|
if (features.cell)
|
|
tdesc = tdesc_powerpc_cell32l;
|
|
else if (features.vsx)
|
|
- tdesc = features.isa205
|
|
- ? tdesc_powerpc_isa205_vsx32l : tdesc_powerpc_vsx32l;
|
|
+ tdesc = (features.htm? tdesc_powerpc_isa207_htm_vsx32l
|
|
+ : features.isa207? tdesc_powerpc_isa207_vsx32l
|
|
+ : features.ppr_dscr? tdesc_powerpc_isa205_ppr_dscr_vsx32l
|
|
+ : features.isa205? tdesc_powerpc_isa205_vsx32l
|
|
+ : tdesc_powerpc_vsx32l);
|
|
else if (features.altivec)
|
|
- tdesc = features.isa205
|
|
- ? tdesc_powerpc_isa205_altivec32l : tdesc_powerpc_altivec32l;
|
|
+ tdesc = (features.isa205? tdesc_powerpc_isa205_altivec32l
|
|
+ : tdesc_powerpc_altivec32l);
|
|
else
|
|
- tdesc = features.isa205
|
|
- ? tdesc_powerpc_isa205_32l : tdesc_powerpc_32l;
|
|
+ tdesc = (features.isa205? tdesc_powerpc_isa205_32l
|
|
+ : tdesc_powerpc_32l);
|
|
}
|
|
|
|
gdb_assert (tdesc != NULL);
|
|
Index: gdb-8.2/gdb/arch/ppc-linux-common.h
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/arch/ppc-linux-common.h 2018-09-05 09:27:13.000000000 +0200
|
|
+++ gdb-8.2/gdb/arch/ppc-linux-common.h 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -30,6 +30,20 @@ struct target_desc;
|
|
#define PPC_LINUX_SIZEOF_VRREGSET 544
|
|
|
|
#define PPC_LINUX_SIZEOF_VSXREGSET 256
|
|
+#define PPC_LINUX_SIZEOF_PPRREGSET 8
|
|
+#define PPC_LINUX_SIZEOF_DSCRREGSET 8
|
|
+#define PPC_LINUX_SIZEOF_TARREGSET 8
|
|
+#define PPC_LINUX_SIZEOF_EBBREGSET (3*8)
|
|
+#define PPC_LINUX_SIZEOF_PMUREGSET (5*8)
|
|
+#define PPC_LINUX_SIZEOF_TM_SPRREGSET (3*8)
|
|
+#define PPC32_LINUX_SIZEOF_CGPRREGSET (48*4)
|
|
+#define PPC64_LINUX_SIZEOF_CGPRREGSET (48*8)
|
|
+#define PPC_LINUX_SIZEOF_CFPRREGSET (32*8+8)
|
|
+#define PPC_LINUX_SIZEOF_CVMXREGSET (34*16)
|
|
+#define PPC_LINUX_SIZEOF_CVSXREGSET (32*8)
|
|
+#define PPC_LINUX_SIZEOF_CPPRREGSET 8
|
|
+#define PPC_LINUX_SIZEOF_CDSCRREGSET 8
|
|
+#define PPC_LINUX_SIZEOF_CTARREGSET 8
|
|
|
|
/* Check if the hwcap auxv entry indicates that isa205 is supported. */
|
|
bool ppc_linux_has_isa205 (CORE_ADDR hwcap);
|
|
@@ -41,6 +55,9 @@ struct ppc_linux_features
|
|
bool altivec;
|
|
bool vsx;
|
|
bool isa205;
|
|
+ bool ppr_dscr;
|
|
+ bool isa207;
|
|
+ bool htm;
|
|
bool cell;
|
|
};
|
|
|
|
@@ -50,6 +67,9 @@ const struct ppc_linux_features ppc_linu
|
|
false,
|
|
false,
|
|
false,
|
|
+ false,
|
|
+ false,
|
|
+ false,
|
|
false,
|
|
};
|
|
|
|
Index: gdb-8.2/gdb/arch/ppc-linux-tdesc.h
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/arch/ppc-linux-tdesc.h 2018-09-05 09:27:13.000000000 +0200
|
|
+++ gdb-8.2/gdb/arch/ppc-linux-tdesc.h 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -29,6 +29,9 @@ extern struct target_desc *tdesc_powerpc
|
|
extern struct target_desc *tdesc_powerpc_isa205_32l;
|
|
extern struct target_desc *tdesc_powerpc_isa205_altivec32l;
|
|
extern struct target_desc *tdesc_powerpc_isa205_vsx32l;
|
|
+extern struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx32l;
|
|
+extern struct target_desc *tdesc_powerpc_isa207_vsx32l;
|
|
+extern struct target_desc *tdesc_powerpc_isa207_htm_vsx32l;
|
|
extern struct target_desc *tdesc_powerpc_e500l;
|
|
|
|
extern struct target_desc *tdesc_powerpc_64l;
|
|
@@ -38,5 +41,8 @@ extern struct target_desc *tdesc_powerpc
|
|
extern struct target_desc *tdesc_powerpc_isa205_64l;
|
|
extern struct target_desc *tdesc_powerpc_isa205_altivec64l;
|
|
extern struct target_desc *tdesc_powerpc_isa205_vsx64l;
|
|
+extern struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx64l;
|
|
+extern struct target_desc *tdesc_powerpc_isa207_vsx64l;
|
|
+extern struct target_desc *tdesc_powerpc_isa207_htm_vsx64l;
|
|
|
|
#endif /* ARCH_PPC_LINUX_TDESC_H */
|
|
Index: gdb-8.2/gdb/doc/gdb.texinfo
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/doc/gdb.texinfo 2019-01-18 14:26:13.000000000 +0100
|
|
+++ gdb-8.2/gdb/doc/gdb.texinfo 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -42576,6 +42576,66 @@ contain registers @samp{ev0h} through @s
|
|
these to present registers @samp{ev0} through @samp{ev31} to the
|
|
user.
|
|
|
|
+The @samp{org.gnu.gdb.power.ppr} feature is optional. It should
|
|
+contain the 64-bit register @samp{ppr}.
|
|
+
|
|
+The @samp{org.gnu.gdb.power.dscr} feature is optional. It should
|
|
+contain the 64-bit register @samp{dscr}.
|
|
+
|
|
+The @samp{org.gnu.gdb.power.tar} feature is optional. It should
|
|
+contain the 64-bit register @samp{tar}.
|
|
+
|
|
+The @samp{org.gnu.gdb.power.ebb} feature is optional. It should
|
|
+contain registers @samp{bescr}, @samp{ebbhr} and @samp{ebbrr}, all
|
|
+64-bit wide.
|
|
+
|
|
+The @samp{org.gnu.gdb.power.linux.pmu} feature is optional. It should
|
|
+contain registers @samp{mmcr0}, @samp{mmcr2}, @samp{siar}, @samp{sdar}
|
|
+and @samp{sier}, all 64-bit wide. This is the subset of the isa 2.07
|
|
+server PMU registers provided by @sc{gnu}/Linux.
|
|
+
|
|
+The @samp{org.gnu.gdb.power.htm.spr} feature is optional. It should
|
|
+contain registers @samp{tfhar}, @samp{texasr} and @samp{tfiar}, all
|
|
+64-bit wide.
|
|
+
|
|
+The @samp{org.gnu.gdb.power.htm.core} feature is optional. It should
|
|
+contain the checkpointed general-purpose registers @samp{cr0} through
|
|
+@samp{cr31}, as well as the checkpointed registers @samp{clr} and
|
|
+@samp{cctr}. These registers may all be either 32-bit or 64-bit
|
|
+depending on the target. It should also contain the checkpointed
|
|
+registers @samp{ccr} and @samp{cxer}, which should both be 32-bit
|
|
+wide.
|
|
+
|
|
+The @samp{org.gnu.gdb.power.htm.fpu} feature is optional. It should
|
|
+contain the checkpointed 64-bit floating-point registers @samp{cf0}
|
|
+through @samp{cf31}, as well as the checkpointed 64-bit register
|
|
+@samp{cfpscr}.
|
|
+
|
|
+The @samp{org.gnu.gdb.power.htm.altivec} feature is optional. It
|
|
+should contain the checkpointed altivec registers @samp{cvr0} through
|
|
+@samp{cvr31}, all 128-bit wide. It should also contain the
|
|
+checkpointed registers @samp{cvscr} and @samp{cvrsave}, both 32-bit
|
|
+wide.
|
|
+
|
|
+The @samp{org.gnu.gdb.power.htm.vsx} feature is optional. It should
|
|
+contain registers @samp{cvs0h} through @samp{cvs31h}. @value{GDBN}
|
|
+will combine these registers with the checkpointed floating point
|
|
+registers (@samp{cf0} through @samp{cf31}) and the checkpointed
|
|
+altivec registers (@samp{cvr0} through @samp{cvr31}) to present the
|
|
+128-bit wide checkpointed vector-scalar registers @samp{cvs0} through
|
|
+@samp{cvs63}. Therefore, this feature requires both
|
|
+@samp{org.gnu.gdb.power.htm.altivec} and
|
|
+@samp{org.gnu.gdb.power.htm.fpu}.
|
|
+
|
|
+The @samp{org.gnu.gdb.power.htm.ppr} feature is optional. It should
|
|
+contain the 64-bit checkpointed register @samp{cppr}.
|
|
+
|
|
+The @samp{org.gnu.gdb.power.htm.dscr} feature is optional. It should
|
|
+contain the 64-bit checkpointed register @samp{cdscr}.
|
|
+
|
|
+The @samp{org.gnu.gdb.power.htm.tar} feature is optional. It should
|
|
+contain the 64-bit checkpointed register @samp{ctar}.
|
|
+
|
|
@node S/390 and System z Features
|
|
@subsection S/390 and System z Features
|
|
@cindex target descriptions, S/390 features
|
|
Index: gdb-8.2/gdb/features/Makefile
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/features/Makefile 2018-09-05 09:27:13.000000000 +0200
|
|
+++ gdb-8.2/gdb/features/Makefile 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -73,6 +73,11 @@ WHICH = aarch64 \
|
|
rs6000/powerpc-isa205-32l rs6000/powerpc-isa205-64l \
|
|
rs6000/powerpc-isa205-altivec32l rs6000/powerpc-isa205-altivec64l \
|
|
rs6000/powerpc-isa205-vsx32l rs6000/powerpc-isa205-vsx64l \
|
|
+ rs6000/powerpc-isa205-ppr-dscr-vsx32l \
|
|
+ rs6000/powerpc-isa205-ppr-dscr-vsx64l \
|
|
+ rs6000/powerpc-isa207-vsx32l rs6000/powerpc-isa207-vsx64l \
|
|
+ rs6000/powerpc-isa207-htm-vsx32l \
|
|
+ rs6000/powerpc-isa207-htm-vsx64l \
|
|
s390-linux32 s390-linux64 s390x-linux64 \
|
|
s390-linux32v1 s390-linux64v1 s390x-linux64v1 \
|
|
s390-linux32v2 s390-linux64v2 s390x-linux64v2 \
|
|
@@ -167,6 +172,12 @@ XMLTOC = \
|
|
rs6000/powerpc-isa205-altivec64l.xml \
|
|
rs6000/powerpc-isa205-vsx32l.xml \
|
|
rs6000/powerpc-isa205-vsx64l.xml \
|
|
+ rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml \
|
|
+ rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml \
|
|
+ rs6000/powerpc-isa207-vsx32l.xml \
|
|
+ rs6000/powerpc-isa207-vsx64l.xml \
|
|
+ rs6000/powerpc-isa207-htm-vsx32l.xml \
|
|
+ rs6000/powerpc-isa207-htm-vsx64l.xml \
|
|
rs6000/powerpc-vsx32.xml \
|
|
rs6000/powerpc-vsx32l.xml \
|
|
rs6000/powerpc-vsx64.xml \
|
|
Index: gdb-8.2/gdb/features/rs6000/power-dscr.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/power-dscr.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,12 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!-- POWER Data Stream Control Register. -->
|
|
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
|
+<feature name="org.gnu.gdb.power.dscr">
|
|
+ <reg name="dscr" bitsize="64" type="uint64"/>
|
|
+</feature>
|
|
Index: gdb-8.2/gdb/features/rs6000/power-ppr.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/power-ppr.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,12 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!-- POWER Program Priority Register. -->
|
|
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
|
+<feature name="org.gnu.gdb.power.ppr">
|
|
+ <reg name="ppr" bitsize="64" type="uint64"/>
|
|
+</feature>
|
|
Index: gdb-8.2/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,200 @@
|
|
+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
|
|
+ Original: powerpc-isa205-ppr-dscr-vsx32l.xml */
|
|
+
|
|
+#include "defs.h"
|
|
+#include "osabi.h"
|
|
+#include "target-descriptions.h"
|
|
+
|
|
+struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx32l;
|
|
+static void
|
|
+initialize_tdesc_powerpc_isa205_ppr_dscr_vsx32l (void)
|
|
+{
|
|
+ struct target_desc *result = allocate_target_description ();
|
|
+ set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
|
|
+
|
|
+ struct tdesc_feature *feature;
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
|
|
+ tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r26", 26, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r27", 27, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r28", 28, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r29", 29, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r31", 31, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "pc", 64, 1, NULL, 32, "code_ptr");
|
|
+ tdesc_create_reg (feature, "msr", 65, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "lr", 67, 1, NULL, 32, "code_ptr");
|
|
+ tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
|
|
+ tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
|
|
+ tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int");
|
|
+ tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
|
|
+ tdesc_type *element_type;
|
|
+ element_type = tdesc_named_type (feature, "ieee_single");
|
|
+ tdesc_create_vector (feature, "v4f", element_type, 4);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int32");
|
|
+ tdesc_create_vector (feature, "v4i32", element_type, 4);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int16");
|
|
+ tdesc_create_vector (feature, "v8i16", element_type, 8);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int8");
|
|
+ tdesc_create_vector (feature, "v16i8", element_type, 16);
|
|
+
|
|
+ tdesc_type_with_fields *type_with_fields;
|
|
+ type_with_fields = tdesc_create_union (feature, "vec128");
|
|
+ tdesc_type *field_type;
|
|
+ field_type = tdesc_named_type (feature, "uint128");
|
|
+ tdesc_add_field (type_with_fields, "uint128", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v4f");
|
|
+ tdesc_add_field (type_with_fields, "v4_float", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v4i32");
|
|
+ tdesc_add_field (type_with_fields, "v4_int32", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v8i16");
|
|
+ tdesc_add_field (type_with_fields, "v8_int16", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v16i8");
|
|
+ tdesc_add_field (type_with_fields, "v16_int8", field_type);
|
|
+
|
|
+ tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
|
|
+ tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
|
|
+ tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs3h", 110, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs4h", 111, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs5h", 112, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs6h", 113, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs7h", 114, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs8h", 115, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs9h", 116, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs10h", 117, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs11h", 118, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs12h", 119, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs13h", 120, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs14h", 121, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs15h", 122, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs16h", 123, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs17h", 124, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs18h", 125, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs19h", 126, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs20h", 127, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs21h", 128, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs22h", 129, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs23h", 130, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs24h", 131, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs25h", 132, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs26h", 133, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs27h", 134, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs28h", 135, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs29h", 136, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr");
|
|
+ tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr");
|
|
+ tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64");
|
|
+
|
|
+ tdesc_powerpc_isa205_ppr_dscr_vsx32l = result;
|
|
+}
|
|
Index: gdb-8.2/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,18 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
|
|
+<target>
|
|
+ <architecture>powerpc:common</architecture>
|
|
+ <xi:include href="power-core.xml"/>
|
|
+ <xi:include href="power-fpu-isa205.xml"/>
|
|
+ <xi:include href="power-linux.xml"/>
|
|
+ <xi:include href="power-altivec.xml"/>
|
|
+ <xi:include href="power-vsx.xml"/>
|
|
+ <xi:include href="power-ppr.xml"/>
|
|
+ <xi:include href="power-dscr.xml"/>
|
|
+</target>
|
|
Index: gdb-8.2/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,200 @@
|
|
+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
|
|
+ Original: powerpc-isa205-ppr-dscr-vsx64l.xml */
|
|
+
|
|
+#include "defs.h"
|
|
+#include "osabi.h"
|
|
+#include "target-descriptions.h"
|
|
+
|
|
+struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx64l;
|
|
+static void
|
|
+initialize_tdesc_powerpc_isa205_ppr_dscr_vsx64l (void)
|
|
+{
|
|
+ struct target_desc *result = allocate_target_description ();
|
|
+ set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
|
|
+
|
|
+ struct tdesc_feature *feature;
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
|
|
+ tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r3", 3, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r4", 4, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r5", 5, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r6", 6, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r7", 7, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r16", 16, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r17", 17, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r18", 18, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r19", 19, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r20", 20, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r21", 21, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r22", 22, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r23", 23, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r24", 24, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r25", 25, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r26", 26, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r27", 27, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r28", 28, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r29", 29, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r30", 30, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r31", 31, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "pc", 64, 1, NULL, 64, "code_ptr");
|
|
+ tdesc_create_reg (feature, "msr", 65, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "lr", 67, 1, NULL, 64, "code_ptr");
|
|
+ tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
|
|
+ tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
|
|
+ tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int");
|
|
+ tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
|
|
+ tdesc_type *element_type;
|
|
+ element_type = tdesc_named_type (feature, "ieee_single");
|
|
+ tdesc_create_vector (feature, "v4f", element_type, 4);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int32");
|
|
+ tdesc_create_vector (feature, "v4i32", element_type, 4);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int16");
|
|
+ tdesc_create_vector (feature, "v8i16", element_type, 8);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int8");
|
|
+ tdesc_create_vector (feature, "v16i8", element_type, 16);
|
|
+
|
|
+ tdesc_type_with_fields *type_with_fields;
|
|
+ type_with_fields = tdesc_create_union (feature, "vec128");
|
|
+ tdesc_type *field_type;
|
|
+ field_type = tdesc_named_type (feature, "uint128");
|
|
+ tdesc_add_field (type_with_fields, "uint128", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v4f");
|
|
+ tdesc_add_field (type_with_fields, "v4_float", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v4i32");
|
|
+ tdesc_add_field (type_with_fields, "v4_int32", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v8i16");
|
|
+ tdesc_add_field (type_with_fields, "v8_int16", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v16i8");
|
|
+ tdesc_add_field (type_with_fields, "v16_int8", field_type);
|
|
+
|
|
+ tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
|
|
+ tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
|
|
+ tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs3h", 110, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs4h", 111, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs5h", 112, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs6h", 113, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs7h", 114, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs8h", 115, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs9h", 116, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs10h", 117, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs11h", 118, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs12h", 119, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs13h", 120, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs14h", 121, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs15h", 122, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs16h", 123, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs17h", 124, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs18h", 125, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs19h", 126, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs20h", 127, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs21h", 128, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs22h", 129, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs23h", 130, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs24h", 131, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs25h", 132, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs26h", 133, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs27h", 134, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs28h", 135, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs29h", 136, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr");
|
|
+ tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr");
|
|
+ tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64");
|
|
+
|
|
+ tdesc_powerpc_isa205_ppr_dscr_vsx64l = result;
|
|
+}
|
|
Index: gdb-8.2/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,18 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
|
|
+<target>
|
|
+ <architecture>powerpc:common64</architecture>
|
|
+ <xi:include href="power64-core.xml"/>
|
|
+ <xi:include href="power-fpu-isa205.xml"/>
|
|
+ <xi:include href="power64-linux.xml"/>
|
|
+ <xi:include href="power-altivec.xml"/>
|
|
+ <xi:include href="power-vsx.xml"/>
|
|
+ <xi:include href="power-ppr.xml"/>
|
|
+ <xi:include href="power-dscr.xml"/>
|
|
+</target>
|
|
Index: gdb-8.2/gdb/gdbserver/configure.srv
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/gdbserver/configure.srv 2018-09-05 09:27:13.000000000 +0200
|
|
+++ gdb-8.2/gdb/gdbserver/configure.srv 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -32,7 +32,7 @@ else
|
|
srv_amd64_linux_regobj=""
|
|
fi
|
|
|
|
-ipa_ppc_linux_regobj="powerpc-32l-ipa.o powerpc-altivec32l-ipa.o powerpc-cell32l-ipa.o powerpc-vsx32l-ipa.o powerpc-isa205-32l-ipa.o powerpc-isa205-altivec32l-ipa.o powerpc-isa205-vsx32l-ipa.o powerpc-e500l-ipa.o powerpc-64l-ipa.o powerpc-altivec64l-ipa.o powerpc-cell64l-ipa.o powerpc-vsx64l-ipa.o powerpc-isa205-64l-ipa.o powerpc-isa205-altivec64l-ipa.o powerpc-isa205-vsx64l-ipa.o"
|
|
+ipa_ppc_linux_regobj="powerpc-32l-ipa.o powerpc-altivec32l-ipa.o powerpc-cell32l-ipa.o powerpc-vsx32l-ipa.o powerpc-isa205-32l-ipa.o powerpc-isa205-altivec32l-ipa.o powerpc-isa205-vsx32l-ipa.o powerpc-isa205-ppr-dscr-vsx32l-ipa.o powerpc-isa207-vsx32l-ipa.o powerpc-isa207-htm-vsx32l-ipa.o powerpc-e500l-ipa.o powerpc-64l-ipa.o powerpc-altivec64l-ipa.o powerpc-cell64l-ipa.o powerpc-vsx64l-ipa.o powerpc-isa205-64l-ipa.o powerpc-isa205-altivec64l-ipa.o powerpc-isa205-vsx64l-ipa.o powerpc-isa205-ppr-dscr-vsx64l-ipa.o powerpc-isa207-vsx64l-ipa.o powerpc-isa207-htm-vsx64l-ipa.o"
|
|
|
|
# Linux object files. This is so we don't have to repeat
|
|
# these files over and over again.
|
|
@@ -217,6 +217,9 @@ case "${target}" in
|
|
srv_regobj="${srv_regobj} powerpc-isa205-32l.o"
|
|
srv_regobj="${srv_regobj} powerpc-isa205-altivec32l.o"
|
|
srv_regobj="${srv_regobj} powerpc-isa205-vsx32l.o"
|
|
+ srv_regobj="${srv_regobj} powerpc-isa205-ppr-dscr-vsx32l.o"
|
|
+ srv_regobj="${srv_regobj} powerpc-isa207-vsx32l.o"
|
|
+ srv_regobj="${srv_regobj} powerpc-isa207-htm-vsx32l.o"
|
|
srv_regobj="${srv_regobj} powerpc-e500l.o"
|
|
srv_regobj="${srv_regobj} powerpc-64l.o"
|
|
srv_regobj="${srv_regobj} powerpc-altivec64l.o"
|
|
@@ -225,6 +228,9 @@ case "${target}" in
|
|
srv_regobj="${srv_regobj} powerpc-isa205-64l.o"
|
|
srv_regobj="${srv_regobj} powerpc-isa205-altivec64l.o"
|
|
srv_regobj="${srv_regobj} powerpc-isa205-vsx64l.o"
|
|
+ srv_regobj="${srv_regobj} powerpc-isa205-ppr-dscr-vsx64l.o"
|
|
+ srv_regobj="${srv_regobj} powerpc-isa207-vsx64l.o"
|
|
+ srv_regobj="${srv_regobj} powerpc-isa207-htm-vsx64l.o"
|
|
srv_tgtobj="$srv_linux_obj linux-ppc-low.o ppc-linux.o"
|
|
srv_tgtobj="${srv_tgtobj} arch/ppc-linux-common.o"
|
|
srv_xmlfiles="rs6000/powerpc-32l.xml"
|
|
@@ -234,12 +240,28 @@ case "${target}" in
|
|
srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-32l.xml"
|
|
srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-altivec32l.xml"
|
|
srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-vsx32l.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-vsx32l.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-htm-vsx32l.xml"
|
|
srv_xmlfiles="${srv_xmlfiles} rs6000/power-altivec.xml"
|
|
srv_xmlfiles="${srv_xmlfiles} rs6000/power-vsx.xml"
|
|
srv_xmlfiles="${srv_xmlfiles} rs6000/power-core.xml"
|
|
srv_xmlfiles="${srv_xmlfiles} rs6000/power-linux.xml"
|
|
srv_xmlfiles="${srv_xmlfiles} rs6000/power-fpu.xml"
|
|
srv_xmlfiles="${srv_xmlfiles} rs6000/power-fpu-isa205.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-dscr.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-ppr.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-tar.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-ebb.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-linux-pmu.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-spr.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-core.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-fpu.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-altivec.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-vsx.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-ppr.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-dscr.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-tar.xml"
|
|
srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-e500l.xml"
|
|
srv_xmlfiles="${srv_xmlfiles} rs6000/power-spe.xml"
|
|
srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-64l.xml"
|
|
@@ -249,8 +271,12 @@ case "${target}" in
|
|
srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-64l.xml"
|
|
srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-altivec64l.xml"
|
|
srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-vsx64l.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-vsx64l.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-htm-vsx64l.xml"
|
|
srv_xmlfiles="${srv_xmlfiles} rs6000/power64-core.xml"
|
|
srv_xmlfiles="${srv_xmlfiles} rs6000/power64-linux.xml"
|
|
+ srv_xmlfiles="${srv_xmlfiles} rs6000/power64-htm-core.xml"
|
|
srv_linux_usrregs=yes
|
|
srv_linux_regsets=yes
|
|
srv_linux_thread_db=yes
|
|
Index: gdb-8.2/gdb/gdbserver/linux-ppc-ipa.c
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/gdbserver/linux-ppc-ipa.c 2018-09-05 09:27:13.000000000 +0200
|
|
+++ gdb-8.2/gdb/gdbserver/linux-ppc-ipa.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -191,6 +191,12 @@ get_ipa_tdesc (int idx)
|
|
return tdesc_powerpc_isa205_altivec64l;
|
|
case PPC_TDESC_ISA205_VSX:
|
|
return tdesc_powerpc_isa205_vsx64l;
|
|
+ case PPC_TDESC_ISA205_PPR_DSCR_VSX:
|
|
+ return tdesc_powerpc_isa205_ppr_dscr_vsx64l;
|
|
+ case PPC_TDESC_ISA207_VSX:
|
|
+ return tdesc_powerpc_isa207_vsx64l;
|
|
+ case PPC_TDESC_ISA207_HTM_VSX:
|
|
+ return tdesc_powerpc_isa207_htm_vsx64l;
|
|
#else
|
|
case PPC_TDESC_BASE:
|
|
return tdesc_powerpc_32l;
|
|
@@ -206,6 +212,12 @@ get_ipa_tdesc (int idx)
|
|
return tdesc_powerpc_isa205_altivec32l;
|
|
case PPC_TDESC_ISA205_VSX:
|
|
return tdesc_powerpc_isa205_vsx32l;
|
|
+ case PPC_TDESC_ISA205_PPR_DSCR_VSX:
|
|
+ return tdesc_powerpc_isa205_ppr_dscr_vsx32l;
|
|
+ case PPC_TDESC_ISA207_VSX:
|
|
+ return tdesc_powerpc_isa207_vsx32l;
|
|
+ case PPC_TDESC_ISA207_HTM_VSX:
|
|
+ return tdesc_powerpc_isa207_htm_vsx32l;
|
|
case PPC_TDESC_E500:
|
|
return tdesc_powerpc_e500l;
|
|
#endif
|
|
@@ -234,6 +246,9 @@ initialize_low_tracepoint (void)
|
|
init_registers_powerpc_isa205_64l ();
|
|
init_registers_powerpc_isa205_altivec64l ();
|
|
init_registers_powerpc_isa205_vsx64l ();
|
|
+ init_registers_powerpc_isa205_ppr_dscr_vsx64l ();
|
|
+ init_registers_powerpc_isa207_vsx64l ();
|
|
+ init_registers_powerpc_isa207_htm_vsx64l ();
|
|
#else
|
|
init_registers_powerpc_32l ();
|
|
init_registers_powerpc_altivec32l ();
|
|
@@ -242,6 +257,9 @@ initialize_low_tracepoint (void)
|
|
init_registers_powerpc_isa205_32l ();
|
|
init_registers_powerpc_isa205_altivec32l ();
|
|
init_registers_powerpc_isa205_vsx32l ();
|
|
+ init_registers_powerpc_isa205_ppr_dscr_vsx32l ();
|
|
+ init_registers_powerpc_isa207_vsx32l ();
|
|
+ init_registers_powerpc_isa207_htm_vsx32l ();
|
|
init_registers_powerpc_e500l ();
|
|
#endif
|
|
}
|
|
Index: gdb-8.2/gdb/gdbserver/linux-ppc-tdesc-init.h
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/gdbserver/linux-ppc-tdesc-init.h 2018-09-05 09:27:13.000000000 +0200
|
|
+++ gdb-8.2/gdb/gdbserver/linux-ppc-tdesc-init.h 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -29,6 +29,9 @@ enum ppc_linux_tdesc {
|
|
PPC_TDESC_ISA205,
|
|
PPC_TDESC_ISA205_ALTIVEC,
|
|
PPC_TDESC_ISA205_VSX,
|
|
+ PPC_TDESC_ISA205_PPR_DSCR_VSX,
|
|
+ PPC_TDESC_ISA207_VSX,
|
|
+ PPC_TDESC_ISA207_HTM_VSX,
|
|
PPC_TDESC_E500,
|
|
};
|
|
|
|
@@ -55,6 +58,15 @@ void init_registers_powerpc_isa205_altiv
|
|
/* Defined in auto-generated file powerpc-isa205-vsx32l.c. */
|
|
void init_registers_powerpc_isa205_vsx32l (void);
|
|
|
|
+/* Defined in auto-generated file powerpc-isa205-ppr-dscr-vsx32l.c. */
|
|
+void init_registers_powerpc_isa205_ppr_dscr_vsx32l (void);
|
|
+
|
|
+/* Defined in auto-generated file powerpc-isa207-vsx32l.c. */
|
|
+void init_registers_powerpc_isa207_vsx32l (void);
|
|
+
|
|
+/* Defined in auto-generated file powerpc-isa207-htm-vsx32l.c. */
|
|
+void init_registers_powerpc_isa207_htm_vsx32l (void);
|
|
+
|
|
/* Defined in auto-generated file powerpc-e500l.c. */
|
|
void init_registers_powerpc_e500l (void);
|
|
|
|
@@ -83,4 +95,13 @@ void init_registers_powerpc_isa205_altiv
|
|
/* Defined in auto-generated file powerpc-isa205-vsx64l.c. */
|
|
void init_registers_powerpc_isa205_vsx64l (void);
|
|
|
|
+/* Defined in auto-generated file powerpc-isa205-ppr-dscr-vsx64l.c. */
|
|
+void init_registers_powerpc_isa205_ppr_dscr_vsx64l (void);
|
|
+
|
|
+/* Defined in auto-generated file powerpc-isa207-vsx64l.c. */
|
|
+void init_registers_powerpc_isa207_vsx64l (void);
|
|
+
|
|
+/* Defined in auto-generated file powerpc-isa207-htm-vsx64l.c. */
|
|
+void init_registers_powerpc_isa207_htm_vsx64l (void);
|
|
+
|
|
#endif
|
|
Index: gdb-8.2/gdb/nat/ppc-linux.h
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/nat/ppc-linux.h 2018-09-05 09:27:13.000000000 +0200
|
|
+++ gdb-8.2/gdb/nat/ppc-linux.h 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -51,6 +51,21 @@
|
|
#ifndef PPC_FEATURE_HAS_SPE
|
|
#define PPC_FEATURE_HAS_SPE 0x00800000
|
|
#endif
|
|
+#ifndef PPC_FEATURE2_DSCR
|
|
+#define PPC_FEATURE2_DSCR 0x20000000
|
|
+#endif
|
|
+#ifndef PPC_FEATURE2_ARCH_2_07
|
|
+#define PPC_FEATURE2_ARCH_2_07 0x80000000
|
|
+#endif
|
|
+#ifndef PPC_FEATURE2_TAR
|
|
+#define PPC_FEATURE2_TAR 0x04000000
|
|
+#endif
|
|
+#ifndef PPC_FEATURE2_EBB
|
|
+#define PPC_FEATURE2_EBB 0x10000000
|
|
+#endif
|
|
+#ifndef PPC_FEATURE2_HTM
|
|
+#define PPC_FEATURE2_HTM 0x40000000
|
|
+#endif
|
|
|
|
/* Glibc's headers don't define PTRACE_GETVRREGS so we cannot use a
|
|
configure time check. Some older glibc's (for instance 2.2.1)
|
|
@@ -82,6 +97,71 @@
|
|
#define PTRACE_SETEVRREGS 21
|
|
#endif
|
|
|
|
+/* Target Address Register. */
|
|
+#ifndef NT_PPC_TAR
|
|
+#define NT_PPC_TAR 0x103
|
|
+#endif
|
|
+
|
|
+/* Program Priority Register. */
|
|
+#ifndef NT_PPC_PPR
|
|
+#define NT_PPC_PPR 0x104
|
|
+#endif
|
|
+
|
|
+/* Data Stream Control Register. */
|
|
+#ifndef NT_PPC_DSCR
|
|
+#define NT_PPC_DSCR 0x105
|
|
+#endif
|
|
+
|
|
+/* Event Based Branch Registers. */
|
|
+#ifndef NT_PPC_EBB
|
|
+#define NT_PPC_EBB 0x106
|
|
+#endif
|
|
+
|
|
+/* Performance Monitor Registers. */
|
|
+#ifndef NT_PPC_PMU
|
|
+#define NT_PPC_PMU 0x107
|
|
+#endif
|
|
+
|
|
+/* TM checkpointed GPR Registers. */
|
|
+#ifndef NT_PPC_TM_CGPR
|
|
+#define NT_PPC_TM_CGPR 0x108
|
|
+#endif
|
|
+
|
|
+/* TM checkpointed FPR Registers. */
|
|
+#ifndef NT_PPC_TM_CFPR
|
|
+#define NT_PPC_TM_CFPR 0x109
|
|
+#endif
|
|
+
|
|
+/* TM checkpointed VMX Registers. */
|
|
+#ifndef NT_PPC_TM_CVMX
|
|
+#define NT_PPC_TM_CVMX 0x10a
|
|
+#endif
|
|
+
|
|
+/* TM checkpointed VSX Registers. */
|
|
+#ifndef NT_PPC_TM_CVSX
|
|
+#define NT_PPC_TM_CVSX 0x10b
|
|
+#endif
|
|
+
|
|
+/* TM Special Purpose Registers. */
|
|
+#ifndef NT_PPC_TM_SPR
|
|
+#define NT_PPC_TM_SPR 0x10c
|
|
+#endif
|
|
+
|
|
+/* TM checkpointed Target Address Register. */
|
|
+#ifndef NT_PPC_TM_CTAR
|
|
+#define NT_PPC_TM_CTAR 0x10d
|
|
+#endif
|
|
+
|
|
+/* TM checkpointed Program Priority Register. */
|
|
+#ifndef NT_PPC_TM_CPPR
|
|
+#define NT_PPC_TM_CPPR 0x10e
|
|
+#endif
|
|
+
|
|
+/* TM checkpointed Data Stream Control Register. */
|
|
+#ifndef NT_PPC_TM_CDSCR
|
|
+#define NT_PPC_TM_CDSCR 0x10f
|
|
+#endif
|
|
+
|
|
/* Return the wordsize of the target, either 4 or 8 bytes. */
|
|
int ppc_linux_target_wordsize (int tid);
|
|
|
|
Index: gdb-8.2/gdb/ppc-linux-tdep.h
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/ppc-linux-tdep.h 2018-09-05 09:27:13.000000000 +0200
|
|
+++ gdb-8.2/gdb/ppc-linux-tdep.h 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -32,6 +32,14 @@ const struct regset *ppc_linux_fpregset
|
|
const struct regset *ppc_linux_vrregset (struct gdbarch *gdbarch);
|
|
const struct regset *ppc_linux_vsxregset (void);
|
|
|
|
+/* Get the checkpointed GPR regset that matches the target wordsize
|
|
+ and byteorder of GDBARCH. */
|
|
+const struct regset *ppc_linux_cgprregset (struct gdbarch *gdbarch);
|
|
+
|
|
+/* Get the checkpointed vector regset that matches the target byte
|
|
+ order. */
|
|
+const struct regset* ppc_linux_cvmxregset (struct gdbarch *gdbarch);
|
|
+
|
|
/* Extra register number constants. The Linux kernel stores a
|
|
"trap" code and the original value of r3 into special "registers";
|
|
these need to be saved and restored when performing an inferior
|
|
@@ -44,4 +52,17 @@ enum {
|
|
/* Return 1 if PPC_ORIG_R3_REGNUM and PPC_TRAP_REGNUM are usable. */
|
|
int ppc_linux_trap_reg_p (struct gdbarch *gdbarch);
|
|
|
|
+/* Additional register sets, defined in ppc-linux-tdep.c. */
|
|
+extern const struct regset ppc32_linux_pprregset;
|
|
+extern const struct regset ppc32_linux_dscrregset;
|
|
+extern const struct regset ppc32_linux_tarregset;
|
|
+extern const struct regset ppc32_linux_ebbregset;
|
|
+extern const struct regset ppc32_linux_pmuregset;
|
|
+extern const struct regset ppc32_linux_tm_sprregset;
|
|
+extern const struct regset ppc32_linux_cfprregset;
|
|
+extern const struct regset ppc32_linux_cvsxregset;
|
|
+extern const struct regset ppc32_linux_cpprregset;
|
|
+extern const struct regset ppc32_linux_cdscrregset;
|
|
+extern const struct regset ppc32_linux_ctarregset;
|
|
+
|
|
#endif /* PPC_LINUX_TDEP_H */
|
|
Index: gdb-8.2/gdb/ppc-tdep.h
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/ppc-tdep.h 2018-09-05 09:27:13.000000000 +0200
|
|
+++ gdb-8.2/gdb/ppc-tdep.h 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -253,9 +253,42 @@ struct gdbarch_tdep
|
|
int ppc_acc_regnum; /* SPE 'acc' register. */
|
|
int ppc_spefscr_regnum; /* SPE 'spefscr' register. */
|
|
|
|
+ /* Program Priority Register. */
|
|
+ int ppc_ppr_regnum;
|
|
+
|
|
+ /* Data Stream Control Register. */
|
|
+ int ppc_dscr_regnum;
|
|
+
|
|
+ /* Target Address Register. */
|
|
+ int ppc_tar_regnum;
|
|
+
|
|
/* Decimal 128 registers. */
|
|
int ppc_dl0_regnum; /* First Decimal128 argument register pair. */
|
|
|
|
+ int have_ebb;
|
|
+
|
|
+ /* PMU registers. */
|
|
+ int ppc_mmcr0_regnum;
|
|
+ int ppc_mmcr2_regnum;
|
|
+ int ppc_siar_regnum;
|
|
+ int ppc_sdar_regnum;
|
|
+ int ppc_sier_regnum;
|
|
+
|
|
+ /* Hardware Transactional Memory registers. */
|
|
+ int have_htm_spr;
|
|
+ int have_htm_core;
|
|
+ int have_htm_fpu;
|
|
+ int have_htm_altivec;
|
|
+ int have_htm_vsx;
|
|
+ int ppc_cppr_regnum;
|
|
+ int ppc_cdscr_regnum;
|
|
+ int ppc_ctar_regnum;
|
|
+
|
|
+ /* HTM pseudo registers. */
|
|
+ int ppc_cdl0_regnum;
|
|
+ int ppc_cvsr0_regnum;
|
|
+ int ppc_cefpr0_regnum;
|
|
+
|
|
/* Offset to ABI specific location where link register is saved. */
|
|
int lr_frame_offset;
|
|
|
|
@@ -309,12 +342,72 @@ enum {
|
|
PPC_VRSAVE_REGNUM = 139,
|
|
PPC_VSR0_UPPER_REGNUM = 140,
|
|
PPC_VSR31_UPPER_REGNUM = 171,
|
|
+ PPC_PPR_REGNUM = 172,
|
|
+ PPC_DSCR_REGNUM = 173,
|
|
+ PPC_TAR_REGNUM = 174,
|
|
+
|
|
+ /* EBB registers. */
|
|
+ PPC_BESCR_REGNUM = 175,
|
|
+ PPC_EBBHR_REGNUM = 176,
|
|
+ PPC_EBBRR_REGNUM = 177,
|
|
+
|
|
+ /* PMU registers. */
|
|
+ PPC_MMCR0_REGNUM = 178,
|
|
+ PPC_MMCR2_REGNUM = 179,
|
|
+ PPC_SIAR_REGNUM = 180,
|
|
+ PPC_SDAR_REGNUM = 181,
|
|
+ PPC_SIER_REGNUM = 182,
|
|
+
|
|
+ /* Hardware transactional memory registers. */
|
|
+ PPC_TFHAR_REGNUM = 183,
|
|
+ PPC_TEXASR_REGNUM = 184,
|
|
+ PPC_TFIAR_REGNUM = 185,
|
|
+
|
|
+ PPC_CR0_REGNUM = 186,
|
|
+ PPC_CCR_REGNUM = 218,
|
|
+ PPC_CXER_REGNUM = 219,
|
|
+ PPC_CLR_REGNUM = 220,
|
|
+ PPC_CCTR_REGNUM = 221,
|
|
+
|
|
+ PPC_CF0_REGNUM = 222,
|
|
+ PPC_CFPSCR_REGNUM = 254,
|
|
+
|
|
+ PPC_CVR0_REGNUM = 255,
|
|
+ PPC_CVSCR_REGNUM = 287,
|
|
+ PPC_CVRSAVE_REGNUM = 288,
|
|
+
|
|
+ PPC_CVSR0_UPPER_REGNUM = 289,
|
|
+
|
|
+ PPC_CPPR_REGNUM = 321,
|
|
+ PPC_CDSCR_REGNUM = 322,
|
|
+ PPC_CTAR_REGNUM = 323,
|
|
PPC_NUM_REGS
|
|
};
|
|
|
|
/* Big enough to hold the size of the largest register in bytes. */
|
|
#define PPC_MAX_REGISTER_SIZE 64
|
|
|
|
+#define PPC_IS_EBB_REGNUM(i) \
|
|
+ ((i) >= PPC_BESCR_REGNUM && (i) <= PPC_EBBRR_REGNUM)
|
|
+
|
|
+#define PPC_IS_PMU_REGNUM(i) \
|
|
+ ((i) >= PPC_MMCR0_REGNUM && (i) <= PPC_SIER_REGNUM)
|
|
+
|
|
+#define PPC_IS_TMSPR_REGNUM(i) \
|
|
+ ((i) >= PPC_TFHAR_REGNUM && (i) <= PPC_TFIAR_REGNUM)
|
|
+
|
|
+#define PPC_IS_CKPTGP_REGNUM(i) \
|
|
+ ((i) >= PPC_CR0_REGNUM && (i) <= PPC_CCTR_REGNUM)
|
|
+
|
|
+#define PPC_IS_CKPTFP_REGNUM(i) \
|
|
+ ((i) >= PPC_CF0_REGNUM && (i) <= PPC_CFPSCR_REGNUM)
|
|
+
|
|
+#define PPC_IS_CKPTVMX_REGNUM(i) \
|
|
+ ((i) >= PPC_CVR0_REGNUM && (i) <= PPC_CVRSAVE_REGNUM)
|
|
+
|
|
+#define PPC_IS_CKPTVSX_REGNUM(i) \
|
|
+ ((i) >= PPC_CVSR0_UPPER_REGNUM && (i) < (PPC_CVSR0_UPPER_REGNUM + 32))
|
|
+
|
|
/* An instruction to match. */
|
|
|
|
struct ppc_insn_pattern
|
|
Index: gdb-8.2/gdb/regformats/rs6000/powerpc-isa205-ppr-dscr-vsx32l.dat
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/regformats/rs6000/powerpc-isa205-ppr-dscr-vsx32l.dat 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,146 @@
|
|
+# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro:
|
|
+# Generated from: rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml
|
|
+name:powerpc_isa205_ppr_dscr_vsx32l
|
|
+xmltarget:powerpc-isa205-ppr-dscr-vsx32l.xml
|
|
+expedite:r1,pc
|
|
+32:r0
|
|
+32:r1
|
|
+32:r2
|
|
+32:r3
|
|
+32:r4
|
|
+32:r5
|
|
+32:r6
|
|
+32:r7
|
|
+32:r8
|
|
+32:r9
|
|
+32:r10
|
|
+32:r11
|
|
+32:r12
|
|
+32:r13
|
|
+32:r14
|
|
+32:r15
|
|
+32:r16
|
|
+32:r17
|
|
+32:r18
|
|
+32:r19
|
|
+32:r20
|
|
+32:r21
|
|
+32:r22
|
|
+32:r23
|
|
+32:r24
|
|
+32:r25
|
|
+32:r26
|
|
+32:r27
|
|
+32:r28
|
|
+32:r29
|
|
+32:r30
|
|
+32:r31
|
|
+64:f0
|
|
+64:f1
|
|
+64:f2
|
|
+64:f3
|
|
+64:f4
|
|
+64:f5
|
|
+64:f6
|
|
+64:f7
|
|
+64:f8
|
|
+64:f9
|
|
+64:f10
|
|
+64:f11
|
|
+64:f12
|
|
+64:f13
|
|
+64:f14
|
|
+64:f15
|
|
+64:f16
|
|
+64:f17
|
|
+64:f18
|
|
+64:f19
|
|
+64:f20
|
|
+64:f21
|
|
+64:f22
|
|
+64:f23
|
|
+64:f24
|
|
+64:f25
|
|
+64:f26
|
|
+64:f27
|
|
+64:f28
|
|
+64:f29
|
|
+64:f30
|
|
+64:f31
|
|
+32:pc
|
|
+32:msr
|
|
+32:cr
|
|
+32:lr
|
|
+32:ctr
|
|
+32:xer
|
|
+64:fpscr
|
|
+32:orig_r3
|
|
+32:trap
|
|
+128:vr0
|
|
+128:vr1
|
|
+128:vr2
|
|
+128:vr3
|
|
+128:vr4
|
|
+128:vr5
|
|
+128:vr6
|
|
+128:vr7
|
|
+128:vr8
|
|
+128:vr9
|
|
+128:vr10
|
|
+128:vr11
|
|
+128:vr12
|
|
+128:vr13
|
|
+128:vr14
|
|
+128:vr15
|
|
+128:vr16
|
|
+128:vr17
|
|
+128:vr18
|
|
+128:vr19
|
|
+128:vr20
|
|
+128:vr21
|
|
+128:vr22
|
|
+128:vr23
|
|
+128:vr24
|
|
+128:vr25
|
|
+128:vr26
|
|
+128:vr27
|
|
+128:vr28
|
|
+128:vr29
|
|
+128:vr30
|
|
+128:vr31
|
|
+32:vscr
|
|
+32:vrsave
|
|
+64:vs0h
|
|
+64:vs1h
|
|
+64:vs2h
|
|
+64:vs3h
|
|
+64:vs4h
|
|
+64:vs5h
|
|
+64:vs6h
|
|
+64:vs7h
|
|
+64:vs8h
|
|
+64:vs9h
|
|
+64:vs10h
|
|
+64:vs11h
|
|
+64:vs12h
|
|
+64:vs13h
|
|
+64:vs14h
|
|
+64:vs15h
|
|
+64:vs16h
|
|
+64:vs17h
|
|
+64:vs18h
|
|
+64:vs19h
|
|
+64:vs20h
|
|
+64:vs21h
|
|
+64:vs22h
|
|
+64:vs23h
|
|
+64:vs24h
|
|
+64:vs25h
|
|
+64:vs26h
|
|
+64:vs27h
|
|
+64:vs28h
|
|
+64:vs29h
|
|
+64:vs30h
|
|
+64:vs31h
|
|
+64:ppr
|
|
+64:dscr
|
|
Index: gdb-8.2/gdb/regformats/rs6000/powerpc-isa205-ppr-dscr-vsx64l.dat
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/regformats/rs6000/powerpc-isa205-ppr-dscr-vsx64l.dat 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,146 @@
|
|
+# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro:
|
|
+# Generated from: rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml
|
|
+name:powerpc_isa205_ppr_dscr_vsx64l
|
|
+xmltarget:powerpc-isa205-ppr-dscr-vsx64l.xml
|
|
+expedite:r1,pc
|
|
+64:r0
|
|
+64:r1
|
|
+64:r2
|
|
+64:r3
|
|
+64:r4
|
|
+64:r5
|
|
+64:r6
|
|
+64:r7
|
|
+64:r8
|
|
+64:r9
|
|
+64:r10
|
|
+64:r11
|
|
+64:r12
|
|
+64:r13
|
|
+64:r14
|
|
+64:r15
|
|
+64:r16
|
|
+64:r17
|
|
+64:r18
|
|
+64:r19
|
|
+64:r20
|
|
+64:r21
|
|
+64:r22
|
|
+64:r23
|
|
+64:r24
|
|
+64:r25
|
|
+64:r26
|
|
+64:r27
|
|
+64:r28
|
|
+64:r29
|
|
+64:r30
|
|
+64:r31
|
|
+64:f0
|
|
+64:f1
|
|
+64:f2
|
|
+64:f3
|
|
+64:f4
|
|
+64:f5
|
|
+64:f6
|
|
+64:f7
|
|
+64:f8
|
|
+64:f9
|
|
+64:f10
|
|
+64:f11
|
|
+64:f12
|
|
+64:f13
|
|
+64:f14
|
|
+64:f15
|
|
+64:f16
|
|
+64:f17
|
|
+64:f18
|
|
+64:f19
|
|
+64:f20
|
|
+64:f21
|
|
+64:f22
|
|
+64:f23
|
|
+64:f24
|
|
+64:f25
|
|
+64:f26
|
|
+64:f27
|
|
+64:f28
|
|
+64:f29
|
|
+64:f30
|
|
+64:f31
|
|
+64:pc
|
|
+64:msr
|
|
+32:cr
|
|
+64:lr
|
|
+64:ctr
|
|
+32:xer
|
|
+64:fpscr
|
|
+64:orig_r3
|
|
+64:trap
|
|
+128:vr0
|
|
+128:vr1
|
|
+128:vr2
|
|
+128:vr3
|
|
+128:vr4
|
|
+128:vr5
|
|
+128:vr6
|
|
+128:vr7
|
|
+128:vr8
|
|
+128:vr9
|
|
+128:vr10
|
|
+128:vr11
|
|
+128:vr12
|
|
+128:vr13
|
|
+128:vr14
|
|
+128:vr15
|
|
+128:vr16
|
|
+128:vr17
|
|
+128:vr18
|
|
+128:vr19
|
|
+128:vr20
|
|
+128:vr21
|
|
+128:vr22
|
|
+128:vr23
|
|
+128:vr24
|
|
+128:vr25
|
|
+128:vr26
|
|
+128:vr27
|
|
+128:vr28
|
|
+128:vr29
|
|
+128:vr30
|
|
+128:vr31
|
|
+32:vscr
|
|
+32:vrsave
|
|
+64:vs0h
|
|
+64:vs1h
|
|
+64:vs2h
|
|
+64:vs3h
|
|
+64:vs4h
|
|
+64:vs5h
|
|
+64:vs6h
|
|
+64:vs7h
|
|
+64:vs8h
|
|
+64:vs9h
|
|
+64:vs10h
|
|
+64:vs11h
|
|
+64:vs12h
|
|
+64:vs13h
|
|
+64:vs14h
|
|
+64:vs15h
|
|
+64:vs16h
|
|
+64:vs17h
|
|
+64:vs18h
|
|
+64:vs19h
|
|
+64:vs20h
|
|
+64:vs21h
|
|
+64:vs22h
|
|
+64:vs23h
|
|
+64:vs24h
|
|
+64:vs25h
|
|
+64:vs26h
|
|
+64:vs27h
|
|
+64:vs28h
|
|
+64:vs29h
|
|
+64:vs30h
|
|
+64:vs31h
|
|
+64:ppr
|
|
+64:dscr
|
|
Index: gdb-8.2/gdb/testsuite/gdb.arch/powerpc-ppr-dscr.c
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/testsuite/gdb.arch/powerpc-ppr-dscr.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,34 @@
|
|
+/* This testcase is part of GDB, the GNU debugger.
|
|
+
|
|
+ Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ This program is free software; you can redistribute it and/or modify
|
|
+ it under the terms of the GNU General Public License as published by
|
|
+ the Free Software Foundation; either version 3 of the License, or
|
|
+ (at your option) any later version.
|
|
+
|
|
+ This program is distributed in the hope that it will be useful,
|
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+ GNU General Public License for more details.
|
|
+
|
|
+ You should have received a copy of the GNU General Public License
|
|
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
+
|
|
+int main (void)
|
|
+{
|
|
+ /* Set Load Stream Disable bit in DSCR. */
|
|
+ unsigned long dscr = 0x20;
|
|
+
|
|
+ /* This is the non-privileged SPR number to access DSCR,
|
|
+ available since isa 207. */
|
|
+ asm volatile ("mtspr 3,%0" : : "r" (dscr));
|
|
+
|
|
+ /* Set PPR to low priority (010 in bits 11:13, or
|
|
+ 0x0008000000000000). */
|
|
+ asm volatile ("or 1,1,1");
|
|
+ asm volatile ("nop"); // marker
|
|
+ asm volatile ("nop");
|
|
+
|
|
+ return 0;
|
|
+}
|
|
Index: gdb-8.2/gdb/testsuite/gdb.arch/powerpc-ppr-dscr.exp
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/testsuite/gdb.arch/powerpc-ppr-dscr.exp 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,120 @@
|
|
+# Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+# This program is free software; you can redistribute it and/or modify
|
|
+# it under the terms of the GNU General Public License as published by
|
|
+# the Free Software Foundation; either version 3 of the License, or
|
|
+# (at your option) any later version.
|
|
+#
|
|
+# This program is distributed in the hope that it will be useful,
|
|
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+# GNU General Public License for more details.
|
|
+#
|
|
+# You should have received a copy of the GNU General Public License
|
|
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
+
|
|
+# This file is part of the gdb testsuite.
|
|
+
|
|
+# Test access to special purpose registers PPR and DSCR. The test
|
|
+# inferior writes to these registers, we check that GDB reads the same
|
|
+# values, then write to the registers trough GDB, step once, and check
|
|
+# again if we read back the same values.
|
|
+
|
|
+if {![istarget "powerpc*-*-linux*"]} then {
|
|
+ verbose "Skipping PowerPC test for PPR and DSCR registers."
|
|
+ return
|
|
+}
|
|
+
|
|
+standard_testfile .c
|
|
+
|
|
+if {[build_executable "compile" $binfile $srcfile {debug}] == -1} {
|
|
+ return
|
|
+}
|
|
+
|
|
+proc check_register_access { regname } {
|
|
+ global gdb_prompt
|
|
+
|
|
+ set test "$regname register access"
|
|
+ gdb_test_multiple "info reg $regname" "$test" {
|
|
+ -re "Invalid register.*\r\n$gdb_prompt $" {
|
|
+ unsupported "$test"
|
|
+ return 0
|
|
+ }
|
|
+ -re "\r\n$regname.*\r\n$gdb_prompt $" {
|
|
+ pass "$test"
|
|
+ return 1
|
|
+ }
|
|
+ }
|
|
+ return 0
|
|
+}
|
|
+
|
|
+# Do one pass to check if the instructions in our test programs are
|
|
+# available to this processor (e.g. mtspr 3, RS for accessing DSCR).
|
|
+proc ppr_dscr_available {} {
|
|
+ global gdb_prompt
|
|
+ global inferior_exited_re
|
|
+
|
|
+ set test "PPR/DSCR available to inferior"
|
|
+ gdb_test_multiple "continue" "" {
|
|
+ -re "Illegal instruction.*\r\n$gdb_prompt $" {
|
|
+ unsupported "$test"
|
|
+ return 0
|
|
+ }
|
|
+ -re "$inferior_exited_re normally.*$gdb_prompt $" {
|
|
+ pass "$test"
|
|
+ return 1
|
|
+ }
|
|
+ }
|
|
+ return 0
|
|
+}
|
|
+
|
|
+with_test_prefix "check PPR/DSCR access" {
|
|
+ clean_restart $binfile
|
|
+
|
|
+ if ![runto_main] {
|
|
+ return
|
|
+ }
|
|
+
|
|
+ if {![check_register_access "ppr"]} {
|
|
+ return
|
|
+ }
|
|
+
|
|
+ if {![check_register_access "dscr"]} {
|
|
+ return
|
|
+ }
|
|
+
|
|
+ if {![ppr_dscr_available]} {
|
|
+ return
|
|
+ }
|
|
+}
|
|
+
|
|
+# Now do the actual test
|
|
+clean_restart $binfile
|
|
+
|
|
+if ![runto_main] {
|
|
+ return
|
|
+}
|
|
+
|
|
+gdb_breakpoint [gdb_get_line_number "marker"]
|
|
+
|
|
+gdb_continue_to_breakpoint "continue to marker"
|
|
+
|
|
+# At the breakpoint the inferior should have set the
|
|
+# registers to these expected values.
|
|
+
|
|
+with_test_prefix "before write" {
|
|
+ gdb_test "info reg dscr" "dscr.*0x0*20\[ \t\]+.*"
|
|
+ gdb_test "info reg ppr" "ppr.*0x0*8000000000000\[ \t\]+.*"
|
|
+}
|
|
+
|
|
+# Set Store Stream Enable in DSCR and set PPR to the medium-low
|
|
+# priority.
|
|
+gdb_test_no_output "set \$dscr = 0x8"
|
|
+gdb_test_no_output "set \$ppr = 0xC000000000000"
|
|
+
|
|
+gdb_test "stepi" "asm.*"
|
|
+
|
|
+with_test_prefix "after write" {
|
|
+ gdb_test "info reg dscr" "dscr.*0x0*8+\[ \t\]+.*"
|
|
+ gdb_test "info reg ppr" "ppr.*0x0*\[cC\]000000000000\[ \t\]+.*"
|
|
+}
|
|
Index: gdb-8.2/gdb/features/rs6000/power-tar.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/power-tar.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,12 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!-- POWER8 Target Address Register. -->
|
|
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
|
+<feature name="org.gnu.gdb.power.tar">
|
|
+ <reg name="tar" bitsize="64" type="uint64"/>
|
|
+</feature>
|
|
Index: gdb-8.2/gdb/features/rs6000/powerpc-isa207-vsx32l.c
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/powerpc-isa207-vsx32l.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,215 @@
|
|
+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
|
|
+ Original: powerpc-isa207-vsx32l.xml */
|
|
+
|
|
+#include "defs.h"
|
|
+#include "osabi.h"
|
|
+#include "target-descriptions.h"
|
|
+
|
|
+struct target_desc *tdesc_powerpc_isa207_vsx32l;
|
|
+static void
|
|
+initialize_tdesc_powerpc_isa207_vsx32l (void)
|
|
+{
|
|
+ struct target_desc *result = allocate_target_description ();
|
|
+ set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
|
|
+
|
|
+ struct tdesc_feature *feature;
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
|
|
+ tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r26", 26, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r27", 27, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r28", 28, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r29", 29, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r31", 31, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "pc", 64, 1, NULL, 32, "code_ptr");
|
|
+ tdesc_create_reg (feature, "msr", 65, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "lr", 67, 1, NULL, 32, "code_ptr");
|
|
+ tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
|
|
+ tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
|
|
+ tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int");
|
|
+ tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
|
|
+ tdesc_type *element_type;
|
|
+ element_type = tdesc_named_type (feature, "ieee_single");
|
|
+ tdesc_create_vector (feature, "v4f", element_type, 4);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int32");
|
|
+ tdesc_create_vector (feature, "v4i32", element_type, 4);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int16");
|
|
+ tdesc_create_vector (feature, "v8i16", element_type, 8);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int8");
|
|
+ tdesc_create_vector (feature, "v16i8", element_type, 16);
|
|
+
|
|
+ tdesc_type_with_fields *type_with_fields;
|
|
+ type_with_fields = tdesc_create_union (feature, "vec128");
|
|
+ tdesc_type *field_type;
|
|
+ field_type = tdesc_named_type (feature, "uint128");
|
|
+ tdesc_add_field (type_with_fields, "uint128", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v4f");
|
|
+ tdesc_add_field (type_with_fields, "v4_float", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v4i32");
|
|
+ tdesc_add_field (type_with_fields, "v4_int32", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v8i16");
|
|
+ tdesc_add_field (type_with_fields, "v8_int16", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v16i8");
|
|
+ tdesc_add_field (type_with_fields, "v16_int8", field_type);
|
|
+
|
|
+ tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
|
|
+ tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
|
|
+ tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs3h", 110, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs4h", 111, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs5h", 112, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs6h", 113, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs7h", 114, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs8h", 115, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs9h", 116, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs10h", 117, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs11h", 118, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs12h", 119, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs13h", 120, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs14h", 121, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs15h", 122, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs16h", 123, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs17h", 124, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs18h", 125, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs19h", 126, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs20h", 127, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs21h", 128, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs22h", 129, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs23h", 130, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs24h", 131, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs25h", 132, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs26h", 133, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs27h", 134, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs28h", 135, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs29h", 136, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr");
|
|
+ tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr");
|
|
+ tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.tar");
|
|
+ tdesc_create_reg (feature, "tar", 141, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ebb");
|
|
+ tdesc_create_reg (feature, "bescr", 142, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "ebbhr", 143, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "ebbrr", 144, 0, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux.pmu");
|
|
+ tdesc_create_reg (feature, "mmcr0", 145, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "mmcr2", 146, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "siar", 147, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "sdar", 148, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "sier", 149, 0, NULL, 64, "uint64");
|
|
+
|
|
+ tdesc_powerpc_isa207_vsx32l = result;
|
|
+}
|
|
Index: gdb-8.2/gdb/features/rs6000/powerpc-isa207-vsx32l.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/powerpc-isa207-vsx32l.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,21 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
|
|
+<target>
|
|
+ <architecture>powerpc:common</architecture>
|
|
+ <xi:include href="power-core.xml"/>
|
|
+ <xi:include href="power-fpu-isa205.xml"/>
|
|
+ <xi:include href="power-linux.xml"/>
|
|
+ <xi:include href="power-altivec.xml"/>
|
|
+ <xi:include href="power-vsx.xml"/>
|
|
+ <xi:include href="power-ppr.xml"/>
|
|
+ <xi:include href="power-dscr.xml"/>
|
|
+ <xi:include href="power-tar.xml"/>
|
|
+ <xi:include href="power-ebb.xml"/>
|
|
+ <xi:include href="power-linux-pmu.xml"/>
|
|
+</target>
|
|
Index: gdb-8.2/gdb/features/rs6000/powerpc-isa207-vsx64l.c
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/powerpc-isa207-vsx64l.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,215 @@
|
|
+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
|
|
+ Original: powerpc-isa207-vsx64l.xml */
|
|
+
|
|
+#include "defs.h"
|
|
+#include "osabi.h"
|
|
+#include "target-descriptions.h"
|
|
+
|
|
+struct target_desc *tdesc_powerpc_isa207_vsx64l;
|
|
+static void
|
|
+initialize_tdesc_powerpc_isa207_vsx64l (void)
|
|
+{
|
|
+ struct target_desc *result = allocate_target_description ();
|
|
+ set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
|
|
+
|
|
+ struct tdesc_feature *feature;
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
|
|
+ tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r3", 3, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r4", 4, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r5", 5, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r6", 6, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r7", 7, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r16", 16, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r17", 17, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r18", 18, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r19", 19, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r20", 20, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r21", 21, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r22", 22, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r23", 23, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r24", 24, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r25", 25, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r26", 26, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r27", 27, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r28", 28, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r29", 29, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r30", 30, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r31", 31, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "pc", 64, 1, NULL, 64, "code_ptr");
|
|
+ tdesc_create_reg (feature, "msr", 65, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "lr", 67, 1, NULL, 64, "code_ptr");
|
|
+ tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
|
|
+ tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
|
|
+ tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int");
|
|
+ tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
|
|
+ tdesc_type *element_type;
|
|
+ element_type = tdesc_named_type (feature, "ieee_single");
|
|
+ tdesc_create_vector (feature, "v4f", element_type, 4);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int32");
|
|
+ tdesc_create_vector (feature, "v4i32", element_type, 4);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int16");
|
|
+ tdesc_create_vector (feature, "v8i16", element_type, 8);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int8");
|
|
+ tdesc_create_vector (feature, "v16i8", element_type, 16);
|
|
+
|
|
+ tdesc_type_with_fields *type_with_fields;
|
|
+ type_with_fields = tdesc_create_union (feature, "vec128");
|
|
+ tdesc_type *field_type;
|
|
+ field_type = tdesc_named_type (feature, "uint128");
|
|
+ tdesc_add_field (type_with_fields, "uint128", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v4f");
|
|
+ tdesc_add_field (type_with_fields, "v4_float", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v4i32");
|
|
+ tdesc_add_field (type_with_fields, "v4_int32", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v8i16");
|
|
+ tdesc_add_field (type_with_fields, "v8_int16", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v16i8");
|
|
+ tdesc_add_field (type_with_fields, "v16_int8", field_type);
|
|
+
|
|
+ tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
|
|
+ tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
|
|
+ tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs3h", 110, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs4h", 111, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs5h", 112, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs6h", 113, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs7h", 114, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs8h", 115, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs9h", 116, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs10h", 117, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs11h", 118, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs12h", 119, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs13h", 120, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs14h", 121, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs15h", 122, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs16h", 123, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs17h", 124, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs18h", 125, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs19h", 126, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs20h", 127, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs21h", 128, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs22h", 129, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs23h", 130, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs24h", 131, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs25h", 132, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs26h", 133, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs27h", 134, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs28h", 135, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs29h", 136, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr");
|
|
+ tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr");
|
|
+ tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.tar");
|
|
+ tdesc_create_reg (feature, "tar", 141, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ebb");
|
|
+ tdesc_create_reg (feature, "bescr", 142, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "ebbhr", 143, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "ebbrr", 144, 0, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux.pmu");
|
|
+ tdesc_create_reg (feature, "mmcr0", 145, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "mmcr2", 146, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "siar", 147, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "sdar", 148, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "sier", 149, 0, NULL, 64, "uint64");
|
|
+
|
|
+ tdesc_powerpc_isa207_vsx64l = result;
|
|
+}
|
|
Index: gdb-8.2/gdb/features/rs6000/powerpc-isa207-vsx64l.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/powerpc-isa207-vsx64l.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,21 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
|
|
+<target>
|
|
+ <architecture>powerpc:common64</architecture>
|
|
+ <xi:include href="power64-core.xml"/>
|
|
+ <xi:include href="power-fpu-isa205.xml"/>
|
|
+ <xi:include href="power64-linux.xml"/>
|
|
+ <xi:include href="power-altivec.xml"/>
|
|
+ <xi:include href="power-vsx.xml"/>
|
|
+ <xi:include href="power-ppr.xml"/>
|
|
+ <xi:include href="power-dscr.xml"/>
|
|
+ <xi:include href="power-tar.xml"/>
|
|
+ <xi:include href="power-ebb.xml"/>
|
|
+ <xi:include href="power-linux-pmu.xml"/>
|
|
+</target>
|
|
Index: gdb-8.2/gdb/regformats/rs6000/powerpc-isa207-vsx32l.dat
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/regformats/rs6000/powerpc-isa207-vsx32l.dat 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,155 @@
|
|
+# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro:
|
|
+# Generated from: rs6000/powerpc-isa207-vsx32l.xml
|
|
+name:powerpc_isa207_vsx32l
|
|
+xmltarget:powerpc-isa207-vsx32l.xml
|
|
+expedite:r1,pc
|
|
+32:r0
|
|
+32:r1
|
|
+32:r2
|
|
+32:r3
|
|
+32:r4
|
|
+32:r5
|
|
+32:r6
|
|
+32:r7
|
|
+32:r8
|
|
+32:r9
|
|
+32:r10
|
|
+32:r11
|
|
+32:r12
|
|
+32:r13
|
|
+32:r14
|
|
+32:r15
|
|
+32:r16
|
|
+32:r17
|
|
+32:r18
|
|
+32:r19
|
|
+32:r20
|
|
+32:r21
|
|
+32:r22
|
|
+32:r23
|
|
+32:r24
|
|
+32:r25
|
|
+32:r26
|
|
+32:r27
|
|
+32:r28
|
|
+32:r29
|
|
+32:r30
|
|
+32:r31
|
|
+64:f0
|
|
+64:f1
|
|
+64:f2
|
|
+64:f3
|
|
+64:f4
|
|
+64:f5
|
|
+64:f6
|
|
+64:f7
|
|
+64:f8
|
|
+64:f9
|
|
+64:f10
|
|
+64:f11
|
|
+64:f12
|
|
+64:f13
|
|
+64:f14
|
|
+64:f15
|
|
+64:f16
|
|
+64:f17
|
|
+64:f18
|
|
+64:f19
|
|
+64:f20
|
|
+64:f21
|
|
+64:f22
|
|
+64:f23
|
|
+64:f24
|
|
+64:f25
|
|
+64:f26
|
|
+64:f27
|
|
+64:f28
|
|
+64:f29
|
|
+64:f30
|
|
+64:f31
|
|
+32:pc
|
|
+32:msr
|
|
+32:cr
|
|
+32:lr
|
|
+32:ctr
|
|
+32:xer
|
|
+64:fpscr
|
|
+32:orig_r3
|
|
+32:trap
|
|
+128:vr0
|
|
+128:vr1
|
|
+128:vr2
|
|
+128:vr3
|
|
+128:vr4
|
|
+128:vr5
|
|
+128:vr6
|
|
+128:vr7
|
|
+128:vr8
|
|
+128:vr9
|
|
+128:vr10
|
|
+128:vr11
|
|
+128:vr12
|
|
+128:vr13
|
|
+128:vr14
|
|
+128:vr15
|
|
+128:vr16
|
|
+128:vr17
|
|
+128:vr18
|
|
+128:vr19
|
|
+128:vr20
|
|
+128:vr21
|
|
+128:vr22
|
|
+128:vr23
|
|
+128:vr24
|
|
+128:vr25
|
|
+128:vr26
|
|
+128:vr27
|
|
+128:vr28
|
|
+128:vr29
|
|
+128:vr30
|
|
+128:vr31
|
|
+32:vscr
|
|
+32:vrsave
|
|
+64:vs0h
|
|
+64:vs1h
|
|
+64:vs2h
|
|
+64:vs3h
|
|
+64:vs4h
|
|
+64:vs5h
|
|
+64:vs6h
|
|
+64:vs7h
|
|
+64:vs8h
|
|
+64:vs9h
|
|
+64:vs10h
|
|
+64:vs11h
|
|
+64:vs12h
|
|
+64:vs13h
|
|
+64:vs14h
|
|
+64:vs15h
|
|
+64:vs16h
|
|
+64:vs17h
|
|
+64:vs18h
|
|
+64:vs19h
|
|
+64:vs20h
|
|
+64:vs21h
|
|
+64:vs22h
|
|
+64:vs23h
|
|
+64:vs24h
|
|
+64:vs25h
|
|
+64:vs26h
|
|
+64:vs27h
|
|
+64:vs28h
|
|
+64:vs29h
|
|
+64:vs30h
|
|
+64:vs31h
|
|
+64:ppr
|
|
+64:dscr
|
|
+64:tar
|
|
+64:bescr
|
|
+64:ebbhr
|
|
+64:ebbrr
|
|
+64:mmcr0
|
|
+64:mmcr2
|
|
+64:siar
|
|
+64:sdar
|
|
+64:sier
|
|
Index: gdb-8.2/gdb/regformats/rs6000/powerpc-isa207-vsx64l.dat
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/regformats/rs6000/powerpc-isa207-vsx64l.dat 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,155 @@
|
|
+# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro:
|
|
+# Generated from: rs6000/powerpc-isa207-vsx64l.xml
|
|
+name:powerpc_isa207_vsx64l
|
|
+xmltarget:powerpc-isa207-vsx64l.xml
|
|
+expedite:r1,pc
|
|
+64:r0
|
|
+64:r1
|
|
+64:r2
|
|
+64:r3
|
|
+64:r4
|
|
+64:r5
|
|
+64:r6
|
|
+64:r7
|
|
+64:r8
|
|
+64:r9
|
|
+64:r10
|
|
+64:r11
|
|
+64:r12
|
|
+64:r13
|
|
+64:r14
|
|
+64:r15
|
|
+64:r16
|
|
+64:r17
|
|
+64:r18
|
|
+64:r19
|
|
+64:r20
|
|
+64:r21
|
|
+64:r22
|
|
+64:r23
|
|
+64:r24
|
|
+64:r25
|
|
+64:r26
|
|
+64:r27
|
|
+64:r28
|
|
+64:r29
|
|
+64:r30
|
|
+64:r31
|
|
+64:f0
|
|
+64:f1
|
|
+64:f2
|
|
+64:f3
|
|
+64:f4
|
|
+64:f5
|
|
+64:f6
|
|
+64:f7
|
|
+64:f8
|
|
+64:f9
|
|
+64:f10
|
|
+64:f11
|
|
+64:f12
|
|
+64:f13
|
|
+64:f14
|
|
+64:f15
|
|
+64:f16
|
|
+64:f17
|
|
+64:f18
|
|
+64:f19
|
|
+64:f20
|
|
+64:f21
|
|
+64:f22
|
|
+64:f23
|
|
+64:f24
|
|
+64:f25
|
|
+64:f26
|
|
+64:f27
|
|
+64:f28
|
|
+64:f29
|
|
+64:f30
|
|
+64:f31
|
|
+64:pc
|
|
+64:msr
|
|
+32:cr
|
|
+64:lr
|
|
+64:ctr
|
|
+32:xer
|
|
+64:fpscr
|
|
+64:orig_r3
|
|
+64:trap
|
|
+128:vr0
|
|
+128:vr1
|
|
+128:vr2
|
|
+128:vr3
|
|
+128:vr4
|
|
+128:vr5
|
|
+128:vr6
|
|
+128:vr7
|
|
+128:vr8
|
|
+128:vr9
|
|
+128:vr10
|
|
+128:vr11
|
|
+128:vr12
|
|
+128:vr13
|
|
+128:vr14
|
|
+128:vr15
|
|
+128:vr16
|
|
+128:vr17
|
|
+128:vr18
|
|
+128:vr19
|
|
+128:vr20
|
|
+128:vr21
|
|
+128:vr22
|
|
+128:vr23
|
|
+128:vr24
|
|
+128:vr25
|
|
+128:vr26
|
|
+128:vr27
|
|
+128:vr28
|
|
+128:vr29
|
|
+128:vr30
|
|
+128:vr31
|
|
+32:vscr
|
|
+32:vrsave
|
|
+64:vs0h
|
|
+64:vs1h
|
|
+64:vs2h
|
|
+64:vs3h
|
|
+64:vs4h
|
|
+64:vs5h
|
|
+64:vs6h
|
|
+64:vs7h
|
|
+64:vs8h
|
|
+64:vs9h
|
|
+64:vs10h
|
|
+64:vs11h
|
|
+64:vs12h
|
|
+64:vs13h
|
|
+64:vs14h
|
|
+64:vs15h
|
|
+64:vs16h
|
|
+64:vs17h
|
|
+64:vs18h
|
|
+64:vs19h
|
|
+64:vs20h
|
|
+64:vs21h
|
|
+64:vs22h
|
|
+64:vs23h
|
|
+64:vs24h
|
|
+64:vs25h
|
|
+64:vs26h
|
|
+64:vs27h
|
|
+64:vs28h
|
|
+64:vs29h
|
|
+64:vs30h
|
|
+64:vs31h
|
|
+64:ppr
|
|
+64:dscr
|
|
+64:tar
|
|
+64:bescr
|
|
+64:ebbhr
|
|
+64:ebbrr
|
|
+64:mmcr0
|
|
+64:mmcr2
|
|
+64:siar
|
|
+64:sdar
|
|
+64:sier
|
|
Index: gdb-8.2/gdb/testsuite/gdb.arch/powerpc-tar.c
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/testsuite/gdb.arch/powerpc-tar.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,33 @@
|
|
+/* This testcase is part of GDB, the GNU debugger.
|
|
+
|
|
+ Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ This program is free software; you can redistribute it and/or modify
|
|
+ it under the terms of the GNU General Public License as published by
|
|
+ the Free Software Foundation; either version 3 of the License, or
|
|
+ (at your option) any later version.
|
|
+
|
|
+ This program is distributed in the hope that it will be useful,
|
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+ GNU General Public License for more details.
|
|
+
|
|
+ You should have received a copy of the GNU General Public License
|
|
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
+
|
|
+int main (void)
|
|
+{
|
|
+ void * target1 = &&target1_l;
|
|
+ void * target2 = &&target2_l;
|
|
+ asm volatile ("mtspr 815,%0" : : "r" (target1) : );
|
|
+
|
|
+ /* Branch always to TAR. */
|
|
+ asm volatile ("bctar 20,0,0"); // marker
|
|
+
|
|
+ target2_l:
|
|
+ asm volatile ("nop"); // marker 2
|
|
+ target1_l:
|
|
+ asm volatile ("nop");
|
|
+
|
|
+ return 0;
|
|
+}
|
|
Index: gdb-8.2/gdb/testsuite/gdb.arch/powerpc-tar.exp
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/testsuite/gdb.arch/powerpc-tar.exp 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,122 @@
|
|
+# Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+# This program is free software; you can redistribute it and/or modify
|
|
+# it under the terms of the GNU General Public License as published by
|
|
+# the Free Software Foundation; either version 3 of the License, or
|
|
+# (at your option) any later version.
|
|
+#
|
|
+# This program is distributed in the hope that it will be useful,
|
|
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+# GNU General Public License for more details.
|
|
+#
|
|
+# You should have received a copy of the GNU General Public License
|
|
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
+
|
|
+# This file is part of the gdb testsuite.
|
|
+
|
|
+# Test access to special purpose register TAR (the Target Address
|
|
+# Register). The test inferior writes to this register, we check that
|
|
+# GDB reads the same value, then write to the register the address of
|
|
+# another label. We then let the inferior continue and execute a
|
|
+# branch to TAR and check that we stop at the address that we wrote to
|
|
+# register.
|
|
+
|
|
+if {![istarget "powerpc*-*-linux*"]} then {
|
|
+ verbose "Skipping PowerPC test for the TAR register."
|
|
+ return
|
|
+}
|
|
+
|
|
+standard_testfile .c
|
|
+
|
|
+if {[build_executable "compile" $binfile $srcfile {debug}] == -1} {
|
|
+ return -1
|
|
+}
|
|
+
|
|
+proc check_register_access { regname } {
|
|
+ global gdb_prompt
|
|
+
|
|
+ set test "$regname register access"
|
|
+ gdb_test_multiple "info reg $regname" "$test" {
|
|
+ -re "Invalid register.*\r\n$gdb_prompt $" {
|
|
+ unsupported "$test"
|
|
+ return 0
|
|
+ }
|
|
+ -re "\r\n$regname.*\r\n$gdb_prompt $" {
|
|
+ pass "$test"
|
|
+ return 1
|
|
+ }
|
|
+ }
|
|
+ return 0
|
|
+}
|
|
+
|
|
+proc tar_available {} {
|
|
+ global gdb_prompt
|
|
+ global inferior_exited_re
|
|
+
|
|
+ set test "TAR available to inferior"
|
|
+ gdb_test_multiple "continue" "" {
|
|
+ -re "Illegal instruction.*\r\n$gdb_prompt $" {
|
|
+ unsupported "$test"
|
|
+ return 0
|
|
+ }
|
|
+ -re "$inferior_exited_re normally.*$gdb_prompt $" {
|
|
+ pass "$test"
|
|
+ return 1
|
|
+ }
|
|
+ }
|
|
+ return 0
|
|
+}
|
|
+
|
|
+# Do one pass to check if TAR is usable, system
|
|
+# software can prevent it from being used.
|
|
+with_test_prefix "check TAR access" {
|
|
+ clean_restart $binfile
|
|
+
|
|
+ if ![runto_main] {
|
|
+ return
|
|
+ }
|
|
+
|
|
+ if {![check_register_access "tar"]} {
|
|
+ return
|
|
+ }
|
|
+
|
|
+ if {![tar_available]} {
|
|
+ return
|
|
+ }
|
|
+}
|
|
+
|
|
+# Now do the actual test
|
|
+clean_restart $binfile
|
|
+
|
|
+if ![runto_main] {
|
|
+ return
|
|
+}
|
|
+
|
|
+gdb_breakpoint [gdb_get_line_number "marker"]
|
|
+
|
|
+gdb_continue_to_breakpoint "continue to marker"
|
|
+
|
|
+set target1 [get_hexadecimal_valueof "target1" -1]
|
|
+set tar [get_hexadecimal_valueof "\$tar" -2]
|
|
+
|
|
+set test "TAR value from mtspr"
|
|
+
|
|
+if {${target1} == ${tar}} {
|
|
+ pass $test
|
|
+} else {
|
|
+ fail $test
|
|
+}
|
|
+
|
|
+set target2 [get_hexadecimal_valueof "target2" -1]
|
|
+
|
|
+if {$target2 == -1} {
|
|
+ fail "Could not get value of target2"
|
|
+ return
|
|
+}
|
|
+
|
|
+gdb_test_no_output "set \$tar = $target2" "set tar"
|
|
+
|
|
+gdb_breakpoint [gdb_get_line_number "marker 2"]
|
|
+
|
|
+gdb_continue_to_breakpoint "continue to new target address" ".*marker 2.*"
|
|
Index: gdb-8.2/gdb/features/rs6000/power-ebb.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/power-ebb.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,14 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!-- POWER8 Event-based Branching Registers. -->
|
|
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
|
+<feature name="org.gnu.gdb.power.ebb">
|
|
+ <reg name="bescr" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="ebbhr" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="ebbrr" bitsize="64" type="uint64" save-restore="no"/>
|
|
+</feature>
|
|
Index: gdb-8.2/gdb/features/rs6000/power-linux-pmu.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/power-linux-pmu.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,17 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!-- Subset of the POWER8 ISA 2.07 Performance Monitor Registers
|
|
+ provided by Linux. -->
|
|
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
|
+<feature name="org.gnu.gdb.power.linux.pmu">
|
|
+ <reg name="mmcr0" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="mmcr2" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="siar" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="sdar" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="sier" bitsize="64" type="uint64" save-restore="no"/>
|
|
+</feature>
|
|
Index: gdb-8.2/gdb/NEWS
|
|
===================================================================
|
|
--- gdb-8.2.orig/gdb/NEWS 2019-01-18 14:26:13.000000000 +0100
|
|
+++ gdb-8.2/gdb/NEWS 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -3,6 +3,10 @@
|
|
|
|
*** Changes since GDB 8.2
|
|
|
|
+* GDB and GDBserver now support access to additional registers on
|
|
+ PowerPC GNU/Linux targets: PPR, DSCR, TAR, EBB/PMU registers, and
|
|
+ HTM registers.
|
|
+
|
|
* GDB and GDBserver now support IPv6 connections. IPv6 addresses
|
|
can be passed using the '[ADDRESS]:PORT' notation, or the regular
|
|
'ADDRESS:PORT' method.
|
|
Index: gdb-8.2/gdb/features/rs6000/power-htm-altivec.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/power-htm-altivec.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,58 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!-- POWER8 Hardware Transactional Memory checkpointed VRs. -->
|
|
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
|
+<feature name="org.gnu.gdb.power.htm.altivec">
|
|
+ <vector id="v4f" type="ieee_single" count="4"/>
|
|
+ <vector id="v4i32" type="int32" count="4"/>
|
|
+ <vector id="v8i16" type="int16" count="8"/>
|
|
+ <vector id="v16i8" type="int8" count="16"/>
|
|
+ <union id="vec128">
|
|
+ <field name="uint128" type="uint128"/>
|
|
+ <field name="v4_float" type="v4f"/>
|
|
+ <field name="v4_int32" type="v4i32"/>
|
|
+ <field name="v8_int16" type="v8i16"/>
|
|
+ <field name="v16_int8" type="v16i8"/>
|
|
+ </union>
|
|
+
|
|
+ <reg name="cvr0" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr1" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr2" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr3" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr4" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr5" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr6" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr7" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr8" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr9" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr10" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr11" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr12" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr13" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr14" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr15" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr16" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr17" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr18" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr19" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr20" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr21" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr22" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr23" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr24" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr25" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr26" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr27" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr28" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr29" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr30" bitsize="128" type="vec128" save-restore="no"/>
|
|
+ <reg name="cvr31" bitsize="128" type="vec128" save-restore="no"/>
|
|
+
|
|
+ <reg name="cvscr" bitsize="32" save-restore="no" group="vector"/>
|
|
+ <reg name="cvrsave" bitsize="32" save-restore="no" group="vector"/>
|
|
+</feature>
|
|
Index: gdb-8.2/gdb/features/rs6000/power-htm-core.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/power-htm-core.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,48 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!-- POWER8 Hardware Transactional Memory checkpointed GPRs. -->
|
|
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
|
+<feature name="org.gnu.gdb.power.htm.core">
|
|
+ <reg name="cr0" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr1" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr2" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr3" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr4" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr5" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr6" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr7" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr8" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr9" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr10" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr11" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr12" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr13" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr14" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr15" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr16" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr17" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr18" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr19" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr20" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr21" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr22" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr23" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr24" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr25" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr26" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr27" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr28" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr29" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr30" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cr31" bitsize="32" type="uint32" save-restore="no"/>
|
|
+
|
|
+ <reg name="ccr" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cxer" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="clr" bitsize="32" type="code_ptr" save-restore="no"/>
|
|
+ <reg name="cctr" bitsize="32" type="uint32" save-restore="no"/>
|
|
+</feature>
|
|
Index: gdb-8.2/gdb/features/rs6000/power-htm-dscr.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/power-htm-dscr.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,12 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!-- POWER8 Hardware Transactional Memory checkpointed DSCR. -->
|
|
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
|
+<feature name="org.gnu.gdb.power.htm.dscr">
|
|
+ <reg name="cdscr" bitsize="64" type="uint64" save-restore="no"/>
|
|
+</feature>
|
|
Index: gdb-8.2/gdb/features/rs6000/power-htm-fpu.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/power-htm-fpu.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,45 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!-- POWER8 Hardware Transactional Memory checkpointed FPRs. -->
|
|
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
|
+<feature name="org.gnu.gdb.power.htm.fpu">
|
|
+ <reg name="cf0" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf1" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf2" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf3" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf4" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf5" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf6" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf7" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf8" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf9" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf10" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf11" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf12" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf13" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf14" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf15" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf16" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf17" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf18" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf19" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf20" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf21" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf22" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf23" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf24" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf25" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf26" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf27" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf28" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf29" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf30" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cf31" bitsize="64" type="ieee_double" save-restore="no"/>
|
|
+ <reg name="cfpscr" bitsize="64" type="uint64" group="float"
|
|
+ save-restore="no"/>
|
|
+</feature>
|
|
Index: gdb-8.2/gdb/features/rs6000/power-htm-ppr.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/power-htm-ppr.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,12 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!-- POWER8 Hardware Transactional Memory checkpointed PPR. -->
|
|
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
|
+<feature name="org.gnu.gdb.power.htm.ppr">
|
|
+ <reg name="cppr" bitsize="64" type="uint64" save-restore="no"/>
|
|
+</feature>
|
|
Index: gdb-8.2/gdb/features/rs6000/power-htm-spr.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/power-htm-spr.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,14 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!-- POWER8 Hardware Transactional Memory SPRs. -->
|
|
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
|
+<feature name="org.gnu.gdb.power.htm.spr">
|
|
+ <reg name="tfhar" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="texasr" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="tfiar" bitsize="64" type="uint64" save-restore="no"/>
|
|
+</feature>
|
|
Index: gdb-8.2/gdb/features/rs6000/power-htm-tar.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/power-htm-tar.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,12 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!-- POWER8 Hardware Transactional Memory checkpointed TAR. -->
|
|
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
|
+<feature name="org.gnu.gdb.power.htm.tar">
|
|
+ <reg name="ctar" bitsize="64" type="uint64" save-restore="no"/>
|
|
+</feature>
|
|
Index: gdb-8.2/gdb/features/rs6000/power-htm-vsx.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/power-htm-vsx.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,43 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!-- POWER8 Hardware Transactional Memory checkpointed upper VSRs. -->
|
|
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
|
+<feature name="org.gnu.gdb.power.htm.vsx">
|
|
+ <reg name="cvs0h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs1h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs2h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs3h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs4h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs5h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs6h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs7h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs8h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs9h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs10h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs11h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs12h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs13h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs14h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs15h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs16h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs17h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs18h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs19h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs20h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs21h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs22h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs23h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs24h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs25h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs26h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs27h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs28h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs29h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs30h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cvs31h" bitsize="64" type="uint64" save-restore="no"/>
|
|
+</feature>
|
|
Index: gdb-8.2/gdb/features/rs6000/power64-htm-core.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/power64-htm-core.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,48 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!-- POWER8 Hardware Transactional Memory checkpointed GPRs. -->
|
|
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
|
|
+<feature name="org.gnu.gdb.power.htm.core">
|
|
+ <reg name="cr0" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr1" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr2" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr3" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr4" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr5" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr6" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr7" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr8" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr9" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr10" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr11" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr12" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr13" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr14" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr15" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr16" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr17" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr18" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr19" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr20" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr21" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr22" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr23" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr24" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr25" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr26" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr27" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr28" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr29" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr30" bitsize="64" type="uint64" save-restore="no"/>
|
|
+ <reg name="cr31" bitsize="64" type="uint64" save-restore="no"/>
|
|
+
|
|
+ <reg name="ccr" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="cxer" bitsize="32" type="uint32" save-restore="no"/>
|
|
+ <reg name="clr" bitsize="64" type="code_ptr" save-restore="no"/>
|
|
+ <reg name="cctr" bitsize="64" type="uint64" save-restore="no"/>
|
|
+</feature>
|
|
Index: gdb-8.2/gdb/features/rs6000/powerpc-isa207-htm-vsx32l.c
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/powerpc-isa207-htm-vsx32l.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,396 @@
|
|
+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
|
|
+ Original: powerpc-isa207-htm-vsx32l.xml */
|
|
+
|
|
+#include "defs.h"
|
|
+#include "osabi.h"
|
|
+#include "target-descriptions.h"
|
|
+
|
|
+struct target_desc *tdesc_powerpc_isa207_htm_vsx32l;
|
|
+static void
|
|
+initialize_tdesc_powerpc_isa207_htm_vsx32l (void)
|
|
+{
|
|
+ struct target_desc *result = allocate_target_description ();
|
|
+ set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common"));
|
|
+
|
|
+ struct tdesc_feature *feature;
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
|
|
+ tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r26", 26, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r27", 27, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r28", 28, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r29", 29, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "r31", 31, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "pc", 64, 1, NULL, 32, "code_ptr");
|
|
+ tdesc_create_reg (feature, "msr", 65, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "lr", 67, 1, NULL, 32, "code_ptr");
|
|
+ tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
|
|
+ tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
|
|
+ tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int");
|
|
+ tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
|
|
+ tdesc_type *element_type;
|
|
+ element_type = tdesc_named_type (feature, "ieee_single");
|
|
+ tdesc_create_vector (feature, "v4f", element_type, 4);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int32");
|
|
+ tdesc_create_vector (feature, "v4i32", element_type, 4);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int16");
|
|
+ tdesc_create_vector (feature, "v8i16", element_type, 8);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int8");
|
|
+ tdesc_create_vector (feature, "v16i8", element_type, 16);
|
|
+
|
|
+ tdesc_type_with_fields *type_with_fields;
|
|
+ type_with_fields = tdesc_create_union (feature, "vec128");
|
|
+ tdesc_type *field_type;
|
|
+ field_type = tdesc_named_type (feature, "uint128");
|
|
+ tdesc_add_field (type_with_fields, "uint128", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v4f");
|
|
+ tdesc_add_field (type_with_fields, "v4_float", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v4i32");
|
|
+ tdesc_add_field (type_with_fields, "v4_int32", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v8i16");
|
|
+ tdesc_add_field (type_with_fields, "v8_int16", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v16i8");
|
|
+ tdesc_add_field (type_with_fields, "v16_int8", field_type);
|
|
+
|
|
+ tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
|
|
+ tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
|
|
+ tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs3h", 110, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs4h", 111, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs5h", 112, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs6h", 113, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs7h", 114, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs8h", 115, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs9h", 116, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs10h", 117, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs11h", 118, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs12h", 119, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs13h", 120, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs14h", 121, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs15h", 122, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs16h", 123, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs17h", 124, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs18h", 125, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs19h", 126, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs20h", 127, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs21h", 128, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs22h", 129, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs23h", 130, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs24h", 131, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs25h", 132, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs26h", 133, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs27h", 134, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs28h", 135, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs29h", 136, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr");
|
|
+ tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr");
|
|
+ tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.tar");
|
|
+ tdesc_create_reg (feature, "tar", 141, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ebb");
|
|
+ tdesc_create_reg (feature, "bescr", 142, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "ebbhr", 143, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "ebbrr", 144, 0, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux.pmu");
|
|
+ tdesc_create_reg (feature, "mmcr0", 145, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "mmcr2", 146, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "siar", 147, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "sdar", 148, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "sier", 149, 0, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.spr");
|
|
+ tdesc_create_reg (feature, "tfhar", 150, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "texasr", 151, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "tfiar", 152, 0, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.core");
|
|
+ tdesc_create_reg (feature, "cr0", 153, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr1", 154, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr2", 155, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr3", 156, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr4", 157, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr5", 158, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr6", 159, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr7", 160, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr8", 161, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr9", 162, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr10", 163, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr11", 164, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr12", 165, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr13", 166, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr14", 167, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr15", 168, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr16", 169, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr17", 170, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr18", 171, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr19", 172, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr20", 173, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr21", 174, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr22", 175, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr23", 176, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr24", 177, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr25", 178, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr26", 179, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr27", 180, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr28", 181, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr29", 182, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr30", 183, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cr31", 184, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "ccr", 185, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cxer", 186, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "clr", 187, 0, NULL, 32, "code_ptr");
|
|
+ tdesc_create_reg (feature, "cctr", 188, 0, NULL, 32, "uint32");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.fpu");
|
|
+ tdesc_create_reg (feature, "cf0", 189, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf1", 190, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf2", 191, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf3", 192, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf4", 193, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf5", 194, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf6", 195, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf7", 196, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf8", 197, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf9", 198, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf10", 199, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf11", 200, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf12", 201, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf13", 202, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf14", 203, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf15", 204, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf16", 205, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf17", 206, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf18", 207, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf19", 208, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf20", 209, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf21", 210, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf22", 211, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf23", 212, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf24", 213, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf25", 214, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf26", 215, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf27", 216, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf28", 217, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf29", 218, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf30", 219, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf31", 220, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cfpscr", 221, 0, "float", 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.altivec");
|
|
+ element_type = tdesc_named_type (feature, "ieee_single");
|
|
+ tdesc_create_vector (feature, "v4f", element_type, 4);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int32");
|
|
+ tdesc_create_vector (feature, "v4i32", element_type, 4);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int16");
|
|
+ tdesc_create_vector (feature, "v8i16", element_type, 8);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int8");
|
|
+ tdesc_create_vector (feature, "v16i8", element_type, 16);
|
|
+
|
|
+ type_with_fields = tdesc_create_union (feature, "vec128");
|
|
+ field_type = tdesc_named_type (feature, "uint128");
|
|
+ tdesc_add_field (type_with_fields, "uint128", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v4f");
|
|
+ tdesc_add_field (type_with_fields, "v4_float", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v4i32");
|
|
+ tdesc_add_field (type_with_fields, "v4_int32", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v8i16");
|
|
+ tdesc_add_field (type_with_fields, "v8_int16", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v16i8");
|
|
+ tdesc_add_field (type_with_fields, "v16_int8", field_type);
|
|
+
|
|
+ tdesc_create_reg (feature, "cvr0", 222, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr1", 223, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr2", 224, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr3", 225, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr4", 226, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr5", 227, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr6", 228, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr7", 229, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr8", 230, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr9", 231, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr10", 232, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr11", 233, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr12", 234, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr13", 235, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr14", 236, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr15", 237, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr16", 238, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr17", 239, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr18", 240, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr19", 241, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr20", 242, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr21", 243, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr22", 244, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr23", 245, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr24", 246, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr25", 247, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr26", 248, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr27", 249, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr28", 250, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr29", 251, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr30", 252, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr31", 253, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvscr", 254, 0, "vector", 32, "int");
|
|
+ tdesc_create_reg (feature, "cvrsave", 255, 0, "vector", 32, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.vsx");
|
|
+ tdesc_create_reg (feature, "cvs0h", 256, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs1h", 257, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs2h", 258, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs3h", 259, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs4h", 260, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs5h", 261, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs6h", 262, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs7h", 263, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs8h", 264, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs9h", 265, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs10h", 266, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs11h", 267, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs12h", 268, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs13h", 269, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs14h", 270, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs15h", 271, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs16h", 272, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs17h", 273, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs18h", 274, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs19h", 275, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs20h", 276, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs21h", 277, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs22h", 278, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs23h", 279, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs24h", 280, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs25h", 281, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs26h", 282, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs27h", 283, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs28h", 284, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs29h", 285, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs30h", 286, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs31h", 287, 0, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.ppr");
|
|
+ tdesc_create_reg (feature, "cppr", 288, 0, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.dscr");
|
|
+ tdesc_create_reg (feature, "cdscr", 289, 0, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.tar");
|
|
+ tdesc_create_reg (feature, "ctar", 290, 0, NULL, 64, "uint64");
|
|
+
|
|
+ tdesc_powerpc_isa207_htm_vsx32l = result;
|
|
+}
|
|
Index: gdb-8.2/gdb/features/rs6000/powerpc-isa207-htm-vsx32l.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/powerpc-isa207-htm-vsx32l.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,29 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
|
|
+<target>
|
|
+ <architecture>powerpc:common</architecture>
|
|
+ <xi:include href="power-core.xml"/>
|
|
+ <xi:include href="power-fpu-isa205.xml"/>
|
|
+ <xi:include href="power-linux.xml"/>
|
|
+ <xi:include href="power-altivec.xml"/>
|
|
+ <xi:include href="power-vsx.xml"/>
|
|
+ <xi:include href="power-ppr.xml"/>
|
|
+ <xi:include href="power-dscr.xml"/>
|
|
+ <xi:include href="power-tar.xml"/>
|
|
+ <xi:include href="power-ebb.xml"/>
|
|
+ <xi:include href="power-linux-pmu.xml"/>
|
|
+ <xi:include href="power-htm-spr.xml"/>
|
|
+ <xi:include href="power-htm-core.xml"/>
|
|
+ <xi:include href="power-htm-fpu.xml"/>
|
|
+ <xi:include href="power-htm-altivec.xml"/>
|
|
+ <xi:include href="power-htm-vsx.xml"/>
|
|
+ <xi:include href="power-htm-ppr.xml"/>
|
|
+ <xi:include href="power-htm-dscr.xml"/>
|
|
+ <xi:include href="power-htm-tar.xml"/>
|
|
+</target>
|
|
Index: gdb-8.2/gdb/features/rs6000/powerpc-isa207-htm-vsx64l.c
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/powerpc-isa207-htm-vsx64l.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,396 @@
|
|
+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro:
|
|
+ Original: powerpc-isa207-htm-vsx64l.xml */
|
|
+
|
|
+#include "defs.h"
|
|
+#include "osabi.h"
|
|
+#include "target-descriptions.h"
|
|
+
|
|
+struct target_desc *tdesc_powerpc_isa207_htm_vsx64l;
|
|
+static void
|
|
+initialize_tdesc_powerpc_isa207_htm_vsx64l (void)
|
|
+{
|
|
+ struct target_desc *result = allocate_target_description ();
|
|
+ set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64"));
|
|
+
|
|
+ struct tdesc_feature *feature;
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.core");
|
|
+ tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r3", 3, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r4", 4, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r5", 5, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r6", 6, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r7", 7, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r16", 16, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r17", 17, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r18", 18, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r19", 19, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r20", 20, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r21", 21, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r22", 22, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r23", 23, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r24", 24, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r25", 25, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r26", 26, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r27", 27, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r28", 28, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r29", 29, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r30", 30, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "r31", 31, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "pc", 64, 1, NULL, 64, "code_ptr");
|
|
+ tdesc_create_reg (feature, "msr", 65, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "lr", 67, 1, NULL, 64, "code_ptr");
|
|
+ tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu");
|
|
+ tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux");
|
|
+ tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int");
|
|
+ tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec");
|
|
+ tdesc_type *element_type;
|
|
+ element_type = tdesc_named_type (feature, "ieee_single");
|
|
+ tdesc_create_vector (feature, "v4f", element_type, 4);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int32");
|
|
+ tdesc_create_vector (feature, "v4i32", element_type, 4);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int16");
|
|
+ tdesc_create_vector (feature, "v8i16", element_type, 8);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int8");
|
|
+ tdesc_create_vector (feature, "v16i8", element_type, 16);
|
|
+
|
|
+ tdesc_type_with_fields *type_with_fields;
|
|
+ type_with_fields = tdesc_create_union (feature, "vec128");
|
|
+ tdesc_type *field_type;
|
|
+ field_type = tdesc_named_type (feature, "uint128");
|
|
+ tdesc_add_field (type_with_fields, "uint128", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v4f");
|
|
+ tdesc_add_field (type_with_fields, "v4_float", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v4i32");
|
|
+ tdesc_add_field (type_with_fields, "v4_int32", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v8i16");
|
|
+ tdesc_add_field (type_with_fields, "v8_int16", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v16i8");
|
|
+ tdesc_add_field (type_with_fields, "v16_int8", field_type);
|
|
+
|
|
+ tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int");
|
|
+ tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx");
|
|
+ tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs3h", 110, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs4h", 111, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs5h", 112, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs6h", 113, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs7h", 114, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs8h", 115, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs9h", 116, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs10h", 117, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs11h", 118, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs12h", 119, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs13h", 120, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs14h", 121, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs15h", 122, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs16h", 123, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs17h", 124, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs18h", 125, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs19h", 126, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs20h", 127, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs21h", 128, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs22h", 129, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs23h", 130, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs24h", 131, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs25h", 132, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs26h", 133, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs27h", 134, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs28h", 135, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs29h", 136, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr");
|
|
+ tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr");
|
|
+ tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.tar");
|
|
+ tdesc_create_reg (feature, "tar", 141, 1, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ebb");
|
|
+ tdesc_create_reg (feature, "bescr", 142, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "ebbhr", 143, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "ebbrr", 144, 0, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux.pmu");
|
|
+ tdesc_create_reg (feature, "mmcr0", 145, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "mmcr2", 146, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "siar", 147, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "sdar", 148, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "sier", 149, 0, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.spr");
|
|
+ tdesc_create_reg (feature, "tfhar", 150, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "texasr", 151, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "tfiar", 152, 0, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.core");
|
|
+ tdesc_create_reg (feature, "cr0", 153, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr1", 154, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr2", 155, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr3", 156, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr4", 157, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr5", 158, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr6", 159, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr7", 160, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr8", 161, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr9", 162, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr10", 163, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr11", 164, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr12", 165, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr13", 166, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr14", 167, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr15", 168, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr16", 169, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr17", 170, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr18", 171, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr19", 172, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr20", 173, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr21", 174, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr22", 175, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr23", 176, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr24", 177, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr25", 178, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr26", 179, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr27", 180, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr28", 181, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr29", 182, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr30", 183, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cr31", 184, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "ccr", 185, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "cxer", 186, 0, NULL, 32, "uint32");
|
|
+ tdesc_create_reg (feature, "clr", 187, 0, NULL, 64, "code_ptr");
|
|
+ tdesc_create_reg (feature, "cctr", 188, 0, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.fpu");
|
|
+ tdesc_create_reg (feature, "cf0", 189, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf1", 190, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf2", 191, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf3", 192, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf4", 193, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf5", 194, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf6", 195, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf7", 196, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf8", 197, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf9", 198, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf10", 199, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf11", 200, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf12", 201, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf13", 202, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf14", 203, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf15", 204, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf16", 205, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf17", 206, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf18", 207, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf19", 208, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf20", 209, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf21", 210, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf22", 211, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf23", 212, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf24", 213, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf25", 214, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf26", 215, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf27", 216, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf28", 217, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf29", 218, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf30", 219, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cf31", 220, 0, NULL, 64, "ieee_double");
|
|
+ tdesc_create_reg (feature, "cfpscr", 221, 0, "float", 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.altivec");
|
|
+ element_type = tdesc_named_type (feature, "ieee_single");
|
|
+ tdesc_create_vector (feature, "v4f", element_type, 4);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int32");
|
|
+ tdesc_create_vector (feature, "v4i32", element_type, 4);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int16");
|
|
+ tdesc_create_vector (feature, "v8i16", element_type, 8);
|
|
+
|
|
+ element_type = tdesc_named_type (feature, "int8");
|
|
+ tdesc_create_vector (feature, "v16i8", element_type, 16);
|
|
+
|
|
+ type_with_fields = tdesc_create_union (feature, "vec128");
|
|
+ field_type = tdesc_named_type (feature, "uint128");
|
|
+ tdesc_add_field (type_with_fields, "uint128", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v4f");
|
|
+ tdesc_add_field (type_with_fields, "v4_float", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v4i32");
|
|
+ tdesc_add_field (type_with_fields, "v4_int32", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v8i16");
|
|
+ tdesc_add_field (type_with_fields, "v8_int16", field_type);
|
|
+ field_type = tdesc_named_type (feature, "v16i8");
|
|
+ tdesc_add_field (type_with_fields, "v16_int8", field_type);
|
|
+
|
|
+ tdesc_create_reg (feature, "cvr0", 222, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr1", 223, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr2", 224, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr3", 225, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr4", 226, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr5", 227, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr6", 228, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr7", 229, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr8", 230, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr9", 231, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr10", 232, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr11", 233, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr12", 234, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr13", 235, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr14", 236, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr15", 237, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr16", 238, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr17", 239, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr18", 240, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr19", 241, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr20", 242, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr21", 243, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr22", 244, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr23", 245, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr24", 246, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr25", 247, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr26", 248, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr27", 249, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr28", 250, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr29", 251, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr30", 252, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvr31", 253, 0, NULL, 128, "vec128");
|
|
+ tdesc_create_reg (feature, "cvscr", 254, 0, "vector", 32, "int");
|
|
+ tdesc_create_reg (feature, "cvrsave", 255, 0, "vector", 32, "int");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.vsx");
|
|
+ tdesc_create_reg (feature, "cvs0h", 256, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs1h", 257, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs2h", 258, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs3h", 259, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs4h", 260, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs5h", 261, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs6h", 262, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs7h", 263, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs8h", 264, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs9h", 265, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs10h", 266, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs11h", 267, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs12h", 268, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs13h", 269, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs14h", 270, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs15h", 271, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs16h", 272, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs17h", 273, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs18h", 274, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs19h", 275, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs20h", 276, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs21h", 277, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs22h", 278, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs23h", 279, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs24h", 280, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs25h", 281, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs26h", 282, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs27h", 283, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs28h", 284, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs29h", 285, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs30h", 286, 0, NULL, 64, "uint64");
|
|
+ tdesc_create_reg (feature, "cvs31h", 287, 0, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.ppr");
|
|
+ tdesc_create_reg (feature, "cppr", 288, 0, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.dscr");
|
|
+ tdesc_create_reg (feature, "cdscr", 289, 0, NULL, 64, "uint64");
|
|
+
|
|
+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.tar");
|
|
+ tdesc_create_reg (feature, "ctar", 290, 0, NULL, 64, "uint64");
|
|
+
|
|
+ tdesc_powerpc_isa207_htm_vsx64l = result;
|
|
+}
|
|
Index: gdb-8.2/gdb/features/rs6000/powerpc-isa207-htm-vsx64l.xml
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/features/rs6000/powerpc-isa207-htm-vsx64l.xml 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,29 @@
|
|
+<?xml version="1.0"?>
|
|
+<!-- Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ Copying and distribution of this file, with or without modification,
|
|
+ are permitted in any medium without royalty provided the copyright
|
|
+ notice and this notice are preserved. -->
|
|
+
|
|
+<!DOCTYPE target SYSTEM "gdb-target.dtd">
|
|
+<target>
|
|
+ <architecture>powerpc:common64</architecture>
|
|
+ <xi:include href="power64-core.xml"/>
|
|
+ <xi:include href="power-fpu-isa205.xml"/>
|
|
+ <xi:include href="power64-linux.xml"/>
|
|
+ <xi:include href="power-altivec.xml"/>
|
|
+ <xi:include href="power-vsx.xml"/>
|
|
+ <xi:include href="power-ppr.xml"/>
|
|
+ <xi:include href="power-dscr.xml"/>
|
|
+ <xi:include href="power-tar.xml"/>
|
|
+ <xi:include href="power-ebb.xml"/>
|
|
+ <xi:include href="power-linux-pmu.xml"/>
|
|
+ <xi:include href="power-htm-spr.xml"/>
|
|
+ <xi:include href="power64-htm-core.xml"/>
|
|
+ <xi:include href="power-htm-fpu.xml"/>
|
|
+ <xi:include href="power-htm-altivec.xml"/>
|
|
+ <xi:include href="power-htm-vsx.xml"/>
|
|
+ <xi:include href="power-htm-ppr.xml"/>
|
|
+ <xi:include href="power-htm-dscr.xml"/>
|
|
+ <xi:include href="power-htm-tar.xml"/>
|
|
+</target>
|
|
Index: gdb-8.2/gdb/regformats/rs6000/powerpc-isa207-htm-vsx32l.dat
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/regformats/rs6000/powerpc-isa207-htm-vsx32l.dat 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,296 @@
|
|
+# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro:
|
|
+# Generated from: rs6000/powerpc-isa207-htm-vsx32l.xml
|
|
+name:powerpc_isa207_htm_vsx32l
|
|
+xmltarget:powerpc-isa207-htm-vsx32l.xml
|
|
+expedite:r1,pc
|
|
+32:r0
|
|
+32:r1
|
|
+32:r2
|
|
+32:r3
|
|
+32:r4
|
|
+32:r5
|
|
+32:r6
|
|
+32:r7
|
|
+32:r8
|
|
+32:r9
|
|
+32:r10
|
|
+32:r11
|
|
+32:r12
|
|
+32:r13
|
|
+32:r14
|
|
+32:r15
|
|
+32:r16
|
|
+32:r17
|
|
+32:r18
|
|
+32:r19
|
|
+32:r20
|
|
+32:r21
|
|
+32:r22
|
|
+32:r23
|
|
+32:r24
|
|
+32:r25
|
|
+32:r26
|
|
+32:r27
|
|
+32:r28
|
|
+32:r29
|
|
+32:r30
|
|
+32:r31
|
|
+64:f0
|
|
+64:f1
|
|
+64:f2
|
|
+64:f3
|
|
+64:f4
|
|
+64:f5
|
|
+64:f6
|
|
+64:f7
|
|
+64:f8
|
|
+64:f9
|
|
+64:f10
|
|
+64:f11
|
|
+64:f12
|
|
+64:f13
|
|
+64:f14
|
|
+64:f15
|
|
+64:f16
|
|
+64:f17
|
|
+64:f18
|
|
+64:f19
|
|
+64:f20
|
|
+64:f21
|
|
+64:f22
|
|
+64:f23
|
|
+64:f24
|
|
+64:f25
|
|
+64:f26
|
|
+64:f27
|
|
+64:f28
|
|
+64:f29
|
|
+64:f30
|
|
+64:f31
|
|
+32:pc
|
|
+32:msr
|
|
+32:cr
|
|
+32:lr
|
|
+32:ctr
|
|
+32:xer
|
|
+64:fpscr
|
|
+32:orig_r3
|
|
+32:trap
|
|
+128:vr0
|
|
+128:vr1
|
|
+128:vr2
|
|
+128:vr3
|
|
+128:vr4
|
|
+128:vr5
|
|
+128:vr6
|
|
+128:vr7
|
|
+128:vr8
|
|
+128:vr9
|
|
+128:vr10
|
|
+128:vr11
|
|
+128:vr12
|
|
+128:vr13
|
|
+128:vr14
|
|
+128:vr15
|
|
+128:vr16
|
|
+128:vr17
|
|
+128:vr18
|
|
+128:vr19
|
|
+128:vr20
|
|
+128:vr21
|
|
+128:vr22
|
|
+128:vr23
|
|
+128:vr24
|
|
+128:vr25
|
|
+128:vr26
|
|
+128:vr27
|
|
+128:vr28
|
|
+128:vr29
|
|
+128:vr30
|
|
+128:vr31
|
|
+32:vscr
|
|
+32:vrsave
|
|
+64:vs0h
|
|
+64:vs1h
|
|
+64:vs2h
|
|
+64:vs3h
|
|
+64:vs4h
|
|
+64:vs5h
|
|
+64:vs6h
|
|
+64:vs7h
|
|
+64:vs8h
|
|
+64:vs9h
|
|
+64:vs10h
|
|
+64:vs11h
|
|
+64:vs12h
|
|
+64:vs13h
|
|
+64:vs14h
|
|
+64:vs15h
|
|
+64:vs16h
|
|
+64:vs17h
|
|
+64:vs18h
|
|
+64:vs19h
|
|
+64:vs20h
|
|
+64:vs21h
|
|
+64:vs22h
|
|
+64:vs23h
|
|
+64:vs24h
|
|
+64:vs25h
|
|
+64:vs26h
|
|
+64:vs27h
|
|
+64:vs28h
|
|
+64:vs29h
|
|
+64:vs30h
|
|
+64:vs31h
|
|
+64:ppr
|
|
+64:dscr
|
|
+64:tar
|
|
+64:bescr
|
|
+64:ebbhr
|
|
+64:ebbrr
|
|
+64:mmcr0
|
|
+64:mmcr2
|
|
+64:siar
|
|
+64:sdar
|
|
+64:sier
|
|
+64:tfhar
|
|
+64:texasr
|
|
+64:tfiar
|
|
+32:cr0
|
|
+32:cr1
|
|
+32:cr2
|
|
+32:cr3
|
|
+32:cr4
|
|
+32:cr5
|
|
+32:cr6
|
|
+32:cr7
|
|
+32:cr8
|
|
+32:cr9
|
|
+32:cr10
|
|
+32:cr11
|
|
+32:cr12
|
|
+32:cr13
|
|
+32:cr14
|
|
+32:cr15
|
|
+32:cr16
|
|
+32:cr17
|
|
+32:cr18
|
|
+32:cr19
|
|
+32:cr20
|
|
+32:cr21
|
|
+32:cr22
|
|
+32:cr23
|
|
+32:cr24
|
|
+32:cr25
|
|
+32:cr26
|
|
+32:cr27
|
|
+32:cr28
|
|
+32:cr29
|
|
+32:cr30
|
|
+32:cr31
|
|
+32:ccr
|
|
+32:cxer
|
|
+32:clr
|
|
+32:cctr
|
|
+64:cf0
|
|
+64:cf1
|
|
+64:cf2
|
|
+64:cf3
|
|
+64:cf4
|
|
+64:cf5
|
|
+64:cf6
|
|
+64:cf7
|
|
+64:cf8
|
|
+64:cf9
|
|
+64:cf10
|
|
+64:cf11
|
|
+64:cf12
|
|
+64:cf13
|
|
+64:cf14
|
|
+64:cf15
|
|
+64:cf16
|
|
+64:cf17
|
|
+64:cf18
|
|
+64:cf19
|
|
+64:cf20
|
|
+64:cf21
|
|
+64:cf22
|
|
+64:cf23
|
|
+64:cf24
|
|
+64:cf25
|
|
+64:cf26
|
|
+64:cf27
|
|
+64:cf28
|
|
+64:cf29
|
|
+64:cf30
|
|
+64:cf31
|
|
+64:cfpscr
|
|
+128:cvr0
|
|
+128:cvr1
|
|
+128:cvr2
|
|
+128:cvr3
|
|
+128:cvr4
|
|
+128:cvr5
|
|
+128:cvr6
|
|
+128:cvr7
|
|
+128:cvr8
|
|
+128:cvr9
|
|
+128:cvr10
|
|
+128:cvr11
|
|
+128:cvr12
|
|
+128:cvr13
|
|
+128:cvr14
|
|
+128:cvr15
|
|
+128:cvr16
|
|
+128:cvr17
|
|
+128:cvr18
|
|
+128:cvr19
|
|
+128:cvr20
|
|
+128:cvr21
|
|
+128:cvr22
|
|
+128:cvr23
|
|
+128:cvr24
|
|
+128:cvr25
|
|
+128:cvr26
|
|
+128:cvr27
|
|
+128:cvr28
|
|
+128:cvr29
|
|
+128:cvr30
|
|
+128:cvr31
|
|
+32:cvscr
|
|
+32:cvrsave
|
|
+64:cvs0h
|
|
+64:cvs1h
|
|
+64:cvs2h
|
|
+64:cvs3h
|
|
+64:cvs4h
|
|
+64:cvs5h
|
|
+64:cvs6h
|
|
+64:cvs7h
|
|
+64:cvs8h
|
|
+64:cvs9h
|
|
+64:cvs10h
|
|
+64:cvs11h
|
|
+64:cvs12h
|
|
+64:cvs13h
|
|
+64:cvs14h
|
|
+64:cvs15h
|
|
+64:cvs16h
|
|
+64:cvs17h
|
|
+64:cvs18h
|
|
+64:cvs19h
|
|
+64:cvs20h
|
|
+64:cvs21h
|
|
+64:cvs22h
|
|
+64:cvs23h
|
|
+64:cvs24h
|
|
+64:cvs25h
|
|
+64:cvs26h
|
|
+64:cvs27h
|
|
+64:cvs28h
|
|
+64:cvs29h
|
|
+64:cvs30h
|
|
+64:cvs31h
|
|
+64:cppr
|
|
+64:cdscr
|
|
+64:ctar
|
|
Index: gdb-8.2/gdb/regformats/rs6000/powerpc-isa207-htm-vsx64l.dat
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/regformats/rs6000/powerpc-isa207-htm-vsx64l.dat 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,296 @@
|
|
+# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro:
|
|
+# Generated from: rs6000/powerpc-isa207-htm-vsx64l.xml
|
|
+name:powerpc_isa207_htm_vsx64l
|
|
+xmltarget:powerpc-isa207-htm-vsx64l.xml
|
|
+expedite:r1,pc
|
|
+64:r0
|
|
+64:r1
|
|
+64:r2
|
|
+64:r3
|
|
+64:r4
|
|
+64:r5
|
|
+64:r6
|
|
+64:r7
|
|
+64:r8
|
|
+64:r9
|
|
+64:r10
|
|
+64:r11
|
|
+64:r12
|
|
+64:r13
|
|
+64:r14
|
|
+64:r15
|
|
+64:r16
|
|
+64:r17
|
|
+64:r18
|
|
+64:r19
|
|
+64:r20
|
|
+64:r21
|
|
+64:r22
|
|
+64:r23
|
|
+64:r24
|
|
+64:r25
|
|
+64:r26
|
|
+64:r27
|
|
+64:r28
|
|
+64:r29
|
|
+64:r30
|
|
+64:r31
|
|
+64:f0
|
|
+64:f1
|
|
+64:f2
|
|
+64:f3
|
|
+64:f4
|
|
+64:f5
|
|
+64:f6
|
|
+64:f7
|
|
+64:f8
|
|
+64:f9
|
|
+64:f10
|
|
+64:f11
|
|
+64:f12
|
|
+64:f13
|
|
+64:f14
|
|
+64:f15
|
|
+64:f16
|
|
+64:f17
|
|
+64:f18
|
|
+64:f19
|
|
+64:f20
|
|
+64:f21
|
|
+64:f22
|
|
+64:f23
|
|
+64:f24
|
|
+64:f25
|
|
+64:f26
|
|
+64:f27
|
|
+64:f28
|
|
+64:f29
|
|
+64:f30
|
|
+64:f31
|
|
+64:pc
|
|
+64:msr
|
|
+32:cr
|
|
+64:lr
|
|
+64:ctr
|
|
+32:xer
|
|
+64:fpscr
|
|
+64:orig_r3
|
|
+64:trap
|
|
+128:vr0
|
|
+128:vr1
|
|
+128:vr2
|
|
+128:vr3
|
|
+128:vr4
|
|
+128:vr5
|
|
+128:vr6
|
|
+128:vr7
|
|
+128:vr8
|
|
+128:vr9
|
|
+128:vr10
|
|
+128:vr11
|
|
+128:vr12
|
|
+128:vr13
|
|
+128:vr14
|
|
+128:vr15
|
|
+128:vr16
|
|
+128:vr17
|
|
+128:vr18
|
|
+128:vr19
|
|
+128:vr20
|
|
+128:vr21
|
|
+128:vr22
|
|
+128:vr23
|
|
+128:vr24
|
|
+128:vr25
|
|
+128:vr26
|
|
+128:vr27
|
|
+128:vr28
|
|
+128:vr29
|
|
+128:vr30
|
|
+128:vr31
|
|
+32:vscr
|
|
+32:vrsave
|
|
+64:vs0h
|
|
+64:vs1h
|
|
+64:vs2h
|
|
+64:vs3h
|
|
+64:vs4h
|
|
+64:vs5h
|
|
+64:vs6h
|
|
+64:vs7h
|
|
+64:vs8h
|
|
+64:vs9h
|
|
+64:vs10h
|
|
+64:vs11h
|
|
+64:vs12h
|
|
+64:vs13h
|
|
+64:vs14h
|
|
+64:vs15h
|
|
+64:vs16h
|
|
+64:vs17h
|
|
+64:vs18h
|
|
+64:vs19h
|
|
+64:vs20h
|
|
+64:vs21h
|
|
+64:vs22h
|
|
+64:vs23h
|
|
+64:vs24h
|
|
+64:vs25h
|
|
+64:vs26h
|
|
+64:vs27h
|
|
+64:vs28h
|
|
+64:vs29h
|
|
+64:vs30h
|
|
+64:vs31h
|
|
+64:ppr
|
|
+64:dscr
|
|
+64:tar
|
|
+64:bescr
|
|
+64:ebbhr
|
|
+64:ebbrr
|
|
+64:mmcr0
|
|
+64:mmcr2
|
|
+64:siar
|
|
+64:sdar
|
|
+64:sier
|
|
+64:tfhar
|
|
+64:texasr
|
|
+64:tfiar
|
|
+64:cr0
|
|
+64:cr1
|
|
+64:cr2
|
|
+64:cr3
|
|
+64:cr4
|
|
+64:cr5
|
|
+64:cr6
|
|
+64:cr7
|
|
+64:cr8
|
|
+64:cr9
|
|
+64:cr10
|
|
+64:cr11
|
|
+64:cr12
|
|
+64:cr13
|
|
+64:cr14
|
|
+64:cr15
|
|
+64:cr16
|
|
+64:cr17
|
|
+64:cr18
|
|
+64:cr19
|
|
+64:cr20
|
|
+64:cr21
|
|
+64:cr22
|
|
+64:cr23
|
|
+64:cr24
|
|
+64:cr25
|
|
+64:cr26
|
|
+64:cr27
|
|
+64:cr28
|
|
+64:cr29
|
|
+64:cr30
|
|
+64:cr31
|
|
+32:ccr
|
|
+32:cxer
|
|
+64:clr
|
|
+64:cctr
|
|
+64:cf0
|
|
+64:cf1
|
|
+64:cf2
|
|
+64:cf3
|
|
+64:cf4
|
|
+64:cf5
|
|
+64:cf6
|
|
+64:cf7
|
|
+64:cf8
|
|
+64:cf9
|
|
+64:cf10
|
|
+64:cf11
|
|
+64:cf12
|
|
+64:cf13
|
|
+64:cf14
|
|
+64:cf15
|
|
+64:cf16
|
|
+64:cf17
|
|
+64:cf18
|
|
+64:cf19
|
|
+64:cf20
|
|
+64:cf21
|
|
+64:cf22
|
|
+64:cf23
|
|
+64:cf24
|
|
+64:cf25
|
|
+64:cf26
|
|
+64:cf27
|
|
+64:cf28
|
|
+64:cf29
|
|
+64:cf30
|
|
+64:cf31
|
|
+64:cfpscr
|
|
+128:cvr0
|
|
+128:cvr1
|
|
+128:cvr2
|
|
+128:cvr3
|
|
+128:cvr4
|
|
+128:cvr5
|
|
+128:cvr6
|
|
+128:cvr7
|
|
+128:cvr8
|
|
+128:cvr9
|
|
+128:cvr10
|
|
+128:cvr11
|
|
+128:cvr12
|
|
+128:cvr13
|
|
+128:cvr14
|
|
+128:cvr15
|
|
+128:cvr16
|
|
+128:cvr17
|
|
+128:cvr18
|
|
+128:cvr19
|
|
+128:cvr20
|
|
+128:cvr21
|
|
+128:cvr22
|
|
+128:cvr23
|
|
+128:cvr24
|
|
+128:cvr25
|
|
+128:cvr26
|
|
+128:cvr27
|
|
+128:cvr28
|
|
+128:cvr29
|
|
+128:cvr30
|
|
+128:cvr31
|
|
+32:cvscr
|
|
+32:cvrsave
|
|
+64:cvs0h
|
|
+64:cvs1h
|
|
+64:cvs2h
|
|
+64:cvs3h
|
|
+64:cvs4h
|
|
+64:cvs5h
|
|
+64:cvs6h
|
|
+64:cvs7h
|
|
+64:cvs8h
|
|
+64:cvs9h
|
|
+64:cvs10h
|
|
+64:cvs11h
|
|
+64:cvs12h
|
|
+64:cvs13h
|
|
+64:cvs14h
|
|
+64:cvs15h
|
|
+64:cvs16h
|
|
+64:cvs17h
|
|
+64:cvs18h
|
|
+64:cvs19h
|
|
+64:cvs20h
|
|
+64:cvs21h
|
|
+64:cvs22h
|
|
+64:cvs23h
|
|
+64:cvs24h
|
|
+64:cvs25h
|
|
+64:cvs26h
|
|
+64:cvs27h
|
|
+64:cvs28h
|
|
+64:cvs29h
|
|
+64:cvs30h
|
|
+64:cvs31h
|
|
+64:cppr
|
|
+64:cdscr
|
|
+64:ctar
|
|
Index: gdb-8.2/gdb/testsuite/gdb.arch/powerpc-htm-regs.c
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/testsuite/gdb.arch/powerpc-htm-regs.c 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,39 @@
|
|
+/* This testcase is part of GDB, the GNU debugger.
|
|
+
|
|
+ Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+ This program is free software; you can redistribute it and/or modify
|
|
+ it under the terms of the GNU General Public License as published by
|
|
+ the Free Software Foundation; either version 3 of the License, or
|
|
+ (at your option) any later version.
|
|
+
|
|
+ This program is distributed in the hope that it will be useful,
|
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+ GNU General Public License for more details.
|
|
+
|
|
+ You should have received a copy of the GNU General Public License
|
|
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
+
|
|
+int main (void)
|
|
+{
|
|
+ /* Touch DSCR. Some kernels won't schedule the thread with a DSCR
|
|
+ altered by ptrace unless the register was used at some point. */
|
|
+ unsigned long dscr = 0x0;
|
|
+
|
|
+ /* This is the non-privileged SPR number to access DSCR,
|
|
+ available since isa 207. */
|
|
+ asm volatile ("mtspr 3,%0" : : "r" (dscr));
|
|
+
|
|
+ asm volatile ("tbegin."); // first marker
|
|
+ asm volatile goto ("bc 12,2,%l[end]"
|
|
+ :
|
|
+ :
|
|
+ :
|
|
+ : end);
|
|
+ asm volatile ("tabort. 0");
|
|
+end:
|
|
+ asm volatile ("nop"); // second marker
|
|
+
|
|
+ return 0;
|
|
+}
|
|
Index: gdb-8.2/gdb/testsuite/gdb.arch/powerpc-htm-regs.exp
|
|
===================================================================
|
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
|
+++ gdb-8.2/gdb/testsuite/gdb.arch/powerpc-htm-regs.exp 2019-01-18 14:26:14.000000000 +0100
|
|
@@ -0,0 +1,328 @@
|
|
+# Copyright (C) 2018 Free Software Foundation, Inc.
|
|
+
|
|
+# This program is free software; you can redistribute it and/or modify
|
|
+# it under the terms of the GNU General Public License as published by
|
|
+# the Free Software Foundation; either version 3 of the License, or
|
|
+# (at your option) any later version.
|
|
+#
|
|
+# This program is distributed in the hope that it will be useful,
|
|
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
+# GNU General Public License for more details.
|
|
+#
|
|
+# You should have received a copy of the GNU General Public License
|
|
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
+
|
|
+# This file is part of the gdb testsuite.
|
|
+
|
|
+# Test access to HTM (Hardware Transactional Memory) registers. The
|
|
+# tests read the values of various registers before stepping the
|
|
+# inferior through a "tbegin." instruction to start a transaction,
|
|
+# then the checkpointed versions of the registers are checked against
|
|
+# the pre-transactional values. Then, new values are written to some
|
|
+# of the checkpointed registers, these values are read back and saved,
|
|
+# the inferior continues until the transaction aborts, and the regular
|
|
+# registers are then checked against the saved values, because the
|
|
+# abort should have reverted the registers to these values.
|
|
+
|
|
+if {![istarget "powerpc*-*-linux*"]} then {
|
|
+ verbose "Skipping PowerPC test for HTM registers."
|
|
+ return
|
|
+}
|
|
+
|
|
+standard_testfile .c .gen.c
|
|
+
|
|
+# First check if our processor and kernel support access to
|
|
+# the registers we need and to the HTM facility.
|
|
+
|
|
+proc check_register_access { regname } {
|
|
+ global gdb_prompt
|
|
+
|
|
+ set test "$regname register access"
|
|
+ gdb_test_multiple "info reg $regname" "$test" {
|
|
+ -re "Invalid register.*\r\n$gdb_prompt $" {
|
|
+ unsupported "$test"
|
|
+ return 0
|
|
+ }
|
|
+ -re "\r\n$regname.*\r\n$gdb_prompt $" {
|
|
+ pass "$test"
|
|
+ return 1
|
|
+ }
|
|
+ }
|
|
+ return 0
|
|
+}
|
|
+
|
|
+proc check_htm_support {} {
|
|
+ global gdb_prompt
|
|
+ set test "htm support"
|
|
+
|
|
+ gdb_test_multiple "stepi" "$test" {
|
|
+ -re "Illegal instruction.*\r\n$gdb_prompt $" {
|
|
+ unsupported $test
|
|
+ return 0
|
|
+ }
|
|
+ -re "nop.*\r\n$gdb_prompt $"
|
|
+ {
|
|
+ pass $test
|
|
+ return 1
|
|
+ }
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+with_test_prefix "check htm support" {
|
|
+ set gen_src [standard_output_file $srcfile2]
|
|
+
|
|
+ gdb_produce_source $gen_src {
|
|
+ int main () {
|
|
+ asm volatile ("tbegin."); // marker
|
|
+ asm volatile ("nop");
|
|
+ return 0;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if {[build_executable "compile" $binfile $gen_src {debug}] == -1} {
|
|
+ return
|
|
+ }
|
|
+
|
|
+ clean_restart $binfile
|
|
+
|
|
+ # Displaced-stepping a tbegin. causes problems,
|
|
+ # so we make the breakpoint temporary.
|
|
+ gdb_breakpoint [gdb_get_line_number "marker" "$gen_src"] temporary
|
|
+
|
|
+ gdb_run_cmd
|
|
+
|
|
+ # Wait for the prompt.
|
|
+ if {[gdb_test "" "Temporary breakpoint.*"] != 0 } {
|
|
+ return
|
|
+ }
|
|
+
|
|
+ # Make sure that we stopped at the right place (just before tbegin. is
|
|
+ # executed).
|
|
+ if { [gdb_test "x/i \$pc" "=> $hex.*:.*tbegin\\..*" "disassemble tbegin"] != 0} {
|
|
+ return
|
|
+ }
|
|
+
|
|
+ if {![check_register_access "vs0"]} {
|
|
+ return
|
|
+ }
|
|
+
|
|
+ if {![check_register_access "texasr"]} {
|
|
+ return
|
|
+ }
|
|
+
|
|
+ if {![check_register_access "dscr"]} {
|
|
+ return
|
|
+ }
|
|
+
|
|
+ if {![check_register_access "ppr"]} {
|
|
+ return
|
|
+ }
|
|
+
|
|
+ if {![check_register_access "tar"]} {
|
|
+ return
|
|
+ }
|
|
+
|
|
+ if {![check_htm_support]} {
|
|
+ return
|
|
+ }
|
|
+}
|
|
+
|
|
+# Now do the actual test.
|
|
+if {[build_executable "compile" $binfile $srcfile {debug}] == -1} {
|
|
+ return
|
|
+}
|
|
+
|
|
+clean_restart $binfile
|
|
+
|
|
+gdb_breakpoint [gdb_get_line_number "first marker"] temporary
|
|
+
|
|
+gdb_run_cmd
|
|
+
|
|
+# Wait for the prompt.
|
|
+gdb_test "" "Temporary breakpoint.*"
|
|
+
|
|
+if {[gdb_test "x/i \$pc" "=> $hex.*:.*tbegin\\..*" "disassemble tbegin"] != 0} {
|
|
+ return
|
|
+}
|
|
+
|
|
+# Now we write non-zero values to some registers, then read the values
|
|
+# of various registers, then stepi to start the transaction. The
|
|
+# checkpointed register state should correspond to the values we read.
|
|
+
|
|
+# Write to the GPRs
|
|
+for {set i 0} {$i < 32} {incr i 1} {
|
|
+ gdb_test_no_output "set \$r$i = $i"
|
|
+}
|
|
+
|
|
+gdb_test_no_output "set \$xer = 0xc0000000"
|
|
+
|
|
+# FPRs
|
|
+gdb_test_no_output "set \$f0 = 0.5"
|
|
+for {set i 1} {$i < 32} {incr i 1} {
|
|
+ gdb_test_no_output "set \$f$i = \$f[expr $i - 1] + 1.0"
|
|
+}
|
|
+
|
|
+gdb_test_no_output "set \$fpscr = 0x84005000"
|
|
+
|
|
+# VRs
|
|
+for {set i 0} {$i < 32} {incr i 1} {
|
|
+ for {set j 0} {$j < 4} {incr j 1} {
|
|
+ gdb_test_no_output "set \$vr$i.v4_int32\[$j\] = $i"
|
|
+ }
|
|
+}
|
|
+
|
|
+gdb_test_no_output "set \$dscr = 0x2"
|
|
+gdb_test_no_output "set \$tar = &main" "set tar"
|
|
+
|
|
+# Get the pre-transactional value of the registers.
|
|
+for {set i 0} {$i < 32} {incr i 1} {
|
|
+ set "r$i" [get_hexadecimal_valueof "\$r$i" "default0"]
|
|
+}
|
|
+
|
|
+set cr [get_hexadecimal_valueof "\$cr" "default0"]
|
|
+set xer [get_hexadecimal_valueof "\$xer" "default0"]
|
|
+set lr [get_hexadecimal_valueof "\$lr" "default0"]
|
|
+set ctr [get_hexadecimal_valueof "\$ctr" "default0"]
|
|
+
|
|
+for {set i 0} {$i < 32} {incr i 1} {
|
|
+ set "f$i" [get_valueof "" "\$f$i" "default0"]
|
|
+}
|
|
+
|
|
+set fpscr [get_hexadecimal_valueof "\$fpscr" "default0"]
|
|
+
|
|
+for {set i 0} {$i < 32} {incr i 1} {
|
|
+ set "vr$i" [get_hexadecimal_valueof "\$vr$i.uint128" "default0"]
|
|
+}
|
|
+
|
|
+set vscr [get_hexadecimal_valueof "\$vscr" "default0"]
|
|
+set vrsave [get_hexadecimal_valueof "\$vrsave" "default0"]
|
|
+
|
|
+for {set i 0} {$i < 64} {incr i 1} {
|
|
+ set "vs$i" [get_hexadecimal_valueof "\$vs$i.uint128" "default0"]
|
|
+}
|
|
+
|
|
+set dscr [get_hexadecimal_valueof "\$dscr" "default0"]
|
|
+set ppr [get_hexadecimal_valueof "\$ppr" "default0"]
|
|
+set tar [get_hexadecimal_valueof "\$tar" "default0"]
|
|
+
|
|
+gdb_test "stepi" "asm.*bc.*"
|
|
+
|
|
+proc test_register_match {reg_name reg_var_name hex} {
|
|
+ set test "$reg_name matches $reg_var_name"
|
|
+
|
|
+ # In some infrequent cases CXER doesn't match the
|
|
+ # pre-transactional XER, possibly due to a linux kernel bug.
|
|
+ set should_xfail 0
|
|
+ if [istarget "powerpc*-*-linux*" && reg_name == "cxer"] {
|
|
+ set should_xfail 1
|
|
+ }
|
|
+
|
|
+ upvar $reg_var_name expected_val
|
|
+
|
|
+ if {$hex} {
|
|
+ set actual_val [get_hexadecimal_valueof "\$$reg_name" "default1"]
|
|
+ } else {
|
|
+ set actual_val [get_valueof "" "\$$reg_name" "default1"]
|
|
+ }
|
|
+
|
|
+ if { "$expected_val" == "$actual_val" } {
|
|
+ pass $test
|
|
+ } else {
|
|
+ if {$should_xfail} {
|
|
+ xfail $test
|
|
+ } else {
|
|
+ fail $test
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
+for {set i 0} {$i < 32} {incr i 1} {
|
|
+ test_register_match "cr$i" "r$i" 1
|
|
+}
|
|
+
|
|
+test_register_match "ccr" "cr" 1
|
|
+test_register_match "cxer" "xer" 1
|
|
+test_register_match "clr" "lr" 1
|
|
+test_register_match "cctr" "ctr" 1
|
|
+
|
|
+for {set i 0} {$i < 32} {incr i 1} {
|
|
+ test_register_match "cf$i" "f$i" 0
|
|
+}
|
|
+
|
|
+test_register_match "cfpscr" "fpscr" 1
|
|
+
|
|
+for {set i 0} {$i < 32} {incr i 1} {
|
|
+ test_register_match "cvr$i.uint128" "vr$i" 1
|
|
+}
|
|
+
|
|
+test_register_match "cvscr" "vscr" 1
|
|
+test_register_match "cvrsave" "vrsave" 1
|
|
+
|
|
+for {set i 0} {$i < 64} {incr i 1} {
|
|
+ test_register_match "cvs$i.uint128" "vs$i" 1
|
|
+}
|
|
+
|
|
+test_register_match "cdscr" "dscr" 1
|
|
+test_register_match "cppr" "ppr" 1
|
|
+test_register_match "ctar" "tar" 1
|
|
+
|
|
+# Support for writing to the checkpointed registers is not
|
|
+# currently available in the gdbserver stub.
|
|
+if [target_is_gdbserver] {
|
|
+ unsupported "write to checkpointed registers"
|
|
+ return
|
|
+}
|
|
+
|
|
+# Now write different values to some of the checkpointed registers and
|
|
+# check that the transaction abort reverts the register to these
|
|
+# values.
|
|
+for {set i 0} {$i < 32} {incr i 1} {
|
|
+ gdb_test_no_output "set \$cr$i = $i + 0xC00"
|
|
+}
|
|
+
|
|
+gdb_test_no_output "set \$cf0 = 0.25"
|
|
+for {set i 1} {$i < 32} {incr i 1} {
|
|
+ gdb_test_no_output "set \$cf$i = \$cf[expr $i - 1] + 1.0"
|
|
+}
|
|
+
|
|
+for {set i 0} {$i < 32} {incr i 1} {
|
|
+ for {set j 0} {$j < 4} {incr j 1} {
|
|
+ gdb_test_no_output "set \$cvr$i.v4_int32\[$j\] = $i + 0xF00"
|
|
+ }
|
|
+}
|
|
+
|
|
+# Read back the values.
|
|
+with_test_prefix "after write" {
|
|
+ for {set i 0} {$i < 32} {incr i 1} {
|
|
+ set "cr$i" [get_hexadecimal_valueof "\$cr$i" "default0"]
|
|
+ }
|
|
+
|
|
+ for {set i 0} {$i < 32} {incr i 1} {
|
|
+ set "cf$i" [get_valueof "" "\$cf$i" "default0"]
|
|
+ }
|
|
+
|
|
+ for {set i 0} {$i < 64} {incr i 1} {
|
|
+ set "cvs$i" [get_hexadecimal_valueof "\$cvs$i.uint128" "default0"]
|
|
+ }
|
|
+}
|
|
+
|
|
+gdb_breakpoint [gdb_get_line_number "second marker"]
|
|
+
|
|
+gdb_test "continue"
|
|
+
|
|
+with_test_prefix "after transaction failure" {
|
|
+ for {set i 0} {$i < 32} {incr i 1} {
|
|
+ test_register_match "r$i" "cr$i" 1
|
|
+ }
|
|
+
|
|
+ for {set i 0} {$i < 32} {incr i 1} {
|
|
+ test_register_match "f$i" "cf$i" 0
|
|
+ }
|
|
+
|
|
+ for {set i 0} {$i < 64} {incr i 1} {
|
|
+ test_register_match "vs$i.uint128" "cvs$i" 1
|
|
+ }
|
|
+}
|
|
+
|