diff options
author | Owain Ainsworth <oga@cvs.openbsd.org> | 2008-11-21 23:16:17 +0000 |
---|---|---|
committer | Owain Ainsworth <oga@cvs.openbsd.org> | 2008-11-21 23:16:17 +0000 |
commit | a9bbdeebd54ce9cf01f8ac012202ce5627632c5b (patch) | |
tree | a1e74cd0cf0fb5db130c951c7111c51165b17731 /sys/arch | |
parent | f4e9f2c0f36cb107451b28c75e70ca4caba00aa4 (diff) |
de-inline the bus_space_* functions in favour of real functions
This shaves 135.7kb from amd64 GENERIC.MP. An afternoons worth of
testing proved to art, toby and myself that this doesn't slow things
down. i386 will follow shortly.
ok weingart@
Diffstat (limited to 'sys/arch')
-rw-r--r-- | sys/arch/amd64/amd64/bus_space.c | 571 | ||||
-rw-r--r-- | sys/arch/amd64/include/bus.h | 614 |
2 files changed, 633 insertions, 552 deletions
diff --git a/sys/arch/amd64/amd64/bus_space.c b/sys/arch/amd64/amd64/bus_space.c index ea2f4844b2c..cdf735a7d4f 100644 --- a/sys/arch/amd64/amd64/bus_space.c +++ b/sys/arch/amd64/amd64/bus_space.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bus_space.c,v 1.9 2008/06/26 05:42:09 ray Exp $ */ +/* $OpenBSD: bus_space.c,v 1.10 2008/11/21 23:16:16 oga Exp $ */ /* $NetBSD: bus_space.c,v 1.2 2003/03/14 18:47:53 christos Exp $ */ /*- @@ -358,3 +358,572 @@ bus_space_mmap(bus_space_tag_t t, bus_addr_t addr, off_t off, int prot, int flag */ return (atop(addr + off)); } + +u_int8_t +bus_space_read_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) +{ + return (t == X86_BUS_SPACE_IO ? (inb(h + o)) : + (*(volatile u_int8_t *)(h + o))); +} + +u_int16_t +bus_space_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) +{ + return (t == X86_BUS_SPACE_IO ? (inw(h + o)) : + (*(volatile u_int16_t *)(h + o))); +} + +u_int32_t +bus_space_read_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) +{ + return (t == X86_BUS_SPACE_IO ? (inl(h + o)) : + (*(volatile u_int32_t *)(h + o))); +} + +void +bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, + u_int8_t *ptr, bus_size_t cnt) +{ + if ((t) == X86_BUS_SPACE_IO) { + insb(h + o, ptr, cnt); + } else { + void *dummy1; + int dummy2; + void *dummy3; + int __x; + __asm __volatile(" cld ;" + "1: movb (%2),%%al ;" + " stosb ;" + " loop 1b" : + "=D" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) : + "0" ((ptr)), "1" ((cnt)), "2" (h + o) : + "memory"); + } +} + +void +bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, + u_int16_t *ptr, bus_size_t cnt) +{ + if ((t) == X86_BUS_SPACE_IO) { + insw(h + o, ptr, cnt); + } else { + void *dummy1; + int dummy2; + void *dummy3; + int __x; + __asm __volatile(" cld ;" + "1: movw (%2),%%ax ;" + " stosw ;" + " loop 1b" : + "=D" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) : + "0" ((ptr)), "1" ((cnt)), "2" (h + o) : + "memory"); + } +} + +void +bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, + u_int32_t *ptr, bus_size_t cnt) +{ + if ((t) == X86_BUS_SPACE_IO) { + insl(h + o, ptr, cnt); + } else { + void *dummy1; + int dummy2; + void *dummy3; + int __x; + __asm __volatile(" cld ;" + "1: movl (%2),%%eax ;" + " stosl ;" + " loop 1b" : + "=D" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) : + "0" ((ptr)), "1" ((cnt)), "2" (h + o) : + "memory"); + } +} + +void +bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h, + bus_size_t o, u_int8_t *ptr, bus_size_t cnt) +{ + if ((t) == X86_BUS_SPACE_IO) { + int dummy1; + void *dummy2; + int dummy3; + int __x; + __asm __volatile(" cld ;" + "1: inb %w1,%%al ;" + " stosb ;" + " incl %1 ;" + " loop 1b" : + "=&a" (__x), "=d" (dummy1), "=D" (dummy2), + "=c" (dummy3) : + "1" (h + o), "2" (ptr), "3" (cnt) : + "memory"); + } else { + int dummy1; + void *dummy2; + int dummy3; + __asm __volatile(" cld ;" + " repne ;" + " movsb" : + "=S" (dummy1), "=D" (dummy2), "=c" (dummy3) : + "0" (h + o), "1" (ptr), "2" (cnt) : + "memory"); + } +} + +void +bus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h, + bus_size_t o, u_int16_t *ptr, bus_size_t cnt) +{ + if ((t) == X86_BUS_SPACE_IO) { + int dummy1; + void *dummy2; + int dummy3; + int __x; + __asm __volatile(" cld ;" + "1: inw %w1,%%ax ;" + " stosw ;" + " addl $2,%1 ;" + " loop 1b" : + "=&a" (__x), "=d" (dummy1), "=D" (dummy2), + "=c" (dummy3) : + "1" ((h) + (o)), "2" ((ptr)), "3" ((cnt)) : + "memory"); + } else { + int dummy1; + void *dummy2; + int dummy3; + __asm __volatile(" cld ;" + " repne ;" + " movsw" : + "=S" (dummy1), "=D" (dummy2), "=c" (dummy3) : + "0" (h + o), "1" (ptr), "2" (cnt) : + "memory"); + } +} + +void +bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h, + bus_size_t o, u_int32_t *ptr, bus_size_t cnt) +{ + if ((t) == X86_BUS_SPACE_IO) { + int dummy1; + void *dummy2; + int dummy3; + int __x; + __asm __volatile("cld ;" + "1: inl %w1,%%eax ;" + " stosl ;" + " addl $4,%1 ;" + " loop 1b" : + "=&a" (__x), "=d" (dummy1), "=D" (dummy2), + "=c" (dummy3) : + "1" (h + o), "2" (ptr), "3" (cnt) : + "memory"); + } else { + int dummy1; + void *dummy2; + int dummy3; + __asm __volatile("cld ;" + " repne ;" + " movsl" : + "=S" (dummy1), "=D" (dummy2), "=c" (dummy3) : + "0" (h + o), "1" (ptr), "2" (cnt) : + "memory"); + } +} +/* + * void bus_space_write_N(bus_space_tag_t tag, + * bus_space_handle_t bsh, bus_size_t offset, + * u_intN_t value); + * + * Write the 1, 2, 4, or 8 byte value `value' to bus space + * described by tag/handle/offset. + */ +void +bus_space_write_1(bus_space_tag_t t, bus_space_handle_t h, + bus_size_t o, u_int8_t v) +{ + if (t == X86_BUS_SPACE_IO) + outb(h + o, v); + else + ((void)(*(volatile u_int8_t *)(h + o) = v)); +} + +void +bus_space_write_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, + u_int16_t v) +{ + if ((t) == X86_BUS_SPACE_IO) + outw(h + o, v); + else + ((void)(*(volatile u_int16_t *)(h + o) = v)); +} + +void +bus_space_write_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, + u_int32_t v) +{ + if ((t) == X86_BUS_SPACE_IO) + outl(h + o, v); + else + ((void)(*(volatile u_int32_t *)(h + o) = v)); +} + +void +bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h, + bus_size_t o, const u_int8_t *ptr, bus_size_t cnt) +{ + if ((t) == X86_BUS_SPACE_IO) { + outsb(h + o, ptr, cnt); + } else { + void *dummy1; + int dummy2; + void *dummy3; + int __x; + __asm __volatile("cld ;" + "1: lodsb ;" + " movb %%al,(%2) ;" + " loop 1b" : + "=S" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) : + "0" (ptr), "1" (cnt), "2" (h + o)); + } +} + +void +bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h, + bus_size_t o, const u_int16_t *ptr, bus_size_t cnt) +{ + if ((t) == X86_BUS_SPACE_IO) { + outsw(h + o, ptr, cnt); + } else { + void *dummy1; + int dummy2; + void *dummy3; + int __x; + __asm __volatile("cld ;" + "1: lodsw ;" + " movw %%ax,(%2) ;" + " loop 1b" : + "=S" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) : + "0" (ptr), "1" (cnt), "2" (h + o)); + } +} + +void +bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h, + bus_size_t o, const u_int32_t *ptr, bus_size_t cnt) +{ + if ((t) == X86_BUS_SPACE_IO) { + outsl(h + o, ptr, cnt); + } else { + void *dummy1; + int dummy2; + void *dummy3; + int __x; + __asm __volatile("cld ;" + "1: lodsl ;" + " movl %%eax,(%2) ;" + " loop 1b" : + "=S" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) : + "0" (ptr), "1" (cnt), "2" (h + o)); + } +} + +void +bus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h, + bus_size_t o, const u_int8_t *ptr, bus_size_t cnt) +{ + if ((t) == X86_BUS_SPACE_IO) { + int dummy1; + void *dummy2; + int dummy3; + int __x; + __asm __volatile("cld ;" + "1: lodsb ;" + " outb %%al,%w1 ;" + " incl %1 ;" + " loop 1b" : + "=&a" (__x), "=d" (dummy1), "=S" (dummy2), + "=c" (dummy3) : + "1" (h + o), "2" (ptr), "3" (cnt) : + "memory"); + } else { + int dummy1; + void *dummy2; + int dummy3; + __asm __volatile("cld ;" + " repne ;" + " movsb" : + "=D" (dummy1), "=S" (dummy2), "=c" (dummy3) : + "0" (h + o), "1" (ptr), "2" (cnt) : + "memory"); + } +} + +void +bus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h, + bus_size_t o, const u_int16_t *ptr, bus_size_t cnt) +{ + if ((t) == X86_BUS_SPACE_IO) { + int dummy1; + void *dummy2; + int dummy3; + int __x; + __asm __volatile("cld ;" + "1: lodsw ;" + " outw %%ax,%w1 ;" + " addl $2,%1 ;" + " loop 1b" : + "=&a" (__x), "=d" (dummy1), "=S" (dummy2), + "=c" (dummy3) : + "1" (h + o), "2" (ptr), "3" (cnt) : + "memory"); + } else { + int dummy1; + void *dummy2; + int dummy3; + __asm __volatile("cld ;" + " repne ;" + " movsw" : + "=D" (dummy1), "=S" (dummy2), "=c" (dummy3) : + "0" (h + o), "1" (ptr), "2" (cnt) : + "memory"); + } +} + +void +bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h, + bus_size_t o, const u_int32_t *ptr, bus_size_t cnt) +{ + if ((t) == X86_BUS_SPACE_IO) { + int dummy1; + void *dummy2; + int dummy3; + int __x; + __asm __volatile(" cld ;" + "1: lodsl ;" + " outl %%eax,%w1 ;" + " addl $4,%1 ;" + " loop 1b" : + "=&a" (__x), "=d" (dummy1), "=S" (dummy2), + "=c" (dummy3) : + "1" (h + o), "2" (ptr), "3" (cnt) : + "memory"); + } else { + int dummy1; + void *dummy2; + int dummy3; + __asm __volatile("cld ;" + " repne ;" + " movsl" : + "=D" (dummy1), "=S" (dummy2), "=c" (dummy3) : + "0" (h + o), "1" (ptr), "2" (cnt) : + "memory"); + } +} + +void +bus_space_set_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, + u_int8_t v, size_t c) +{ + bus_addr_t addr = h + o; + + if (t == X86_BUS_SPACE_IO) + while (c--) + outb(addr, v); + else + while (c--) + *(volatile u_int8_t *)(addr) = v; +} + +void +bus_space_set_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, + u_int16_t v, size_t c) +{ + bus_addr_t addr = h + o; + + if (t == X86_BUS_SPACE_IO) + while (c--) + outw(addr, v); + else + while (c--) + *(volatile u_int16_t *)(addr) = v; +} + +void +bus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, + u_int32_t v, size_t c) +{ + bus_addr_t addr = h + o; + + if (t == X86_BUS_SPACE_IO) + while (c--) + outl(addr, v); + else + while (c--) + *(volatile u_int32_t *)(addr) = v; +} + +void +bus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, + u_int8_t v, size_t c) +{ + bus_addr_t addr = h + o; + + if (t == X86_BUS_SPACE_IO) + for (; c != 0; c--, addr++) + outb(addr, v); + else + for (; c != 0; c--, addr++) + *(volatile u_int8_t *)(addr) = v; +} + +void +bus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, + u_int16_t v, size_t c) +{ + bus_addr_t addr = h + o; + + if (t == X86_BUS_SPACE_IO) + for (; c != 0; c--, addr += 2) + outw(addr, v); + else + for (; c != 0; c--, addr += 2) + *(volatile u_int16_t *)(addr) = v; +} + +void +bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, + u_int32_t v, size_t c) +{ + bus_addr_t addr = h + o; + + if (t == X86_BUS_SPACE_IO) + for (; c != 0; c--, addr += 4) + outl(addr, v); + else + for (; c != 0; c--, addr += 4) + *(volatile u_int32_t *)(addr) = v; +} + +void +bus_space_copy_region_1(bus_space_tag_t t, + bus_space_handle_t h1, bus_size_t o1, + bus_space_handle_t h2, bus_size_t o2, size_t c) +{ + bus_addr_t addr1 = h1 + o1; + bus_addr_t addr2 = h2 + o2; + + if (t == X86_BUS_SPACE_IO) { + if (addr1 >= addr2) { + /* src after dest: copy forward */ + for (; c != 0; c--, addr1++, addr2++) + outb(addr2, inb(addr1)); + } else { + /* dest after src: copy backwards */ + for (addr1 += (c - 1), addr2 += (c - 1); + c != 0; c--, addr1--, addr2--) + outb(addr2, inb(addr1)); + } + } else { + if (addr1 >= addr2) { + /* src after dest: copy forward */ + for (; c != 0; c--, addr1++, addr2++) + *(volatile u_int8_t *)(addr2) = + *(volatile u_int8_t *)(addr1); + } else { + /* dest after src: copy backwards */ + for (addr1 += (c - 1), addr2 += (c - 1); + c != 0; c--, addr1--, addr2--) + *(volatile u_int8_t *)(addr2) = + *(volatile u_int8_t *)(addr1); + } + } +} + +void +bus_space_copy_region_2(bus_space_tag_t t, + bus_space_handle_t h1, bus_size_t o1, + bus_space_handle_t h2, bus_size_t o2, size_t c) +{ + bus_addr_t addr1 = h1 + o1; + bus_addr_t addr2 = h2 + o2; + + if (t == X86_BUS_SPACE_IO) { + if (addr1 >= addr2) { + /* src after dest: copy forward */ + for (; c != 0; c--, addr1 += 2, addr2 += 2) + outw(addr2, inw(addr1)); + } else { + /* dest after src: copy backwards */ + for (addr1 += 2 * (c - 1), addr2 += 2 * (c - 1); + c != 0; c--, addr1 -= 2, addr2 -= 2) + outw(addr2, inw(addr1)); + } + } else { + if (addr1 >= addr2) { + /* src after dest: copy forward */ + for (; c != 0; c--, addr1 += 2, addr2 += 2) + *(volatile u_int16_t *)(addr2) = + *(volatile u_int16_t *)(addr1); + } else { + /* dest after src: copy backwards */ + for (addr1 += 2 * (c - 1), addr2 += 2 * (c - 1); + c != 0; c--, addr1 -= 2, addr2 -= 2) + *(volatile u_int16_t *)(addr2) = + *(volatile u_int16_t *)(addr1); + } + } +} + +void +bus_space_copy_region_4(bus_space_tag_t t, + bus_space_handle_t h1, bus_size_t o1, + bus_space_handle_t h2, bus_size_t o2, size_t c) +{ + bus_addr_t addr1 = h1 + o1; + bus_addr_t addr2 = h2 + o2; + + if (t == X86_BUS_SPACE_IO) { + if (addr1 >= addr2) { + /* src after dest: copy forward */ + for (; c != 0; c--, addr1 += 4, addr2 += 4) + outl(addr2, inl(addr1)); + } else { + /* dest after src: copy backwards */ + for (addr1 += 4 * (c - 1), addr2 += 4 * (c - 1); + c != 0; c--, addr1 -= 4, addr2 -= 4) + outl(addr2, inl(addr1)); + } + } else { + if (addr1 >= addr2) { + /* src after dest: copy forward */ + for (; c != 0; c--, addr1 += 4, addr2 += 4) + *(volatile u_int32_t *)(addr2) = + *(volatile u_int32_t *)(addr1); + } else { + /* dest after src: copy backwards */ + for (addr1 += 4 * (c - 1), addr2 += 4 * (c - 1); + c != 0; c--, addr1 -= 4, addr2 -= 4) + *(volatile u_int32_t *)(addr2) = + *(volatile u_int32_t *)(addr1); + } + } +} + +void +bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t bsh, + bus_size_t offset, bus_size_t len, int flags) +{ + if (flags == (BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE)) + __asm __volatile("mfence"); + else if (flags == BUS_SPACE_BARRIER_WRITE) + __asm __volatile("sfence"); + else + __asm __volatile("lfence"); +} + diff --git a/sys/arch/amd64/include/bus.h b/sys/arch/amd64/include/bus.h index f83050835ea..d566a285691 100644 --- a/sys/arch/amd64/include/bus.h +++ b/sys/arch/amd64/include/bus.h @@ -1,4 +1,4 @@ -/* $OpenBSD: bus.h,v 1.10 2008/06/26 05:42:09 ray Exp $ */ +/* $OpenBSD: bus.h,v 1.11 2008/11/21 23:16:16 oga Exp $ */ /* $NetBSD: bus.h,v 1.6 1996/11/10 03:19:25 thorpej Exp $ */ /*- @@ -133,18 +133,14 @@ int bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh, * Read a 1, 2, 4, or 8 byte quantity from bus space * described by tag/handle/offset. */ +u_int8_t bus_space_read_1(bus_space_tag_t, bus_space_handle_t, + bus_size_t); -#define bus_space_read_1(t, h, o) \ - ((t) == X86_BUS_SPACE_IO ? (inb((h) + (o))) : \ - (*(volatile u_int8_t *)((h) + (o)))) +u_int16_t bus_space_read_2(bus_space_tag_t, bus_space_handle_t, + bus_size_t); -#define bus_space_read_2(t, h, o) \ - ((t) == X86_BUS_SPACE_IO ? (inw((h) + (o))) : \ - (*(volatile u_int16_t *)((h) + (o)))) - -#define bus_space_read_4(t, h, o) \ - ((t) == X86_BUS_SPACE_IO ? (inl((h) + (o))) : \ - (*(volatile u_int32_t *)((h) + (o)))) +u_int32_t bus_space_read_4(bus_space_tag_t, bus_space_handle_t, + bus_size_t); #if 0 /* Cause a link error for bus_space_read_8 */ #define bus_space_read_8(t, h, o) !!! bus_space_read_8 unimplemented !!! @@ -159,65 +155,14 @@ int bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh, * described by tag/handle/offset and copy into buffer provided. */ -#define bus_space_read_multi_1(t, h, o, ptr, cnt) \ -do { \ - if ((t) == X86_BUS_SPACE_IO) { \ - insb((h) + (o), (ptr), (cnt)); \ - } else { \ - void *dummy1; \ - int dummy2; \ - void *dummy3; \ - int __x; \ - __asm __volatile(" \ - cld ; \ - 1: movb (%2),%%al ; \ - stosb ; \ - loop 1b" : \ - "=D" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) : \ - "0" ((ptr)), "1" ((cnt)), "2" ((h) + (o)) : \ - "memory"); \ - } \ -} while (/* CONSTCOND */ 0) - -#define bus_space_read_multi_2(t, h, o, ptr, cnt) \ -do { \ - if ((t) == X86_BUS_SPACE_IO) { \ - insw((h) + (o), (ptr), (cnt)); \ - } else { \ - void *dummy1; \ - int dummy2; \ - void *dummy3; \ - int __x; \ - __asm __volatile(" \ - cld ; \ - 1: movw (%2),%%ax ; \ - stosw ; \ - loop 1b" : \ - "=D" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) : \ - "0" ((ptr)), "1" ((cnt)), "2" ((h) + (o)) : \ - "memory"); \ - } \ -} while (/* CONSTCOND */ 0) - -#define bus_space_read_multi_4(t, h, o, ptr, cnt) \ -do { \ - if ((t) == X86_BUS_SPACE_IO) { \ - insl((h) + (o), (ptr), (cnt)); \ - } else { \ - void *dummy1; \ - int dummy2; \ - void *dummy3; \ - int __x; \ - __asm __volatile(" \ - cld ; \ - 1: movl (%2),%%eax ; \ - stosl ; \ - loop 1b" : \ - "=D" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) : \ - "0" ((ptr)), "1" ((cnt)), "2" ((h) + (o)) : \ - "memory"); \ - } \ -} while (/* CONSTCOND */ 0) +void bus_space_read_multi_1(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int8_t *, bus_size_t); + +void bus_space_read_multi_2(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int16_t *, bus_size_t); + +void bus_space_read_multi_4(bus_space_tag_t, bus_space_handle_t, bus_size_t, + u_int32_t *, bus_size_t); #if 0 /* Cause a link error for bus_space_read_multi_8 */ #define bus_space_read_multi_8 !!! bus_space_read_multi_8 unimplemented !!! @@ -254,98 +199,13 @@ do { \ * buffer provided. */ -#define bus_space_read_region_1(t, h, o, ptr, cnt) \ -do { \ - if ((t) == X86_BUS_SPACE_IO) { \ - int dummy1; \ - void *dummy2; \ - int dummy3; \ - int __x; \ - __asm __volatile(" \ - cld ; \ - 1: inb %w1,%%al ; \ - stosb ; \ - incl %1 ; \ - loop 1b" : \ - "=&a" (__x), "=d" (dummy1), "=D" (dummy2), \ - "=c" (dummy3) : \ - "1" ((h) + (o)), "2" ((ptr)), "3" ((cnt)) : \ - "memory"); \ - } else { \ - int dummy1; \ - void *dummy2; \ - int dummy3; \ - __asm __volatile(" \ - cld ; \ - repne ; \ - movsb" : \ - "=S" (dummy1), "=D" (dummy2), "=c" (dummy3) : \ - "0" ((h) + (o)), "1" ((ptr)), "2" ((cnt)) : \ - "memory"); \ - } \ -} while (/* CONSTCOND */ 0) - -#define bus_space_read_region_2(t, h, o, ptr, cnt) \ -do { \ - if ((t) == X86_BUS_SPACE_IO) { \ - int dummy1; \ - void *dummy2; \ - int dummy3; \ - int __x; \ - __asm __volatile(" \ - cld ; \ - 1: inw %w1,%%ax ; \ - stosw ; \ - addl $2,%1 ; \ - loop 1b" : \ - "=&a" (__x), "=d" (dummy1), "=D" (dummy2), \ - "=c" (dummy3) : \ - "1" ((h) + (o)), "2" ((ptr)), "3" ((cnt)) : \ - "memory"); \ - } else { \ - int dummy1; \ - void *dummy2; \ - int dummy3; \ - __asm __volatile(" \ - cld ; \ - repne ; \ - movsw" : \ - "=S" (dummy1), "=D" (dummy2), "=c" (dummy3) : \ - "0" ((h) + (o)), "1" ((ptr)), "2" ((cnt)) : \ - "memory"); \ - } \ -} while (/* CONSTCOND */ 0) - -#define bus_space_read_region_4(t, h, o, ptr, cnt) \ -do { \ - if ((t) == X86_BUS_SPACE_IO) { \ - int dummy1; \ - void *dummy2; \ - int dummy3; \ - int __x; \ - __asm __volatile(" \ - cld ; \ - 1: inl %w1,%%eax ; \ - stosl ; \ - addl $4,%1 ; \ - loop 1b" : \ - "=&a" (__x), "=d" (dummy1), "=D" (dummy2), \ - "=c" (dummy3) : \ - "1" ((h) + (o)), "2" ((ptr)), "3" ((cnt)) : \ - "memory"); \ - } else { \ - int dummy1; \ - void *dummy2; \ - int dummy3; \ - __asm __volatile(" \ - cld ; \ - repne ; \ - movsl" : \ - "=S" (dummy1), "=D" (dummy2), "=c" (dummy3) : \ - "0" ((h) + (o)), "1" ((ptr)), "2" ((cnt)) : \ - "memory"); \ - } \ -} while (/* CONSTCOND */ 0) +void bus_space_read_region_1(bus_space_tag_t, bus_space_handle_t, + bus_size_t, u_int8_t *, bus_size_t); + +void bus_space_read_region_2(bus_space_tag_t, bus_space_handle_t, + bus_size_t, u_int16_t *, bus_size_t); +void bus_space_read_region_4(bus_space_tag_t, bus_space_handle_t, + bus_size_t, u_int32_t *, bus_size_t); #define bus_space_read_region_stream_1 bus_space_read_region_1 #if 0 /* Cause a link error for bus_space_read_region_8 */ @@ -383,26 +243,14 @@ do { \ * described by tag/handle/offset. */ -#define bus_space_write_1(t, h, o, v) do { \ - if ((t) == X86_BUS_SPACE_IO) \ - outb((h) + (o), (v)); \ - else \ - ((void)(*(volatile u_int8_t *)((h) + (o)) = (v))); \ -} while (0) - -#define bus_space_write_2(t, h, o, v) do { \ - if ((t) == X86_BUS_SPACE_IO) \ - outw((h) + (o), (v)); \ - else \ - ((void)(*(volatile u_int16_t *)((h) + (o)) = (v))); \ -} while (0) - -#define bus_space_write_4(t, h, o, v) do { \ - if ((t) == X86_BUS_SPACE_IO) \ - outl((h) + (o), (v)); \ - else \ - ((void)(*(volatile u_int32_t *)((h) + (o)) = (v))); \ -} while (0) +void bus_space_write_1(bus_space_tag_t, bus_space_handle_t, + bus_size_t, u_int8_t); + +void bus_space_write_2(bus_space_tag_t, bus_space_handle_t, + bus_size_t, u_int16_t); + +void bus_space_write_4(bus_space_tag_t, bus_space_handle_t, + bus_size_t, u_int32_t); #if 0 /* Cause a link error for bus_space_write_8 */ #define bus_space_write_8 !!! bus_space_write_8 not implemented !!! @@ -417,62 +265,12 @@ do { \ * provided to bus space described by tag/handle/offset. */ -#define bus_space_write_multi_1(t, h, o, ptr, cnt) \ -do { \ - if ((t) == X86_BUS_SPACE_IO) { \ - outsb((h) + (o), (ptr), (cnt)); \ - } else { \ - void *dummy1; \ - int dummy2; \ - void *dummy3; \ - int __x; \ - __asm __volatile(" \ - cld ; \ - 1: lodsb ; \ - movb %%al,(%2) ; \ - loop 1b" : \ - "=S" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) : \ - "0" ((ptr)), "1" ((cnt)), "2" ((h) + (o))); \ - } \ -} while (/* CONSTCOND */ 0) - -#define bus_space_write_multi_2(t, h, o, ptr, cnt) \ -do { \ - if ((t) == X86_BUS_SPACE_IO) { \ - outsw((h) + (o), (ptr), (cnt)); \ - } else { \ - void *dummy1; \ - int dummy2; \ - void *dummy3; \ - int __x; \ - __asm __volatile(" \ - cld ; \ - 1: lodsw ; \ - movw %%ax,(%2) ; \ - loop 1b" : \ - "=S" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) : \ - "0" ((ptr)), "1" ((cnt)), "2" ((h) + (o))); \ - } \ -} while (/* CONSTCOND */ 0) - -#define bus_space_write_multi_4(t, h, o, ptr, cnt) \ -do { \ - if ((t) == X86_BUS_SPACE_IO) { \ - outsl((h) + (o), (ptr), (cnt)); \ - } else { \ - void *dummy1; \ - int dummy2; \ - void *dummy3; \ - int __x; \ - __asm __volatile(" \ - cld ; \ - 1: lodsl ; \ - movl %%eax,(%2) ; \ - loop 1b" : \ - "=S" (dummy1), "=c" (dummy2), "=r" (dummy3), "=&a" (__x) : \ - "0" ((ptr)), "1" ((cnt)), "2" ((h) + (o))); \ - } \ -} while (/* CONSTCOND */ 0) +void bus_space_write_multi_1(bus_space_tag_t, bus_space_handle_t, + bus_size_t, const u_int8_t *, bus_size_t); +void bus_space_write_multi_2(bus_space_tag_t, bus_space_handle_t, + bus_size_t, const u_int16_t *, bus_size_t); +void bus_space_write_multi_4(bus_space_tag_t, bus_space_handle_t, + bus_size_t, const u_int32_t *, bus_size_t); #if 0 /* Cause a link error for bus_space_write_multi_8 */ #define bus_space_write_multi_8(t, h, o, a, c) \ @@ -509,98 +307,13 @@ do { \ * to bus space described by tag/handle starting at `offset'. */ -#define bus_space_write_region_1(t, h, o, ptr, cnt) \ -do { \ - if ((t) == X86_BUS_SPACE_IO) { \ - int dummy1; \ - void *dummy2; \ - int dummy3; \ - int __x; \ - __asm __volatile(" \ - cld ; \ - 1: lodsb ; \ - outb %%al,%w1 ; \ - incl %1 ; \ - loop 1b" : \ - "=&a" (__x), "=d" (dummy1), "=S" (dummy2), \ - "=c" (dummy3) : \ - "1" ((h) + (o)), "2" ((ptr)), "3" ((cnt)) : \ - "memory"); \ - } else { \ - int dummy1; \ - void *dummy2; \ - int dummy3; \ - __asm __volatile(" \ - cld ; \ - repne ; \ - movsb" : \ - "=D" (dummy1), "=S" (dummy2), "=c" (dummy3) : \ - "0" ((h) + (o)), "1" ((ptr)), "2" ((cnt)) : \ - "memory"); \ - } \ -} while (/* CONSTCOND */ 0) - -#define bus_space_write_region_2(t, h, o, ptr, cnt) \ -do { \ - if ((t) == X86_BUS_SPACE_IO) { \ - int dummy1; \ - void *dummy2; \ - int dummy3; \ - int __x; \ - __asm __volatile(" \ - cld ; \ - 1: lodsw ; \ - outw %%ax,%w1 ; \ - addl $2,%1 ; \ - loop 1b" : \ - "=&a" (__x), "=d" (dummy1), "=S" (dummy2), \ - "=c" (dummy3) : \ - "1" ((h) + (o)), "2" ((ptr)), "3" ((cnt)) : \ - "memory"); \ - } else { \ - int dummy1; \ - void *dummy2; \ - int dummy3; \ - __asm __volatile(" \ - cld ; \ - repne ; \ - movsw" : \ - "=D" (dummy1), "=S" (dummy2), "=c" (dummy3) : \ - "0" ((h) + (o)), "1" ((ptr)), "2" ((cnt)) : \ - "memory"); \ - } \ -} while (/* CONSTCOND */ 0) - -#define bus_space_write_region_4(t, h, o, ptr, cnt) \ -do { \ - if ((t) == X86_BUS_SPACE_IO) { \ - int dummy1; \ - void *dummy2; \ - int dummy3; \ - int __x; \ - __asm __volatile(" \ - cld ; \ - 1: lodsl ; \ - outl %%eax,%w1 ; \ - addl $4,%1 ; \ - loop 1b" : \ - "=&a" (__x), "=d" (dummy1), "=S" (dummy2), \ - "=c" (dummy3) : \ - "1" ((h) + (o)), "2" ((ptr)), "3" ((cnt)) : \ - "memory"); \ - } else { \ - int dummy1; \ - void *dummy2; \ - int dummy3; \ - __asm __volatile(" \ - cld ; \ - repne ; \ - movsl" : \ - "=D" (dummy1), "=S" (dummy2), "=c" (dummy3) : \ - "0" ((h) + (o)), "1" ((ptr)), "2" ((cnt)) : \ - "memory"); \ - } \ -} while (/* CONSTCOND */ 0) +void bus_space_write_region_1(bus_space_tag_t, bus_space_handle_t, + bus_size_t, const u_int8_t *, bus_size_t); +void bus_space_write_region_2(bus_space_tag_t, bus_space_handle_t, + bus_size_t, const u_int16_t *, bus_size_t); +void bus_space_write_region_4(bus_space_tag_t, bus_space_handle_t, + bus_size_t, const u_int32_t *, bus_size_t); + #if 0 /* Cause a link error for bus_space_write_region_8 */ #define bus_space_write_region_8 \ @@ -638,54 +351,12 @@ do { \ * by tag/handle/offset `count' times. */ -static __inline void bus_space_set_multi_1(bus_space_tag_t, - bus_space_handle_t, bus_size_t, u_int8_t, size_t); -static __inline void bus_space_set_multi_2(bus_space_tag_t, - bus_space_handle_t, bus_size_t, u_int16_t, size_t); -static __inline void bus_space_set_multi_4(bus_space_tag_t, - bus_space_handle_t, bus_size_t, u_int32_t, size_t); - -static __inline void -bus_space_set_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - u_int8_t v, size_t c) -{ - bus_addr_t addr = h + o; - - if (t == X86_BUS_SPACE_IO) - while (c--) - outb(addr, v); - else - while (c--) - *(volatile u_int8_t *)(addr) = v; -} - -static __inline void -bus_space_set_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - u_int16_t v, size_t c) -{ - bus_addr_t addr = h + o; - - if (t == X86_BUS_SPACE_IO) - while (c--) - outw(addr, v); - else - while (c--) - *(volatile u_int16_t *)(addr) = v; -} - -static __inline void -bus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - u_int32_t v, size_t c) -{ - bus_addr_t addr = h + o; - - if (t == X86_BUS_SPACE_IO) - while (c--) - outl(addr, v); - else - while (c--) - *(volatile u_int32_t *)(addr) = v; -} +void bus_space_set_multi_1(bus_space_tag_t, bus_space_handle_t, + bus_size_t, u_int8_t, size_t); +void bus_space_set_multi_2(bus_space_tag_t, bus_space_handle_t, + bus_size_t, u_int16_t, size_t); +void bus_space_set_multi_4(bus_space_tag_t, bus_space_handle_t, + bus_size_t, u_int32_t, size_t); #if 0 /* Cause a link error for bus_space_set_multi_8 */ #define bus_space_set_multi_8 \ @@ -701,54 +372,12 @@ bus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, * by tag/handle starting at `offset'. */ -static __inline void bus_space_set_region_1(bus_space_tag_t, - bus_space_handle_t, bus_size_t, u_int8_t, size_t); -static __inline void bus_space_set_region_2(bus_space_tag_t, - bus_space_handle_t, bus_size_t, u_int16_t, size_t); -static __inline void bus_space_set_region_4(bus_space_tag_t, - bus_space_handle_t, bus_size_t, u_int32_t, size_t); - -static __inline void -bus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - u_int8_t v, size_t c) -{ - bus_addr_t addr = h + o; - - if (t == X86_BUS_SPACE_IO) - for (; c != 0; c--, addr++) - outb(addr, v); - else - for (; c != 0; c--, addr++) - *(volatile u_int8_t *)(addr) = v; -} - -static __inline void -bus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - u_int16_t v, size_t c) -{ - bus_addr_t addr = h + o; - - if (t == X86_BUS_SPACE_IO) - for (; c != 0; c--, addr += 2) - outw(addr, v); - else - for (; c != 0; c--, addr += 2) - *(volatile u_int16_t *)(addr) = v; -} - -static __inline void -bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, - u_int32_t v, size_t c) -{ - bus_addr_t addr = h + o; - - if (t == X86_BUS_SPACE_IO) - for (; c != 0; c--, addr += 4) - outl(addr, v); - else - for (; c != 0; c--, addr += 4) - *(volatile u_int32_t *)(addr) = v; -} +void bus_space_set_region_1(bus_space_tag_t, bus_space_handle_t, + bus_size_t, u_int8_t, size_t); +void bus_space_set_region_2(bus_space_tag_t, bus_space_handle_t, + bus_size_t, u_int16_t, size_t); +void bus_space_set_region_4(bus_space_tag_t, bus_space_handle_t, + bus_size_t, u_int32_t, size_t); #if 0 /* Cause a link error for bus_space_set_region_8 */ #define bus_space_set_region_8 \ @@ -770,120 +399,12 @@ bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, #define bus_space_copy_4 bus_space_copy_region_4 #define bus_space_copy_8 bus_space_copy_region_8 -static __inline void bus_space_copy_region_1(bus_space_tag_t, - bus_space_handle_t, bus_size_t, bus_space_handle_t, - bus_size_t, size_t); -static __inline void bus_space_copy_region_2(bus_space_tag_t, - bus_space_handle_t, bus_size_t, bus_space_handle_t, - bus_size_t, size_t); -static __inline void bus_space_copy_region_4(bus_space_tag_t, - bus_space_handle_t, bus_size_t, bus_space_handle_t, - bus_size_t, size_t); - -static __inline void -bus_space_copy_region_1(bus_space_tag_t t, - bus_space_handle_t h1, bus_size_t o1, - bus_space_handle_t h2, bus_size_t o2, size_t c) -{ - bus_addr_t addr1 = h1 + o1; - bus_addr_t addr2 = h2 + o2; - - if (t == X86_BUS_SPACE_IO) { - if (addr1 >= addr2) { - /* src after dest: copy forward */ - for (; c != 0; c--, addr1++, addr2++) - outb(addr2, inb(addr1)); - } else { - /* dest after src: copy backwards */ - for (addr1 += (c - 1), addr2 += (c - 1); - c != 0; c--, addr1--, addr2--) - outb(addr2, inb(addr1)); - } - } else { - if (addr1 >= addr2) { - /* src after dest: copy forward */ - for (; c != 0; c--, addr1++, addr2++) - *(volatile u_int8_t *)(addr2) = - *(volatile u_int8_t *)(addr1); - } else { - /* dest after src: copy backwards */ - for (addr1 += (c - 1), addr2 += (c - 1); - c != 0; c--, addr1--, addr2--) - *(volatile u_int8_t *)(addr2) = - *(volatile u_int8_t *)(addr1); - } - } -} - -static __inline void -bus_space_copy_region_2(bus_space_tag_t t, - bus_space_handle_t h1, bus_size_t o1, - bus_space_handle_t h2, bus_size_t o2, size_t c) -{ - bus_addr_t addr1 = h1 + o1; - bus_addr_t addr2 = h2 + o2; - - if (t == X86_BUS_SPACE_IO) { - if (addr1 >= addr2) { - /* src after dest: copy forward */ - for (; c != 0; c--, addr1 += 2, addr2 += 2) - outw(addr2, inw(addr1)); - } else { - /* dest after src: copy backwards */ - for (addr1 += 2 * (c - 1), addr2 += 2 * (c - 1); - c != 0; c--, addr1 -= 2, addr2 -= 2) - outw(addr2, inw(addr1)); - } - } else { - if (addr1 >= addr2) { - /* src after dest: copy forward */ - for (; c != 0; c--, addr1 += 2, addr2 += 2) - *(volatile u_int16_t *)(addr2) = - *(volatile u_int16_t *)(addr1); - } else { - /* dest after src: copy backwards */ - for (addr1 += 2 * (c - 1), addr2 += 2 * (c - 1); - c != 0; c--, 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 t, - bus_space_handle_t h1, bus_size_t o1, - bus_space_handle_t h2, bus_size_t o2, size_t c) -{ - bus_addr_t addr1 = h1 + o1; - bus_addr_t addr2 = h2 + o2; - - if (t == X86_BUS_SPACE_IO) { - if (addr1 >= addr2) { - /* src after dest: copy forward */ - for (; c != 0; c--, addr1 += 4, addr2 += 4) - outl(addr2, inl(addr1)); - } else { - /* dest after src: copy backwards */ - for (addr1 += 4 * (c - 1), addr2 += 4 * (c - 1); - c != 0; c--, addr1 -= 4, addr2 -= 4) - outl(addr2, inl(addr1)); - } - } else { - if (addr1 >= addr2) { - /* src after dest: copy forward */ - for (; c != 0; c--, addr1 += 4, addr2 += 4) - *(volatile u_int32_t *)(addr2) = - *(volatile u_int32_t *)(addr1); - } else { - /* dest after src: copy backwards */ - for (addr1 += 4 * (c - 1), addr2 += 4 * (c - 1); - c != 0; c--, addr1 -= 4, addr2 -= 4) - *(volatile u_int32_t *)(addr2) = - *(volatile u_int32_t *)(addr1); - } - } -} +void bus_space_copy_region_1(bus_space_tag_t, bus_space_handle_t, + bus_size_t, bus_space_handle_t, bus_size_t, size_t); +void bus_space_copy_region_2(bus_space_tag_t, bus_space_handle_t, + bus_size_t, bus_space_handle_t, bus_size_t, size_t); +void bus_space_copy_region_4(bus_space_tag_t, bus_space_handle_t, + bus_size_t, bus_space_handle_t, bus_size_t, size_t); #if 0 /* Cause a link error for bus_space_copy_8 */ #define bus_space_copy_8 \ @@ -899,17 +420,8 @@ bus_space_copy_region_4(bus_space_tag_t t, #define BUS_BARRIER_READ BUS_SPACE_BARRIER_READ #define BUS_BARRIER_WRITE BUS_SPACE_BARRIER_WRITE -static __inline void -bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t bsh, - bus_size_t offset, bus_size_t len, int flags) -{ - if (flags == (BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE)) - __asm __volatile("mfence"); - else if (flags == BUS_SPACE_BARRIER_WRITE) - __asm __volatile("sfence"); - else - __asm __volatile("lfence"); -} +void bus_space_barrier(bus_space_tag_t, bus_space_handle_t, + bus_size_t, bus_size_t, int); #define BUS_SPACE_MAP_CACHEABLE 0x0001 #define BUS_SPACE_MAP_LINEAR 0x0002 |