aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHelge Deller <deller@gmx.de>2025-01-28 15:37:41 +0100
committerHelge Deller <deller@gmx.de>2025-01-30 13:37:20 +0100
commitbf60e2a72adc190d3a4d8eb28b6f9c4c17ddd649 (patch)
treed54fceedadac1e8827095b73de5268eddaa258e1
parent3f8c3d7bf6d4d3454cd1e56b4bb253c301d72ca2 (diff)
downloadqemu-bf60e2a72adc190d3a4d8eb28b6f9c4c17ddd649.zip
qemu-bf60e2a72adc190d3a4d8eb28b6f9c4c17ddd649.tar.gz
qemu-bf60e2a72adc190d3a4d8eb28b6f9c4c17ddd649.tar.bz2
disas/hppa: implement mfdiag/mtdiag disassembly
The various PA-RISC CPUs implement different CPU-specific diag instructions (mfdiag, mtdiag, mfcpu, mtcpu, ...) to access CPU-internal diagnose/configuration registers, e.g. for cache control, managing space register hashing, control front panel LEDs and read status of the hardware reset button. Those instructions are mostly undocumented, but are used by ODE, HP-UX and Linux. This patch adds some neccessary instructions for PCXL and PCXU CPUs. Signed-off-by: Helge Deller <deller@gmx.de> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
-rw-r--r--disas/hppa.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/disas/hppa.c b/disas/hppa.c
index 49e2231..2b58434 100644
--- a/disas/hppa.c
+++ b/disas/hppa.c
@@ -606,7 +606,7 @@ struct pa_opcode
In the args field, the following characters are unused:
- ' " - / 34 6789:; '
+ ' " - / 34 678 :; '
'@ C M [\] '
'` e g } '
@@ -650,6 +650,7 @@ Also these:
| 6 bit field length at 19,27:31 (fixed extract/deposit)
A 13 bit immediate at 18 (to support the BREAK instruction)
^ like b, but describes a control register
+ 9 like b, but describes a diagnose register
! sar (cr11) register
D 26 bit immediate at 31 (to support the DIAG instruction)
$ 9 bit immediate at 28 (to support POPBTS)
@@ -1322,13 +1323,19 @@ static const struct pa_opcode pa_opcodes[] =
{ "fdce", 0x040012c0, 0xfc00ffdf, "cZx(b)", pa10, 0},
{ "fdce", 0x040012c0, 0xfc003fdf, "cZx(s,b)", pa10, 0},
{ "fice", 0x040002c0, 0xfc001fdf, "cZx(S,b)", pa10, 0},
-{ "diag", 0x14000000, 0xfc000000, "D", pa10, 0},
{ "idtlbt", 0x04001800, 0xfc00ffff, "x,b", pa20, FLAG_STRICT},
{ "iitlbt", 0x04000800, 0xfc00ffff, "x,b", pa20, FLAG_STRICT},
+/* completely undocumented, but used by ODE, HP-UX and Linux: */
+{ "mfcpu_pcxu", 0x140008a0, 0xfc9fffe0, "9,t", pa20, 0}, /* PCXU: mfdiag */
+{ "mtcpu_pcxu", 0x14001840, 0xfc00ffff, "x,9", pa20, 0},
+
/* These may be specific to certain versions of the PA. Joel claimed
they were 72000 (7200?) specific. However, I'm almost certain the
mtcpu/mfcpu were undocumented, but available in the older 700 machines. */
+{ "mfcpu_c", 0x14000600, 0xfc00ffff, "9,x", pa10, 0}, /* PCXL: for dr0 and dr8 only */
+{ "mfcpu_t", 0x14001400, 0xfc9fffe0, "9,t", pa10, 0}, /* PCXL: all dr except dr0 and dr8 */
+{ "mtcpu_pcxl", 0x14000240, 0xfc00ffff, "x,9", pa11, 0}, /* PCXL: mtcpu for dr0 and dr8 */
{ "mtcpu", 0x14001600, 0xfc00ffff, "x,^", pa10, 0},
{ "mfcpu", 0x14001A00, 0xfc00ffff, "^,x", pa10, 0},
{ "tocen", 0x14403600, 0xffffffff, "", pa10, 0},
@@ -1336,6 +1343,9 @@ static const struct pa_opcode pa_opcodes[] =
{ "shdwgr", 0x14402600, 0xffffffff, "", pa10, 0},
{ "grshdw", 0x14400620, 0xffffffff, "", pa10, 0},
+/* instead of showing D only, show all other registers too */
+{ "diag", 0x14000000, 0xfc000000, "D x,9,t", pa10, 0},
+
/* gfw and gfr are not in the HP PA 1.1 manual, but they are in either
the Timex FPU or the Mustang ERS (not sure which) manual. */
{ "gfw", 0x04001680, 0xfc00ffdf, "cZx(b)", pa11, 0},
@@ -1801,6 +1811,12 @@ fput_creg (unsigned reg, disassemble_info *info)
(*info->fprintf_func) (info->stream, "%s", control_reg[reg]);
}
+static void
+fput_dreg (unsigned reg, disassemble_info *info)
+{
+ (*info->fprintf_func) (info->stream, "dr%d", reg);
+}
+
/* Print constants with sign. */
static void
@@ -2007,6 +2023,9 @@ print_insn_hppa (bfd_vma memaddr, disassemble_info *info)
case '^':
fput_creg (GET_FIELD (insn, 6, 10), info);
break;
+ case '9':
+ fput_dreg (GET_FIELD (insn, 6, 10), info);
+ break;
case 't':
fput_reg (GET_FIELD (insn, 27, 31), info);
break;