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-all mailing list