Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/powerpc/oea Don't save the firmware's copy of SPRG[...
details: https://anonhg.NetBSD.org/src/rev/99e86938a194
branches: trunk
changeset: 959778:99e86938a194
user: thorpej <thorpej%NetBSD.org@localhost>
date: Wed Feb 24 16:53:00 2021 +0000
description:
Don't save the firmware's copy of SPRG[0-3], and don't fiddle with
SPRG[0-3] in the firmware trampoline. Section 7.1 of the OpenFirmware
PowerPC CPU bindings says that firmware "client interface shall not modify"
when in virtual-mode, and "client interface shall preserve" in real-mode.
This is important because in vritual-mode, DSI exceptions will land in
the kernel's DSI exception handler, and that handler depends on the
kernel's SPRG0 value (it contains the pointer to the cpu_info for that
CPU).
Additionally, in the firmware trampoline, point curcpu at an empty
ofw_battable. This ensures that the DSI exception handler won't
load a BAT register with a kernel block translation that clobbers
a segment translation owned by the firmware. Eventually, this ofw_battable
might contain some of the larger translations owned by the firmware.
diffstat:
sys/arch/powerpc/oea/ofw_subr.S | 57 ++++++++++------------------------
sys/arch/powerpc/oea/ofwoea_machdep.c | 16 ++++++++-
2 files changed, 31 insertions(+), 42 deletions(-)
diffs (142 lines):
diff -r 426baea8678a -r 99e86938a194 sys/arch/powerpc/oea/ofw_subr.S
--- a/sys/arch/powerpc/oea/ofw_subr.S Wed Feb 24 16:42:38 2021 +0000
+++ b/sys/arch/powerpc/oea/ofw_subr.S Wed Feb 24 16:53:00 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ofw_subr.S,v 1.17 2021/02/19 18:03:21 thorpej Exp $ */
+/* $NetBSD: ofw_subr.S,v 1.18 2021/02/24 16:53:00 thorpej Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -52,7 +52,7 @@
/* MSR and SPRG[0-3] used in OpenFirmware */
.globl ofwmsr
- .comm ofwmsr,20,4
+ .comm ofwmsr,4,4
#ifdef FIRMWORKSBUGS
.lcomm ofwreal_incharge,4,4
@@ -101,16 +101,7 @@
/* Save the MSR that OpenFirmware is using. */
mfmsr %r0
lis %r9,ofwmsr@ha
- stwu %r0,ofwmsr@l(%r9)
-
- mfsprg0 %r0 /* save SPRGs */
- stw %r0,4(%r9)
- mfsprg1 %r0
- stw %r0,8(%r9)
- mfsprg2 %r0
- stw %r0,12(%r9)
- mfsprg3 %r0
- stw %r0,16(%r9)
+ stw %r0,ofwmsr@l(%r9)
lis %r8,OF_buffer@ha
addi %r8,%r8,OF_buffer@l
@@ -161,15 +152,6 @@
lwz %r4,ofentry@l(%r4)
mtlr %r4
- mfsprg0 %r5 /* save current sprg0 (curcpu) */
- stw %r5,16(%r1)
- mfsprg1 %r5 /* save current sprg1 */
- stw %r5,20(%r1)
- mfsprg2 %r5 /* save current sprg1 */
- stw %r5,24(%r1)
- mfsprg3 %r5 /* save current sprg3 */
- stw %r5,28(%r1)
-
#ifdef FIRMWORKSBUGS
lis %r4,ofwreal_incharge@ha
lwz %r4,ofwreal_incharge@l(%r4)
@@ -214,21 +196,25 @@
cmpwi %r5,0
bne 1b
2:
- lis %r4,ofwmsr+16@ha /* Open Firmware msr + sprg[0-3] */
- lwzu %r5,ofwmsr+16@l(%r4)
- mtsprg3 %r5
- lwz %r5,-4(%r4)
- mtsprg2 %r5
- lwz %r5,-8(%r4)
- mtsprg1 %r5
- lwz %r5,-12(%r4)
- mtsprg0 %r5
- lwz %r5,-16(%r4)
+ /* curcpu()->ci_battable = &ofw_battable */
+ GET_CPUINFO(%r4)
+ lis %r5,_C_LABEL(ofw_battable)@ha
+ addi %r5,%r5,_C_LABEL(ofw_battable)@l
+ stw %r5,CI_BATTABLE(%r4)
+
+ lis %r4,ofwmsr@ha /* Open Firmware msr */
+ lwz %r5,ofwmsr@l(%r4)
mtmsr %r5
isync
blrl /* call Open Firmware */
+ /* curcpu()->ci_battable = &battable */
+ GET_CPUINFO(%r4)
+ lis %r5,_C_LABEL(battable)@ha
+ addi %r5,%r5,_C_LABEL(battable)@l
+ stw %r5,CI_BATTABLE(%r4)
+
lis %r4,ofwsrsave@ha /* restore saved SRs */
addi %r4,%r4,ofwsrsave@l
li %r5,0
@@ -243,15 +229,6 @@
mtmsr %r4
isync
4:
- lwz %r5,16(%r1) /* restore saved sprgs (curcpu) */
- mtsprg0 %r5
- lwz %r5,20(%r1)
- mtsprg1 %r5
- lwz %r5,24(%r1)
- mtsprg2 %r5
- lwz %r5,28(%r1)
- mtsprg3 %r5
-
addi %r1,%r1,48 /* pop stack frame and save area */
lwz %r0,4(%r1) /* return address */
mtlr %r0
diff -r 426baea8678a -r 99e86938a194 sys/arch/powerpc/oea/ofwoea_machdep.c
--- a/sys/arch/powerpc/oea/ofwoea_machdep.c Wed Feb 24 16:42:38 2021 +0000
+++ b/sys/arch/powerpc/oea/ofwoea_machdep.c Wed Feb 24 16:53:00 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ofwoea_machdep.c,v 1.53 2021/02/19 18:10:51 thorpej Exp $ */
+/* $NetBSD: ofwoea_machdep.c,v 1.54 2021/02/24 16:53:00 thorpej Exp $ */
/*-
* Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ofwoea_machdep.c,v 1.53 2021/02/19 18:10:51 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ofwoea_machdep.c,v 1.54 2021/02/24 16:53:00 thorpej Exp $");
#include "ksyms.h"
#include "wsdisplay.h"
@@ -100,7 +100,19 @@
struct OF_translation ofw_translations[OFW_MAX_TRANSLATIONS];
+/*
+ * Data structures holding OpenFirmware's translations when running
+ * in virtual-mode.
+ *
+ * When we call into OpenFirmware, we point the calling CPU's
+ * cpu_info::ci_battable at ofw_battable[]. For now, this table
+ * is empty, which will ensure that any DSI exceptions that occur
+ * during the firmware call will not erroneously load kernel BAT
+ * mappings that could clobber the firmware's translations.
+ */
struct pmap ofw_pmap;
+struct bat ofw_battable[BAT_VA2IDX(0xffffffff)+1];
+
char bootpath[256];
char model_name[64];
#if NKSYMS || defined(DDB) || defined(MODULAR)
Home |
Main Index |
Thread Index |
Old Index