Oops, I forget to include patches.

KATO Takenori <[EMAIL PROTECTED]> wrote:

> Attached patches provides indirection support in bus space stuff
> (submitted by Takahashi-san <[EMAIL PROTECTED]> with minor modification
> by me).  
> 
> I <[EMAIL PROTECTED]> 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 <[EMAIL PROTECTED]>  |        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!       +==========================+
--- 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)
--- 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_ */
--- 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);
 }
 
--- 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) {

Reply via email to