|
@@ -30,6 +30,7 @@ extern char system_call_common[];
|
|
#define XER_OV 0x40000000U
|
|
#define XER_OV 0x40000000U
|
|
#define XER_CA 0x20000000U
|
|
#define XER_CA 0x20000000U
|
|
|
|
|
|
|
|
+#ifdef CONFIG_PPC_FPU
|
|
/*
|
|
/*
|
|
* Functions in ldstfp.S
|
|
* Functions in ldstfp.S
|
|
*/
|
|
*/
|
|
@@ -41,6 +42,7 @@ extern int do_lvx(int rn, unsigned long ea);
|
|
extern int do_stvx(int rn, unsigned long ea);
|
|
extern int do_stvx(int rn, unsigned long ea);
|
|
extern int do_lxvd2x(int rn, unsigned long ea);
|
|
extern int do_lxvd2x(int rn, unsigned long ea);
|
|
extern int do_stxvd2x(int rn, unsigned long ea);
|
|
extern int do_stxvd2x(int rn, unsigned long ea);
|
|
|
|
+#endif
|
|
|
|
|
|
/*
|
|
/*
|
|
* Determine whether a conditional branch instruction would branch.
|
|
* Determine whether a conditional branch instruction would branch.
|
|
@@ -290,6 +292,7 @@ static int __kprobes write_mem(unsigned long val, unsigned long ea, int nb,
|
|
return write_mem_unaligned(val, ea, nb, regs);
|
|
return write_mem_unaligned(val, ea, nb, regs);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef CONFIG_PPC_FPU
|
|
/*
|
|
/*
|
|
* Check the address and alignment, and call func to do the actual
|
|
* Check the address and alignment, and call func to do the actual
|
|
* load or store.
|
|
* load or store.
|
|
@@ -351,6 +354,7 @@ static int __kprobes do_fp_store(int rn, int (*func)(int, unsigned long),
|
|
}
|
|
}
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
+#endif
|
|
|
|
|
|
#ifdef CONFIG_ALTIVEC
|
|
#ifdef CONFIG_ALTIVEC
|
|
/* For Altivec/VMX, no need to worry about alignment */
|
|
/* For Altivec/VMX, no need to worry about alignment */
|
|
@@ -1393,6 +1397,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
|
|
regs->gpr[rd] = byterev_4(val);
|
|
regs->gpr[rd] = byterev_4(val);
|
|
goto ldst_done;
|
|
goto ldst_done;
|
|
|
|
|
|
|
|
+#ifdef CONFIG_PPC_CPU
|
|
case 535: /* lfsx */
|
|
case 535: /* lfsx */
|
|
case 567: /* lfsux */
|
|
case 567: /* lfsux */
|
|
if (!(regs->msr & MSR_FP))
|
|
if (!(regs->msr & MSR_FP))
|
|
@@ -1424,6 +1429,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
|
|
ea = xform_ea(instr, regs, u);
|
|
ea = xform_ea(instr, regs, u);
|
|
err = do_fp_store(rd, do_stfd, ea, 8, regs);
|
|
err = do_fp_store(rd, do_stfd, ea, 8, regs);
|
|
goto ldst_done;
|
|
goto ldst_done;
|
|
|
|
+#endif
|
|
|
|
|
|
#ifdef __powerpc64__
|
|
#ifdef __powerpc64__
|
|
case 660: /* stdbrx */
|
|
case 660: /* stdbrx */
|
|
@@ -1534,6 +1540,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
|
|
} while (++rd < 32);
|
|
} while (++rd < 32);
|
|
goto instr_done;
|
|
goto instr_done;
|
|
|
|
|
|
|
|
+#ifdef CONFIG_PPC_FPU
|
|
case 48: /* lfs */
|
|
case 48: /* lfs */
|
|
case 49: /* lfsu */
|
|
case 49: /* lfsu */
|
|
if (!(regs->msr & MSR_FP))
|
|
if (!(regs->msr & MSR_FP))
|
|
@@ -1565,6 +1572,7 @@ int __kprobes emulate_step(struct pt_regs *regs, unsigned int instr)
|
|
ea = dform_ea(instr, regs);
|
|
ea = dform_ea(instr, regs);
|
|
err = do_fp_store(rd, do_stfd, ea, 8, regs);
|
|
err = do_fp_store(rd, do_stfd, ea, 8, regs);
|
|
goto ldst_done;
|
|
goto ldst_done;
|
|
|
|
+#endif
|
|
|
|
|
|
#ifdef __powerpc64__
|
|
#ifdef __powerpc64__
|
|
case 58: /* ld[u], lwa */
|
|
case 58: /* ld[u], lwa */
|