|
@@ -52,6 +52,7 @@
|
|
|
#include <asm/processor.h>
|
|
|
#endif
|
|
|
#include <asm/kexec.h>
|
|
|
+#include <asm/ppc-opcode.h>
|
|
|
|
|
|
#if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC)
|
|
|
int (*__debugger)(struct pt_regs *regs);
|
|
@@ -637,29 +638,6 @@ static void parse_fpe(struct pt_regs *regs)
|
|
|
* bits is faster and easier.
|
|
|
*
|
|
|
*/
|
|
|
-#define INST_MFSPR_PVR 0x7c1f42a6
|
|
|
-#define INST_MFSPR_PVR_MASK 0xfc1fffff
|
|
|
-
|
|
|
-#define INST_DCBA 0x7c0005ec
|
|
|
-#define INST_DCBA_MASK 0xfc0007fe
|
|
|
-
|
|
|
-#define INST_MCRXR 0x7c000400
|
|
|
-#define INST_MCRXR_MASK 0xfc0007fe
|
|
|
-
|
|
|
-#define INST_STRING 0x7c00042a
|
|
|
-#define INST_STRING_MASK 0xfc0007fe
|
|
|
-#define INST_STRING_GEN_MASK 0xfc00067e
|
|
|
-#define INST_LSWI 0x7c0004aa
|
|
|
-#define INST_LSWX 0x7c00042a
|
|
|
-#define INST_STSWI 0x7c0005aa
|
|
|
-#define INST_STSWX 0x7c00052a
|
|
|
-
|
|
|
-#define INST_POPCNTB 0x7c0000f4
|
|
|
-#define INST_POPCNTB_MASK 0xfc0007fe
|
|
|
-
|
|
|
-#define INST_ISEL 0x7c00001e
|
|
|
-#define INST_ISEL_MASK 0xfc00003e
|
|
|
-
|
|
|
static int emulate_string_inst(struct pt_regs *regs, u32 instword)
|
|
|
{
|
|
|
u8 rT = (instword >> 21) & 0x1f;
|
|
@@ -670,20 +648,20 @@ static int emulate_string_inst(struct pt_regs *regs, u32 instword)
|
|
|
int pos = 0;
|
|
|
|
|
|
/* Early out if we are an invalid form of lswx */
|
|
|
- if ((instword & INST_STRING_MASK) == INST_LSWX)
|
|
|
+ if ((instword & PPC_INST_STRING_MASK) == PPC_INST_LSWX)
|
|
|
if ((rT == rA) || (rT == NB_RB))
|
|
|
return -EINVAL;
|
|
|
|
|
|
EA = (rA == 0) ? 0 : regs->gpr[rA];
|
|
|
|
|
|
- switch (instword & INST_STRING_MASK) {
|
|
|
- case INST_LSWX:
|
|
|
- case INST_STSWX:
|
|
|
+ switch (instword & PPC_INST_STRING_MASK) {
|
|
|
+ case PPC_INST_LSWX:
|
|
|
+ case PPC_INST_STSWX:
|
|
|
EA += NB_RB;
|
|
|
num_bytes = regs->xer & 0x7f;
|
|
|
break;
|
|
|
- case INST_LSWI:
|
|
|
- case INST_STSWI:
|
|
|
+ case PPC_INST_LSWI:
|
|
|
+ case PPC_INST_STSWI:
|
|
|
num_bytes = (NB_RB == 0) ? 32 : NB_RB;
|
|
|
break;
|
|
|
default:
|
|
@@ -695,9 +673,9 @@ static int emulate_string_inst(struct pt_regs *regs, u32 instword)
|
|
|
u8 val;
|
|
|
u32 shift = 8 * (3 - (pos & 0x3));
|
|
|
|
|
|
- switch ((instword & INST_STRING_MASK)) {
|
|
|
- case INST_LSWX:
|
|
|
- case INST_LSWI:
|
|
|
+ switch ((instword & PPC_INST_STRING_MASK)) {
|
|
|
+ case PPC_INST_LSWX:
|
|
|
+ case PPC_INST_LSWI:
|
|
|
if (get_user(val, (u8 __user *)EA))
|
|
|
return -EFAULT;
|
|
|
/* first time updating this reg,
|
|
@@ -706,8 +684,8 @@ static int emulate_string_inst(struct pt_regs *regs, u32 instword)
|
|
|
regs->gpr[rT] = 0;
|
|
|
regs->gpr[rT] |= val << shift;
|
|
|
break;
|
|
|
- case INST_STSWI:
|
|
|
- case INST_STSWX:
|
|
|
+ case PPC_INST_STSWI:
|
|
|
+ case PPC_INST_STSWX:
|
|
|
val = regs->gpr[rT] >> shift;
|
|
|
if (put_user(val, (u8 __user *)EA))
|
|
|
return -EFAULT;
|
|
@@ -775,18 +753,18 @@ static int emulate_instruction(struct pt_regs *regs)
|
|
|
return -EFAULT;
|
|
|
|
|
|
/* Emulate the mfspr rD, PVR. */
|
|
|
- if ((instword & INST_MFSPR_PVR_MASK) == INST_MFSPR_PVR) {
|
|
|
+ if ((instword & PPC_INST_MFSPR_PVR_MASK) == PPC_INST_MFSPR_PVR) {
|
|
|
rd = (instword >> 21) & 0x1f;
|
|
|
regs->gpr[rd] = mfspr(SPRN_PVR);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
/* Emulating the dcba insn is just a no-op. */
|
|
|
- if ((instword & INST_DCBA_MASK) == INST_DCBA)
|
|
|
+ if ((instword & PPC_INST_DCBA_MASK) == PPC_INST_DCBA)
|
|
|
return 0;
|
|
|
|
|
|
/* Emulate the mcrxr insn. */
|
|
|
- if ((instword & INST_MCRXR_MASK) == INST_MCRXR) {
|
|
|
+ if ((instword & PPC_INST_MCRXR_MASK) == PPC_INST_MCRXR) {
|
|
|
int shift = (instword >> 21) & 0x1c;
|
|
|
unsigned long msk = 0xf0000000UL >> shift;
|
|
|
|
|
@@ -796,16 +774,16 @@ static int emulate_instruction(struct pt_regs *regs)
|
|
|
}
|
|
|
|
|
|
/* Emulate load/store string insn. */
|
|
|
- if ((instword & INST_STRING_GEN_MASK) == INST_STRING)
|
|
|
+ if ((instword & PPC_INST_STRING_GEN_MASK) == PPC_INST_STRING)
|
|
|
return emulate_string_inst(regs, instword);
|
|
|
|
|
|
/* Emulate the popcntb (Population Count Bytes) instruction. */
|
|
|
- if ((instword & INST_POPCNTB_MASK) == INST_POPCNTB) {
|
|
|
+ if ((instword & PPC_INST_POPCNTB_MASK) == PPC_INST_POPCNTB) {
|
|
|
return emulate_popcntb_inst(regs, instword);
|
|
|
}
|
|
|
|
|
|
/* Emulate isel (Integer Select) instruction */
|
|
|
- if ((instword & INST_ISEL_MASK) == INST_ISEL) {
|
|
|
+ if ((instword & PPC_INST_ISEL_MASK) == PPC_INST_ISEL) {
|
|
|
return emulate_isel(regs, instword);
|
|
|
}
|
|
|
|