Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/powerpc/powerpc Reset segment registers 1-7 upon en...



details:   https://anonhg.NetBSD.org/src/rev/cfc3a204ba54
branches:  trunk
changeset: 511922:cfc3a204ba54
user:      matt <matt%NetBSD.org@localhost>
date:      Sat Jun 30 01:24:13 2001 +0000

description:
Reset segment registers 1-7 upon entry to kernel (via trap or interrupts)
so that the bat spill code won't run into spurious valid user pages and
treat them as kernel pages.  Restore segment registers 1-7 upon return to
user mode from either a trap or interrupt.   XXX  eventually do all 16 SRs

diffstat:

 sys/arch/powerpc/powerpc/trap_subr.S |  53 ++++++++++++++++++++++++++++++++++-
 1 files changed, 51 insertions(+), 2 deletions(-)

diffs (92 lines):

diff -r 4ab125c9eb09 -r cfc3a204ba54 sys/arch/powerpc/powerpc/trap_subr.S
--- a/sys/arch/powerpc/powerpc/trap_subr.S      Sat Jun 30 01:21:24 2001 +0000
+++ b/sys/arch/powerpc/powerpc/trap_subr.S      Sat Jun 30 01:24:13 2001 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: trap_subr.S,v 1.9 2001/06/23 02:36:14 matt Exp $       */
+/*     $NetBSD: trap_subr.S,v 1.10 2001/06/30 01:24:13 matt Exp $      */
 
 /*
  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -542,6 +542,20 @@
 /* Restore user & kernel access SR: */                                 \
        lis     2,_C_LABEL(curpm)@ha;   /* get real address of pmap */  \
        lwz     2,_C_LABEL(curpm)@l(2);                                 \
+       lwz     3,PM_SR+4(2);                                           \
+       mtsr    1,3;                    /* restore SR1 */               \
+       lwz     3,PM_SR+8(2);                                           \
+       mtsr    2,3;                    /* restore SR2 */               \
+       lwz     3,PM_SR+12(2);                                          \
+       mtsr    3,3;                    /* restore SR3 */               \
+       lwz     3,PM_SR+16(2);                                          \
+       mtsr    4,3;                    /* restore SR4 */               \
+       lwz     3,PM_SR+20(2);                                          \
+       mtsr    5,3;                    /* restore SR5 */               \
+       lwz     3,PM_SR+24(2);                                          \
+       mtsr    6,3;                    /* restore SR6 */               \
+       lwz     3,PM_SR+28(2);                                          \
+       mtsr    7,3;                    /* restore SR7 */               \
        lwz     3,PM_USRSR(2);                                          \
        mtsr    USER_SR,3;                                              \
        lwz     3,PM_KERNELSR(2);                                       \
@@ -585,6 +599,16 @@
        lis     31,KERNEL_SEGMENT@h
        ori     31,31,KERNEL_SEGMENT@l
        mtsr    KERNEL_SR,31
+/* Obliterate SRs so BAT spills work correctly */
+       lis     31,EMPTY_SEGMENT@h
+       ori     31,31,EMPTY_SEGMENT@l
+       mtsr    1,31
+       mtsr    2,31
+       mtsr    3,31
+       mtsr    4,31
+       mtsr    5,31
+       mtsr    6,31
+       mtsr    7,31
        FRAME_SETUP(tempsave)
 /* Now we can recover interrupts again: */
        mfmsr   7
@@ -729,11 +753,22 @@
        stw     5,20(1);                                                \
        stw     4,12(1);                                                \
        stw     3,8(1);                                                 \
+       mtcr    3;                                                      \
+       bc      4,17,99f;       /* branch if PSL_PR is false */         \
+       lis     3,EMPTY_SEGMENT@h;                                      \
+       ori     3,3,EMPTY_SEGMENT@l;                                    \
+       mtsr    1,3;            /* reset SRs so BAT spills work */      \
+       mtsr    2,3;                                                    \
+       mtsr    3,3;                                                    \
+       mtsr    4,3;                                                    \
+       mtsr    5,3;                                                    \
+       mtsr    6,3;                                                    \
+       mtsr    7,3;                                                    \
 /* interrupts are recoverable here, and enable translation */          \
        lis     3,(KERNEL_SEGMENT|SR_SUKEY|SR_PRKEY)@h;                 \
        ori     3,3,(KERNEL_SEGMENT|SR_SUKEY|SR_PRKEY)@l;               \
        mtsr    KERNEL_SR,3;                                            \
-       mfmsr   5;                                                      \
+99:    mfmsr   5;                                                      \
        ori     5,5,(PSL_IR|PSL_DR|PSL_RI);                             \
        mtmsr   5;                                                      \
        isync
@@ -770,6 +805,20 @@
        bc      4,17,1f                 /* branch if PSL_PR is false */
        lis     3,_C_LABEL(curpm)@ha    /* get current pmap real address */
        lwz     3,_C_LABEL(curpm)@l(3)
+       lwz     4,PM_SR+4(3)
+       mtsr    1,4                     /* Restore SR1 */
+       lwz     4,PM_SR+8(3)
+       mtsr    2,4                     /* Restore SR2 */
+       lwz     4,PM_SR+12(3)
+       mtsr    3,4                     /* Restore SR3 */
+       lwz     4,PM_SR+16(3)
+       mtsr    4,4                     /* Restore SR4 */
+       lwz     4,PM_SR+20(3)
+       mtsr    5,4                     /* Restore SR5 */
+       lwz     4,PM_SR+24(3)
+       mtsr    6,4                     /* Restore SR6 */
+       lwz     4,PM_SR+28(3)
+       mtsr    7,4                     /* Restore SR7 */
        lwz     3,PM_KERNELSR(3)
        mtsr    KERNEL_SR,3             /* Restore kernel SR */
        lis     3,_C_LABEL(astpending)@ha /* Test AST pending */



Home | Main Index | Thread Index | Old Index