svn commit: r366037 - in head/sys: conf powerpc/conf powerpc/ofw powerpc/powernv
Brandon Bergren
bdragon at FreeBSD.org
Wed Sep 23 00:09:30 UTC 2020
Author: bdragon
Date: Wed Sep 23 00:09:29 2020
New Revision: 366037
URL: https://svnweb.freebsd.org/changeset/base/366037
Log:
[PowerPC64LE] Work around qemu TCG bug in mtmsrd emulation.
The TCG implementation of mtmsrd in qemu blindly copies the entire register
to the MSR, instead of the specific bit positions listed in the ISA.
This means that qemu will prematurely switch endian out from under the
running code instead of waiting for the rfid, causing an immediate trap
as it attempts to interpret the next instruction in the wrong endianness.
To work around this, ensure PSL_LE is still set before doing the mtmsrd.
In the future, we may wish to just turn off translation and unconditionally
use rfid to switch to the ofmsr instead of quasi-switching to the ofmsr.
Add a new platform option so this can be disabled. (And so that we can
conditonalize additional QEMU-specific hacks in the platform code.)
Sponsored by: Tag1 Consulting, Inc.
Modified:
head/sys/conf/options.powerpc
head/sys/powerpc/conf/GENERIC64
head/sys/powerpc/conf/NOTES
head/sys/powerpc/ofw/ofwcall64.S
head/sys/powerpc/powernv/opalcall.S
Modified: head/sys/conf/options.powerpc
==============================================================================
--- head/sys/conf/options.powerpc Wed Sep 23 00:06:48 2020 (r366036)
+++ head/sys/conf/options.powerpc Wed Sep 23 00:09:29 2020 (r366037)
@@ -29,6 +29,7 @@ MAMBO
POWERNV opt_platform.h
PSERIES
PSIM
+QEMU opt_platform.h
SC_OFWFB opt_ofwfb.h
Modified: head/sys/powerpc/conf/GENERIC64
==============================================================================
--- head/sys/powerpc/conf/GENERIC64 Wed Sep 23 00:06:48 2020 (r366036)
+++ head/sys/powerpc/conf/GENERIC64 Wed Sep 23 00:09:29 2020 (r366037)
@@ -30,6 +30,7 @@ makeoptions WITH_CTF=1
options POWERMAC #NewWorld Apple PowerMacs
options PS3 #Sony Playstation 3
options MAMBO #IBM Mambo Full System Simulator
+options QEMU #QEMU processor emulator
options PSERIES #PAPR-compliant systems (e.g. IBM p)
options POWERNV #Non-virtualized OpenPOWER systems
Modified: head/sys/powerpc/conf/NOTES
==============================================================================
--- head/sys/powerpc/conf/NOTES Wed Sep 23 00:06:48 2020 (r366036)
+++ head/sys/powerpc/conf/NOTES Wed Sep 23 00:09:29 2020 (r366037)
@@ -44,6 +44,7 @@ options POWERMAC #NewWorld Apple PowerMacs
#options PS3 #Sony Playstation 3
options PSIM #GDB PSIM ppc simulator
options MAMBO #IBM Mambo Full System Simulator
+options QEMU #QEMU processor emulator
# The cpufreq(4) driver provides support for CPU frequency control
device cpufreq
Modified: head/sys/powerpc/ofw/ofwcall64.S
==============================================================================
--- head/sys/powerpc/ofw/ofwcall64.S Wed Sep 23 00:06:48 2020 (r366036)
+++ head/sys/powerpc/ofw/ofwcall64.S Wed Sep 23 00:09:29 2020 (r366037)
@@ -32,6 +32,8 @@
#include <machine/spr.h>
#include <machine/asm.h>
+#include "opt_platform.h"
+
#define OFWSTKSZ 4096 /* 4K Open Firmware stack */
/*
@@ -119,6 +121,10 @@ ASENTRY_NOPROF(ofwcall)
addis %r5,%r2,TOC_REF(ofmsr)@ha
ld %r5,TOC_REF(ofmsr)@l(%r5)
ld %r5,0(%r5)
+#if defined(__LITTLE_ENDIAN__) && defined(QEMU)
+ /* QEMU hack: qemu does not emulate mtmsrd correctly! */
+ ori %r5,%r5,1 /* Leave PSR_LE set */
+#endif
mtmsrd %r5
isync
@@ -270,6 +276,10 @@ ASENTRY_NOPROF(rtascall)
addis %r7,%r2,TOC_REF(rtasmsr)@ha
ld %r7,TOC_REF(rtasmsr)@l(%r7)
ld %r7,0(%r7)
+#ifdef __LITTLE_ENDIAN__
+ /* QEMU hack: qemu does not emulate mtmsrd correctly! */
+ ori %r7,%r7,1 /* Leave PSR_LE set */
+#endif
mtmsrd %r7
isync
Modified: head/sys/powerpc/powernv/opalcall.S
==============================================================================
--- head/sys/powerpc/powernv/opalcall.S Wed Sep 23 00:06:48 2020 (r366036)
+++ head/sys/powerpc/powernv/opalcall.S Wed Sep 23 00:09:29 2020 (r366037)
@@ -27,6 +27,8 @@
#include <machine/asm.h>
+#include "opt_platform.h"
+
GLOBAL(opal_entrypoint)
.llong 0
GLOBAL(opal_data)
@@ -70,8 +72,17 @@ ASENTRY(opal_call)
ld %r2,TOC_REF(opal_data)@l(%r2)
ld %r2,0(%r2)
+
+#if defined(__LITTLE_ENDIAN__) && defined(QEMU)
+ /* QEMU hack: qemu does not emulate mtmsrd correctly! */
+ ori %r3,%r3,1 /* Leave PSR_LE set */
+#endif
mtmsrd %r3
isync
+#if defined(__LITTLE_ENDIAN__) && defined(QEMU)
+ /* Clean up from qemu hack */
+ xori %r3,%r3,1
+#endif
/* Shift registers over */
mr %r3,%r4
More information about the svn-src-head
mailing list