diff mbox

ppc: restrict the use of the rfi instruction

Message ID 1473319962-27591-1-git-send-email-clg@kaod.org (mailing list archive)
State New, archived
Headers show

Commit Message

Cédric Le Goater Sept. 8, 2016, 7:32 a.m. UTC
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>

Power ISA 2.x has deleted the rfi instruction and rfid shoud be used
instead on cpus following this instruction set or later.

This will raise an invalid exception when rfi is used on such
processors: Book3S 64-bit processors.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
[clg: the required fix in openbios, commit b747b6acc272 ('ppc: use
      rfid when running under a CPU from the 970 family.'), is now
      merged in qemu under commit 5cebd885d0d2 ('Update OpenBIOS
      images to b747b6a built from submodule.') ]
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 target-ppc/translate.c |    9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

Comments

David Gibson Sept. 12, 2016, 1:37 a.m. UTC | #1
On Thu, Sep 08, 2016 at 09:32:42AM +0200, Cédric Le Goater wrote:
> From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> 
> Power ISA 2.x has deleted the rfi instruction and rfid shoud be used
> instead on cpus following this instruction set or later.
> 
> This will raise an invalid exception when rfi is used on such
> processors: Book3S 64-bit processors.
> 
> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
> [clg: the required fix in openbios, commit b747b6acc272 ('ppc: use
>       rfid when running under a CPU from the 970 family.'), is now
>       merged in qemu under commit 5cebd885d0d2 ('Update OpenBIOS
>       images to b747b6a built from submodule.') ]
> Signed-off-by: Cédric Le Goater <clg@kaod.org>

Applied to ppc-for-2.8, thanks.

> ---
>  target-ppc/translate.c |    9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
> 
> Index: qemu-dgibson-for-2.8.git/target-ppc/translate.c
> ===================================================================
> --- qemu-dgibson-for-2.8.git.orig/target-ppc/translate.c
> +++ qemu-dgibson-for-2.8.git/target-ppc/translate.c
> @@ -3585,10 +3585,13 @@ static void gen_rfi(DisasContext *ctx)
>  #if defined(CONFIG_USER_ONLY)
>      GEN_PRIV;
>  #else
> -    /* FIXME: This instruction doesn't exist anymore on 64-bit server
> -     * processors compliant with arch 2.x, we should remove it there,
> -     * but we need to fix OpenBIOS not to use it on 970 first
> +    /* This instruction doesn't exist anymore on 64-bit server
> +     * processors compliant with arch 2.x
>       */
> +    if (ctx->insns_flags & PPC_SEGMENT_64B) {
> +        gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
> +        return;
> +    }
>      /* Restore CPU state */
>      CHK_SV;
>      gen_update_cfar(ctx, ctx->nip - 4);
>
diff mbox

Patch

Index: qemu-dgibson-for-2.8.git/target-ppc/translate.c
===================================================================
--- qemu-dgibson-for-2.8.git.orig/target-ppc/translate.c
+++ qemu-dgibson-for-2.8.git/target-ppc/translate.c
@@ -3585,10 +3585,13 @@  static void gen_rfi(DisasContext *ctx)
 #if defined(CONFIG_USER_ONLY)
     GEN_PRIV;
 #else
-    /* FIXME: This instruction doesn't exist anymore on 64-bit server
-     * processors compliant with arch 2.x, we should remove it there,
-     * but we need to fix OpenBIOS not to use it on 970 first
+    /* This instruction doesn't exist anymore on 64-bit server
+     * processors compliant with arch 2.x
      */
+    if (ctx->insns_flags & PPC_SEGMENT_64B) {
+        gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
+        return;
+    }
     /* Restore CPU state */
     CHK_SV;
     gen_update_cfar(ctx, ctx->nip - 4);