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/4d62644b5e89
branches:  trunk
changeset: 981002:4d62644b5e89
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 b732be4e609a -r 4d62644b5e89 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 b732be4e609a -r 4d62644b5e89 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