@@ -30,6 +30,7 @@ SRC_URI = "https://download.qemu.org/${BPN}-${PV}.tar.xz \
file://0001-tracetool-use-relative-paths-for-line-preprocessor-d.patch \
file://qemu-guest-agent.init \
file://qemu-guest-agent.udev \
+ file://ppc.patch \
"
UPSTREAM_CHECK_REGEX = "qemu-(?P<pver>\d+(\.\d+)+)\.tar"
new file mode 100644
@@ -0,0 +1,70 @@
+target/ppc: Fix fallback to MFSS for MFFSCRN, MFFSCRNI, MFFSCE and MFFSL
+
+The following commits changed the code such that these instructions became invalid
+on pre 3.0 ISAs:
+
+ bf8adfd88b547680aa857c46098f3a1e94373160 - target/ppc: Move mffscrn[i] to decodetree
+ 394c2e2fda70da722f20fb60412d6c0ca4bfaa03 - target/ppc: Move mffsce to decodetree
+ 3e5bce70efe6bd1f684efbb21fd2a316cbf0657e - target/ppc: Move mffsl to decodetree
+
+The hardware will handle them as a MFFS instruction as the code did previously.
+Restore that behaviour. This means applications that were segfaulting under qemu
+when encountering these instructions now operate correctly. The instruction
+is used in glibc libm functions for example.
+
+Upstream-Status: Pending
+
+Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
+
+Index: qemu-8.0.0/target/ppc/translate/fp-impl.c.inc
+===================================================================
+--- qemu-8.0.0.orig/target/ppc/translate/fp-impl.c.inc
++++ qemu-8.0.0/target/ppc/translate/fp-impl.c.inc
+@@ -584,7 +584,10 @@ static bool trans_MFFSCE(DisasContext *c
+ {
+ TCGv_i64 fpscr;
+
+- REQUIRE_INSNS_FLAGS2(ctx, ISA300);
++ if (unlikely(!(ctx->insns_flags2 & PPC2_ISA300))) {
++ return trans_MFFS(ctx, a);
++ }
++
+ REQUIRE_FPU(ctx);
+
+ gen_reset_fpstatus();
+@@ -597,7 +600,10 @@ static bool trans_MFFSCRN(DisasContext *
+ {
+ TCGv_i64 t1, fpscr;
+
+- REQUIRE_INSNS_FLAGS2(ctx, ISA300);
++ if (unlikely(!(ctx->insns_flags2 & PPC2_ISA300))) {
++ return trans_MFFS(ctx, a);
++ }
++
+ REQUIRE_FPU(ctx);
+
+ t1 = tcg_temp_new_i64();
+@@ -631,7 +637,10 @@ static bool trans_MFFSCRNI(DisasContext
+ {
+ TCGv_i64 t1, fpscr;
+
+- REQUIRE_INSNS_FLAGS2(ctx, ISA300);
++ if (unlikely(!(ctx->insns_flags2 & PPC2_ISA300))) {
++ return trans_MFFS(ctx, a);
++ }
++
+ REQUIRE_FPU(ctx);
+
+ t1 = tcg_temp_new_i64();
+@@ -661,7 +670,10 @@ static bool trans_MFFSCDRNI(DisasContext
+
+ static bool trans_MFFSL(DisasContext *ctx, arg_X_t *a)
+ {
+- REQUIRE_INSNS_FLAGS2(ctx, ISA300);
++ if (unlikely(!(ctx->insns_flags2 & PPC2_ISA300))) {
++ return trans_MFFS(ctx, a);
++ }
++
+ REQUIRE_FPU(ctx);
+
+ gen_reset_fpstatus();
See the patch for more details, fixes a regression in qemu causing illegal instructions in libm on powerpc, triggered by a libinput upgrade. https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=f1c56cdff09f650ad721fae026eb6a3651631f3d was the glibc code generating the instruction and triggering the issue. Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> --- meta/recipes-devtools/qemu/qemu.inc | 1 + meta/recipes-devtools/qemu/qemu/ppc.patch | 70 +++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 meta/recipes-devtools/qemu/qemu/ppc.patch