CVS commit: src/sys/dev/ic

2013-08-31 Thread KIYOHARA Takashi
Module Name:src
Committed By:   kiyohara
Date:   Sun Sep  1 04:58:15 UTC 2013

Modified Files:
src/sys/dev/ic: com.c comreg.h

Log Message:
Add support 16750 64Byte FIFO.  But not test.


To generate a diff of this commit:
cvs rdiff -u -r1.313 -r1.314 src/sys/dev/ic/com.c
cvs rdiff -u -r1.19 -r1.20 src/sys/dev/ic/comreg.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/com.c
diff -u src/sys/dev/ic/com.c:1.313 src/sys/dev/ic/com.c:1.314
--- src/sys/dev/ic/com.c:1.313	Sun Sep  1 04:51:24 2013
+++ src/sys/dev/ic/com.c	Sun Sep  1 04:58:15 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: com.c,v 1.313 2013/09/01 04:51:24 kiyohara Exp $ */
+/* $NetBSD: com.c,v 1.314 2013/09/01 04:58:15 kiyohara Exp $ */
 
 /*-
  * Copyright (c) 1998, 1999, 2004, 2008 The NetBSD Foundation, Inc.
@@ -66,7 +66,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: com.c,v 1.313 2013/09/01 04:51:24 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: com.c,v 1.314 2013/09/01 04:58:15 kiyohara Exp $");
 
 #include "opt_com.h"
 #include "opt_ddb.h"
@@ -374,9 +374,7 @@ com_attach_subr(struct com_softc *sc)
 {
 	struct com_regs *regsp = &sc->sc_regs;
 	struct tty *tp;
-#ifdef COM_16650
 	u_int8_t lcr;
-#endif
 	const char *fifo_msg = NULL;
 	prop_dictionary_t	dict;
 	bool is_console = true;
@@ -480,6 +478,37 @@ com_attach_subr(struct com_softc *sc)
 #endif
 sc->sc_fifolen = 16;
 
+			/*
+			 * TL16C750 can enable 64byte FIFO, only when DLAB
+			 * is 1.  However, some 16750 may always enable.  For
+			 * example, restrictions according to DLAB in a data
+			 * sheet for SC16C750 were not described.
+			 * Please enable 'options COM_16650', supposing you
+			 * use SC16C750.  Probably 32 bytes of FIFO and HW FLOW
+			 * should become effective.
+			 */
+			uint8_t iir1, iir2;
+			const uint8_t fcr = FIFO_ENABLE | FIFO_TRIGGER_14;
+
+			lcr = CSR_READ_1(regsp, COM_REG_LCR);
+			CSR_WRITE_1(regsp, COM_REG_LCR, lcr & ~LCR_DLAB);
+			CSR_WRITE_1(regsp, COM_REG_FIFO, fcr | FIFO_64B_ENABLE);
+			iir1 = CSR_READ_1(regsp, COM_REG_IIR);
+			CSR_WRITE_1(regsp, COM_REG_FIFO, fcr);
+			CSR_WRITE_1(regsp, COM_REG_LCR, lcr | LCR_DLAB);
+			CSR_WRITE_1(regsp, COM_REG_FIFO, fcr | FIFO_64B_ENABLE);
+			iir2 = CSR_READ_1(regsp, COM_REG_IIR);
+
+			CSR_WRITE_1(regsp, COM_REG_LCR, lcr);
+
+			if (!ISSET(iir1, IIR_64B_FIFO) &&
+			ISSET(iir2, IIR_64B_FIFO)) {
+/* It is TL16C750. */
+sc->sc_fifolen = 64;
+SET(sc->sc_hwflags, COM_HW_FLOW);
+			} else
+CSR_WRITE_1(regsp, COM_REG_FIFO, fcr);
+
 #ifdef COM_16650
 			CSR_WRITE_1(regsp, COM_REG_LCR, lcr);
 			if (sc->sc_fifolen == 0)
@@ -488,6 +517,9 @@ com_attach_subr(struct com_softc *sc)
 fifo_msg = "st16650a, working fifo";
 			else
 #endif
+			if (sc->sc_fifolen == 64)
+fifo_msg = "tl16c750, working fifo";
+			else
 fifo_msg = "ns16550a, working fifo";
 		} else
 			fifo_msg = "ns16550, broken fifo";

Index: src/sys/dev/ic/comreg.h
diff -u src/sys/dev/ic/comreg.h:1.19 src/sys/dev/ic/comreg.h:1.20
--- src/sys/dev/ic/comreg.h:1.19	Sun Sep  1 04:51:24 2013
+++ src/sys/dev/ic/comreg.h	Sun Sep  1 04:58:15 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: comreg.h,v 1.19 2013/09/01 04:51:24 kiyohara Exp $	*/
+/*	$NetBSD: comreg.h,v 1.20 2013/09/01 04:58:15 kiyohara Exp $	*/
 
 /*-
  * Copyright (c) 1991 The Regents of the University of California.
@@ -63,6 +63,7 @@
 #define	IIR_TXRDY	0x2	/* Transmitter ready */
 #define	IIR_MLSC	0x0	/* Modem status */
 #define	IIR_NOPEND	0x1	/* No pending interrupts */
+#define	IIR_64B_FIFO	0x20	/* 64byte FIFO Enabled (16750) */
 #define	IIR_FIFO_MASK	0xc0	/* set if FIFOs are enabled */
 
 /* fifo control register */
@@ -70,6 +71,7 @@
 #define	FIFO_RCV_RST	0x02	/* Reset RX FIFO */
 #define	FIFO_XMT_RST	0x04	/* Reset TX FIFO */
 #define	FIFO_DMA_MODE	0x08
+#define	FIFO_64B_ENABLE	0x20	/* 64byte FIFO Enable (16750) */
 #define	FIFO_TRIGGER_1	0x00	/* Trigger RXRDY intr on 1 character */
 #define	FIFO_TRIGGER_4	0x40	/* ibid 4 */
 #define	FIFO_TRIGGER_8	0x80	/* ibid 8 */



CVS commit: src/sys/dev

2013-08-31 Thread KIYOHARA Takashi
Module Name:src
Committed By:   kiyohara
Date:   Sun Sep  1 04:51:24 UTC 2013

Modified Files:
src/sys/dev/ic: com.c comreg.h comvar.h ns16550reg.h
src/sys/dev/marvell: com_mv.c

Log Message:
Move the Marvell extension to com_mv.c.


To generate a diff of this commit:
cvs rdiff -u -r1.312 -r1.313 src/sys/dev/ic/com.c
cvs rdiff -u -r1.18 -r1.19 src/sys/dev/ic/comreg.h
cvs rdiff -u -r1.75 -r1.76 src/sys/dev/ic/comvar.h
cvs rdiff -u -r1.8 -r1.9 src/sys/dev/ic/ns16550reg.h
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/marvell/com_mv.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/com.c
diff -u src/sys/dev/ic/com.c:1.312 src/sys/dev/ic/com.c:1.313
--- src/sys/dev/ic/com.c:1.312	Sat Jul 27 06:54:35 2013
+++ src/sys/dev/ic/com.c	Sun Sep  1 04:51:24 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: com.c,v 1.312 2013/07/27 06:54:35 kiyohara Exp $ */
+/* $NetBSD: com.c,v 1.313 2013/09/01 04:51:24 kiyohara Exp $ */
 
 /*-
  * Copyright (c) 1998, 1999, 2004, 2008 The NetBSD Foundation, Inc.
@@ -66,7 +66,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: com.c,v 1.312 2013/07/27 06:54:35 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: com.c,v 1.313 2013/09/01 04:51:24 kiyohara Exp $");
 
 #include "opt_com.h"
 #include "opt_ddb.h"
@@ -246,17 +246,7 @@ void	com_kgdb_putc(void *, int);
 #define	COM_REG_16550	{ \
 	com_data, com_data, com_dlbl, com_dlbh, com_ier, com_iir, com_fifo, \
 	com_efr, com_lcr, com_mcr, com_lsr, com_msr }
-/* 16750-specific register set, additional UART status register */
-#define	COM_REG_16750	{ \
-	com_data, com_data, com_dlbl, com_dlbh, com_ier, com_iir, com_fifo, \
-	com_efr, com_lcr, com_mcr, com_lsr, com_msr, 0, 0, 0, 0, 0, 0, 0, 0, \
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, com_usr }
-
-#ifdef COM_16750
-const bus_size_t com_std_map[32] = COM_REG_16750;
-#else
 const bus_size_t com_std_map[16] = COM_REG_16550;
-#endif /* COM_16750 */
 #endif /* COM_REGMAP */
 
 #define	COMUNIT_MASK	0x7
@@ -416,10 +406,7 @@ com_attach_subr(struct com_softc *sc)
 			(u_long)comcons_info.regs.cr_iobase);
 		}
 
-#ifdef COM_16750
-		/* Use in comintr(). */
 		sc->sc_lcr = cflag2lcr(comcons_info.cflag);
-#endif
 
 		/* Make sure the console is always "hardwired". */
 		delay(1);			/* wait for output to finish */
@@ -1479,19 +1466,19 @@ com_iflush(struct com_softc *sc)
 		aprint_error_dev(sc->sc_dev, "com_iflush timeout %02x\n", reg);
 #endif
 
-#ifdef COM_16750
-	uint8_t fifo;
-	/*
-	 * Reset all Rx/Tx FIFO, preserve current FIFO length.
-	 * This should prevent triggering busy interrupt while
-	 * manipulating divisors.
-	 */
-	fifo = CSR_READ_1(regsp, COM_REG_FIFO) & (FIFO_TRIGGER_1 |
-	FIFO_TRIGGER_4 | FIFO_TRIGGER_8 | FIFO_TRIGGER_14);
-	CSR_WRITE_1(regsp, COM_REG_FIFO, fifo | FIFO_ENABLE | FIFO_RCV_RST |
-	FIFO_XMT_RST);
-	delay(100);
-#endif
+	if (sc->sc_type == COM_TYPE_ARMADAXP) {
+		uint8_t fifo;
+		/*
+		 * Reset all Rx/Tx FIFO, preserve current FIFO length.
+		 * This should prevent triggering busy interrupt while
+		 * manipulating divisors.
+		 */
+		fifo = CSR_READ_1(regsp, COM_REG_FIFO) & (FIFO_TRIGGER_1 |
+		FIFO_TRIGGER_4 | FIFO_TRIGGER_8 | FIFO_TRIGGER_14);
+		CSR_WRITE_1(regsp, COM_REG_FIFO,
+		fifo | FIFO_ENABLE | FIFO_RCV_RST | FIFO_XMT_RST);
+		delay(100);
+	}
 }
 
 void
@@ -1919,26 +1906,6 @@ comintr(void *arg)
 	mutex_spin_enter(&sc->sc_lock);
 	iir = CSR_READ_1(regsp, COM_REG_IIR);
 
-	/* Handle ns16750-specific busy interrupt. */
-#ifdef COM_16750
-	int timeout;
-	if ((iir & IIR_BUSY) == IIR_BUSY) {
-		for (timeout = 1;
-		(CSR_READ_1(regsp, COM_REG_USR) & 0x1) != 0; timeout--)
-			if (timeout <= 0) {
-aprint_error_dev(sc->sc_dev,
-"timeout while waiting for BUSY interrupt "
-"acknowledge\n");
-mutex_spin_exit(&sc->sc_lock);
-return (0);
-			}
-
-		CSR_WRITE_1(regsp, COM_REG_LCR, sc->sc_lcr);
-		iir = CSR_READ_1(regsp, COM_REG_IIR);
-	}
-#endif /* COM_16750 */
-
-
 	if (ISSET(iir, IIR_NOPEND)) {
 		mutex_spin_exit(&sc->sc_lock);
 		return (0);

Index: src/sys/dev/ic/comreg.h
diff -u src/sys/dev/ic/comreg.h:1.18 src/sys/dev/ic/comreg.h:1.19
--- src/sys/dev/ic/comreg.h:1.18	Sat Apr 20 11:52:41 2013
+++ src/sys/dev/ic/comreg.h	Sun Sep  1 04:51:24 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: comreg.h,v 1.18 2013/04/20 11:52:41 rkujawa Exp $	*/
+/*	$NetBSD: comreg.h,v 1.19 2013/09/01 04:51:24 kiyohara Exp $	*/
 
 /*-
  * Copyright (c) 1991 The Regents of the University of California.
@@ -56,15 +56,14 @@
 /* interrupt identification register */
 #define	IIR_IMASK	0xf
 #define	IIR_RXTOUT	0xc
+/* ARMADAXP's ns16550 ports have extra value in this register */
+#define IIR_BUSY	0x7	/* Busy indicator */
 #define	IIR_RLS		0x6	/* Line status change */
 #define	IIR_RXRDY	0x4	/* Receiver ready */
 #define	IIR_TXRDY	0x2	/* Transmitter ready */
 #define	IIR_MLSC	0x0	/* Modem status */
 #define	IIR_NOPEND	0x1	/* No pending interrupts */
 #define	IIR_

CVS commit: src/sys/arch/powerpc/oea

2013-08-31 Thread Matt Thomas
Module Name:src
Committed By:   matt
Date:   Sat Aug 31 15:01:08 UTC 2013

Modified Files:
src/sys/arch/powerpc/oea: oea_machdep.c

Log Message:
convert rfid to rfi in exception handlers.


To generate a diff of this commit:
cvs rdiff -u -r1.66 -r1.67 src/sys/arch/powerpc/oea/oea_machdep.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/powerpc/oea/oea_machdep.c
diff -u src/sys/arch/powerpc/oea/oea_machdep.c:1.66 src/sys/arch/powerpc/oea/oea_machdep.c:1.67
--- src/sys/arch/powerpc/oea/oea_machdep.c:1.66	Sat Aug 31 07:33:15 2013
+++ src/sys/arch/powerpc/oea/oea_machdep.c	Sat Aug 31 15:01:08 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: oea_machdep.c,v 1.66 2013/08/31 07:33:15 matt Exp $	*/
+/*	$NetBSD: oea_machdep.c,v 1.67 2013/08/31 15:01:08 matt Exp $	*/
 
 /*
  * Copyright (C) 2002 Matt Thomas
@@ -33,7 +33,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: oea_machdep.c,v 1.66 2013/08/31 07:33:15 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: oea_machdep.c,v 1.67 2013/08/31 15:01:08 matt Exp $");
 
 #include "opt_ppcarch.h"
 #include "opt_compat_netbsd.h"
@@ -386,6 +386,8 @@ oea_init(void (*handler)(void))
 *ip++ = NOP;
 *ip++ = NOP;
 ip[0] = NOP;
+			} else if (*ip == RFID) {
+*ip = RFI;
 			}
 		}
 
@@ -905,6 +907,8 @@ oea_install_extint(void (*handler)(void)
 *ip++ = NOP;
 *ip++ = NOP;
 ip[0] = NOP;
+			} else if (*ip == RFID) {
+*ip = RFI;
 			}
 		}
 	}



CVS commit: src/sys/arch/x86/x86

2013-08-31 Thread Jared D. McNeill
Module Name:src
Committed By:   jmcneill
Date:   Sat Aug 31 12:26:56 UTC 2013

Modified Files:
src/sys/arch/x86/x86: x86_machdep.c

Log Message:
md_root_setconf also depends on option MEMORY_DISK_DYNAMIC


To generate a diff of this commit:
cvs rdiff -u -r1.59 -r1.60 src/sys/arch/x86/x86/x86_machdep.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/x86/x86/x86_machdep.c
diff -u src/sys/arch/x86/x86/x86_machdep.c:1.59 src/sys/arch/x86/x86/x86_machdep.c:1.60
--- src/sys/arch/x86/x86/x86_machdep.c:1.59	Fri Aug 30 16:42:17 2013
+++ src/sys/arch/x86/x86/x86_machdep.c	Sat Aug 31 12:26:56 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: x86_machdep.c,v 1.59 2013/08/30 16:42:17 jmcneill Exp $	*/
+/*	$NetBSD: x86_machdep.c,v 1.60 2013/08/31 12:26:56 jmcneill Exp $	*/
 
 /*-
  * Copyright (c) 2002, 2006, 2007 YAMAMOTO Takashi,
@@ -31,7 +31,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: x86_machdep.c,v 1.59 2013/08/30 16:42:17 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: x86_machdep.c,v 1.60 2013/08/31 12:26:56 jmcneill Exp $");
 
 #include "opt_modular.h"
 #include "opt_physmem.h"
@@ -74,7 +74,7 @@ __KERNEL_RCSID(0, "$NetBSD: x86_machdep.
 #endif
 
 #include "opt_md.h"
-#ifdef MEMORY_DISK_HOOKS
+#if defined(MEMORY_DISK_HOOKS) && defined(MEMORY_DISK_DYNAMIC)
 #include 
 #endif
 
@@ -191,7 +191,7 @@ module_init_md(void)
 			aprint_debug("File-system image path=%s len=%d pa=%x\n",
 			bi->path, bi->len, bi->base);
 			KASSERT(trunc_page(bi->base) == bi->base);
-#ifdef MEMORY_DISK_HOOKS
+#if defined(MEMORY_DISK_HOOKS) && defined(MEMORY_DISK_DYNAMIC)
 			md_root_setconf((void *)((uintptr_t)bi->base + KERNBASE),
 			bi->len);
 #endif



CVS commit: src/distrib/sgimips/instkernel

2013-08-31 Thread Havard Eidnes
Module Name:src
Committed By:   he
Date:   Sat Aug 31 10:42:18 UTC 2013

Modified Files:
src/distrib/sgimips/instkernel: Makefile

Log Message:
Bump the image size so that the contents fits again.  Kernel (at
least INSTALL32_IP3x) has big enough area already.


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/distrib/sgimips/instkernel/Makefile

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/distrib/sgimips/instkernel/Makefile
diff -u src/distrib/sgimips/instkernel/Makefile:1.10 src/distrib/sgimips/instkernel/Makefile:1.11
--- src/distrib/sgimips/instkernel/Makefile:1.10	Sat Feb  4 22:27:25 2012
+++ src/distrib/sgimips/instkernel/Makefile	Sat Aug 31 10:42:18 2013
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.10 2012/02/04 22:27:25 he Exp $
+#	$NetBSD: Makefile,v 1.11 2013/08/31 10:42:18 he Exp $
 
 .include 
 .include "${NETBSDSRCDIR}/distrib/common/Makefile.distrib"
@@ -16,7 +16,7 @@ LISTS=		${.CURDIR}/list64
 .endif
 
 IMAGE=		diskimage
-IMAGESIZE=	3800k
+IMAGESIZE=	4000k
 MTREECONF=	${DISTRIBDIR}/common/mtree.dot
 IMAGEENDIAN=	be
 



CVS commit: src/sys/arch/powerpc/oea

2013-08-31 Thread Matt Thomas
Module Name:src
Committed By:   matt
Date:   Sat Aug 31 07:33:15 UTC 2013

Modified Files:
src/sys/arch/powerpc/oea: oea_machdep.c ofwoea_machdep.c

Log Message:
Move the pmap_setup to the start oea_init (no non-OFW ports can use it).
If PPC_OEA64_BRIDGE is defined, add code so that when OEACPU_64_BRIDGE is not
present, it replaces the rfid with rfi and mfmsr/rldicl/mtmsrd sequence
with NOPs.  This allows plain OEA kernels to work.  (tested on PMPPC with
PPC_OEA64_BRIDGE option added).


To generate a diff of this commit:
cvs rdiff -u -r1.65 -r1.66 src/sys/arch/powerpc/oea/oea_machdep.c
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/powerpc/oea/ofwoea_machdep.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/powerpc/oea/oea_machdep.c
diff -u src/sys/arch/powerpc/oea/oea_machdep.c:1.65 src/sys/arch/powerpc/oea/oea_machdep.c:1.66
--- src/sys/arch/powerpc/oea/oea_machdep.c:1.65	Thu Jul  4 22:59:27 2013
+++ src/sys/arch/powerpc/oea/oea_machdep.c	Sat Aug 31 07:33:15 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: oea_machdep.c,v 1.65 2013/07/04 22:59:27 joerg Exp $	*/
+/*	$NetBSD: oea_machdep.c,v 1.66 2013/08/31 07:33:15 matt Exp $	*/
 
 /*
  * Copyright (C) 2002 Matt Thomas
@@ -33,7 +33,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: oea_machdep.c,v 1.65 2013/07/04 22:59:27 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: oea_machdep.c,v 1.66 2013/08/31 07:33:15 matt Exp $");
 
 #include "opt_ppcarch.h"
 #include "opt_compat_netbsd.h"
@@ -147,6 +147,14 @@ oea_init(void (*handler)(void))
 #endif
 	KASSERT(mfspr(SPR_SPRG0) == (uintptr_t)ci);
 
+#if defined (PPC_OEA64_BRIDGE) && defined (PPC_OEA)
+	if (oeacpufeat & OEACPU_64_BRIDGE)
+		pmap_setup64bridge();
+	else
+		pmap_setup32();
+#endif
+
+
 	cpuvers = mfpvr() >> 16;
 
 	/*
@@ -298,6 +306,16 @@ oea_init(void (*handler)(void))
 #define	B		0x4800
 #define	TLBSYNC		0x7c00046c
 #define	SYNC		0x7c0004ac
+#ifdef PPC_OEA64_BRIDGE
+#define	MFMSR_MASK	0xfc1f
+#define	MFMSR		0x7ca6
+#define	MTMSRD_MASK	0xfc1e
+#define	MTMSRD		0x7c000164
+#define RLDICL_MASK	0xfc1c
+#define RLDICL		0x7800
+#define	RFID		0x4c24
+#define	RFI		0x4c64
+#endif
 
 #ifdef ALTIVEC
 #define	MFSPR_VRSAVE	0x7c0042a6
@@ -320,9 +338,7 @@ oea_init(void (*handler)(void))
 	if (scratch & PSL_VEC) {
 		cpu_altivec = 1;
 	} else {
-		int *ip = trapstart;
-		
-		for (; ip < trapend; ip++) {
+		for (int *ip = trapstart; ip < trapend; ip++) {
 			if ((ip[0] & MxSPR_MASK) == MFSPR_VRSAVE) {
 ip[0] = NOP;	/* mfspr */
 ip[1] = NOP;	/* stw */
@@ -343,9 +359,7 @@ oea_init(void (*handler)(void))
 	 * sequences where we zap/restore BAT registers on kernel exit/entry.
 	 */
 	if (cpuvers != MPC601) {
-		int *ip = trapstart;
-		
-		for (; ip < trapend; ip++) {
+		for (int *ip = trapstart; ip < trapend; ip++) {
 			if ((ip[0] & MxSPR_MASK) == MFSPR_MQ) {
 ip[0] = NOP;	/* mfspr */
 ip[1] = NOP;	/* stw */
@@ -361,6 +375,37 @@ oea_init(void (*handler)(void))
 		}
 	}
 
+#ifdef PPC_OEA64_BRIDGE
+	if ((oeacpufeat & OEACPU_64_BRIDGE) == 0) {
+		for (int *ip = (int *)exc_base;
+		 (uintptr_t)ip <= exc_base + EXC_LAST;
+		 ip++) {
+			if ((ip[0] & MFMSR_MASK) == MFMSR
+			&& (ip[1] & RLDICL_MASK) == RLDICL
+			&& (ip[2] & MTMSRD_MASK) == MTMSRD) {
+*ip++ = NOP;
+*ip++ = NOP;
+ip[0] = NOP;
+			}
+		}
+
+		/*
+		 * Now replace each rfid instruction with a rfi instruction.
+		 */
+		for (int *ip = trapstart; ip < trapend; ip++) {
+			if ((ip[0] & MFMSR_MASK) == MFMSR
+			&& (ip[1] & RLDICL_MASK) == RLDICL
+			&& (ip[2] & MTMSRD_MASK) == MTMSRD) {
+*ip++ = NOP;
+*ip++ = NOP;
+ip[0] = NOP;
+			} else if (*ip == RFID) {
+*ip = RFI;
+			}
+		}
+	}
+#endif /* PPC_OEA64_BRIDGE */
+
 	/*
 	 * Sync the changed instructions.
 	 */
@@ -381,10 +426,11 @@ oea_init(void (*handler)(void))
 		extern int kernel_text[], etext[];
 		int *ip;
 
-		for (ip = kernel_text; ip < etext; ip++)
+		for (ip = kernel_text; ip < etext; ip++) {
 			if (*ip == TLBSYNC) {
 *ip = SYNC;
 __syncicache(ip, sizeof(*ip));
+			}
 		}
 	}
 #endif /* PPC_OEA601 */
@@ -830,6 +876,11 @@ oea_install_extint(void (*handler)(void)
 	extern int extint[], extsize[];
 	extern int extint_call[];
 	uintptr_t offset = (uintptr_t)handler - (uintptr_t)extint_call;
+#ifdef PPC_HIGH_VEC
+	const uintptr_t exc_exi_base = EXC_HIGHVEC + EXC_EXI;
+#else
+	const uintptr_t exc_exi_base = EXC_EXI;
+#endif
 	int omsr, msr;
 
 #ifdef	DIAGNOSTIC
@@ -842,13 +893,24 @@ oea_install_extint(void (*handler)(void)
 	:	"K" ((u_short)~PSL_EE));
 	extint_call[0] = (extint_call[0] & 0xfc03) | offset;
 	__syncicache((void *)extint_call, sizeof extint_call[0]);
-#ifdef PPC_HIGH_VEC
-	memcpy((void *)(EXC_HIGHVEC + EXC_EXI), extint, (size_t)extsize);
-	__syncicache((void *)(EXC_HIGHVEC + EXC_EXI), (int)extsize);
-#else
-	memcpy((void *)EXC_EXI, extint, (size_t)extsize);
-	__syncicache((void *)EXC_E