Module Name: src Committed By: martin Date: Tue Mar 3 18:54:59 UTC 2020
Modified Files: src/common/lib/libc/arch/powerpc/atomic [netbsd-9]: atomic_cas.S atomic_op_asm.h atomic_swap.S src/sys/arch/evbppc/conf [netbsd-9]: std.obs200 std.obs266 std.virtex std.walnut src/sys/arch/powerpc/ibm4xx [netbsd-9]: 4xx_trap_subr.S trap_subr.S src/sys/arch/powerpc/include [netbsd-9]: asm.h lock.h src/sys/arch/powerpc/powerpc [netbsd-9]: lock_stubs.S locore_subr.S trap_subr.S Log Message: Pull up following revision(s) (requested by rin in ticket #755): sys/arch/evbppc/conf/std.virtex: revision 1.4 sys/arch/powerpc/powerpc/trap_subr.S: revision 1.81 sys/arch/powerpc/ibm4xx/4xx_trap_subr.S: revision 1.8 sys/arch/evbppc/conf/std.walnut: revision 1.9 common/lib/libc/arch/powerpc/atomic/atomic_op_asm.h: revision 1.7 sys/arch/powerpc/include/asm.h: revision 1.49 common/lib/libc/arch/powerpc/atomic/atomic_cas.S: revision 1.9 sys/arch/powerpc/ibm4xx/trap_subr.S: revision 1.28 sys/arch/powerpc/include/lock.h: revision 1.15 sys/arch/evbppc/conf/std.obs266: revision 1.3 common/lib/libc/arch/powerpc/atomic/atomic_swap.S: revision 1.8 sys/arch/powerpc/powerpc/locore_subr.S: revision 1.61 sys/arch/powerpc/powerpc/lock_stubs.S: revision 1.12 sys/arch/evbppc/conf/std.obs200: revision 1.5 Implement workaround for IBM405 Errata 77 (aka CPU_210), where interrupted stwcx. may errantly write data to memory: https://elinux.org/images/1/1d/Ppc405gp-errata.pdf This is because stwcx. is split into two pieces in the pipeline. We need to (1) insert dcbt before every stwcx. instruction, as well as (2) insert sync before every rfi/rfci instruction. It is unclear which processors are affected, but according to Linux, all 405-based cores up until 405GPR and 405EP are affected: https://github.com/torvalds/linux/blob/master/arch/powerpc/platforms/40x/Kconfig#L140 For kernel, this workaround can be restricted to affected processors. However, for kernel modules and userland, we have to enable it for all 32bit powerpc archs in order to share common binaries as before. Proposed on port-powerpc: http://mail-index.netbsd.org/port-powerpc/2020/02/21/msg003583.html To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.8.28.1 \ src/common/lib/libc/arch/powerpc/atomic/atomic_cas.S cvs rdiff -u -r1.6 -r1.6.28.1 \ src/common/lib/libc/arch/powerpc/atomic/atomic_op_asm.h cvs rdiff -u -r1.7 -r1.7.28.1 \ src/common/lib/libc/arch/powerpc/atomic/atomic_swap.S cvs rdiff -u -r1.4 -r1.4.64.1 src/sys/arch/evbppc/conf/std.obs200 cvs rdiff -u -r1.2 -r1.2.60.1 src/sys/arch/evbppc/conf/std.obs266 cvs rdiff -u -r1.3 -r1.3.58.1 src/sys/arch/evbppc/conf/std.virtex cvs rdiff -u -r1.8 -r1.8.58.1 src/sys/arch/evbppc/conf/std.walnut cvs rdiff -u -r1.7 -r1.7.60.1 src/sys/arch/powerpc/ibm4xx/4xx_trap_subr.S cvs rdiff -u -r1.27 -r1.27.4.1 src/sys/arch/powerpc/ibm4xx/trap_subr.S cvs rdiff -u -r1.48 -r1.48.22.1 src/sys/arch/powerpc/include/asm.h cvs rdiff -u -r1.13 -r1.13.8.1 src/sys/arch/powerpc/include/lock.h cvs rdiff -u -r1.10 -r1.10.34.1 src/sys/arch/powerpc/powerpc/lock_stubs.S cvs rdiff -u -r1.57.4.1 -r1.57.4.2 src/sys/arch/powerpc/powerpc/locore_subr.S cvs rdiff -u -r1.80 -r1.80.4.1 src/sys/arch/powerpc/powerpc/trap_subr.S Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/common/lib/libc/arch/powerpc/atomic/atomic_cas.S diff -u src/common/lib/libc/arch/powerpc/atomic/atomic_cas.S:1.8 src/common/lib/libc/arch/powerpc/atomic/atomic_cas.S:1.8.28.1 --- src/common/lib/libc/arch/powerpc/atomic/atomic_cas.S:1.8 Fri Mar 7 07:17:54 2014 +++ src/common/lib/libc/arch/powerpc/atomic/atomic_cas.S Tue Mar 3 18:54:59 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: atomic_cas.S,v 1.8 2014/03/07 07:17:54 matt Exp $ */ +/* $NetBSD: atomic_cas.S,v 1.8.28.1 2020/03/03 18:54:59 martin Exp $ */ /*- * Copyright (c) 2007, 2008 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include "atomic_op_asm.h" -__RCSID("$NetBSD: atomic_cas.S,v 1.8 2014/03/07 07:17:54 matt Exp $") +__RCSID("$NetBSD: atomic_cas.S,v 1.8.28.1 2020/03/03 18:54:59 martin Exp $") .text ENTRY(_atomic_cas_32) @@ -39,6 +39,7 @@ ENTRY(_atomic_cas_32) 1: lwarx %r3,0,%r10 cmpw %r3,%r4 bnelr- + IBM405_ERRATA77_DCBT(0,%r10) stwcx. %r5,0,%r10 beqlr+ b 1b Index: src/common/lib/libc/arch/powerpc/atomic/atomic_op_asm.h diff -u src/common/lib/libc/arch/powerpc/atomic/atomic_op_asm.h:1.6 src/common/lib/libc/arch/powerpc/atomic/atomic_op_asm.h:1.6.28.1 --- src/common/lib/libc/arch/powerpc/atomic/atomic_op_asm.h:1.6 Fri Mar 7 07:17:54 2014 +++ src/common/lib/libc/arch/powerpc/atomic/atomic_op_asm.h Tue Mar 3 18:54:59 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: atomic_op_asm.h,v 1.6 2014/03/07 07:17:54 matt Exp $ */ +/* $NetBSD: atomic_op_asm.h,v 1.6.28.1 2020/03/03 18:54:59 martin Exp $ */ /*- * Copyright (c) 2007 The NetBSD Foundation, Inc. @@ -49,6 +49,7 @@ ENTRY(_atomic_##op##_32) ; \ mr %r10,%r3 ; \ 1: lwarx %r3,0,%r10 ; \ insn %r5,%r3,arg ; \ + IBM405_ERRATA77_DCBT(0,%r10) ; \ stwcx. %r5,0,%r10 ; \ beqlr+ ; \ b 1b ; \ @@ -71,6 +72,7 @@ ENTRY(_atomic_##op##_32_nv) ; \ mr %r10,%r3 ; \ 1: lwarx %r3,0,%r10 ; \ insn %r3,%r3,arg ; \ + IBM405_ERRATA77_DCBT(0,%r10) ; \ stwcx. %r3,0,%r10 ; \ beqlr+ ; \ b 1b ; \ Index: src/common/lib/libc/arch/powerpc/atomic/atomic_swap.S diff -u src/common/lib/libc/arch/powerpc/atomic/atomic_swap.S:1.7 src/common/lib/libc/arch/powerpc/atomic/atomic_swap.S:1.7.28.1 --- src/common/lib/libc/arch/powerpc/atomic/atomic_swap.S:1.7 Fri Mar 7 07:17:54 2014 +++ src/common/lib/libc/arch/powerpc/atomic/atomic_swap.S Tue Mar 3 18:54:59 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: atomic_swap.S,v 1.7 2014/03/07 07:17:54 matt Exp $ */ +/* $NetBSD: atomic_swap.S,v 1.7.28.1 2020/03/03 18:54:59 martin Exp $ */ /*- * Copyright (c) 2007 The NetBSD Foundation, Inc. @@ -31,12 +31,13 @@ #include "atomic_op_asm.h" -__RCSID("$NetBSD: atomic_swap.S,v 1.7 2014/03/07 07:17:54 matt Exp $") +__RCSID("$NetBSD: atomic_swap.S,v 1.7.28.1 2020/03/03 18:54:59 martin Exp $") .text ENTRY(_atomic_swap_32) mr %r10,%r3 1: lwarx %r3,0,%r10 + IBM405_ERRATA77_DCBT(0,%r10) stwcx. %r4,0,%r10 beqlr+ b 1b Index: src/sys/arch/evbppc/conf/std.obs200 diff -u src/sys/arch/evbppc/conf/std.obs200:1.4 src/sys/arch/evbppc/conf/std.obs200:1.4.64.1 --- src/sys/arch/evbppc/conf/std.obs200:1.4 Thu Mar 18 14:15:38 2010 +++ src/sys/arch/evbppc/conf/std.obs200 Tue Mar 3 18:54:59 2020 @@ -1,9 +1,11 @@ -# $NetBSD: std.obs200,v 1.4 2010/03/18 14:15:38 kiyohara Exp $ +# $NetBSD: std.obs200,v 1.4.64.1 2020/03/03 18:54:59 martin Exp $ # # Standard/required options for obs200 include "arch/evbppc/conf/std.obs405" +options IBM405_ERRATA77 + makeoptions PRDCTTYPE="obs200" makeoptions TEXTADDR=0x450000 options KERNBASE=0x450000 Index: src/sys/arch/evbppc/conf/std.obs266 diff -u src/sys/arch/evbppc/conf/std.obs266:1.2 src/sys/arch/evbppc/conf/std.obs266:1.2.60.1 --- src/sys/arch/evbppc/conf/std.obs266:1.2 Mon Apr 4 19:55:16 2011 +++ src/sys/arch/evbppc/conf/std.obs266 Tue Mar 3 18:54:59 2020 @@ -1,9 +1,11 @@ -# $NetBSD: std.obs266,v 1.2 2011/04/04 19:55:16 dyoung Exp $ +# $NetBSD: std.obs266,v 1.2.60.1 2020/03/03 18:54:59 martin Exp $ # # Standard/required options for obs266. include "arch/evbppc/conf/std.obs405" +options IBM405_ERRATA77 + makeoptions PRDCTTYPE="obs266" makeoptions TEXTADDR=0x25000 options KERNBASE=0x25000 Index: src/sys/arch/evbppc/conf/std.virtex diff -u src/sys/arch/evbppc/conf/std.virtex:1.3 src/sys/arch/evbppc/conf/std.virtex:1.3.58.1 --- src/sys/arch/evbppc/conf/std.virtex:1.3 Mon Jun 20 17:44:33 2011 +++ src/sys/arch/evbppc/conf/std.virtex Tue Mar 3 18:54:59 2020 @@ -1,4 +1,4 @@ -# $NetBSD: std.virtex,v 1.3 2011/06/20 17:44:33 matt Exp $ +# $NetBSD: std.virtex,v 1.3.58.1 2020/03/03 18:54:59 martin Exp $ # # Standard/required options for NetBSD/virtex. @@ -8,6 +8,10 @@ include "conf/std" # MI standard option # standard ("mandatory") kernel options. options PPC_IBM4XX # IBM 40x family +# XXX According to Linux, 405D5 (Virtex-II Pro) is affected, whereas +# XXX 405F6 (Virtex-4) is not. +options IBM405_ERRATA77 + # Executable support: options EXEC_ELF32 # (native) ELF32 binary support options EXEC_AOUT # (native) a.out binary support (deprecated) Index: src/sys/arch/evbppc/conf/std.walnut diff -u src/sys/arch/evbppc/conf/std.walnut:1.8 src/sys/arch/evbppc/conf/std.walnut:1.8.58.1 --- src/sys/arch/evbppc/conf/std.walnut:1.8 Wed Jun 22 18:06:32 2011 +++ src/sys/arch/evbppc/conf/std.walnut Tue Mar 3 18:54:59 2020 @@ -1,4 +1,4 @@ -# $NetBSD: std.walnut,v 1.8 2011/06/22 18:06:32 matt Exp $ +# $NetBSD: std.walnut,v 1.8.58.1 2020/03/03 18:54:59 martin Exp $ # # Standard/required options for NetBSD/walnut. @@ -8,6 +8,8 @@ include "conf/std" # MI standard option # standard ("mandatory") kernel options. options PPC_IBM4XX # IBM 40x family +options IBM405_ERRATA77 + # Executable support: options EXEC_ELF32 # (native) ELF32 binary support options EXEC_AOUT # (native) a.out binary support (deprecated) Index: src/sys/arch/powerpc/ibm4xx/4xx_trap_subr.S diff -u src/sys/arch/powerpc/ibm4xx/4xx_trap_subr.S:1.7 src/sys/arch/powerpc/ibm4xx/4xx_trap_subr.S:1.7.60.1 --- src/sys/arch/powerpc/ibm4xx/4xx_trap_subr.S:1.7 Thu May 19 07:51:50 2011 +++ src/sys/arch/powerpc/ibm4xx/4xx_trap_subr.S Tue Mar 3 18:54:59 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: 4xx_trap_subr.S,v 1.7 2011/05/19 07:51:50 kiyohara Exp $ */ +/* $NetBSD: 4xx_trap_subr.S,v 1.7.60.1 2020/03/03 18:54:59 martin Exp $ */ /* * Copyright 2001 Wasabi Systems, Inc. @@ -55,10 +55,12 @@ _C_LABEL(pitfitwdog): _C_LABEL(pitfitwdogsize) = .-_C_LABEL(pitfitwdog) pithandler: + IBM405_ERRATA77_SYNC rfi ba . /* Protect against prefetch */ wdoghandler: + IBM405_ERRATA77_SYNC rfi ba . /* Protect against prefetch */ Index: src/sys/arch/powerpc/ibm4xx/trap_subr.S diff -u src/sys/arch/powerpc/ibm4xx/trap_subr.S:1.27 src/sys/arch/powerpc/ibm4xx/trap_subr.S:1.27.4.1 --- src/sys/arch/powerpc/ibm4xx/trap_subr.S:1.27 Sun Jul 15 05:16:43 2018 +++ src/sys/arch/powerpc/ibm4xx/trap_subr.S Tue Mar 3 18:54:59 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: trap_subr.S,v 1.27 2018/07/15 05:16:43 maxv Exp $ */ +/* $NetBSD: trap_subr.S,v 1.27.4.1 2020/03/03 18:54:59 martin Exp $ */ /* * Copyright 2001 Wasabi Systems, Inc. @@ -334,6 +334,7 @@ intrleave_to_kernel: mtpid %r31 mfsprg3 %r31 mfsprg2 %r30 + IBM405_ERRATA77_SYNC rfi ba . /* Protect against prefetch */ @@ -375,6 +376,7 @@ intrleave_to_user: mtpid %r31 mfsprg3 %r31 mfsprg2 %r30 + IBM405_ERRATA77_SYNC rfi ba . /* Protect against prefetch */ Index: src/sys/arch/powerpc/include/asm.h diff -u src/sys/arch/powerpc/include/asm.h:1.48 src/sys/arch/powerpc/include/asm.h:1.48.22.1 --- src/sys/arch/powerpc/include/asm.h:1.48 Mon Jan 12 02:32:33 2015 +++ src/sys/arch/powerpc/include/asm.h Tue Mar 3 18:54:59 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: asm.h,v 1.48 2015/01/12 02:32:33 dennis Exp $ */ +/* $NetBSD: asm.h,v 1.48.22.1 2020/03/03 18:54:59 martin Exp $ */ /* * Copyright (C) 1995, 1996 Wolfgang Solfrank. @@ -432,4 +432,20 @@ y: .quad .##y,.TOC.@tocbase,0; \ .endm #endif /* _LOCORE */ +#if defined(IBM405_ERRATA77) || \ + ((defined(_MODULE) || !defined(_KERNEL)) && !defined(__LP64__)) +/* + * Workaround for IBM405 Errata 77 (CPU_210): interrupted stwcx. may + * errantly write data to memory + * + * (1) Insert dcbt before every stwcx. instruction + * (2) Insert sync before every rfi/rfci instruction + */ +#define IBM405_ERRATA77_DCBT(ra, rb) dcbt ra,rb +#define IBM405_ERRATA77_SYNC sync +#else +#define IBM405_ERRATA77_DCBT(ra, rb) /* nothing */ +#define IBM405_ERRATA77_SYNC /* nothing */ +#endif + #endif /* !_PPC_ASM_H_ */ Index: src/sys/arch/powerpc/include/lock.h diff -u src/sys/arch/powerpc/include/lock.h:1.13 src/sys/arch/powerpc/include/lock.h:1.13.8.1 --- src/sys/arch/powerpc/include/lock.h:1.13 Sun Sep 17 00:01:08 2017 +++ src/sys/arch/powerpc/include/lock.h Tue Mar 3 18:54:59 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: lock.h,v 1.13 2017/09/17 00:01:08 christos Exp $ */ +/* $NetBSD: lock.h,v 1.13.8.1 2020/03/03 18:54:59 martin Exp $ */ /*- * Copyright (c) 2000, 2007 The NetBSD Foundation, Inc. @@ -80,7 +80,11 @@ __cpu_simple_lock(__cpu_simple_lock_t *a 2: lwzx %0,0,%1 \n\ cmpwi %0,%2 \n\ beq+ 1b \n\ - b 2b \n\ + b 2b \n" +#ifdef IBM405_ERRATA77 + "dcbt 0,%1 \n" +#endif +" \ 3: stwcx. %3,0,%1 \n\ bne- 1b \n\ isync \n\ @@ -99,9 +103,16 @@ __cpu_simple_lock_try(__cpu_simple_lock_ \n\ 1: lwarx %0,0,%1 \n\ cmpwi %0,%2 \n\ - bne 2f \n\ - stwcx. %3,0,%1 \n\ - bne- 1b \n\ + bne 2f \n" +#ifdef IBM405_ERRATA77 + "dcbt 0,%1 \n" +#endif + "stwcx. %3,0,%1 \n\ + bne- 1b \n" +#ifdef IBM405_ERRATA77 + "dcbt 0,%4 \n" +#endif +" \ 2: stwcx. %3,0,%4 \n\ isync \n\ \n" Index: src/sys/arch/powerpc/powerpc/lock_stubs.S diff -u src/sys/arch/powerpc/powerpc/lock_stubs.S:1.10 src/sys/arch/powerpc/powerpc/lock_stubs.S:1.10.34.1 --- src/sys/arch/powerpc/powerpc/lock_stubs.S:1.10 Fri Feb 28 05:38:15 2014 +++ src/sys/arch/powerpc/powerpc/lock_stubs.S Tue Mar 3 18:54:59 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: lock_stubs.S,v 1.10 2014/02/28 05:38:15 matt Exp $ */ +/* $NetBSD: lock_stubs.S,v 1.10.34.1 2020/03/03 18:54:59 martin Exp $ */ /*- * Copyright (c) 2007 The NetBSD Foundation, Inc. @@ -55,6 +55,7 @@ ENTRY(_lock_cas) lptrarx %r10,0,%r3 cmpptr %r10,%r4 bne- 2f + IBM405_ERRATA77_DCBT(0,%r3) stptrcx. %r5,0,%r3 bne- 1b SYNC @@ -73,6 +74,7 @@ ENTRY(mutex_enter) lptrarx %r10,0,%r3 cmpptri %r10,0 bne- 2f + IBM405_ERRATA77_DCBT(0,%r3) stptrcx. %r13,0,%r3 bne- 1b ISYNC @@ -90,6 +92,7 @@ ENTRY(mutex_exit) lptrarx %r10,0,%r3 cmpptr %r10,%r13 bne- 2f + IBM405_ERRATA77_DCBT(0,%r3) stptrcx. %r7,0,%r3 bne- 1b blr @@ -125,6 +128,7 @@ ENTRY(rw_enter) 2: lptrarx %r10,0,%r3 cmpptr %r10,%r9 bne- 3f + IBM405_ERRATA77_DCBT(0,%r3) stptrcx. %r7,0,%r3 bne- 2b ISYNC @@ -150,6 +154,7 @@ ENTRY(rw_tryenter) 2: lptrarx %r10,0,%r3 cmpptr %r10,%r9 bne- 3f + IBM405_ERRATA77_DCBT(0,%r3) stptrcx. %r7,0,%r3 bne- 2b @@ -181,6 +186,7 @@ ENTRY(rw_exit) 2: lptrarx %r10,0,%r3 cmpptr %r10,%r9 bne- 3f + IBM405_ERRATA77_DCBT(0,%r3) stptrcx. %r7,0,%r3 bne- 2b Index: src/sys/arch/powerpc/powerpc/locore_subr.S diff -u src/sys/arch/powerpc/powerpc/locore_subr.S:1.57.4.1 src/sys/arch/powerpc/powerpc/locore_subr.S:1.57.4.2 --- src/sys/arch/powerpc/powerpc/locore_subr.S:1.57.4.1 Thu Feb 27 18:50:43 2020 +++ src/sys/arch/powerpc/powerpc/locore_subr.S Tue Mar 3 18:54:59 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: locore_subr.S,v 1.57.4.1 2020/02/27 18:50:43 martin Exp $ */ +/* $NetBSD: locore_subr.S,v 1.57.4.2 2020/03/03 18:54:59 martin Exp $ */ /* * Copyright (c) 2001 Wasabi Systems, Inc. @@ -288,6 +288,7 @@ switchto_restore: */ ldreg %r31,CFRAME_R31(%r1) /* restore saved registers */ ldreg %r30,CFRAME_R30(%r1) + IBM405_ERRATA77_DCBT(0,%r1) stwcx. %r1,0,%r1 /* clear reservation */ #if 1 addi %r1,%r1,CALLFRAMELEN @@ -329,6 +330,7 @@ _ENTRY(softint_cleanup) mtmsr %r0 isync #endif + IBM405_ERRATA77_DCBT(0,%r1) stwcx. %r1,0,%r1 /* clear reservation */ addi %r1, %r1, CALLFRAMELEN ldreg %r0, CFRAME_LR(%r1) @@ -480,6 +482,7 @@ _ENTRY(softint_fast_dispatch) ldreg %r29,SFRAME_R29(%r1) /* R29 */ ldreg %r31,SFRAMELEN+CFRAME_R31(%r1) /* restore saved registers */ ldreg %r30,SFRAMELEN+CFRAME_R30(%r1) + IBM405_ERRATA77_DCBT(0,%r1) stwcx. %r1,0,%r1 /* clear reservation */ addi %r1,%r1,SFRAMELEN+2*CALLFRAMELEN /* remove switch & callframes */ #endif @@ -588,6 +591,7 @@ ENTRY(do_ucas_32) lwarx %r10,0,%r3 cmpw %r10, %r4 bne 2f + IBM405_ERRATA77_DCBT(0,%r3) stwcx. %r5,0,%r3 bne 1b mr %r5,%r10 Index: src/sys/arch/powerpc/powerpc/trap_subr.S diff -u src/sys/arch/powerpc/powerpc/trap_subr.S:1.80 src/sys/arch/powerpc/powerpc/trap_subr.S:1.80.4.1 --- src/sys/arch/powerpc/powerpc/trap_subr.S:1.80 Sun Jul 15 05:16:44 2018 +++ src/sys/arch/powerpc/powerpc/trap_subr.S Tue Mar 3 18:54:59 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: trap_subr.S,v 1.80 2018/07/15 05:16:44 maxv Exp $ */ +/* $NetBSD: trap_subr.S,v 1.80.4.1 2020/03/03 18:54:59 martin Exp $ */ /* * Copyright (C) 1995, 1996 Wolfgang Solfrank. @@ -315,6 +315,7 @@ dsitrap_fix_dbat7: ldreg %r30,(CI_DISISAVE+CPUSAVE_R30)(%r1) /* restore r30 */ ldreg %r31,(CI_DISISAVE+CPUSAVE_R31)(%r1) /* restore r31 */ mfsprg1 %r1 + IBM405_ERRATA77_SYNC RFI /* return to trapped code */ 1: #endif /* !PPC_MPC8XX */ @@ -387,6 +388,7 @@ _C_LABEL(dsi601trap): ldreg %r30,(CI_DISISAVE+CPUSAVE_R30)(%r1) /* restore r30 */ ldreg %r31,(CI_DISISAVE+CPUSAVE_R31)(%r1) /* restore r31 */ mfsprg1 %r1 + IBM405_ERRATA77_SYNC RFI /* return to trapped code */ 1: mflr %r28 /* save LR */ @@ -503,6 +505,7 @@ _C_LABEL(tlbimiss): srwi %r1,%r1,8 /* get byte 7 of pte */ tlbli %r0 /* load the itlb */ stb %r1,6(%r2) /* update page table */ + IBM405_ERRATA77_SYNC RFI 3: /* not found in pteg */ @@ -562,6 +565,7 @@ _C_LABEL(tlbdlmiss): srwi %r1,%r1,8 /* get byte 7 of pte */ tlbld %r0 /* load the dtlb */ stb %r1,6(%r2) /* update page table */ + IBM405_ERRATA77_SYNC RFI 3: /* not found in pteg */ @@ -618,6 +622,7 @@ _C_LABEL(tlbdsmiss): mtcrf 0x80,%r3 /* and restore */ mtspr SPR_RPA,%r1 /* set the pte */ tlbld %r0 /* load the dtlb */ + IBM405_ERRATA77_SYNC RFI 3: /* not found in pteg */ @@ -991,6 +996,7 @@ trapleave: FRAME_RESTORE_CALLEE intrleave: FRAME_LEAVE(CI_TEMPSAVE) + IBM405_ERRATA77_SYNC RFI /* @@ -1214,6 +1220,7 @@ ddbtrap: beq trapagain FRAME_RESTORE_CALLEE FRAME_LEAVE(CI_DDBSAVE) + IBM405_ERRATA77_SYNC RFI #endif /* DDB || KGDB */