summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorSandipan Das <sandipan@linux.ibm.com>2019-02-22 12:23:28 +0530
committerMichael Ellerman <mpe@ellerman.id.au>2019-02-26 00:05:17 +1100
commita23987ef267a3549667fed5d69c0174e7fc15910 (patch)
tree141c27f8779c90fb1b8bcb11dddb5fa59fdca234 /arch
parent930d6288a26787d2e7f633705434171a506db9c5 (diff)
downloadlinux-a23987ef267a3549667fed5d69c0174e7fc15910.tar.gz
linux-a23987ef267a3549667fed5d69c0174e7fc15910.tar.bz2
linux-a23987ef267a3549667fed5d69c0174e7fc15910.zip
powerpc: sstep: Add support for darn instruction
This adds emulation support for the following integer instructions: * Deliver A Random Number (darn) As suggested by Michael, this uses a raw .long for specifying the instruction word when using inline assembly to retain compatibility with older binutils. Signed-off-by: Sandipan Das <sandipan@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/lib/sstep.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c
index 67e69ebd6c00..ab575e02f9b8 100644
--- a/arch/powerpc/lib/sstep.c
+++ b/arch/powerpc/lib/sstep.c
@@ -1728,6 +1728,28 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
(int) regs->gpr[rb];
goto arith_done;
+ case 755: /* darn */
+ if (!cpu_has_feature(CPU_FTR_ARCH_300))
+ return -1;
+ switch (ra & 0x3) {
+ case 0:
+ /* 32-bit conditioned */
+ asm volatile(PPC_DARN(%0, 0) : "=r" (op->val));
+ goto compute_done;
+
+ case 1:
+ /* 64-bit conditioned */
+ asm volatile(PPC_DARN(%0, 1) : "=r" (op->val));
+ goto compute_done;
+
+ case 2:
+ /* 64-bit raw */
+ asm volatile(PPC_DARN(%0, 2) : "=r" (op->val));
+ goto compute_done;
+ }
+
+ return -1;
+
/*
* Logical instructions