Commit 548ccebc authored by Paul Mackerras's avatar Paul Mackerras

powerpc: Fix reading and writing SPRs from xmon on 32-bit

When we created the instructions to read/write SPRs in xmon, we were
setting up a ppc64-style procedure descriptor and calling that, which
doesn't work in 32-bit.  For 32-bit a function pointer just points
to the instructions of the function.  This fixes it to do the right
thing for both 32-bit and 64-bit.
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 22c841c9
...@@ -1467,17 +1467,23 @@ read_spr(int n) ...@@ -1467,17 +1467,23 @@ read_spr(int n)
{ {
unsigned int instrs[2]; unsigned int instrs[2];
unsigned long (*code)(void); unsigned long (*code)(void);
unsigned long opd[3];
unsigned long ret = -1UL; unsigned long ret = -1UL;
#ifdef CONFIG_PPC64
unsigned long opd[3];
instrs[0] = 0x7c6002a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
instrs[1] = 0x4e800020;
opd[0] = (unsigned long)instrs; opd[0] = (unsigned long)instrs;
opd[1] = 0; opd[1] = 0;
opd[2] = 0; opd[2] = 0;
code = (unsigned long (*)(void)) opd;
#else
code = (unsigned long (*)(void)) instrs;
#endif
/* mfspr r3,n; blr */
instrs[0] = 0x7c6002a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
instrs[1] = 0x4e800020;
store_inst(instrs); store_inst(instrs);
store_inst(instrs+1); store_inst(instrs+1);
code = (unsigned long (*)(void)) opd;
if (setjmp(bus_error_jmp) == 0) { if (setjmp(bus_error_jmp) == 0) {
catch_memory_errors = 1; catch_memory_errors = 1;
...@@ -1499,16 +1505,21 @@ write_spr(int n, unsigned long val) ...@@ -1499,16 +1505,21 @@ write_spr(int n, unsigned long val)
{ {
unsigned int instrs[2]; unsigned int instrs[2];
unsigned long (*code)(unsigned long); unsigned long (*code)(unsigned long);
#ifdef CONFIG_PPC64
unsigned long opd[3]; unsigned long opd[3];
instrs[0] = 0x7c6003a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
instrs[1] = 0x4e800020;
opd[0] = (unsigned long)instrs; opd[0] = (unsigned long)instrs;
opd[1] = 0; opd[1] = 0;
opd[2] = 0; opd[2] = 0;
code = (unsigned long (*)(unsigned long)) opd;
#else
code = (unsigned long (*)(unsigned long)) instrs;
#endif
instrs[0] = 0x7c6003a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);
instrs[1] = 0x4e800020;
store_inst(instrs); store_inst(instrs);
store_inst(instrs+1); store_inst(instrs+1);
code = (unsigned long (*)(unsigned long)) opd;
if (setjmp(bus_error_jmp) == 0) { if (setjmp(bus_error_jmp) == 0) {
catch_memory_errors = 1; catch_memory_errors = 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment