Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 25 Dec 1999 14:12:12 +0900
From:      KATO Takenori <kato@ganko.eps.nagoya-u.ac.jp>
To:        FreeBSD-current@FreeBSD.ORG, FreeBSD98-hackers@jp.freebsd.org
Subject:   Re: indirection in bus space
Message-ID:  <19991225141212T.kato@gneiss.eps.nagoya-u.ac.jp>
In-Reply-To: Your message of "Sat, 25 Dec 1999 14:07:25 %2B0900" <19991225140725U.kato@gneiss.eps.nagoya-u.ac.jp>
References:  <19991225140725U.kato@gneiss.eps.nagoya-u.ac.jp>

next in thread | previous in thread | raw e-mail | index | archive | help
----Next_Part(Sat_Dec_25_14:12:03_1999_809)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Oops, I forget to include patches.

KATO Takenori <kato@ganko.eps.nagoya-u.ac.jp> wrote:

> Attached patches provides indirection support in bus space stuff
> (submitted by Takahashi-san <nyan@FreeBSD.ORG> with minor modification
> by me).  
> 
> I <kato@ganko.eps.nagoya-u.ac.jp> wrote:
> 
> >    3. Make new sys/i386/include/bus.h file as:
> > 	#ifdef PC98
> > 	#include <machine/bus_pc98.h>
> > 	#else
> > 	#include <machine/bsu_at386.h>
> > 	#endif
> 
> Only one #ifdef in the diff makes it needless.  In this patch,
> indirection is enabled by default in PC-98 kernel and is disabled by
> default in IBM-PC kernel.  That is, there is no performance loss in
> IBM-PC kernel.
> 
> Any comment?
> 
> 
> Thanks.

-----------------------------------------------+--------------------------+
KATO Takenori <kato@ganko.eps.nagoya-u.ac.jp>  |        FreeBSD           |
Dept. Earth Planet. Sci, Nagoya Univ.          |    The power to serve!   |
Nagoya, 464-8602, Japan                        |  http://www.FreeBSD.org/ |
                                               |http://www.jp.FreeBSD.org/|
++++ FreeBSD(98) 3.3R-Rev. 01 available!       +==========================+

----Next_Part(Sat_Dec_25_14:12:03_1999_809)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=bus.h.diff

--- bus.h.orig	Sat Dec 25 13:06:10 1999
+++ bus.h	Sat Dec 25 13:21:41 1999
@@ -72,14 +72,18 @@
 #ifndef _I386_BUS_H_
 #define _I386_BUS_H_
 
+#include <sys/bus.h>
 #include <machine/cpufunc.h>
 
 /*
- * To remain compatible with NetBSD's interface, default to both memio and
- * pio when neither of them is defined.
+ * To remain compatible with NetBSD's interface, default to memio, pio and
+ * pio-indirection (PC-98 only) when neither of them is defined.
  */ 
-#if !defined(_I386_BUS_PIO_H_) && !defined(_I386_BUS_MEMIO_H_)
+#if !defined(_I386_BUS_PIO_H_) && !defined(_I386_BUS_PIO_IND_H_) && !defined(_I386_BUS_MEMIO_H_)
 #define _I386_BUS_PIO_H_
+#ifdef	PC98
+#define _I386_BUS_PIO_IND_H_
+#endif
 #define _I386_BUS_MEMIO_H_
 #endif
 
@@ -88,6 +92,7 @@
  */
 #define	I386_BUS_SPACE_IO	0	/* space is i/o space */
 #define I386_BUS_SPACE_MEM	1	/* space is mem space */
+#define	I386_BUS_SPACE_IO_IND	2	/* space is i/o space */
 
 /*
  * Bus address and size types
@@ -107,8 +112,25 @@
 /*
  * Access methods for bus resources and address space.
  */
+struct resource;
+
 typedef	int bus_space_tag_t;
-typedef	u_int bus_space_handle_t;
+typedef	struct {
+    bus_addr_t		bsh_base;
+    bus_addr_t		*bsh_iat;
+    size_t		bsh_iatsz;
+    struct resource	**bsh_res;
+    size_t		bsh_ressz;
+} bus_space_handle_t;
+
+/*
+ * Allocate discontinuous resources for ISA bus.
+ */
+struct resource *
+isa_alloc_resourcev(device_t child, int type, int *rid,
+		    bus_addr_t *res, bus_size_t count, u_int flags);
+int
+isa_load_resourcev(struct resource *re, bus_addr_t *res, bus_size_t count);
 
 /*
  * Map a region of device bus space into CPU virtual address space.
@@ -151,7 +173,7 @@
 void	bus_space_free(bus_space_tag_t t, bus_space_handle_t bsh,
 		       bus_size_t size);
 
-#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 
 /*
  * Read a 1, 2, 4, or 8 byte quantity from bus space
@@ -170,47 +192,74 @@
 					   bus_size_t offset);
 
 static __inline u_int8_t
-bus_space_read_1(bus_space_tag_t tag, bus_space_handle_t handle,
+bus_space_read_1(bus_space_tag_t tag, bus_space_handle_t bsh,
 		 bus_size_t offset)
 {
-#if defined (_I386_BUS_PIO_H_)
-#if defined (_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
-		return (inb(handle + offset));
+		return (inb(bsh.bsh_base + offset));
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+		return (inb(bsh.bsh_iat[offset]));
 #endif
-#if defined (_I386_BUS_MEMIO_H_)
-	return (*(volatile u_int8_t *)(handle + offset));
+#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	else
+#endif
+		return (*(volatile u_int8_t *)(bsh.bsh_base + offset));
 #endif
 }
 
 static __inline u_int16_t
-bus_space_read_2(bus_space_tag_t tag, bus_space_handle_t handle,
+bus_space_read_2(bus_space_tag_t tag, bus_space_handle_t bsh,
 		 bus_size_t offset)
 {
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
-		return (inw(handle + offset));
+		return (inw(bsh.bsh_base + offset));
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+		return (inw(bsh.bsh_iat[offset]));
 #endif
 #if defined(_I386_BUS_MEMIO_H_)
-	return (*(volatile u_int16_t *)(handle + offset));
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	else
+#endif
+		return (*(volatile u_int16_t *)(bsh.bsh_base + offset));
 #endif
 }
 
 static __inline u_int32_t
-bus_space_read_4(bus_space_tag_t tag, bus_space_handle_t handle,
+bus_space_read_4(bus_space_tag_t tag, bus_space_handle_t bsh,
 		 bus_size_t offset)
 {
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
-		return (inl(handle + offset));
+		return (inl(bsh.bsh_base + offset));
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+		return (inl(bsh.bsh_iat[offset]));
 #endif
 #if defined(_I386_BUS_MEMIO_H_)
-	return (*(volatile u_int32_t *)(handle + offset));
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	else
+#endif
+		return (*(volatile u_int32_t *)(bsh.bsh_base + offset));
 #endif
 }
 
@@ -242,14 +291,20 @@
 		       bus_size_t offset, u_int8_t *addr, size_t count)
 {
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
-		insb(bsh + offset, addr, count);
+		insb(bsh.bsh_base + offset, addr, count);
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+		insb(bsh.bsh_iat[offset], addr, count);
 #endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
 	{
 		__asm __volatile("				\n\
@@ -258,7 +313,7 @@
 			stosb					\n\
 			loop 1b"				:
 		    "=D" (addr), "=c" (count)			:
-		    "r" (bsh + offset), "0" (addr), "1" (count)	:
+		    "r" (bsh.bsh_base + offset), "0" (addr), "1" (count) :
 		    "%eax", "memory");
 	}
 #endif
@@ -269,14 +324,20 @@
 		       bus_size_t offset, u_int16_t *addr, size_t count)
 {
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
-		insw(bsh + offset, addr, count);
+		insw(bsh.bsh_base + offset, addr, count);
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+		insw(bsh.bsh_iat[offset], addr, count);
 #endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
 	{
 		__asm __volatile("				\n\
@@ -285,7 +346,7 @@
 			stosw					\n\
 			loop 1b"				:
 		    "=D" (addr), "=c" (count)			:
-		    "r" (bsh + offset), "0" (addr), "1" (count)	:
+		    "r" (bsh.bsh_base + offset), "0" (addr), "1" (count) :
 		    "%eax", "memory");
 	}
 #endif
@@ -296,14 +357,20 @@
 		       bus_size_t offset, u_int32_t *addr, size_t count)
 {
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
-		insl(bsh + offset, addr, count);
+		insl(bsh.bsh_base + offset, addr, count);
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+		insl(bsh.bsh_iat[offset], addr, count);
 #endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
 	{
 		__asm __volatile("				\n\
@@ -312,7 +379,7 @@
 			stosl					\n\
 			loop 1b"				:
 		    "=D" (addr), "=c" (count)			:
-		    "r" (bsh + offset), "0" (addr), "1" (count)	:
+		    "r" (bsh.bsh_base + offset), "0" (addr), "1" (count) :
 		    "%eax", "memory");
 	}
 #endif
@@ -348,11 +415,11 @@
 			bus_size_t offset, u_int8_t *addr, size_t count)
 {
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
 	{
-		int _port_ = bsh + offset;			\
+		int _port_ = bsh.bsh_base + offset;		\
 		__asm __volatile("				\n\
 			cld					\n\
 		1:	inb %w2,%%al				\n\
@@ -364,12 +431,29 @@
 		    "%eax", "memory", "cc");
 	}
 #endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+	{
+		__asm __volatile("				\n\
+			cld					\n\
+		1:	movl bsh.bsh_iat(%l2), %%edx		\n\
+			inb %%dx,%%al				\n\
+			stosb					\n\
+			incl %2					\n\
+			loop 1b"				:
+		    "=D" (addr), "=c" (count), "=b" (offset)	:
+		    "0" (addr), "1" (count), "2" (offset)	:
+		    "%eax", "memory", "cc");
+	}
+#endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
 	{
-		int _port_ = bsh + offset;			\
+		int _port_ = bsh.bsh_base + offset;		\
 		__asm __volatile("				\n\
 			cld					\n\
 			repne					\n\
@@ -386,11 +470,11 @@
 			bus_size_t offset, u_int16_t *addr, size_t count)
 {
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
 	{
-		int _port_ = bsh + offset;			\
+		int _port_ = bsh.bsh_base + offset;		\
 		__asm __volatile("				\n\
 			cld					\n\
 		1:	inw %w2,%%ax				\n\
@@ -402,12 +486,29 @@
 		    "%eax", "memory", "cc");
 	}
 #endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+	{
+		__asm __volatile("				\n\
+			cld					\n\
+		1:	movl bsh.bsh_iat(%l2), %%edx		\n\
+			inw %%dx,%%ax				\n\
+			stosw					\n\
+			addl $2,%2				\n\
+			loop 1b"				:
+		    "=D" (addr), "=c" (count), "=b" (offset)	:
+		    "0" (addr), "1" (count), "2" (offset)	:
+		    "%eax", "memory", "cc");
+	}
+#endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
 	{
-		int _port_ = bsh + offset;			\
+		int _port_ = bsh.bsh_base + offset;		\
 		__asm __volatile("				\n\
 			cld					\n\
 			repne					\n\
@@ -424,11 +525,11 @@
 			bus_size_t offset, u_int32_t *addr, size_t count)
 {
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
 	{
-		int _port_ = bsh + offset;			\
+		int _port_ = bsh.bsh_base + offset;		\
 		__asm __volatile("				\n\
 			cld					\n\
 		1:	inl %w2,%%eax				\n\
@@ -440,12 +541,29 @@
 		    "%eax", "memory", "cc");
 	}
 #endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+	{
+		__asm __volatile("				\n\
+			cld					\n\
+		1:	movl bsh.bsh_iat(%l2), %%edx		\n\
+			inl %%dx,%%eax				\n\
+			stosl					\n\
+			addl $4,%2				\n\
+			loop 1b"				:
+		    "=D" (addr), "=c" (count), "=b" (offset)	:
+		    "0" (addr), "1" (count), "2" (offset)	:
+		    "%eax", "memory", "cc");
+	}
+#endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
 	{
-		int _port_ = bsh + offset;			\
+		int _port_ = bsh.bsh_base + offset;		\
 		__asm __volatile("				\n\
 			cld					\n\
 			repne					\n\
@@ -483,16 +601,22 @@
 		       bus_size_t offset, u_int8_t value)
 {
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
-		outb(bsh + offset, value);
+		outb(bsh.bsh_base + offset, value);
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+		outb(bsh.bsh_iat[offset], value);
 #endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
-		*(volatile u_int8_t *)(bsh + offset) = value;
+		*(volatile u_int8_t *)(bsh.bsh_base + offset) = value;
 #endif
 }
 
@@ -501,16 +625,22 @@
 		       bus_size_t offset, u_int16_t value)
 {
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
-		outw(bsh + offset, value);
+		outw(bsh.bsh_base + offset, value);
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+		outw(bsh.bsh_iat[offset], value);
 #endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
-		*(volatile u_int16_t *)(bsh + offset) = value;
+		*(volatile u_int16_t *)(bsh.bsh_base + offset) = value;
 #endif
 }
 
@@ -519,16 +649,22 @@
 		       bus_size_t offset, u_int32_t value)
 {
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
-		outl(bsh + offset, value);
+		outl(bsh.bsh_base + offset, value);
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+		outl(bsh.bsh_iat[offset], value);
 #endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
-		*(volatile u_int32_t *)(bsh + offset) = value;
+		*(volatile u_int32_t *)(bsh.bsh_base + offset) = value;
 #endif
 }
 
@@ -563,14 +699,20 @@
 			bus_size_t offset, const u_int8_t *addr, size_t count)
 {
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
-		outsb(bsh + offset, addr, count);
+		outsb(bsh.bsh_base + offset, addr, count);
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+		outsb(bsh.bsh_iat[offset], addr, count);
 #endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
 	{
 		__asm __volatile("				\n\
@@ -579,7 +721,7 @@
 			movb %%al,(%2)				\n\
 			loop 1b"				:
 		    "=S" (addr), "=c" (count)			:
-		    "r" (bsh + offset), "0" (addr), "1" (count)	:
+		    "r" (bsh.bsh_base + offset), "0" (addr), "1" (count) :
 		    "%eax", "memory", "cc");
 	}
 #endif
@@ -590,14 +732,20 @@
 			bus_size_t offset, const u_int16_t *addr, size_t count)
 {
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
-		outsw(bsh + offset, addr, count);
+		outsw(bsh.bsh_base + offset, addr, count);
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+		outsw(bsh.bsh_iat[offset], addr, count);
 #endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
 	{
 		__asm __volatile("				\n\
@@ -607,7 +755,7 @@
 			movw %%ax,(%2)				\n\
 			loop 1b"				:
 		    "=S" (addr), "=c" (count)			:
-		    "r" (bsh + offset), "0" (addr), "1" (count)	:
+		    "r" (bsh.bsh_base + offset), "0" (addr), "1" (count) :
 		    "%eax", "memory", "cc");
 	}
 #endif
@@ -618,14 +766,20 @@
 			bus_size_t offset, const u_int32_t *addr, size_t count)
 {
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
-		outsl(bsh + offset, addr, count);
+		outsl(bsh.bsh_base + offset, addr, count);
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+		outsl(bsh.bsh_iat[offset], addr, count);
 #endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
 	{
 		__asm __volatile("				\n\
@@ -634,7 +788,7 @@
 			movl %%eax,(%2)				\n\
 			loop 1b"				:
 		    "=S" (addr), "=c" (count)			:
-		    "r" (bsh + offset), "0" (addr), "1" (count)	:
+		    "r" (bsh.bsh_base + offset), "0" (addr), "1" (count) :
 		    "%eax", "memory", "cc");
 	}
 #endif
@@ -671,11 +825,11 @@
 			 bus_size_t offset, const u_int8_t *addr, size_t count)
 {
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
 	{
-		int _port_ = bsh + offset;			\
+		int _port_ = bsh.bsh_base + offset;		\
 		__asm __volatile("				\n\
 			cld					\n\
 		1:	lodsb					\n\
@@ -687,12 +841,29 @@
 		    "%eax", "memory", "cc");
 	}
 #endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+	{
+		__asm __volatile("				\n\
+			cld					\n\
+		1:	lodsb					\n\
+			movl bsh.bsh_iat(%l0), %%edx		\n\
+			outb %%al,%%dx				\n\
+			incl %0					\n\
+			loop 1b"				:
+		    "=b" (offset), "=S" (addr), "=c" (count)	:
+		    "0" (offset), "1" (addr), "2" (count)	:
+		    "%eax", "memory", "cc");
+	}
+#endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
 	{
-		int _port_ = bsh + offset;			\
+		int _port_ = bsh.bsh_base + offset;		\
 		__asm __volatile("				\n\
 			cld					\n\
 			repne					\n\
@@ -709,11 +880,11 @@
 			 bus_size_t offset, const u_int16_t *addr, size_t count)
 {
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
 	{
-		int _port_ = bsh + offset;			\
+		int _port_ = bsh.bsh_base + offset;		\
 		__asm __volatile("				\n\
 			cld					\n\
 		1:	lodsw					\n\
@@ -725,12 +896,29 @@
 		    "%eax", "memory", "cc");
 	}
 #endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+	{
+		__asm __volatile("				\n\
+			cld					\n\
+		1:	lodsw					\n\
+			movl bsh.bsh_iat(%l0), %%edx		\n\
+			outw %%ax,%%dx				\n\
+			addl $2,%0				\n\
+			loop 1b"				:
+		    "=b" (offset), "=S" (addr), "=c" (count)	:
+		    "0" (offset), "1" (addr), "2" (count)	:
+		    "%eax", "memory", "cc");
+	}
+#endif
 #if defined(_I386_BUS_MEMIO_H_)
 #if defined(_I386_BUS_PIO_H_)
-	else
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
 	{
-		int _port_ = bsh + offset;			\
+		int _port_ = bsh.bsh_base + offset;		\
 		__asm __volatile("				\n\
 			cld					\n\
 			repne					\n\
@@ -747,11 +935,11 @@
 			 bus_size_t offset, const u_int32_t *addr, size_t count)
 {
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
 	{
-		int _port_ = bsh + offset;			\
+		int _port_ = bsh.bsh_base + offset;		\
 		__asm __volatile("				\n\
 			cld					\n\
 		1:	lodsl					\n\
@@ -763,12 +951,29 @@
 		    "%eax", "memory", "cc");
 	}
 #endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+	{
+		__asm __volatile("				\n\
+			cld					\n\
+		1:	lodsl					\n\
+			movl bsh.bsh_iat(%l0), %%edx		\n\
+			outl %%eax,%%dx				\n\
+			addl $4,%0				\n\
+			loop 1b"				:
+		    "=b" (offset), "=S" (addr), "=c" (count)	:
+		    "0" (offset), "1" (addr), "2" (count)	:
+		    "%eax", "memory", "cc");
+	}
+#endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
 	{
-		int _port_ = bsh + offset;			\
+		int _port_ = bsh.bsh_base + offset;		\
 		__asm __volatile("				\n\
 			cld					\n\
 			repne					\n\
@@ -807,21 +1012,35 @@
 bus_space_set_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh,
 		      bus_size_t offset, u_int8_t value, size_t count)
 {
-	bus_addr_t addr = bsh + offset;
-
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
+	{
+		bus_addr_t addr = bsh.bsh_base + offset;
+		while (count--)
+			outb(addr, value);
+	}
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+	{
+		bus_addr_t addr = bsh.bsh_iat[offset];
 		while (count--)
 			outb(addr, value);
+	}
 #endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
+	{
+		bus_addr_t addr = bsh.bsh_base + offset;
 		while (count--)
 			*(volatile u_int8_t *)(addr) = value;
+	}
 #endif
 }
 
@@ -829,21 +1048,35 @@
 bus_space_set_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh,
 		     bus_size_t offset, u_int16_t value, size_t count)
 {
-	bus_addr_t addr = bsh + offset;
-
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
+	{
+		bus_addr_t addr = bsh.bsh_base + offset;
 		while (count--)
 			outw(addr, value);
+	}
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+	{
+		bus_addr_t addr = bsh.bsh_iat[offset];
+		while (count--)
+			outw(addr, value);
+	}
 #endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
+	{
+		bus_addr_t addr = bsh.bsh_base + offset;
 		while (count--)
 			*(volatile u_int16_t *)(addr) = value;
+	}
 #endif
 }
 
@@ -851,21 +1084,35 @@
 bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh,
 		      bus_size_t offset, u_int32_t value, size_t count)
 {
-	bus_addr_t addr = bsh + offset;
-
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
+	{
+		bus_addr_t addr = bsh.bsh_base + offset;
 		while (count--)
 			outl(addr, value);
+	}
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+	{
+		bus_addr_t addr = bsh.bsh_iat[offset];
+		while (count--)
+			outl(addr, value);
+	}
 #endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
+	{
+		bus_addr_t addr = bsh.bsh_base + offset;
 		while (count--)
 			*(volatile u_int32_t *)(addr) = value;
+	}
 #endif
 }
 
@@ -895,21 +1142,34 @@
 bus_space_set_region_1(bus_space_tag_t tag, bus_space_handle_t bsh,
 		       bus_size_t offset, u_int8_t value, size_t count)
 {
-	bus_addr_t addr = bsh + offset;
-
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
+	{
+		bus_addr_t addr = bsh.bsh_base + offset;
 		for (; count != 0; count--, addr++)
 			outb(addr, value);
+	}
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+	{
+		for (; count != 0; count--, offset++)
+			outb(bsh.bsh_iat[offset], value);
+	}
 #endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
+	{
+		bus_addr_t addr = bsh.bsh_base + offset;
 		for (; count != 0; count--, addr++)
 			*(volatile u_int8_t *)(addr) = value;
+	}
 #endif
 }
 
@@ -917,21 +1177,34 @@
 bus_space_set_region_2(bus_space_tag_t tag, bus_space_handle_t bsh,
 		       bus_size_t offset, u_int16_t value, size_t count)
 {
-	bus_addr_t addr = bsh + offset;
-
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
+	{
+		bus_addr_t addr = bsh.bsh_base + offset;
 		for (; count != 0; count--, addr += 2)
 			outw(addr, value);
+	}
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+	{
+		for (; count != 0; count--, offset += 2)
+			outw(bsh.bsh_iat[offset], value);
+	}
 #endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
+	{
+		bus_addr_t addr = bsh.bsh_base + offset;
 		for (; count != 0; count--, addr += 2)
 			*(volatile u_int16_t *)(addr) = value;
+	}
 #endif
 }
 
@@ -939,21 +1212,34 @@
 bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t bsh,
 		       bus_size_t offset, u_int32_t value, size_t count)
 {
-	bus_addr_t addr = bsh + offset;
-
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
+	{
+		bus_addr_t addr = bsh.bsh_base + offset;
 		for (; count != 0; count--, addr += 4)
 			outl(addr, value);
+	}
+#endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+	{
+		for (; count != 0; count--, offset += 4)
+			outl(bsh.bsh_iat[offset], value);
+	}
 #endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
+	{
+		bus_addr_t addr = bsh.bsh_base + offset;
 		for (; count != 0; count--, addr += 4)
 			*(volatile u_int32_t *)(addr) = value;
+	}
 #endif
 }
 
@@ -989,14 +1275,13 @@
 			bus_size_t off1, bus_space_handle_t bsh2,
 			bus_size_t off2, size_t count)
 {
-	bus_addr_t addr1 = bsh1 + off1;
-	bus_addr_t addr2 = bsh2 + off2;
-
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
 	{
+		bus_addr_t addr1 = bsh1.bsh_base + off1;
+		bus_addr_t addr2 = bsh2.bsh_base + off2;
 		if (addr1 >= addr2) {
 			/* src after dest: copy forward */
 			for (; count != 0; count--, addr1++, addr2++)
@@ -1004,16 +1289,37 @@
 		} else {
 			/* dest after src: copy backwards */
 			for (addr1 += (count - 1), addr2 += (count - 1);
-			    count != 0; count--, addr1--, addr2--)
+			     count != 0; count--, addr1--, addr2--)
 				outb(addr2, inb(addr1));
 		}
 	}
 #endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+	{
+		if (bsh1.bsh_iat[off1] >= bsh2.bsh_iat[off2]) {
+			/* src after dest: copy forward */
+			for (; count != 0; count--, off1++, off2++)
+				outb(bsh2.bsh_iat[off2],
+				     inb(bsh1.bsh_iat[off1]));
+		} else {
+			/* dest after src: copy backwards */
+			for (off1 += (count - 1), off2 += (count - 1);
+			     count != 0; count--, off1--, off2--)
+				outb(bsh2.bsh_iat[off2],
+				     inb(bsh1.bsh_iat[off1]));
+		}
+	}
+#endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
 	{
+		bus_addr_t addr1 = bsh1.bsh_base + off1;
+		bus_addr_t addr2 = bsh2.bsh_base + off2;
 		if (addr1 >= addr2) {
 			/* src after dest: copy forward */
 			for (; count != 0; count--, addr1++, addr2++)
@@ -1022,7 +1328,7 @@
 		} else {
 			/* dest after src: copy backwards */
 			for (addr1 += (count - 1), addr2 += (count - 1);
-			    count != 0; count--, addr1--, addr2--)
+			     count != 0; count--, addr1--, addr2--)
 				*(volatile u_int8_t *)(addr2) =
 				    *(volatile u_int8_t *)(addr1);
 		}
@@ -1035,14 +1341,13 @@
 			bus_size_t off1, bus_space_handle_t bsh2,
 			bus_size_t off2, size_t count)
 {
-	bus_addr_t addr1 = bsh1 + off1;
-	bus_addr_t addr2 = bsh2 + off2;
-
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
 	{
+		bus_addr_t addr1 = bsh1.bsh_base + off1;
+		bus_addr_t addr2 = bsh2.bsh_base + off2;
 		if (addr1 >= addr2) {
 			/* src after dest: copy forward */
 			for (; count != 0; count--, addr1 += 2, addr2 += 2)
@@ -1050,16 +1355,37 @@
 		} else {
 			/* dest after src: copy backwards */
 			for (addr1 += 2 * (count - 1), addr2 += 2 * (count - 1);
-			    count != 0; count--, addr1 -= 2, addr2 -= 2)
+			     count != 0; count--, addr1 -= 2, addr2 -= 2)
 				outw(addr2, inw(addr1));
 		}
 	}
 #endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+	{
+		if (bsh1.bsh_iat[off1] >= bsh2.bsh_iat[off2]) {
+			/* src after dest: copy forward */
+			for (; count != 0; count--, off1 += 2, off2 += 2)
+				outw(bsh2.bsh_iat[off2],
+				     inw(bsh1.bsh_iat[off1]));
+		} else {
+			/* dest after src: copy backwards */
+			for (off1 += 2 * (count - 1), off2 += 2 * (count - 1);
+			     count != 0; count--, off1 -= 2, off2 -= 2)
+				outw(bsh2.bsh_iat[off2],
+				     inw(bsh1.bsh_iat[off1]));
+		}
+	}
+#endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
 	{
+		bus_addr_t addr1 = bsh1.bsh_base + off1;
+		bus_addr_t addr2 = bsh2.bsh_base + off2;
 		if (addr1 >= addr2) {
 			/* src after dest: copy forward */
 			for (; count != 0; count--, addr1 += 2, addr2 += 2)
@@ -1068,7 +1394,7 @@
 		} else {
 			/* dest after src: copy backwards */
 			for (addr1 += 2 * (count - 1), addr2 += 2 * (count - 1);
-			    count != 0; count--, addr1 -= 2, addr2 -= 2)
+			     count != 0; count--, addr1 -= 2, addr2 -= 2)
 				*(volatile u_int16_t *)(addr2) =
 				    *(volatile u_int16_t *)(addr1);
 		}
@@ -1081,14 +1407,13 @@
 			bus_size_t off1, bus_space_handle_t bsh2,
 			bus_size_t off2, size_t count)
 {
-	bus_addr_t addr1 = bsh1 + off1;
-	bus_addr_t addr2 = bsh2 + off2;
-
 #if defined(_I386_BUS_PIO_H_)
-#if defined(_I386_BUS_MEMIO_H_)
+#if defined(_I386_BUS_PIO_IND_H_) || defined(_I386_BUS_MEMIO_H_)
 	if (tag == I386_BUS_SPACE_IO)
 #endif
 	{
+		bus_addr_t addr1 = bsh1.bsh_base + off1;
+		bus_addr_t addr2 = bsh2.bsh_base + off2;
 		if (addr1 >= addr2) {
 			/* src after dest: copy forward */
 			for (; count != 0; count--, addr1 += 4, addr2 += 4)
@@ -1101,11 +1426,32 @@
 		}
 	}
 #endif
+#if defined(_I386_BUS_PIO_IND_H_)
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
+	if (tag == I386_BUS_SPACE_IO_IND)
+#endif
+	{
+		if (bsh1.bsh_iat[off1] >= bsh2.bsh_iat[off2]) {
+			/* src after dest: copy forward */
+			for (; count != 0; count--, off1 += 4, off2 += 4)
+				outl(bsh2.bsh_iat[off2],
+				     inl(bsh1.bsh_iat[off1]));
+		} else {
+			/* dest after src: copy backwards */
+			for (off1 += 4 * (count - 1), off2 += 4 * (count - 1);
+			     count != 0; count--, off1 -= 4, off2 -= 4)
+				outl(bsh2.bsh_iat[off2],
+				     inl(bsh1.bsh_iat[off1]));
+		}
+	}
+#endif
 #if defined(_I386_BUS_MEMIO_H_)
-#if defined(_I386_BUS_PIO_H_)
-	else
+#if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_PIO_IND_H_)
+	if (tag == I386_BUS_SPACE_MEM)
 #endif
 	{
+		bus_addr_t addr1 = bsh1.bsh_base + off1;
+		bus_addr_t addr2 = bsh2.bsh_base + off2;
 		if (addr1 >= addr2) {
 			/* src after dest: copy forward */
 			for (; count != 0; count--, addr1 += 4, addr2 += 4)

----Next_Part(Sat_Dec_25_14:12:03_1999_809)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=bus_pio_ind.h.diff

--- bus_pio_ind.h.orig	Sat Dec 25 13:16:09 1999
+++ bus_pio_ind.h	Sat Dec 25 13:16:09 1999
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 1997 Justin Gibbs.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions, and the following disclaimer,
+ *    without modification, immediately at the beginning of the file.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _I386_BUS_PIO_IND_H_
+#define _I386_BUS_PIO_IND_H_
+#endif /* _I386_BUS_PIO_IND_H_ */

----Next_Part(Sat_Dec_25_14:12:03_1999_809)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=isa.c.diff

--- isa.c.orig	Sat Dec 25 13:16:38 1999
+++ isa.c	Sat Dec 25 13:16:09 1999
@@ -23,7 +23,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/isa/isa.c,v 1.132 1999/10/12 21:35:46 dfr Exp $
+ * $FreeBSD$
  */
 
 /*
@@ -60,6 +60,7 @@
 #include <sys/bus.h>
 #include <sys/malloc.h>
 #include <machine/bus.h>
+#include <sys/rman.h>
 
 #include <machine/resource.h>
 
@@ -128,12 +129,105 @@
 				   start, end, count, flags);
 }
 
+#ifdef PC98
+struct resource *
+isa_alloc_resourcev(device_t child, int type, int *rid,
+		    bus_addr_t *res, bus_size_t count, u_int flags)
+{
+	struct isa_device* idev = DEVTOISA(child);
+	struct resource_list *rl = &idev->id_resources;
+
+	device_t	bus = device_get_parent(child);
+	bus_addr_t	ioport;
+	struct resource *re;
+	struct resource	**bsre;
+	int		i, j, k, linear_cnt, ressz, bsrid;
+
+	ioport = bus_get_resource_start(child, SYS_RES_IOPORT, 0);
+
+	linear_cnt = count;
+	ressz = 1;
+	for (i = 1; i < count; ++i) {
+		if (res[i] > res[i - 1] + 1) {
+			if (i < linear_cnt)
+				linear_cnt = i;
+			++ressz;
+		}
+	}
+
+	re = isa_alloc_resource(bus, child, type, rid, ioport + res[0],
+			 ioport + res[linear_cnt - 1], linear_cnt, flags);
+	if (re == NULL)
+		return NULL;
+
+	bsre = malloc(sizeof (struct resource *) * ressz, M_DEVBUF, M_NOWAIT);
+	if (bsre == NULL) {
+		resource_list_release(rl, bus, child, type, *rid, re);
+		return NULL;
+	}
+	bsre[0] = re;
+
+	for (i = linear_cnt, k = 1; i < count; i = j, k++) {
+		for (j = i + 1; j < count; j++) {
+			if (res[j] > res[j - 1] + 1)
+				break;
+		}
+		bsrid = *rid + k;
+		bsre[k] = isa_alloc_resource(bus, child, type, &bsrid,
+			ioport + res[i], ioport + res[j - 1], j - i, flags);
+		if (bsre[k] == NULL) {
+			for (k--; k >= 0; k--)
+				resource_list_release(rl, bus, child, type,
+						      *rid + k, bsre[k]);
+			free(bsre, M_DEVBUF);
+			return NULL;
+		}
+	}
+
+	re->r_bushandle.bsh_res = bsre;
+	re->r_bushandle.bsh_ressz = ressz;
+
+	return re;
+}
+
+int
+isa_load_resourcev(struct resource *re, bus_addr_t *res, bus_size_t count)
+{
+	bus_addr_t	*addr;
+	int		i;
+
+	addr = malloc(sizeof (bus_addr_t) * count, M_DEVBUF, M_NOWAIT);
+	if (addr == NULL)
+		return 1;
+
+	for (i = 0; i < count; i++)
+		addr[i] = rman_get_start(re) + res[i];
+
+	rman_set_bustag(re, I386_BUS_SPACE_IO_IND);
+	re->r_bushandle.bsh_iat = addr;
+	re->r_bushandle.bsh_iatsz = count;
+
+	return 0;
+}
+#endif
+
 int
 isa_release_resource(device_t bus, device_t child, int type, int rid,
 		     struct resource *r)
 {
 	struct isa_device* idev = DEVTOISA(child);
 	struct resource_list *rl = &idev->id_resources;
+#ifdef PC98
+	int	i;
+
+	for (i = 1; i < r->r_bushandle.bsh_ressz; i++)
+		resource_list_release(rl, bus, child, type, rid + i,
+				      r->r_bushandle.bsh_res[i]);
+	if (r->r_bushandle.bsh_res != NULL)
+		free(r->r_bushandle.bsh_res, M_DEVBUF);
+	if (r->r_bushandle.bsh_iat != NULL)
+		free(r->r_bushandle.bsh_iat, M_DEVBUF);
+#endif
 	return resource_list_release(rl, bus, child, type, rid, r);
 }
 

----Next_Part(Sat_Dec_25_14:12:03_1999_809)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=nexus.c.diff

--- nexus.c.orig	Sat Dec 25 13:34:22 1999
+++ nexus.c	Sat Dec 25 13:16:09 1999
@@ -26,7 +26,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/sys/i386/i386/nexus.c,v 1.22 1999/12/03 08:41:13 mdodd Exp $
+ * $FreeBSD$
  */
 
 /*
@@ -303,10 +303,26 @@
 		}
 		rman_set_virtual(rv, vaddr);
 		rman_set_bustag(rv, I386_BUS_SPACE_MEM);
+#ifdef PC98
+		rv->r_bushandle.bsh_base = (bus_addr_t) vaddr;
+		rv->r_bushandle.bsh_iat = NULL;
+		rv->r_bushandle.bsh_iatsz = 0;
+		rv->r_bushandle.bsh_res = NULL;
+		rv->r_bushandle.bsh_ressz = 0;
+#else
 		rman_set_bushandle(rv, (bus_space_handle_t) vaddr);
+#endif
 	} else if (type == SYS_RES_IOPORT) {
 		rman_set_bustag(rv, I386_BUS_SPACE_IO);
+#ifdef PC98
+		rv->r_bushandle.bsh_base = rv->r_start;
+		rv->r_bushandle.bsh_iat = NULL;
+		rv->r_bushandle.bsh_iatsz = 0;
+		rv->r_bushandle.bsh_res = NULL;
+		rv->r_bushandle.bsh_ressz = 0;
+#else
 		rman_set_bushandle(rv, rv->r_start);
+#endif
 	}
 
 	if (needactivate) {

----Next_Part(Sat_Dec_25_14:12:03_1999_809)----


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19991225141212T.kato>