hrev50989 adds 1 changeset to branch 'master'
old head: df3ba9532d9d1f8b889dcb6869e96af9dcdc1177
new head: 5e3916baeea5fceb1debbd27f5efb64c5b96968c
overview:
http://cgit.haiku-os.org/haiku/log/?qt=range&q=5e3916baeea5+%5Edf3ba9532d9d
----------------------------------------------------------------------------
5e3916baeea5: FreeBSD compability layer optimized read and writes.
FreeBSD has a simple inlined bus_space_read while Haikus had one
with call overhead.
This still needs cleanup as it is x86 specific, which it was already.
Also it redefines inX and outX defines as arch/x86/arch_cpu.h has a
C++ namespace so it can't be included from FreeBSD drivers C-files.
The results of these changes should be worth it though.
[ Fredrik Holmqvist <fredrik.holmqvist@xxxxxxxxx> ]
----------------------------------------------------------------------------
Revision: hrev50989
Commit: 5e3916baeea5fceb1debbd27f5efb64c5b96968c
URL: http://cgit.haiku-os.org/haiku/commit/?id=5e3916baeea5
Author: Fredrik Holmqvist <fredrik.holmqvist@xxxxxxxxx>
Date: Wed Mar 1 17:32:18 2017 UTC
----------------------------------------------------------------------------
2 files changed, 83 insertions(+), 49 deletions(-)
src/libs/compat/freebsd_network/bus.cpp | 36 --------
.../compat/freebsd_network/compat/machine/bus.h | 96 +++++++++++++++++---
----------------------------------------------------------------------------
diff --git a/src/libs/compat/freebsd_network/bus.cpp
b/src/libs/compat/freebsd_network/bus.cpp
index 288b604..4a77a0a 100644
--- a/src/libs/compat/freebsd_network/bus.cpp
+++ b/src/libs/compat/freebsd_network/bus.cpp
@@ -501,42 +501,6 @@ bus_generic_driver_added(device_t dev, driver_t *driver)
}
-#define BUS_SPACE_READ(size, type, fun) \
- type bus_space_read_##size(bus_space_tag_t tag, \
- bus_space_handle_t handle, bus_size_t offset) \
- { \
- type value; \
- if (tag == I386_BUS_SPACE_IO) \
- value = fun(handle + offset); \
- else \
- value = *(volatile type *)(handle + offset); \
- if (tag == I386_BUS_SPACE_IO) \
- TRACE_BUS_SPACE_RW(("bus_space_read_%s(0x%lx, 0x%lx,
0x%lx) = 0x%lx\n", \
- #size, (uint32)tag, (uint32)handle,
(uint32)offset, (uint32)value)); \
- return value; \
- }
-
-#define BUS_SPACE_WRITE(size, type, fun) \
- void bus_space_write_##size(bus_space_tag_t tag, \
- bus_space_handle_t handle, bus_size_t offset, type value) \
- { \
- if (tag == I386_BUS_SPACE_IO) \
- TRACE_BUS_SPACE_RW(("bus_space_write_%s(0x%lx, 0x%lx,
0x%lx, 0x%lx)\n", \
- #size, (uint32)tag, (uint32)handle,
(uint32)offset, (uint32)value)); \
- if (tag == I386_BUS_SPACE_IO) \
- fun(value, handle + offset); \
- else \
- *(volatile type *)(handle + offset) = value; \
- }
-
-BUS_SPACE_READ(1, uint8_t, in8)
-BUS_SPACE_READ(2, uint16_t, in16)
-BUS_SPACE_READ(4, uint32_t, in32)
-
-BUS_SPACE_WRITE(1, uint8_t, out8)
-BUS_SPACE_WRITE(2, uint16_t, out16)
-BUS_SPACE_WRITE(4, uint32_t, out32)
-
int
bus_child_present(device_t child)
{
diff --git a/src/libs/compat/freebsd_network/compat/machine/bus.h
b/src/libs/compat/freebsd_network/compat/machine/bus.h
index 9e0a49d..a10ba9a 100644
--- a/src/libs/compat/freebsd_network/compat/machine/bus.h
+++ b/src/libs/compat/freebsd_network/compat/machine/bus.h
@@ -110,7 +110,6 @@
#ifndef _FBSD_COMPAT_MACHINE_BUS_H_
#define _FBSD_COMPAT_MACHINE_BUS_H_
-
#include <machine/_bus.h>
#include <machine/cpufunc.h>
@@ -138,18 +137,89 @@ struct resource;
#define BUS_SPACE_BARRIER_WRITE 2
-uint8_t bus_space_read_1(bus_space_tag_t tag, bus_space_handle_t handle,
- bus_size_t offset);
-uint16_t bus_space_read_2(bus_space_tag_t tag, bus_space_handle_t handle,
- bus_size_t offset);
-uint32_t bus_space_read_4(bus_space_tag_t tag, bus_space_handle_t handle,
- bus_size_t offset);
-void bus_space_write_1(bus_space_tag_t tag, bus_space_handle_t handle,
- bus_size_t offset, uint8_t value);
-void bus_space_write_2(bus_space_tag_t tag, bus_space_handle_t handle,
- bus_size_t offset, uint16_t value);
-void bus_space_write_4(bus_space_tag_t tag, bus_space_handle_t handle,
- bus_size_t offset, uint32_t value);
+// Copied from arch/x86/arch_cpu.h
+// Can't use the header as it inderictly includes arch/x86/arch_thread_types.h
+// Which has a namespace, so can't be used in FreeBSD's C-code atm.
+#define out8(value,port) \
+ __asm__ ("outb %%al,%%dx" : : "a" (value), "d" (port))
+
+#define out16(value,port) \
+ __asm__ ("outw %%ax,%%dx" : : "a" (value), "d" (port))
+
+#define out32(value,port) \
+ __asm__ ("outl %%eax,%%dx" : : "a" (value), "d" (port))
+
+#define in8(port) ({ \
+ uint8 _v; \
+ __asm__ volatile ("inb %%dx,%%al" : "=a" (_v) : "d" (port)); \
+ _v; \
+})
+
+#define in16(port) ({ \
+ uint16 _v; \
+ __asm__ volatile ("inw %%dx,%%ax":"=a" (_v) : "d" (port)); \
+ _v; \
+})
+
+#define in32(port) ({ \
+ uint32 _v; \
+ __asm__ volatile ("inl %%dx,%%eax":"=a" (_v) : "d" (port)); \
+ _v; \
+})
+
+
+inline uint8_t
+bus_space_read_1(bus_space_tag_t tag, bus_space_handle_t handle,
+ bus_size_t offset) {
+ return tag == I386_BUS_SPACE_MEM ?
+ (*(volatile u_int8_t *)(handle + offset)) :
+ in8(handle + offset);
+}
+
+
+inline uint16_t
+bus_space_read_2(bus_space_tag_t tag, bus_space_handle_t handle,
+ bus_size_t offset) {
+ return tag == I386_BUS_SPACE_MEM ?
+ (*(volatile u_int16_t *)(handle + offset)) :
+ in16(handle + offset);
+}
+
+
+inline uint32_t
+bus_space_read_4(bus_space_tag_t tag, bus_space_handle_t handle,
+ bus_size_t offset) {
+ return tag == I386_BUS_SPACE_MEM ?
+ (*(volatile u_int32_t *)(handle + offset)) :
+ in32(handle + offset);
+}
+
+
+inline void bus_space_write_1(bus_space_tag_t tag, bus_space_handle_t handle,
+ bus_size_t offset, uint8_t value) {
+ if (tag == I386_BUS_SPACE_MEM)
+ *(volatile uint8_t *)(handle + offset) = value;
+ else
+ out8(value, handle + offset);
+}
+
+
+inline void bus_space_write_2(bus_space_tag_t tag, bus_space_handle_t handle,
+ bus_size_t offset, uint16_t value) {
+ if (tag == I386_BUS_SPACE_MEM)
+ *(volatile uint16_t *)(handle + offset) = value;
+ else
+ out16(value, handle + offset);
+}
+
+
+inline void bus_space_write_4(bus_space_tag_t tag, bus_space_handle_t handle,
+ bus_size_t offset, uint32_t value) {
+ if (tag == I386_BUS_SPACE_MEM)
+ *(volatile uint32_t *)(handle + offset) = value;
+ else
+ out32(value, handle + offset);
+}
static inline void