[rtems-libbsd commit] Put CPU specific bus_space routines into separate files

Joel Sherrill joel at rtems.org
Fri Jul 6 15:55:54 UTC 2012


Module:    rtems-libbsd
Branch:    master
Commit:    dbda80875a56e0ad08169c0799e0458a0148d812
Changeset: http://git.rtems.org/rtems-libbsd/commit/?id=dbda80875a56e0ad08169c0799e0458a0148d812

Author:    Joel Sherrill <joel.sherrill at oarcorp.com>
Date:      Fri Jul  6 10:57:12 2012 -0500

Put CPU specific bus_space routines into separate files

The code in rtemsbsd/freebsd/machine/bus.h assumed that all bus space
accesses were through memory in a simple fashion. The i386 has a true
distinction between I/O and memory space which must be accounted for.

This may not be the eventual structure of this code but we must
have different bus space accessors for different hardware configurations.
And in many, if not most, cases we will want these to be inlined for
performance.

---

 freebsd-to-rtems.py                                |    2 +-
 freebsd/i386/include/freebsd/machine/cpufunc.h     |  755 ++++++++++++++
 rtemsbsd/freebsd/machine/bus.h                     |  570 +----------
 rtemsbsd/freebsd/machine/bus_space-i386.h          | 1087 ++++++++++++++++++++
 rtemsbsd/freebsd/machine/bus_space-simple_memory.h |  684 ++++++++++++
 rtemsbsd/freebsd/machine/cpufunc.h                 |   30 -
 6 files changed, 2534 insertions(+), 594 deletions(-)

diff --git a/freebsd-to-rtems.py b/freebsd-to-rtems.py
index d78ee3b..c1eef76 100755
--- a/freebsd-to-rtems.py
+++ b/freebsd-to-rtems.py
@@ -482,7 +482,6 @@ rtems.addRTEMSHeaderFiles(
 		'rtems/machine/bus_dma.h',
 		'rtems/machine/rtems-bsd-config.h',
 		'rtems/machine/clock.h',
-		'rtems/machine/cpufunc.h',
 		'rtems/machine/endian.h',
 		'rtems/macpue/_limits.h',
 		'rtems/machine/_align.h',
@@ -1212,6 +1211,7 @@ devNic.addCPUDependentHeaderFiles(
 		'i386/include/intr_machdep.h',
 		'i386/include/legacyvar.h',
 		'i386/include/pci_cfgreg.h',
+		'i386/include/cpufunc.h',
 	]
 )
 devNic.addCPUDependentSourceFiles(
diff --git a/freebsd/i386/include/freebsd/machine/cpufunc.h b/freebsd/i386/include/freebsd/machine/cpufunc.h
new file mode 100644
index 0000000..cd82c68
--- /dev/null
+++ b/freebsd/i386/include/freebsd/machine/cpufunc.h
@@ -0,0 +1,755 @@
+/*-
+ * Copyright (c) 1993 The Regents of the University of California.
+ * 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.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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$
+ */
+
+/*
+ * Functions to provide access to special i386 instructions.
+ * This in included in sys/systm.h, and that file should be
+ * used in preference to this.
+ */
+
+#ifndef _MACHINE_CPUFUNC_HH_
+#define	_MACHINE_CPUFUNC_HH_
+
+#ifndef _SYS_CDEFS_HH_
+#error this file needs sys/cdefs.h as a prerequisite
+#endif
+
+#ifdef XEN
+extern void xen_cli(void);
+extern void xen_sti(void);
+extern u_int xen_rcr2(void);
+extern void xen_load_cr3(u_int data);
+extern void xen_tlb_flush(void);
+extern void xen_invlpg(u_int addr);
+extern void write_eflags(u_int eflags);
+extern u_int read_eflags(void);
+#endif
+
+struct region_descriptor;
+
+#define readb(va)	(*(volatile u_int8_t *) (va))
+#define readw(va)	(*(volatile u_int16_t *) (va))
+#define readl(va)	(*(volatile u_int32_t *) (va))
+
+#define writeb(va, d)	(*(volatile u_int8_t *) (va) = (d))
+#define writew(va, d)	(*(volatile u_int16_t *) (va) = (d))
+#define writel(va, d)	(*(volatile u_int32_t *) (va) = (d))
+
+#if defined(__GNUCLIKE_ASM) && defined(__CC_SUPPORTS___INLINE)
+
+static __inline void
+breakpoint(void)
+{
+	__asm __volatile("int $3");
+}
+
+static __inline u_int
+bsfl(u_int mask)
+{
+	u_int	result;
+
+	__asm("bsfl %1,%0" : "=r" (result) : "rm" (mask) : "cc");
+	return (result);
+}
+
+static __inline u_int
+bsrl(u_int mask)
+{
+	u_int	result;
+
+	__asm("bsrl %1,%0" : "=r" (result) : "rm" (mask) : "cc");
+	return (result);
+}
+
+static __inline void
+clflush(u_long addr)
+{
+
+	__asm __volatile("clflush %0" : : "m" (*(char *)addr));
+}
+
+static __inline void
+disable_intr(void)
+{
+#ifdef XEN
+	xen_cli();
+#else	
+	__asm __volatile("cli" : : : "memory");
+#endif
+}
+
+static __inline void
+do_cpuid(u_int ax, u_int *p)
+{
+	__asm __volatile("cpuid"
+			 : "=a" (p[0]), "=b" (p[1]), "=c" (p[2]), "=d" (p[3])
+			 :  "0" (ax));
+}
+
+static __inline void
+cpuid_count(u_int ax, u_int cx, u_int *p)
+{
+	__asm __volatile("cpuid"
+			 : "=a" (p[0]), "=b" (p[1]), "=c" (p[2]), "=d" (p[3])
+			 :  "0" (ax), "c" (cx));
+}
+
+static __inline void
+enable_intr(void)
+{
+#ifdef XEN
+	xen_sti();
+#else
+	__asm __volatile("sti");
+#endif
+}
+
+static __inline void
+cpu_monitor(const void *addr, int extensions, int hints)
+{
+	__asm __volatile("monitor;"
+	    : :"a" (addr), "c" (extensions), "d"(hints));
+}
+
+static __inline void
+cpu_mwait(int extensions, int hints)
+{
+	__asm __volatile("mwait;" : :"a" (hints), "c" (extensions));
+}
+
+static __inline void
+mfence(void)
+{
+
+	__asm __volatile("mfence" : : : "memory");
+}
+
+#ifdef _KERNEL
+
+#define	HAVE_INLINE_FFS
+
+static __inline int
+ffs(int mask)
+{
+	/*
+	 * Note that gcc-2's builtin ffs would be used if we didn't declare
+	 * this inline or turn off the builtin.  The builtin is faster but
+	 * broken in gcc-2.4.5 and slower but working in gcc-2.5 and later
+	 * versions.
+	 */
+	 return (mask == 0 ? mask : (int)bsfl((u_int)mask) + 1);
+}
+
+#define	HAVE_INLINE_FLS
+
+static __inline int
+fls(int mask)
+{
+	return (mask == 0 ? mask : (int)bsrl((u_int)mask) + 1);
+}
+
+#endif /* _KERNEL */
+
+static __inline void
+halt(void)
+{
+	__asm __volatile("hlt");
+}
+
+static __inline u_char
+inb(u_int port)
+{
+	u_char	data;
+
+	__asm volatile("inb %w1, %0" : "=a" (data) : "Nd" (port));
+	return (data);
+}
+
+static __inline u_int
+inl(u_int port)
+{
+	u_int	data;
+
+	__asm volatile("inl %w1, %0" : "=a" (data) : "Nd" (port));
+	return (data);
+}
+
+static __inline void
+insb(u_int port, void *addr, size_t cnt)
+{
+	__asm __volatile("cld; rep; insb"
+			 : "+D" (addr), "+c" (cnt)
+			 : "d" (port)
+			 : "memory");
+}
+
+static __inline void
+insw(u_int port, void *addr, size_t cnt)
+{
+	__asm __volatile("cld; rep; insw"
+			 : "+D" (addr), "+c" (cnt)
+			 : "d" (port)
+			 : "memory");
+}
+
+static __inline void
+insl(u_int port, void *addr, size_t cnt)
+{
+	__asm __volatile("cld; rep; insl"
+			 : "+D" (addr), "+c" (cnt)
+			 : "d" (port)
+			 : "memory");
+}
+
+static __inline void
+invd(void)
+{
+	__asm __volatile("invd");
+}
+
+static __inline u_short
+inw(u_int port)
+{
+	u_short	data;
+
+	__asm volatile("inw %w1, %0" : "=a" (data) : "Nd" (port));
+	return (data);
+}
+
+static __inline void
+outb(u_int port, u_char data)
+{
+	__asm __volatile("outb %0, %w1" : : "a" (data), "Nd" (port));
+}
+
+static __inline void
+outl(u_int port, u_int data)
+{
+	__asm volatile("outl %0, %w1" : : "a" (data), "Nd" (port));
+}
+
+static __inline void
+outsb(u_int port, const void *addr, size_t cnt)
+{
+	__asm __volatile("cld; rep; outsb"
+			 : "+S" (addr), "+c" (cnt)
+			 : "d" (port));
+}
+
+static __inline void
+outsw(u_int port, const void *addr, size_t cnt)
+{
+	__asm __volatile("cld; rep; outsw"
+			 : "+S" (addr), "+c" (cnt)
+			 : "d" (port));
+}
+
+static __inline void
+outsl(u_int port, const void *addr, size_t cnt)
+{
+	__asm __volatile("cld; rep; outsl"
+			 : "+S" (addr), "+c" (cnt)
+			 : "d" (port));
+}
+
+static __inline void
+outw(u_int port, u_short data)
+{
+	__asm volatile("outw %0, %w1" : : "a" (data), "Nd" (port));
+}
+
+static __inline void
+ia32_pause(void)
+{
+	__asm __volatile("pause");
+}
+
+static __inline u_int
+#ifdef XEN
+_read_eflags(void)
+#else	
+read_eflags(void)
+#endif
+{
+	u_int	ef;
+
+	__asm __volatile("pushfl; popl %0" : "=r" (ef));
+	return (ef);
+}
+
+static __inline uint64_t
+rdmsr(u_int msr)
+{
+	uint64_t rv;
+
+	__asm __volatile("rdmsr" : "=A" (rv) : "c" (msr));
+	return (rv);
+}
+
+static __inline uint64_t
+rdpmc(u_int pmc)
+{
+	uint64_t rv;
+
+	__asm __volatile("rdpmc" : "=A" (rv) : "c" (pmc));
+	return (rv);
+}
+
+static __inline uint64_t
+rdtsc(void)
+{
+	uint64_t rv;
+
+	__asm __volatile("rdtsc" : "=A" (rv));
+	return (rv);
+}
+
+static __inline void
+wbinvd(void)
+{
+	__asm __volatile("wbinvd");
+}
+
+static __inline void
+#ifdef XEN
+_write_eflags(u_int ef)
+#else
+write_eflags(u_int ef)
+#endif
+{
+	__asm __volatile("pushl %0; popfl" : : "r" (ef));
+}
+
+static __inline void
+wrmsr(u_int msr, uint64_t newval)
+{
+	__asm __volatile("wrmsr" : : "A" (newval), "c" (msr));
+}
+
+static __inline void
+load_cr0(u_int data)
+{
+
+	__asm __volatile("movl %0,%%cr0" : : "r" (data));
+}
+
+static __inline u_int
+rcr0(void)
+{
+	u_int	data;
+
+	__asm __volatile("movl %%cr0,%0" : "=r" (data));
+	return (data);
+}
+
+static __inline u_int
+rcr2(void)
+{
+	u_int	data;
+
+#ifdef XEN
+	return (xen_rcr2());
+#endif
+	__asm __volatile("movl %%cr2,%0" : "=r" (data));
+	return (data);
+}
+
+static __inline void
+load_cr3(u_int data)
+{
+#ifdef XEN
+	xen_load_cr3(data);
+#else
+	__asm __volatile("movl %0,%%cr3" : : "r" (data) : "memory");
+#endif
+}
+
+static __inline u_int
+rcr3(void)
+{
+	u_int	data;
+
+	__asm __volatile("movl %%cr3,%0" : "=r" (data));
+	return (data);
+}
+
+static __inline void
+load_cr4(u_int data)
+{
+	__asm __volatile("movl %0,%%cr4" : : "r" (data));
+}
+
+static __inline u_int
+rcr4(void)
+{
+	u_int	data;
+
+	__asm __volatile("movl %%cr4,%0" : "=r" (data));
+	return (data);
+}
+
+/*
+ * Global TLB flush (except for thise for pages marked PG_G)
+ */
+static __inline void
+invltlb(void)
+{
+#ifdef XEN
+	xen_tlb_flush();
+#else	
+	load_cr3(rcr3());
+#endif
+}
+
+/*
+ * TLB flush for an individual page (even if it has PG_G).
+ * Only works on 486+ CPUs (i386 does not have PG_G).
+ */
+static __inline void
+invlpg(u_int addr)
+{
+
+#ifdef XEN
+	xen_invlpg(addr);
+#else
+	__asm __volatile("invlpg %0" : : "m" (*(char *)addr) : "memory");
+#endif
+}
+
+static __inline u_int
+rfs(void)
+{
+	u_int sel;
+	__asm __volatile("mov %%fs,%0" : "=rm" (sel));
+	return (sel);
+}
+
+static __inline uint64_t
+rgdt(void)
+{
+	uint64_t gdtr;
+	__asm __volatile("sgdt %0" : "=m" (gdtr));
+	return (gdtr);
+}
+
+static __inline u_int
+rgs(void)
+{
+	u_int sel;
+	__asm __volatile("mov %%gs,%0" : "=rm" (sel));
+	return (sel);
+}
+
+static __inline uint64_t
+ridt(void)
+{
+	uint64_t idtr;
+	__asm __volatile("sidt %0" : "=m" (idtr));
+	return (idtr);
+}
+
+static __inline u_short
+rldt(void)
+{
+	u_short ldtr;
+	__asm __volatile("sldt %0" : "=g" (ldtr));
+	return (ldtr);
+}
+
+static __inline u_int
+rss(void)
+{
+	u_int sel;
+	__asm __volatile("mov %%ss,%0" : "=rm" (sel));
+	return (sel);
+}
+
+static __inline u_short
+rtr(void)
+{
+	u_short tr;
+	__asm __volatile("str %0" : "=g" (tr));
+	return (tr);
+}
+
+static __inline void
+load_fs(u_int sel)
+{
+	__asm __volatile("mov %0,%%fs" : : "rm" (sel));
+}
+
+static __inline void
+load_gs(u_int sel)
+{
+	__asm __volatile("mov %0,%%gs" : : "rm" (sel));
+}
+
+static __inline void
+lidt(struct region_descriptor *addr)
+{
+	__asm __volatile("lidt (%0)" : : "r" (addr));
+}
+
+static __inline void
+lldt(u_short sel)
+{
+	__asm __volatile("lldt %0" : : "r" (sel));
+}
+
+static __inline void
+ltr(u_short sel)
+{
+	__asm __volatile("ltr %0" : : "r" (sel));
+}
+
+static __inline u_int
+rdr0(void)
+{
+	u_int	data;
+	__asm __volatile("movl %%dr0,%0" : "=r" (data));
+	return (data);
+}
+
+static __inline void
+load_dr0(u_int dr0)
+{
+	__asm __volatile("movl %0,%%dr0" : : "r" (dr0));
+}
+
+static __inline u_int
+rdr1(void)
+{
+	u_int	data;
+	__asm __volatile("movl %%dr1,%0" : "=r" (data));
+	return (data);
+}
+
+static __inline void
+load_dr1(u_int dr1)
+{
+	__asm __volatile("movl %0,%%dr1" : : "r" (dr1));
+}
+
+static __inline u_int
+rdr2(void)
+{
+	u_int	data;
+	__asm __volatile("movl %%dr2,%0" : "=r" (data));
+	return (data);
+}
+
+static __inline void
+load_dr2(u_int dr2)
+{
+	__asm __volatile("movl %0,%%dr2" : : "r" (dr2));
+}
+
+static __inline u_int
+rdr3(void)
+{
+	u_int	data;
+	__asm __volatile("movl %%dr3,%0" : "=r" (data));
+	return (data);
+}
+
+static __inline void
+load_dr3(u_int dr3)
+{
+	__asm __volatile("movl %0,%%dr3" : : "r" (dr3));
+}
+
+static __inline u_int
+rdr4(void)
+{
+	u_int	data;
+	__asm __volatile("movl %%dr4,%0" : "=r" (data));
+	return (data);
+}
+
+static __inline void
+load_dr4(u_int dr4)
+{
+	__asm __volatile("movl %0,%%dr4" : : "r" (dr4));
+}
+
+static __inline u_int
+rdr5(void)
+{
+	u_int	data;
+	__asm __volatile("movl %%dr5,%0" : "=r" (data));
+	return (data);
+}
+
+static __inline void
+load_dr5(u_int dr5)
+{
+	__asm __volatile("movl %0,%%dr5" : : "r" (dr5));
+}
+
+static __inline u_int
+rdr6(void)
+{
+	u_int	data;
+	__asm __volatile("movl %%dr6,%0" : "=r" (data));
+	return (data);
+}
+
+static __inline void
+load_dr6(u_int dr6)
+{
+	__asm __volatile("movl %0,%%dr6" : : "r" (dr6));
+}
+
+static __inline u_int
+rdr7(void)
+{
+	u_int	data;
+	__asm __volatile("movl %%dr7,%0" : "=r" (data));
+	return (data);
+}
+
+static __inline void
+load_dr7(u_int dr7)
+{
+	__asm __volatile("movl %0,%%dr7" : : "r" (dr7));
+}
+
+static __inline u_char
+read_cyrix_reg(u_char reg)
+{
+	outb(0x22, reg);
+	return inb(0x23);
+}
+
+static __inline void
+write_cyrix_reg(u_char reg, u_char data)
+{
+	outb(0x22, reg);
+	outb(0x23, data);
+}
+
+static __inline register_t
+intr_disable(void)
+{
+	register_t eflags;
+
+	eflags = read_eflags();
+	disable_intr();
+	return (eflags);
+}
+
+static __inline void
+intr_restore(register_t eflags)
+{
+	write_eflags(eflags);
+}
+
+#else /* !(__GNUCLIKE_ASM && __CC_SUPPORTS___INLINE) */
+
+int	breakpoint(void);
+u_int	bsfl(u_int mask);
+u_int	bsrl(u_int mask);
+void	disable_intr(void);
+void	do_cpuid(u_int ax, u_int *p);
+void	enable_intr(void);
+void	halt(void);
+void	ia32_pause(void);
+u_char	inb(u_int port);
+u_int	inl(u_int port);
+void	insb(u_int port, void *addr, size_t cnt);
+void	insl(u_int port, void *addr, size_t cnt);
+void	insw(u_int port, void *addr, size_t cnt);
+register_t	intr_disable(void);
+void	intr_restore(register_t ef);
+void	invd(void);
+void	invlpg(u_int addr);
+void	invltlb(void);
+u_short	inw(u_int port);
+void	lidt(struct region_descriptor *addr);
+void	lldt(u_short sel);
+void	load_cr0(u_int cr0);
+void	load_cr3(u_int cr3);
+void	load_cr4(u_int cr4);
+void	load_dr0(u_int dr0);
+void	load_dr1(u_int dr1);
+void	load_dr2(u_int dr2);
+void	load_dr3(u_int dr3);
+void	load_dr4(u_int dr4);
+void	load_dr5(u_int dr5);
+void	load_dr6(u_int dr6);
+void	load_dr7(u_int dr7);
+void	load_fs(u_int sel);
+void	load_gs(u_int sel);
+void	ltr(u_short sel);
+void	outb(u_int port, u_char data);
+void	outl(u_int port, u_int data);
+void	outsb(u_int port, const void *addr, size_t cnt);
+void	outsl(u_int port, const void *addr, size_t cnt);
+void	outsw(u_int port, const void *addr, size_t cnt);
+void	outw(u_int port, u_short data);
+u_int	rcr0(void);
+u_int	rcr2(void);
+u_int	rcr3(void);
+u_int	rcr4(void);
+uint64_t rdmsr(u_int msr);
+uint64_t rdpmc(u_int pmc);
+u_int	rdr0(void);
+u_int	rdr1(void);
+u_int	rdr2(void);
+u_int	rdr3(void);
+u_int	rdr4(void);
+u_int	rdr5(void);
+u_int	rdr6(void);
+u_int	rdr7(void);
+uint64_t rdtsc(void);
+u_char	read_cyrix_reg(u_char reg);
+u_int	read_eflags(void);
+u_int	rfs(void);
+uint64_t rgdt(void);
+u_int	rgs(void);
+uint64_t ridt(void);
+u_short	rldt(void);
+u_short	rtr(void);
+void	wbinvd(void);
+void	write_cyrix_reg(u_char reg, u_char data);
+void	write_eflags(u_int ef);
+void	wrmsr(u_int msr, uint64_t newval);
+
+#endif	/* __GNUCLIKE_ASM && __CC_SUPPORTS___INLINE */
+
+void    reset_dbregs(void);
+
+#ifdef _KERNEL
+int	rdmsr_safe(u_int msr, uint64_t *val);
+int	wrmsr_safe(u_int msr, uint64_t newval);
+#endif
+
+#endif /* !_MACHINE_CPUFUNC_HH_ */
diff --git a/rtemsbsd/freebsd/machine/bus.h b/rtemsbsd/freebsd/machine/bus.h
index a2b2195..f62ca45 100644
--- a/rtemsbsd/freebsd/machine/bus.h
+++ b/rtemsbsd/freebsd/machine/bus.h
@@ -212,569 +212,13 @@ void
 bus_space_free(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t size);
 
 
-static __inline void
-bus_space_barrier(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
-    bus_size_t size, int flags)
-{
-	/* Do nothing */
-}
-
-
-/*
- * Read 1 unit of data from bus space described by the tag, handle and ofs
- * tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
- * data is returned.
- */
-static __inline uint8_t
-bus_space_read_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs)
-{
-	uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
-	return (*bsp);
-}
-
-static __inline uint16_t
-bus_space_read_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs)
-{
-	uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
-	return (*bsp);
-}
-
-static __inline uint32_t
-bus_space_read_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs)
-{
-	uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
-	return (*bsp);
-}
-
-static __inline uint64_t
-bus_space_read_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs)
-{
-	uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
-	return (*bsp);
-}
-
-
-/*
- * Write 1 unit of data to bus space described by the tag, handle and ofs
- * tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
- * data is passed by value.
- */
-static __inline void
-bus_space_write_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
-    uint8_t val)
-{
-	uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
-	*bsp = val;
-}
-
-static __inline void
-bus_space_write_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
-    uint16_t val)
-{
-	uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
-	*bsp = val;
-}
-
-static __inline void
-bus_space_write_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
-    uint32_t val)
-{
-	uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
-	*bsp = val;
-}
-
-static __inline void
-bus_space_write_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
-    uint64_t val)
-{
-	uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
-	*bsp = val;
-}
-
-
-/*
- * Read count units of data from bus space described by the tag, handle and
- * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
- * data is returned in the buffer passed by reference.
- */
-static __inline void
-bus_space_read_multi_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, uint8_t *bufp, bus_size_t count)
-{
-	uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
-	while (count-- > 0) {
-		*bufp++ = *bsp;
-	}
-}
-
-static __inline void
-bus_space_read_multi_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, uint16_t *bufp, bus_size_t count)
-{
-	uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
-	while (count-- > 0) {
-		*bufp++ = *bsp;
-	}
-}
-
-static __inline void
-bus_space_read_multi_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, uint32_t *bufp, bus_size_t count)
-{
-	uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
-	while (count-- > 0) {
-		*bufp++ = *bsp;
-	}
-}
-
-static __inline void
-bus_space_read_multi_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, uint64_t *bufp, bus_size_t count)
-{
-	uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
-	while (count-- > 0) {
-		*bufp++ = *bsp;
-	}
-}
-
-
-/*
- * Write count units of data to bus space described by the tag, handle and
- * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
- * data is read from the buffer passed by reference.
- */
-static __inline void
-bus_space_write_multi_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, const uint8_t *bufp, bus_size_t count)
-{
-	uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
-	while (count-- > 0) {
-		*bsp = *bufp++;
-	}
-}
-
-static __inline void
-bus_space_write_multi_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, const uint16_t *bufp, bus_size_t count)
-{
-	uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
-	while (count-- > 0) {
-		*bsp = *bufp++;
-	}
-}
-
-static __inline void
-bus_space_write_multi_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, const uint32_t *bufp, bus_size_t count)
-{
-	uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
-	while (count-- > 0) {
-		*bsp = *bufp++;
-	}
-}
-
-static __inline void
-bus_space_write_multi_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, const uint64_t *bufp, bus_size_t count)
-{
-	uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
-	while (count-- > 0) {
-		*bsp = *bufp++;
-	}
-}
-
-
-/*
- * Read count units of data from bus space described by the tag, handle and
- * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
- * data is written to the buffer passed by reference and read from successive
- * bus space addresses. Access is unordered.
- */
-static __inline void
-bus_space_read_region_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, uint8_t *bufp, bus_size_t count)
-{
-	while (count-- > 0) {
-		uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
-		*bufp++ = *bsp;
-		ofs += 1;
-	}
-}
-
-static __inline void
-bus_space_read_region_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, uint16_t *bufp, bus_size_t count)
-{
-	while (count-- > 0) {
-		uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
-		*bufp++ = *bsp;
-		ofs += 2;
-	}
-}
-
-static __inline void
-bus_space_read_region_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, uint32_t *bufp, bus_size_t count)
-{
-	while (count-- > 0) {
-		uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
-		*bufp++ = *bsp;
-		ofs += 4;
-	}
-}
-
-static __inline void
-bus_space_read_region_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, uint64_t *bufp, bus_size_t count)
-{
-	while (count-- > 0) {
-		uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
-		*bufp++ = *bsp;
-		ofs += 8;
-	}
-}
-
-
-/*
- * Write count units of data from bus space described by the tag, handle and
- * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
- * data is read from the buffer passed by reference and written to successive
- * bus space addresses. Access is unordered.
- */
-static __inline void
-bus_space_write_region_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, const uint8_t *bufp, bus_size_t count)
-{
-	while (count-- > 0) {
-		uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
-		*bsp = *bufp++;
-		ofs += 1;
-	}
-}
-
-static __inline void
-bus_space_write_region_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, const uint16_t *bufp, bus_size_t count)
-{
-	while (count-- > 0) {
-		uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
-		*bsp = *bufp++;
-		ofs += 2;
-	}
-}
-
-static __inline void
-bus_space_write_region_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, const uint32_t *bufp, bus_size_t count)
-{
-	while (count-- > 0) {
-		uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
-		*bsp = *bufp++;
-		ofs += 4;
-	}
-}
-
-static __inline void
-bus_space_write_region_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, const uint64_t *bufp, bus_size_t count)
-{
-	while (count-- > 0) {
-		uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
-		*bsp = *bufp++;
-		ofs += 8;
-	}
-}
-
-
-/*
- * Write count units of data from bus space described by the tag, handle and
- * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
- * data is passed by value. Writes are unordered.
- */
-static __inline void
-bus_space_set_multi_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, uint8_t val, bus_size_t count)
-{
-	uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
-	while (count-- > 0) {
-		*bsp = val;
-	}
-}
-
-static __inline void
-bus_space_set_multi_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, uint16_t val, bus_size_t count)
-{
-	uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
-	while (count-- > 0) {
-		*bsp = val;
-	}
-}
-
-static __inline void
-bus_space_set_multi_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, uint32_t val, bus_size_t count)
-{
-	uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
-	while (count-- > 0) {
-		*bsp = val;
-	}
-}
-
-static __inline void
-bus_space_set_multi_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, uint64_t val, bus_size_t count)
-{
-	uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
-	while (count-- > 0) {
-		*bsp = val;
-	}
-}
-
-
-/*
- * Write count units of data from bus space described by the tag, handle and
- * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
- * data is passed by value and written to successive bus space addresses.
- * Writes are unordered.
- */
-static __inline void
-bus_space_set_region_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, uint8_t val, bus_size_t count)
-{
-	while (count-- > 0) {
-		uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
-		*bsp = val;
-		ofs += 1;
-	}
-}
-
-static __inline void
-bus_space_set_region_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, uint16_t val, bus_size_t count)
-{
-	while (count-- > 0) {
-		uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
-		*bsp = val;
-		ofs += 2;
-	}
-}
-
-static __inline void
-bus_space_set_region_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, uint32_t val, bus_size_t count)
-{
-	while (count-- > 0) {
-		uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
-		*bsp = val;
-		ofs += 4;
-	}
-}
-
-static __inline void
-bus_space_set_region_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
-    bus_size_t ofs, uint64_t val, bus_size_t count)
-{
-	while (count-- > 0) {
-		uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
-		*bsp = val;
-		ofs += 8;
-	}
-}
-
-
-/*
- * Copy count units of data from bus space described by the tag and the first
- * handle and ofs pair to bus space described by the tag and the second handle
- * and ofs pair. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes.
- * The data is read from successive bus space addresses and also written to
- * successive bus space addresses. Both reads and writes are unordered.
- */
-static __inline void
-bus_space_copy_region_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh1,
-    bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, bus_size_t count)
-{
-	bus_addr_t dst = bsh1 + ofs1;
-	bus_addr_t src = bsh2 + ofs2;
-	uint8_t __volatile *dstp = (uint8_t __volatile *) dst;
-	uint8_t __volatile *srcp = (uint8_t __volatile *) src;
-	if (dst > src) {
-		src += count - 1;
-		dst += count - 1;
-		while (count-- > 0) {
-			*dstp = *srcp;
-			src -= 1;
-			dst -= 1;
-		}
-	} else {
-		while (count-- > 0) {
-			*dstp = *srcp;
-			src += 1;
-			dst += 1;
-		}
-	}
-}
-
-static __inline void
-bus_space_copy_region_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh1,
-    bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, bus_size_t count)
-{
-	bus_addr_t dst = bsh1 + ofs1;
-	bus_addr_t src = bsh2 + ofs2;
-	uint16_t __volatile *dstp = (uint16_t __volatile *) dst;
-	uint16_t __volatile *srcp = (uint16_t __volatile *) src;
-	if (dst > src) {
-		src += (count - 1) << 1;
-		dst += (count - 1) << 1;
-		while (count-- > 0) {
-			*dstp = *srcp;
-			src -= 2;
-			dst -= 2;
-		}
-	} else {
-		while (count-- > 0) {
-			*dstp = *srcp;
-			src += 2;
-			dst += 2;
-		}
-	}
-}
-
-static __inline void
-bus_space_copy_region_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh1,
-    bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, bus_size_t count)
-{
-	bus_addr_t dst = bsh1 + ofs1;
-	bus_addr_t src = bsh2 + ofs2;
-	uint32_t __volatile *dstp = (uint32_t __volatile *) dst;
-	uint32_t __volatile *srcp = (uint32_t __volatile *) src;
-	if (dst > src) {
-		src += (count - 1) << 2;
-		dst += (count - 1) << 2;
-		while (count-- > 0) {
-			*dstp = *srcp;
-			src -= 4;
-			dst -= 4;
-		}
-	} else {
-		while (count-- > 0) {
-			*dstp = *srcp;
-			src += 4;
-			dst += 4;
-		}
-	}
-}
-
-static __inline void
-bus_space_copy_region_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh1,
-    bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, bus_size_t count)
-{
-	bus_addr_t dst = bsh1 + ofs1;
-	bus_addr_t src = bsh2 + ofs2;
-	uint64_t __volatile *dstp = (uint64_t __volatile *) dst;
-	uint64_t __volatile *srcp = (uint64_t __volatile *) src;
-	if (dst > src) {
-		src += (count - 1) << 3;
-		dst += (count - 1) << 3;
-		while (count-- > 0) {
-			*dstp = *srcp;
-			src -= 8;
-			dst -= 8;
-		}
-	} else {
-		while (count-- > 0) {
-			*dstp = *srcp;
-			src += 8;
-			dst += 8;
-		}
-	}
-}
-
-
-/*
- * Stream accesses are the same as normal accesses on RTEMS; there are no
- * supported bus systems with an endianess different from the host one.
- */
-#define	bus_space_read_stream_1(t, h, o)	\
-	bus_space_read_1(t, h, o)
-#define	bus_space_read_stream_2(t, h, o)	\
-	bus_space_read_2(t, h, o)
-#define	bus_space_read_stream_4(t, h, o)	\
-	bus_space_read_4(t, h, o)
-#define	bus_space_read_stream_8(t, h, o)	\
-	bus_space_read_8(t, h, o)
-
-#define	bus_space_read_multi_stream_1(t, h, o, a, c)	\
-	bus_space_read_multi_1(t, h, o, a, c)
-#define	bus_space_read_multi_stream_2(t, h, o, a, c)	\
-	bus_space_read_multi_2(t, h, o, a, c)
-#define	bus_space_read_multi_stream_4(t, h, o, a, c)	\
-	bus_space_read_multi_4(t, h, o, a, c)
-#define	bus_space_read_multi_stream_8(t, h, o, a, c)	\
-	bus_space_read_multi_8(t, h, o, a, c)
-
-#define	bus_space_write_stream_1(t, h, o, v)	\
-	bus_space_write_1(t, h, o, v)
-#define	bus_space_write_stream_2(t, h, o, v)	\
-	bus_space_write_2(t, h, o, v)
-#define	bus_space_write_stream_4(t, h, o, v)	\
-	bus_space_write_4(t, h, o, v)
-#define	bus_space_write_stream_8(t, h, o, v)	\
-	bus_space_write_8(t, h, o, v)
-
-#define	bus_space_write_multi_stream_1(t, h, o, a, c)	\
-	bus_space_write_multi_1(t, h, o, a, c)
-#define	bus_space_write_multi_stream_2(t, h, o, a, c)	\
-	bus_space_write_multi_2(t, h, o, a, c)
-#define	bus_space_write_multi_stream_4(t, h, o, a, c)	\
-	bus_space_write_multi_4(t, h, o, a, c)
-#define	bus_space_write_multi_stream_8(t, h, o, a, c)	\
-	bus_space_write_multi_8(t, h, o, a, c)
-
-#define	bus_space_set_multi_stream_1(t, h, o, v, c)	\
-	bus_space_set_multi_1(t, h, o, v, c)
-#define	bus_space_set_multi_stream_2(t, h, o, v, c)	\
-	bus_space_set_multi_2(t, h, o, v, c)
-#define	bus_space_set_multi_stream_4(t, h, o, v, c)	\
-	bus_space_set_multi_4(t, h, o, v, c)
-#define	bus_space_set_multi_stream_8(t, h, o, v, c)	\
-	bus_space_set_multi_8(t, h, o, v, c)
-
-#define	bus_space_read_region_stream_1(t, h, o, a, c)	\
-	bus_space_read_region_1(t, h, o, a, c)
-#define	bus_space_read_region_stream_2(t, h, o, a, c)	\
-	bus_space_read_region_2(t, h, o, a, c)
-#define	bus_space_read_region_stream_4(t, h, o, a, c)	\
-	bus_space_read_region_4(t, h, o, a, c)
-#define	bus_space_read_region_stream_8(t, h, o, a, c)	\
-	bus_space_read_region_8(t, h, o, a, c)
-
-#define	bus_space_write_region_stream_1(t, h, o, a, c)	\
-	bus_space_write_region_1(t, h, o, a, c)
-#define	bus_space_write_region_stream_2(t, h, o, a, c)	\
-	bus_space_write_region_2(t, h, o, a, c)
-#define	bus_space_write_region_stream_4(t, h, o, a, c)	\
-	bus_space_write_region_4(t, h, o, a, c)
-#define	bus_space_write_region_stream_8(t, h, o, a, c)	\
-	bus_space_write_region_8(t, h, o, a, c)
-
-#define	bus_space_set_region_stream_1(t, h, o, v, c)	\
-	bus_space_set_region_1(t, h, o, v, c)
-#define	bus_space_set_region_stream_2(t, h, o, v, c)	\
-	bus_space_set_region_2(t, h, o, v, c)
-#define	bus_space_set_region_stream_4(t, h, o, v, c)	\
-	bus_space_set_region_4(t, h, o, v, c)
-#define	bus_space_set_region_stream_8(t, h, o, v, c)	\
-	bus_space_set_region_8(t, h, o, v, c)
-
-#define	bus_space_copy_region_stream_1(t, h1, o1, h2, o2, c)	\
-	bus_space_copy_region_1(t, h1, o1, h2, o2, c)
-#define	bus_space_copy_region_stream_2(t, h1, o1, h2, o2, c)	\
-	bus_space_copy_region_2(t, h1, o1, h2, o2, c)
-#define	bus_space_copy_region_stream_4(t, h1, o1, h2, o2, c)	\
-	bus_space_copy_region_4(t, h1, o1, h2, o2, c)
-#define	bus_space_copy_region_stream_8(t, h1, o1, h2, o2, c)	\
-	bus_space_copy_region_8(t, h1, o1, h2, o2, c)
+#if defined(__i386__)
+  #include <freebsd/machine/bus_space-i386.h>
+#elif defined(__ppc__)
+  #include <freebsd/machine/bus_space-simple_memory.h>
+#else
+  #error "Bus space routines not implemented for this architecture!!"
+#endif
 
 #include <freebsd/machine/bus_dma.h>
 
diff --git a/rtemsbsd/freebsd/machine/bus_space-i386.h b/rtemsbsd/freebsd/machine/bus_space-i386.h
new file mode 100644
index 0000000..2f63552
--- /dev/null
+++ b/rtemsbsd/freebsd/machine/bus_space-i386.h
@@ -0,0 +1,1087 @@
+/**
+ * @file
+ *
+ * @ingroup rtems_bsd_machine
+ *
+ * @brief TODO.
+ *
+ * File origin from FreeBSD 'sys/i386/include/bus.h'.
+ */
+
+/*-
+ * Copyright (c) KATO Takenori, 1999.
+ *
+ * All rights reserved.  Unpublished rights reserved under the copyright
+ * laws of Japan.
+ *
+ * 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 as
+ *    the first lines of this file unmodified.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. 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 ``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 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$
+ */
+
+/*	$NetBSD: bus.h,v 1.12 1997/10/01 08:25:15 fvdl Exp $	*/
+
+/*-
+ * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
+ * NASA Ames Research Center.
+ *
+ * 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.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the NetBSD
+ *	Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+ */
+
+/*-
+ * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
+ * Copyright (c) 1996 Christopher G. Demetriou.  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.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by Christopher G. Demetriou
+ *	for the NetBSD Project.
+ * 4. 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 ``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 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.
+ */
+
+#ifndef _RTEMS_BSD_MACHINE_BUS_I386_H_
+#define _RTEMS_BSD_MACHINE_BUS_I386_H_
+
+#include <freebsd/machine/_bus.h>
+#include <freebsd/machine/cpufunc.h>
+#include <freebsd/machine/resource.h>
+
+#define I386_BUS_SPACE_IO SYS_RES_IOPORT
+
+/*
+ * Read a 1, 2, 4, or 8 byte quantity from bus space
+ * described by tag/handle/offset.
+ */
+static __inline u_int8_t bus_space_read_1(bus_space_tag_t tag,
+					  bus_space_handle_t handle,
+					  bus_size_t offset);
+
+static __inline u_int16_t bus_space_read_2(bus_space_tag_t tag,
+					   bus_space_handle_t handle,
+					   bus_size_t offset);
+
+static __inline u_int32_t bus_space_read_4(bus_space_tag_t tag,
+					   bus_space_handle_t handle,
+					   bus_size_t offset);
+
+static __inline u_int8_t
+bus_space_read_1(bus_space_tag_t tag, bus_space_handle_t handle,
+		 bus_size_t offset)
+{
+
+	if (tag == I386_BUS_SPACE_IO)
+		return (inb(handle + offset));
+	return (*(volatile u_int8_t *)(handle + offset));
+}
+
+static __inline u_int16_t
+bus_space_read_2(bus_space_tag_t tag, bus_space_handle_t handle,
+		 bus_size_t offset)
+{
+
+	if (tag == I386_BUS_SPACE_IO)
+		return (inw(handle + offset));
+	return (*(volatile u_int16_t *)(handle + offset));
+}
+
+static __inline u_int32_t
+bus_space_read_4(bus_space_tag_t tag, bus_space_handle_t handle,
+		 bus_size_t offset)
+{
+
+	if (tag == I386_BUS_SPACE_IO)
+		return (inl(handle + offset));
+	return (*(volatile u_int32_t *)(handle + offset));
+}
+
+#if 0	/* Cause a link error for bus_space_read_8 */
+#define	bus_space_read_8(t, h, o)	!!! bus_space_read_8 unimplemented !!!
+#endif
+
+/*
+ * Read `count' 1, 2, 4, or 8 byte quantities from bus space
+ * described by tag/handle/offset and copy into buffer provided.
+ */
+static __inline void bus_space_read_multi_1(bus_space_tag_t tag,
+					    bus_space_handle_t bsh,
+					    bus_size_t offset, u_int8_t *addr,
+					    size_t count);
+
+static __inline void bus_space_read_multi_2(bus_space_tag_t tag,
+					    bus_space_handle_t bsh,
+					    bus_size_t offset, u_int16_t *addr,
+					    size_t count);
+
+static __inline void bus_space_read_multi_4(bus_space_tag_t tag,
+					    bus_space_handle_t bsh,
+					    bus_size_t offset, u_int32_t *addr,
+					    size_t count);
+
+static __inline void
+bus_space_read_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh,
+		       bus_size_t offset, u_int8_t *addr, size_t count)
+{
+
+	if (tag == I386_BUS_SPACE_IO)
+		insb(bsh + offset, addr, count);
+	else {
+#ifdef __GNUCLIKE_ASM
+		__asm __volatile("				\n\
+			cld					\n\
+		1:	movb (%2),%%al				\n\
+			stosb					\n\
+			loop 1b"				:
+		    "=D" (addr), "=c" (count)			:
+		    "r" (bsh + offset), "0" (addr), "1" (count)	:
+		    "%eax", "memory");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+	}
+}
+
+static __inline void
+bus_space_read_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh,
+		       bus_size_t offset, u_int16_t *addr, size_t count)
+{
+
+	if (tag == I386_BUS_SPACE_IO)
+		insw(bsh + offset, addr, count);
+	else {
+#ifdef __GNUCLIKE_ASM
+		__asm __volatile("				\n\
+			cld					\n\
+		1:	movw (%2),%%ax				\n\
+			stosw					\n\
+			loop 1b"				:
+		    "=D" (addr), "=c" (count)			:
+		    "r" (bsh + offset), "0" (addr), "1" (count)	:
+		    "%eax", "memory");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+	}
+}
+
+static __inline void
+bus_space_read_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh,
+		       bus_size_t offset, u_int32_t *addr, size_t count)
+{
+
+	if (tag == I386_BUS_SPACE_IO)
+		insl(bsh + offset, addr, count);
+	else {
+#ifdef __GNUCLIKE_ASM
+		__asm __volatile("				\n\
+			cld					\n\
+		1:	movl (%2),%%eax				\n\
+			stosl					\n\
+			loop 1b"				:
+		    "=D" (addr), "=c" (count)			:
+		    "r" (bsh + offset), "0" (addr), "1" (count)	:
+		    "%eax", "memory");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+	}
+}
+
+#if 0	/* Cause a link error for bus_space_read_multi_8 */
+#define	bus_space_read_multi_8	!!! bus_space_read_multi_8 unimplemented !!!
+#endif
+
+/*
+ * Read `count' 1, 2, 4, or 8 byte quantities from bus space
+ * described by tag/handle and starting at `offset' and copy into
+ * buffer provided.
+ */
+static __inline void bus_space_read_region_1(bus_space_tag_t tag,
+					     bus_space_handle_t bsh,
+					     bus_size_t offset, u_int8_t *addr,
+					     size_t count);
+
+static __inline void bus_space_read_region_2(bus_space_tag_t tag,
+					     bus_space_handle_t bsh,
+					     bus_size_t offset, u_int16_t *addr,
+					     size_t count);
+
+static __inline void bus_space_read_region_4(bus_space_tag_t tag,
+					     bus_space_handle_t bsh,
+					     bus_size_t offset, u_int32_t *addr,
+					     size_t count);
+
+
+static __inline void
+bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t bsh,
+			bus_size_t offset, u_int8_t *addr, size_t count)
+{
+
+	if (tag == I386_BUS_SPACE_IO) {
+		int _port_ = bsh + offset;
+#ifdef __GNUCLIKE_ASM
+		__asm __volatile("				\n\
+			cld					\n\
+		1:	inb %w2,%%al				\n\
+			stosb					\n\
+			incl %2					\n\
+			loop 1b"				:
+		    "=D" (addr), "=c" (count), "=d" (_port_)	:
+		    "0" (addr), "1" (count), "2" (_port_)	:
+		    "%eax", "memory", "cc");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+	} else {
+		int _port_ = bsh + offset;
+#ifdef __GNUCLIKE_ASM
+		__asm __volatile("				\n\
+			cld					\n\
+			repne					\n\
+			movsb"					:
+		    "=D" (addr), "=c" (count), "=S" (_port_)	:
+		    "0" (addr), "1" (count), "2" (_port_)	:
+		    "memory", "cc");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+	}
+}
+
+static __inline void
+bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t bsh,
+			bus_size_t offset, u_int16_t *addr, size_t count)
+{
+
+	if (tag == I386_BUS_SPACE_IO) {
+		int _port_ = bsh + offset;
+#ifdef __GNUCLIKE_ASM
+		__asm __volatile("				\n\
+			cld					\n\
+		1:	inw %w2,%%ax				\n\
+			stosw					\n\
+			addl $2,%2				\n\
+			loop 1b"				:
+		    "=D" (addr), "=c" (count), "=d" (_port_)	:
+		    "0" (addr), "1" (count), "2" (_port_)	:
+		    "%eax", "memory", "cc");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+	} else {
+		int _port_ = bsh + offset;
+#ifdef __GNUCLIKE_ASM
+		__asm __volatile("				\n\
+			cld					\n\
+			repne					\n\
+			movsw"					:
+		    "=D" (addr), "=c" (count), "=S" (_port_)	:
+		    "0" (addr), "1" (count), "2" (_port_)	:
+		    "memory", "cc");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+	}
+}
+
+static __inline void
+bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t bsh,
+			bus_size_t offset, u_int32_t *addr, size_t count)
+{
+
+	if (tag == I386_BUS_SPACE_IO) {
+		int _port_ = bsh + offset;
+#ifdef __GNUCLIKE_ASM
+		__asm __volatile("				\n\
+			cld					\n\
+		1:	inl %w2,%%eax				\n\
+			stosl					\n\
+			addl $4,%2				\n\
+			loop 1b"				:
+		    "=D" (addr), "=c" (count), "=d" (_port_)	:
+		    "0" (addr), "1" (count), "2" (_port_)	:
+		    "%eax", "memory", "cc");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+	} else {
+		int _port_ = bsh + offset;
+#ifdef __GNUCLIKE_ASM
+		__asm __volatile("				\n\
+			cld					\n\
+			repne					\n\
+			movsl"					:
+		    "=D" (addr), "=c" (count), "=S" (_port_)	:
+		    "0" (addr), "1" (count), "2" (_port_)	:
+		    "memory", "cc");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+	}
+}
+
+#if 0	/* Cause a link error for bus_space_read_region_8 */
+#define	bus_space_read_region_8	!!! bus_space_read_region_8 unimplemented !!!
+#endif
+
+/*
+ * Write the 1, 2, 4, or 8 byte value `value' to bus space
+ * described by tag/handle/offset.
+ */
+
+static __inline void bus_space_write_1(bus_space_tag_t tag,
+				       bus_space_handle_t bsh,
+				       bus_size_t offset, u_int8_t value);
+
+static __inline void bus_space_write_2(bus_space_tag_t tag,
+				       bus_space_handle_t bsh,
+				       bus_size_t offset, u_int16_t value);
+
+static __inline void bus_space_write_4(bus_space_tag_t tag,
+				       bus_space_handle_t bsh,
+				       bus_size_t offset, u_int32_t value);
+
+static __inline void
+bus_space_write_1(bus_space_tag_t tag, bus_space_handle_t bsh,
+		       bus_size_t offset, u_int8_t value)
+{
+
+	if (tag == I386_BUS_SPACE_IO)
+		outb(bsh + offset, value);
+	else
+		*(volatile u_int8_t *)(bsh + offset) = value;
+}
+
+static __inline void
+bus_space_write_2(bus_space_tag_t tag, bus_space_handle_t bsh,
+		       bus_size_t offset, u_int16_t value)
+{
+
+	if (tag == I386_BUS_SPACE_IO)
+		outw(bsh + offset, value);
+	else
+		*(volatile u_int16_t *)(bsh + offset) = value;
+}
+
+static __inline void
+bus_space_write_4(bus_space_tag_t tag, bus_space_handle_t bsh,
+		       bus_size_t offset, u_int32_t value)
+{
+
+	if (tag == I386_BUS_SPACE_IO)
+		outl(bsh + offset, value);
+	else
+		*(volatile u_int32_t *)(bsh + offset) = value;
+}
+
+#if 0	/* Cause a link error for bus_space_write_8 */
+#define	bus_space_write_8	!!! bus_space_write_8 not implemented !!!
+#endif
+
+/*
+ * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
+ * provided to bus space described by tag/handle/offset.
+ */
+
+static __inline void bus_space_write_multi_1(bus_space_tag_t tag,
+					     bus_space_handle_t bsh,
+					     bus_size_t offset,
+					     const u_int8_t *addr,
+					     size_t count);
+static __inline void bus_space_write_multi_2(bus_space_tag_t tag,
+					     bus_space_handle_t bsh,
+					     bus_size_t offset,
+					     const u_int16_t *addr,
+					     size_t count);
+
+static __inline void bus_space_write_multi_4(bus_space_tag_t tag,
+					     bus_space_handle_t bsh,
+					     bus_size_t offset,
+					     const u_int32_t *addr,
+					     size_t count);
+
+static __inline void
+bus_space_write_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh,
+			bus_size_t offset, const u_int8_t *addr, size_t count)
+{
+
+	if (tag == I386_BUS_SPACE_IO)
+		outsb(bsh + offset, addr, count);
+	else {
+#ifdef __GNUCLIKE_ASM
+		__asm __volatile("				\n\
+			cld					\n\
+		1:	lodsb					\n\
+			movb %%al,(%2)				\n\
+			loop 1b"				:
+		    "=S" (addr), "=c" (count)			:
+		    "r" (bsh + offset), "0" (addr), "1" (count)	:
+		    "%eax", "memory", "cc");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+	}
+}
+
+static __inline void
+bus_space_write_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh,
+			bus_size_t offset, const u_int16_t *addr, size_t count)
+{
+
+	if (tag == I386_BUS_SPACE_IO)
+		outsw(bsh + offset, addr, count);
+	else {
+#ifdef __GNUCLIKE_ASM
+		__asm __volatile("				\n\
+			cld					\n\
+		1:	lodsw					\n\
+			movw %%ax,(%2)				\n\
+			loop 1b"				:
+		    "=S" (addr), "=c" (count)			:
+		    "r" (bsh + offset), "0" (addr), "1" (count)	:
+		    "%eax", "memory", "cc");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+	}
+}
+
+static __inline void
+bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh,
+			bus_size_t offset, const u_int32_t *addr, size_t count)
+{
+
+	if (tag == I386_BUS_SPACE_IO)
+		outsl(bsh + offset, addr, count);
+	else {
+#ifdef __GNUCLIKE_ASM
+		__asm __volatile("				\n\
+			cld					\n\
+		1:	lodsl					\n\
+			movl %%eax,(%2)				\n\
+			loop 1b"				:
+		    "=S" (addr), "=c" (count)			:
+		    "r" (bsh + offset), "0" (addr), "1" (count)	:
+		    "%eax", "memory", "cc");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+	}
+}
+
+#if 0	/* Cause a link error for bus_space_write_multi_8 */
+#define	bus_space_write_multi_8(t, h, o, a, c)				\
+			!!! bus_space_write_multi_8 unimplemented !!!
+#endif
+
+/*
+ * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided
+ * to bus space described by tag/handle starting at `offset'.
+ */
+
+static __inline void bus_space_write_region_1(bus_space_tag_t tag,
+					      bus_space_handle_t bsh,
+					      bus_size_t offset,
+					      const u_int8_t *addr,
+					      size_t count);
+static __inline void bus_space_write_region_2(bus_space_tag_t tag,
+					      bus_space_handle_t bsh,
+					      bus_size_t offset,
+					      const u_int16_t *addr,
+					      size_t count);
+static __inline void bus_space_write_region_4(bus_space_tag_t tag,
+					      bus_space_handle_t bsh,
+					      bus_size_t offset,
+					      const u_int32_t *addr,
+					      size_t count);
+
+static __inline void
+bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t bsh,
+			 bus_size_t offset, const u_int8_t *addr, size_t count)
+{
+
+	if (tag == I386_BUS_SPACE_IO) {
+		int _port_ = bsh + offset;
+#ifdef __GNUCLIKE_ASM
+		__asm __volatile("				\n\
+			cld					\n\
+		1:	lodsb					\n\
+			outb %%al,%w0				\n\
+			incl %0					\n\
+			loop 1b"				:
+		    "=d" (_port_), "=S" (addr), "=c" (count)	:
+		    "0" (_port_), "1" (addr), "2" (count)	:
+		    "%eax", "memory", "cc");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+	} else {
+		int _port_ = bsh + offset;
+#ifdef __GNUCLIKE_ASM
+		__asm __volatile("				\n\
+			cld					\n\
+			repne					\n\
+			movsb"					:
+		    "=D" (_port_), "=S" (addr), "=c" (count)	:
+		    "0" (_port_), "1" (addr), "2" (count)	:
+		    "memory", "cc");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+	}
+}
+
+static __inline void
+bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t bsh,
+			 bus_size_t offset, const u_int16_t *addr, size_t count)
+{
+
+	if (tag == I386_BUS_SPACE_IO) {
+		int _port_ = bsh + offset;
+#ifdef __GNUCLIKE_ASM
+		__asm __volatile("				\n\
+			cld					\n\
+		1:	lodsw					\n\
+			outw %%ax,%w0				\n\
+			addl $2,%0				\n\
+			loop 1b"				:
+		    "=d" (_port_), "=S" (addr), "=c" (count)	:
+		    "0" (_port_), "1" (addr), "2" (count)	:
+		    "%eax", "memory", "cc");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+	} else {
+		int _port_ = bsh + offset;
+#ifdef __GNUCLIKE_ASM
+		__asm __volatile("				\n\
+			cld					\n\
+			repne					\n\
+			movsw"					:
+		    "=D" (_port_), "=S" (addr), "=c" (count)	:
+		    "0" (_port_), "1" (addr), "2" (count)	:
+		    "memory", "cc");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+	}
+}
+
+static __inline void
+bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t bsh,
+			 bus_size_t offset, const u_int32_t *addr, size_t count)
+{
+
+	if (tag == I386_BUS_SPACE_IO) {
+		int _port_ = bsh + offset;
+#ifdef __GNUCLIKE_ASM
+		__asm __volatile("				\n\
+			cld					\n\
+		1:	lodsl					\n\
+			outl %%eax,%w0				\n\
+			addl $4,%0				\n\
+			loop 1b"				:
+		    "=d" (_port_), "=S" (addr), "=c" (count)	:
+		    "0" (_port_), "1" (addr), "2" (count)	:
+		    "%eax", "memory", "cc");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+	} else {
+		int _port_ = bsh + offset;
+#ifdef __GNUCLIKE_ASM
+		__asm __volatile("				\n\
+			cld					\n\
+			repne					\n\
+			movsl"					:
+		    "=D" (_port_), "=S" (addr), "=c" (count)	:
+		    "0" (_port_), "1" (addr), "2" (count)	:
+		    "memory", "cc");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+	}
+}
+
+#if 0	/* Cause a link error for bus_space_write_region_8 */
+#define	bus_space_write_region_8					\
+			!!! bus_space_write_region_8 unimplemented !!!
+#endif
+
+/*
+ * Write the 1, 2, 4, or 8 byte value `val' to bus space described
+ * by tag/handle/offset `count' times.
+ */
+
+static __inline void 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);
+static __inline void 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);
+static __inline void 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);
+
+static __inline void
+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_space_handle_t addr = bsh + offset;
+
+	if (tag == I386_BUS_SPACE_IO)
+		while (count--)
+			outb(addr, value);
+	else
+		while (count--)
+			*(volatile u_int8_t *)(addr) = value;
+}
+
+static __inline void
+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_space_handle_t addr = bsh + offset;
+
+	if (tag == I386_BUS_SPACE_IO)
+		while (count--)
+			outw(addr, value);
+	else
+		while (count--)
+			*(volatile u_int16_t *)(addr) = value;
+}
+
+static __inline void
+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_space_handle_t addr = bsh + offset;
+
+	if (tag == I386_BUS_SPACE_IO)
+		while (count--)
+			outl(addr, value);
+	else
+		while (count--)
+			*(volatile u_int32_t *)(addr) = value;
+}
+
+#if 0	/* Cause a link error for bus_space_set_multi_8 */
+#define	bus_space_set_multi_8 !!! bus_space_set_multi_8 unimplemented !!!
+#endif
+
+/*
+ * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
+ * by tag/handle starting at `offset'.
+ */
+
+static __inline void 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);
+static __inline void 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);
+static __inline void 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);
+
+static __inline void
+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_space_handle_t addr = bsh + offset;
+
+	if (tag == I386_BUS_SPACE_IO)
+		for (; count != 0; count--, addr++)
+			outb(addr, value);
+	else
+		for (; count != 0; count--, addr++)
+			*(volatile u_int8_t *)(addr) = value;
+}
+
+static __inline void
+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_space_handle_t addr = bsh + offset;
+
+	if (tag == I386_BUS_SPACE_IO)
+		for (; count != 0; count--, addr += 2)
+			outw(addr, value);
+	else
+		for (; count != 0; count--, addr += 2)
+			*(volatile u_int16_t *)(addr) = value;
+}
+
+static __inline void
+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_space_handle_t addr = bsh + offset;
+
+	if (tag == I386_BUS_SPACE_IO)
+		for (; count != 0; count--, addr += 4)
+			outl(addr, value);
+	else
+		for (; count != 0; count--, addr += 4)
+			*(volatile u_int32_t *)(addr) = value;
+}
+
+#if 0	/* Cause a link error for bus_space_set_region_8 */
+#define	bus_space_set_region_8	!!! bus_space_set_region_8 unimplemented !!!
+#endif
+
+/*
+ * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
+ * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
+ */
+
+static __inline void bus_space_copy_region_1(bus_space_tag_t tag,
+					     bus_space_handle_t bsh1,
+					     bus_size_t off1,
+					     bus_space_handle_t bsh2,
+					     bus_size_t off2, size_t count);
+
+static __inline void bus_space_copy_region_2(bus_space_tag_t tag,
+					     bus_space_handle_t bsh1,
+					     bus_size_t off1,
+					     bus_space_handle_t bsh2,
+					     bus_size_t off2, size_t count);
+
+static __inline void bus_space_copy_region_4(bus_space_tag_t tag,
+					     bus_space_handle_t bsh1,
+					     bus_size_t off1,
+					     bus_space_handle_t bsh2,
+					     bus_size_t off2, size_t count);
+
+static __inline void
+bus_space_copy_region_1(bus_space_tag_t tag, bus_space_handle_t bsh1,
+			bus_size_t off1, bus_space_handle_t bsh2,
+			bus_size_t off2, size_t count)
+{
+	bus_space_handle_t addr1 = bsh1 + off1;
+	bus_space_handle_t addr2 = bsh2 + off2;
+
+	if (tag == I386_BUS_SPACE_IO) {
+		if (addr1 >= addr2) {
+			/* src after dest: copy forward */
+			for (; count != 0; count--, addr1++, addr2++)
+				outb(addr2, inb(addr1));
+		} else {
+			/* dest after src: copy backwards */
+			for (addr1 += (count - 1), addr2 += (count - 1);
+			    count != 0; count--, addr1--, addr2--)
+				outb(addr2, inb(addr1));
+		}
+	} else {
+		if (addr1 >= addr2) {
+			/* src after dest: copy forward */
+			for (; count != 0; count--, addr1++, addr2++)
+				*(volatile u_int8_t *)(addr2) =
+				    *(volatile u_int8_t *)(addr1);
+		} else {
+			/* dest after src: copy backwards */
+			for (addr1 += (count - 1), addr2 += (count - 1);
+			    count != 0; count--, addr1--, addr2--)
+				*(volatile u_int8_t *)(addr2) =
+				    *(volatile u_int8_t *)(addr1);
+		}
+	}
+}
+
+static __inline void
+bus_space_copy_region_2(bus_space_tag_t tag, bus_space_handle_t bsh1,
+			bus_size_t off1, bus_space_handle_t bsh2,
+			bus_size_t off2, size_t count)
+{
+	bus_space_handle_t addr1 = bsh1 + off1;
+	bus_space_handle_t addr2 = bsh2 + off2;
+
+	if (tag == I386_BUS_SPACE_IO) {
+		if (addr1 >= addr2) {
+			/* src after dest: copy forward */
+			for (; count != 0; count--, addr1 += 2, addr2 += 2)
+				outw(addr2, inw(addr1));
+		} else {
+			/* dest after src: copy backwards */
+			for (addr1 += 2 * (count - 1), addr2 += 2 * (count - 1);
+			    count != 0; count--, addr1 -= 2, addr2 -= 2)
+				outw(addr2, inw(addr1));
+		}
+	} else {
+		if (addr1 >= addr2) {
+			/* src after dest: copy forward */
+			for (; count != 0; count--, addr1 += 2, addr2 += 2)
+				*(volatile u_int16_t *)(addr2) =
+				    *(volatile u_int16_t *)(addr1);
+		} else {
+			/* dest after src: copy backwards */
+			for (addr1 += 2 * (count - 1), addr2 += 2 * (count - 1);
+			    count != 0; count--, addr1 -= 2, addr2 -= 2)
+				*(volatile u_int16_t *)(addr2) =
+				    *(volatile u_int16_t *)(addr1);
+		}
+	}
+}
+
+static __inline void
+bus_space_copy_region_4(bus_space_tag_t tag, bus_space_handle_t bsh1,
+			bus_size_t off1, bus_space_handle_t bsh2,
+			bus_size_t off2, size_t count)
+{
+	bus_space_handle_t addr1 = bsh1 + off1;
+	bus_space_handle_t addr2 = bsh2 + off2;
+
+	if (tag == I386_BUS_SPACE_IO) {
+		if (addr1 >= addr2) {
+			/* src after dest: copy forward */
+			for (; count != 0; count--, addr1 += 4, addr2 += 4)
+				outl(addr2, inl(addr1));
+		} else {
+			/* dest after src: copy backwards */
+			for (addr1 += 4 * (count - 1), addr2 += 4 * (count - 1);
+			    count != 0; count--, addr1 -= 4, addr2 -= 4)
+				outl(addr2, inl(addr1));
+		}
+	} else {
+		if (addr1 >= addr2) {
+			/* src after dest: copy forward */
+			for (; count != 0; count--, addr1 += 4, addr2 += 4)
+				*(volatile u_int32_t *)(addr2) =
+				    *(volatile u_int32_t *)(addr1);
+		} else {
+			/* dest after src: copy backwards */
+			for (addr1 += 4 * (count - 1), addr2 += 4 * (count - 1);
+			    count != 0; count--, addr1 -= 4, addr2 -= 4)
+				*(volatile u_int32_t *)(addr2) =
+				    *(volatile u_int32_t *)(addr1);
+		}
+	}
+}
+
+#if 0	/* Cause a link error for bus_space_copy_8 */
+#define	bus_space_copy_region_8	!!! bus_space_copy_region_8 unimplemented !!!
+#endif
+
+/*
+ * Bus read/write barrier methods.
+ *
+ *	void bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t bsh,
+ *			       bus_size_t offset, bus_size_t len, int flags);
+ *
+ *
+ * Note that BUS_SPACE_BARRIER_WRITE doesn't do anything other than
+ * prevent reordering by the compiler; all Intel x86 processors currently
+ * retire operations outside the CPU in program order.
+ */
+#define	BUS_SPACE_BARRIER_READ	0x01		/* force read barrier */
+#define	BUS_SPACE_BARRIER_WRITE	0x02		/* force write barrier */
+
+static __inline void
+bus_space_barrier(bus_space_tag_t tag __unused, bus_space_handle_t bsh __unused,
+		  bus_size_t offset __unused, bus_size_t len __unused, int flags)
+{
+#ifdef __GNUCLIKE_ASM
+	if (flags & BUS_SPACE_BARRIER_READ)
+		__asm __volatile("lock; addl $0,0(%%esp)" : : : "memory");
+	else
+		__asm __volatile("" : : : "memory");
+#else
+# ifndef lint
+#  error "no assembler code for your compiler"
+# endif
+#endif
+}
+
+#ifdef BUS_SPACE_NO_LEGACY
+#undef inb
+#undef outb
+#define inb(a) compiler_error
+#define inw(a) compiler_error
+#define inl(a) compiler_error
+#define outb(a, b) compiler_error
+#define outw(a, b) compiler_error
+#define outl(a, b) compiler_error
+#endif
+
+#ifndef __rtems__
+#include <machine/bus_dma.h>
+#endif
+
+/*
+ * Stream accesses are the same as normal accesses on i386/pc98; there are no
+ * supported bus systems with an endianess different from the host one.
+ */
+#define	bus_space_read_stream_1(t, h, o)	bus_space_read_1((t), (h), (o))
+#define	bus_space_read_stream_2(t, h, o)	bus_space_read_2((t), (h), (o))
+#define	bus_space_read_stream_4(t, h, o)	bus_space_read_4((t), (h), (o))
+
+#define	bus_space_read_multi_stream_1(t, h, o, a, c) \
+	bus_space_read_multi_1((t), (h), (o), (a), (c))
+#define	bus_space_read_multi_stream_2(t, h, o, a, c) \
+	bus_space_read_multi_2((t), (h), (o), (a), (c))
+#define	bus_space_read_multi_stream_4(t, h, o, a, c) \
+	bus_space_read_multi_4((t), (h), (o), (a), (c))
+
+#define	bus_space_write_stream_1(t, h, o, v) \
+	bus_space_write_1((t), (h), (o), (v))
+#define	bus_space_write_stream_2(t, h, o, v) \
+	bus_space_write_2((t), (h), (o), (v))
+#define	bus_space_write_stream_4(t, h, o, v) \
+	bus_space_write_4((t), (h), (o), (v))
+
+#define	bus_space_write_multi_stream_1(t, h, o, a, c) \
+	bus_space_write_multi_1((t), (h), (o), (a), (c))
+#define	bus_space_write_multi_stream_2(t, h, o, a, c) \
+	bus_space_write_multi_2((t), (h), (o), (a), (c))
+#define	bus_space_write_multi_stream_4(t, h, o, a, c) \
+	bus_space_write_multi_4((t), (h), (o), (a), (c))
+
+#define	bus_space_set_multi_stream_1(t, h, o, v, c) \
+	bus_space_set_multi_1((t), (h), (o), (v), (c))
+#define	bus_space_set_multi_stream_2(t, h, o, v, c) \
+	bus_space_set_multi_2((t), (h), (o), (v), (c))
+#define	bus_space_set_multi_stream_4(t, h, o, v, c) \
+	bus_space_set_multi_4((t), (h), (o), (v), (c))
+
+#define	bus_space_read_region_stream_1(t, h, o, a, c) \
+	bus_space_read_region_1((t), (h), (o), (a), (c))
+#define	bus_space_read_region_stream_2(t, h, o, a, c) \
+	bus_space_read_region_2((t), (h), (o), (a), (c))
+#define	bus_space_read_region_stream_4(t, h, o, a, c) \
+	bus_space_read_region_4((t), (h), (o), (a), (c))
+
+#define	bus_space_write_region_stream_1(t, h, o, a, c) \
+	bus_space_write_region_1((t), (h), (o), (a), (c))
+#define	bus_space_write_region_stream_2(t, h, o, a, c) \
+	bus_space_write_region_2((t), (h), (o), (a), (c))
+#define	bus_space_write_region_stream_4(t, h, o, a, c) \
+	bus_space_write_region_4((t), (h), (o), (a), (c))
+
+#define	bus_space_set_region_stream_1(t, h, o, v, c) \
+	bus_space_set_region_1((t), (h), (o), (v), (c))
+#define	bus_space_set_region_stream_2(t, h, o, v, c) \
+	bus_space_set_region_2((t), (h), (o), (v), (c))
+#define	bus_space_set_region_stream_4(t, h, o, v, c) \
+	bus_space_set_region_4((t), (h), (o), (v), (c))
+
+#define	bus_space_copy_region_stream_1(t, h1, o1, h2, o2, c) \
+	bus_space_copy_region_1((t), (h1), (o1), (h2), (o2), (c))
+#define	bus_space_copy_region_stream_2(t, h1, o1, h2, o2, c) \
+	bus_space_copy_region_2((t), (h1), (o1), (h2), (o2), (c))
+#define	bus_space_copy_region_stream_4(t, h1, o1, h2, o2, c) \
+	bus_space_copy_region_4((t), (h1), (o1), (h2), (o2), (c))
+
+#endif /* _RTEMS_BSD_MACHINE_BUS_I386_H_ */
diff --git a/rtemsbsd/freebsd/machine/bus_space-simple_memory.h b/rtemsbsd/freebsd/machine/bus_space-simple_memory.h
new file mode 100644
index 0000000..559294e
--- /dev/null
+++ b/rtemsbsd/freebsd/machine/bus_space-simple_memory.h
@@ -0,0 +1,684 @@
+/**
+ * @file
+ *
+ * @ingroup rtems_bsd_machine
+ *
+ * @brief TODO.
+ *
+ * File origin from FreeBSD 'sys/amd64/include/bus.h'.
+ */
+
+/*-
+ * Copyright (c) 2009, 2010 embedded brains GmbH.  All rights reserved.
+ *
+ *  embedded brains GmbH
+ *  Obere Lagerstr. 30
+ *  82178 Puchheim
+ *  Germany
+ *  <rtems at embedded-brains.de>
+ *
+ * Copyright (c) KATO Takenori, 1999.
+ *
+ * All rights reserved.  Unpublished rights reserved under the copyright
+ * laws of Japan.
+ *
+ * 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 as
+ *    the first lines of this file unmodified.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. 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 ``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 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.
+ */
+
+/*-
+ * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
+ * NASA Ames Research Center.
+ *
+ * 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.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the NetBSD
+ *	Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+ */
+
+/*-
+ * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
+ * Copyright (c) 1996 Christopher G. Demetriou.  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.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by Christopher G. Demetriou
+ *	for the NetBSD Project.
+ * 4. 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 ``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 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.
+ */
+
+#ifndef _RTEMS_BSD_MACHINE_BUS_SIMPLE_MEMORY_H_
+#define _RTEMS_BSD_MACHINE_BUS_SIMPLE_MEMORY_H_
+
+static __inline void
+bus_space_barrier(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
+    bus_size_t size, int flags)
+{
+	/* Do nothing */
+}
+
+/*
+ * Read 1 unit of data from bus space described by the tag, handle and ofs
+ * tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
+ * data is returned.
+ */
+static __inline uint8_t
+bus_space_read_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs)
+{
+	uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
+	return (*bsp);
+}
+
+static __inline uint16_t
+bus_space_read_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs)
+{
+	uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
+	return (*bsp);
+}
+
+static __inline uint32_t
+bus_space_read_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs)
+{
+	uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
+	return (*bsp);
+}
+
+static __inline uint64_t
+bus_space_read_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs)
+{
+	uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
+	return (*bsp);
+}
+
+
+/*
+ * Write 1 unit of data to bus space described by the tag, handle and ofs
+ * tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
+ * data is passed by value.
+ */
+static __inline void
+bus_space_write_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
+    uint8_t val)
+{
+	uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
+	*bsp = val;
+}
+
+static __inline void
+bus_space_write_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
+    uint16_t val)
+{
+	uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
+	*bsp = val;
+}
+
+static __inline void
+bus_space_write_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
+    uint32_t val)
+{
+	uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
+	*bsp = val;
+}
+
+static __inline void
+bus_space_write_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh, bus_size_t ofs,
+    uint64_t val)
+{
+	uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
+	*bsp = val;
+}
+
+
+/*
+ * Read count units of data from bus space described by the tag, handle and
+ * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
+ * data is returned in the buffer passed by reference.
+ */
+static __inline void
+bus_space_read_multi_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, uint8_t *bufp, bus_size_t count)
+{
+	uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
+	while (count-- > 0) {
+		*bufp++ = *bsp;
+	}
+}
+
+static __inline void
+bus_space_read_multi_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, uint16_t *bufp, bus_size_t count)
+{
+	uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
+	while (count-- > 0) {
+		*bufp++ = *bsp;
+	}
+}
+
+static __inline void
+bus_space_read_multi_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, uint32_t *bufp, bus_size_t count)
+{
+	uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
+	while (count-- > 0) {
+		*bufp++ = *bsp;
+	}
+}
+
+static __inline void
+bus_space_read_multi_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, uint64_t *bufp, bus_size_t count)
+{
+	uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
+	while (count-- > 0) {
+		*bufp++ = *bsp;
+	}
+}
+
+
+/*
+ * Write count units of data to bus space described by the tag, handle and
+ * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
+ * data is read from the buffer passed by reference.
+ */
+static __inline void
+bus_space_write_multi_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, const uint8_t *bufp, bus_size_t count)
+{
+	uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
+	while (count-- > 0) {
+		*bsp = *bufp++;
+	}
+}
+
+static __inline void
+bus_space_write_multi_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, const uint16_t *bufp, bus_size_t count)
+{
+	uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
+	while (count-- > 0) {
+		*bsp = *bufp++;
+	}
+}
+
+static __inline void
+bus_space_write_multi_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, const uint32_t *bufp, bus_size_t count)
+{
+	uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
+	while (count-- > 0) {
+		*bsp = *bufp++;
+	}
+}
+
+static __inline void
+bus_space_write_multi_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, const uint64_t *bufp, bus_size_t count)
+{
+	uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
+	while (count-- > 0) {
+		*bsp = *bufp++;
+	}
+}
+
+
+/*
+ * Read count units of data from bus space described by the tag, handle and
+ * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
+ * data is written to the buffer passed by reference and read from successive
+ * bus space addresses. Access is unordered.
+ */
+static __inline void
+bus_space_read_region_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, uint8_t *bufp, bus_size_t count)
+{
+	while (count-- > 0) {
+		uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
+		*bufp++ = *bsp;
+		ofs += 1;
+	}
+}
+
+static __inline void
+bus_space_read_region_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, uint16_t *bufp, bus_size_t count)
+{
+	while (count-- > 0) {
+		uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
+		*bufp++ = *bsp;
+		ofs += 2;
+	}
+}
+
+static __inline void
+bus_space_read_region_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, uint32_t *bufp, bus_size_t count)
+{
+	while (count-- > 0) {
+		uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
+		*bufp++ = *bsp;
+		ofs += 4;
+	}
+}
+
+static __inline void
+bus_space_read_region_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, uint64_t *bufp, bus_size_t count)
+{
+	while (count-- > 0) {
+		uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
+		*bufp++ = *bsp;
+		ofs += 8;
+	}
+}
+
+
+/*
+ * Write count units of data from bus space described by the tag, handle and
+ * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
+ * data is read from the buffer passed by reference and written to successive
+ * bus space addresses. Access is unordered.
+ */
+static __inline void
+bus_space_write_region_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, const uint8_t *bufp, bus_size_t count)
+{
+	while (count-- > 0) {
+		uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
+		*bsp = *bufp++;
+		ofs += 1;
+	}
+}
+
+static __inline void
+bus_space_write_region_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, const uint16_t *bufp, bus_size_t count)
+{
+	while (count-- > 0) {
+		uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
+		*bsp = *bufp++;
+		ofs += 2;
+	}
+}
+
+static __inline void
+bus_space_write_region_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, const uint32_t *bufp, bus_size_t count)
+{
+	while (count-- > 0) {
+		uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
+		*bsp = *bufp++;
+		ofs += 4;
+	}
+}
+
+static __inline void
+bus_space_write_region_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, const uint64_t *bufp, bus_size_t count)
+{
+	while (count-- > 0) {
+		uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
+		*bsp = *bufp++;
+		ofs += 8;
+	}
+}
+
+
+/*
+ * Write count units of data from bus space described by the tag, handle and
+ * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
+ * data is passed by value. Writes are unordered.
+ */
+static __inline void
+bus_space_set_multi_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, uint8_t val, bus_size_t count)
+{
+	uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
+	while (count-- > 0) {
+		*bsp = val;
+	}
+}
+
+static __inline void
+bus_space_set_multi_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, uint16_t val, bus_size_t count)
+{
+	uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
+	while (count-- > 0) {
+		*bsp = val;
+	}
+}
+
+static __inline void
+bus_space_set_multi_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, uint32_t val, bus_size_t count)
+{
+	uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
+	while (count-- > 0) {
+		*bsp = val;
+	}
+}
+
+static __inline void
+bus_space_set_multi_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, uint64_t val, bus_size_t count)
+{
+	uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
+	while (count-- > 0) {
+		*bsp = val;
+	}
+}
+
+
+/*
+ * Write count units of data from bus space described by the tag, handle and
+ * ofs tuple. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes. The
+ * data is passed by value and written to successive bus space addresses.
+ * Writes are unordered.
+ */
+static __inline void
+bus_space_set_region_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, uint8_t val, bus_size_t count)
+{
+	while (count-- > 0) {
+		uint8_t __volatile *bsp = (uint8_t __volatile *)(bsh + ofs);
+		*bsp = val;
+		ofs += 1;
+	}
+}
+
+static __inline void
+bus_space_set_region_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, uint16_t val, bus_size_t count)
+{
+	while (count-- > 0) {
+		uint16_t __volatile *bsp = (uint16_t __volatile *)(bsh + ofs);
+		*bsp = val;
+		ofs += 2;
+	}
+}
+
+static __inline void
+bus_space_set_region_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, uint32_t val, bus_size_t count)
+{
+	while (count-- > 0) {
+		uint32_t __volatile *bsp = (uint32_t __volatile *)(bsh + ofs);
+		*bsp = val;
+		ofs += 4;
+	}
+}
+
+static __inline void
+bus_space_set_region_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh,
+    bus_size_t ofs, uint64_t val, bus_size_t count)
+{
+	while (count-- > 0) {
+		uint64_t __volatile *bsp = (uint64_t __volatile *)(bsh + ofs);
+		*bsp = val;
+		ofs += 8;
+	}
+}
+
+
+/*
+ * Copy count units of data from bus space described by the tag and the first
+ * handle and ofs pair to bus space described by the tag and the second handle
+ * and ofs pair. A unit of data can be 1 byte, 2 bytes, 4 bytes or 8 bytes.
+ * The data is read from successive bus space addresses and also written to
+ * successive bus space addresses. Both reads and writes are unordered.
+ */
+static __inline void
+bus_space_copy_region_1(bus_space_tag_t bst __unused, bus_space_handle_t bsh1,
+    bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, bus_size_t count)
+{
+	bus_addr_t dst = bsh1 + ofs1;
+	bus_addr_t src = bsh2 + ofs2;
+	uint8_t __volatile *dstp = (uint8_t __volatile *) dst;
+	uint8_t __volatile *srcp = (uint8_t __volatile *) src;
+	if (dst > src) {
+		src += count - 1;
+		dst += count - 1;
+		while (count-- > 0) {
+			*dstp = *srcp;
+			src -= 1;
+			dst -= 1;
+		}
+	} else {
+		while (count-- > 0) {
+			*dstp = *srcp;
+			src += 1;
+			dst += 1;
+		}
+	}
+}
+
+static __inline void
+bus_space_copy_region_2(bus_space_tag_t bst __unused, bus_space_handle_t bsh1,
+    bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, bus_size_t count)
+{
+	bus_addr_t dst = bsh1 + ofs1;
+	bus_addr_t src = bsh2 + ofs2;
+	uint16_t __volatile *dstp = (uint16_t __volatile *) dst;
+	uint16_t __volatile *srcp = (uint16_t __volatile *) src;
+	if (dst > src) {
+		src += (count - 1) << 1;
+		dst += (count - 1) << 1;
+		while (count-- > 0) {
+			*dstp = *srcp;
+			src -= 2;
+			dst -= 2;
+		}
+	} else {
+		while (count-- > 0) {
+			*dstp = *srcp;
+			src += 2;
+			dst += 2;
+		}
+	}
+}
+
+static __inline void
+bus_space_copy_region_4(bus_space_tag_t bst __unused, bus_space_handle_t bsh1,
+    bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, bus_size_t count)
+{
+	bus_addr_t dst = bsh1 + ofs1;
+	bus_addr_t src = bsh2 + ofs2;
+	uint32_t __volatile *dstp = (uint32_t __volatile *) dst;
+	uint32_t __volatile *srcp = (uint32_t __volatile *) src;
+	if (dst > src) {
+		src += (count - 1) << 2;
+		dst += (count - 1) << 2;
+		while (count-- > 0) {
+			*dstp = *srcp;
+			src -= 4;
+			dst -= 4;
+		}
+	} else {
+		while (count-- > 0) {
+			*dstp = *srcp;
+			src += 4;
+			dst += 4;
+		}
+	}
+}
+
+static __inline void
+bus_space_copy_region_8(bus_space_tag_t bst __unused, bus_space_handle_t bsh1,
+    bus_size_t ofs1, bus_space_handle_t bsh2, bus_size_t ofs2, bus_size_t count)
+{
+	bus_addr_t dst = bsh1 + ofs1;
+	bus_addr_t src = bsh2 + ofs2;
+	uint64_t __volatile *dstp = (uint64_t __volatile *) dst;
+	uint64_t __volatile *srcp = (uint64_t __volatile *) src;
+	if (dst > src) {
+		src += (count - 1) << 3;
+		dst += (count - 1) << 3;
+		while (count-- > 0) {
+			*dstp = *srcp;
+			src -= 8;
+			dst -= 8;
+		}
+	} else {
+		while (count-- > 0) {
+			*dstp = *srcp;
+			src += 8;
+			dst += 8;
+		}
+	}
+}
+
+
+/*
+ * Stream accesses are the same as normal accesses on RTEMS; there are no
+ * supported bus systems with an endianess different from the host one.
+ */
+#define	bus_space_read_stream_1(t, h, o)	\
+	bus_space_read_1(t, h, o)
+#define	bus_space_read_stream_2(t, h, o)	\
+	bus_space_read_2(t, h, o)
+#define	bus_space_read_stream_4(t, h, o)	\
+	bus_space_read_4(t, h, o)
+#define	bus_space_read_stream_8(t, h, o)	\
+	bus_space_read_8(t, h, o)
+
+#define	bus_space_read_multi_stream_1(t, h, o, a, c)	\
+	bus_space_read_multi_1(t, h, o, a, c)
+#define	bus_space_read_multi_stream_2(t, h, o, a, c)	\
+	bus_space_read_multi_2(t, h, o, a, c)
+#define	bus_space_read_multi_stream_4(t, h, o, a, c)	\
+	bus_space_read_multi_4(t, h, o, a, c)
+#define	bus_space_read_multi_stream_8(t, h, o, a, c)	\
+	bus_space_read_multi_8(t, h, o, a, c)
+
+#define	bus_space_write_stream_1(t, h, o, v)	\
+	bus_space_write_1(t, h, o, v)
+#define	bus_space_write_stream_2(t, h, o, v)	\
+	bus_space_write_2(t, h, o, v)
+#define	bus_space_write_stream_4(t, h, o, v)	\
+	bus_space_write_4(t, h, o, v)
+#define	bus_space_write_stream_8(t, h, o, v)	\
+	bus_space_write_8(t, h, o, v)
+
+#define	bus_space_write_multi_stream_1(t, h, o, a, c)	\
+	bus_space_write_multi_1(t, h, o, a, c)
+#define	bus_space_write_multi_stream_2(t, h, o, a, c)	\
+	bus_space_write_multi_2(t, h, o, a, c)
+#define	bus_space_write_multi_stream_4(t, h, o, a, c)	\
+	bus_space_write_multi_4(t, h, o, a, c)
+#define	bus_space_write_multi_stream_8(t, h, o, a, c)	\
+	bus_space_write_multi_8(t, h, o, a, c)
+
+#define	bus_space_set_multi_stream_1(t, h, o, v, c)	\
+	bus_space_set_multi_1(t, h, o, v, c)
+#define	bus_space_set_multi_stream_2(t, h, o, v, c)	\
+	bus_space_set_multi_2(t, h, o, v, c)
+#define	bus_space_set_multi_stream_4(t, h, o, v, c)	\
+	bus_space_set_multi_4(t, h, o, v, c)
+#define	bus_space_set_multi_stream_8(t, h, o, v, c)	\
+	bus_space_set_multi_8(t, h, o, v, c)
+
+#define	bus_space_read_region_stream_1(t, h, o, a, c)	\
+	bus_space_read_region_1(t, h, o, a, c)
+#define	bus_space_read_region_stream_2(t, h, o, a, c)	\
+	bus_space_read_region_2(t, h, o, a, c)
+#define	bus_space_read_region_stream_4(t, h, o, a, c)	\
+	bus_space_read_region_4(t, h, o, a, c)
+#define	bus_space_read_region_stream_8(t, h, o, a, c)	\
+	bus_space_read_region_8(t, h, o, a, c)
+
+#define	bus_space_write_region_stream_1(t, h, o, a, c)	\
+	bus_space_write_region_1(t, h, o, a, c)
+#define	bus_space_write_region_stream_2(t, h, o, a, c)	\
+	bus_space_write_region_2(t, h, o, a, c)
+#define	bus_space_write_region_stream_4(t, h, o, a, c)	\
+	bus_space_write_region_4(t, h, o, a, c)
+#define	bus_space_write_region_stream_8(t, h, o, a, c)	\
+	bus_space_write_region_8(t, h, o, a, c)
+
+#define	bus_space_set_region_stream_1(t, h, o, v, c)	\
+	bus_space_set_region_1(t, h, o, v, c)
+#define	bus_space_set_region_stream_2(t, h, o, v, c)	\
+	bus_space_set_region_2(t, h, o, v, c)
+#define	bus_space_set_region_stream_4(t, h, o, v, c)	\
+	bus_space_set_region_4(t, h, o, v, c)
+#define	bus_space_set_region_stream_8(t, h, o, v, c)	\
+	bus_space_set_region_8(t, h, o, v, c)
+
+#define	bus_space_copy_region_stream_1(t, h1, o1, h2, o2, c)	\
+	bus_space_copy_region_1(t, h1, o1, h2, o2, c)
+#define	bus_space_copy_region_stream_2(t, h1, o1, h2, o2, c)	\
+	bus_space_copy_region_2(t, h1, o1, h2, o2, c)
+#define	bus_space_copy_region_stream_4(t, h1, o1, h2, o2, c)	\
+	bus_space_copy_region_4(t, h1, o1, h2, o2, c)
+#define	bus_space_copy_region_stream_8(t, h1, o1, h2, o2, c)	\
+	bus_space_copy_region_8(t, h1, o1, h2, o2, c)
+
+#endif /* _RTEMS_BSD_MACHINE_BUS_SIMPLE_MEMORY_H_ */
diff --git a/rtemsbsd/freebsd/machine/cpufunc.h b/rtemsbsd/freebsd/machine/cpufunc.h
deleted file mode 100644
index 0874499..0000000
--- a/rtemsbsd/freebsd/machine/cpufunc.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * @file
- *
- * @ingroup rtems_bsd_machine
- *
- * @brief TODO.
- */
-
-/*
- * Copyright (c) 2009, 2010 embedded brains GmbH.  All rights reserved.
- *
- *  embedded brains GmbH
- *  Obere Lagerstr. 30
- *  82178 Puchheim
- *  Germany
- *  <rtems at embedded-brains.de>
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.com/license/LICENSE.
- */
-
-#ifndef _RTEMS_BSD_MACHINE_CPUFUNC_H_
-#define _RTEMS_BSD_MACHINE_CPUFUNC_H_
-
-#ifndef _RTEMS_BSD_MACHINE_RTEMS_BSD_CONFIG_H_
-#error "the header file <freebsd/machine/rtems-bsd-config.h> must be included first"
-#endif
-
-#endif /* _RTEMS_BSD_MACHINE_CPUFUNC_H_ */




More information about the vc mailing list