diff --git a/repos/base-fiasco/src/core/spec/x86/target.mk b/repos/base-fiasco/src/core/spec/x86/target.mk index 0cb8c5da8..919ee322f 100644 --- a/repos/base-fiasco/src/core/spec/x86/target.mk +++ b/repos/base-fiasco/src/core/spec/x86/target.mk @@ -4,5 +4,6 @@ REQUIRES += x86 SRC_CC += platform_x86.cc vpath io_port_session_component.cc $(GEN_CORE_DIR)/spec/x86 +vpath io_port_session_support.cc $(GEN_CORE_DIR)/spec/x86 vpath platform_services.cc $(GEN_CORE_DIR)/spec/x86 diff --git a/repos/base-fiasco/src/core/target.inc b/repos/base-fiasco/src/core/target.inc index 5009ac58b..63603ddbd 100644 --- a/repos/base-fiasco/src/core/target.inc +++ b/repos/base-fiasco/src/core/target.inc @@ -16,6 +16,7 @@ SRC_CC += stack_area.cc \ io_mem_session_component.cc \ io_mem_session_support.cc \ io_port_session_component.cc \ + io_port_session_support.cc \ irq_session_component.cc \ main.cc \ multiboot_info.cc \ diff --git a/repos/base-foc/src/core/spec/x86/target.inc b/repos/base-foc/src/core/spec/x86/target.inc index 10d780c7d..6528f4ec2 100644 --- a/repos/base-foc/src/core/spec/x86/target.inc +++ b/repos/base-foc/src/core/spec/x86/target.inc @@ -1,10 +1,12 @@ LD_TEXT_ADDR = 0x500000 REQUIRES += x86 SRC_CC += io_port_session_component.cc \ + io_port_session_support.cc \ spec/x86/ipc_pager.cc \ spec/x86/platform.cc vpath io_port_session_component.cc $(BASE_DIR)/src/core/spec/x86 +vpath io_port_session_support.cc $(BASE_DIR)/src/core/spec/x86 vpath platform_services.cc $(BASE_DIR)/src/core/spec/x86 include $(REP_DIR)/src/core/target.inc diff --git a/repos/base-hw/lib/mk/spec/x86/core.inc b/repos/base-hw/lib/mk/spec/x86/core.inc index 8d95f41d5..cfe4d5b21 100644 --- a/repos/base-hw/lib/mk/spec/x86/core.inc +++ b/repos/base-hw/lib/mk/spec/x86/core.inc @@ -18,6 +18,7 @@ SRC_CC += spec/x86/cpu.cc SRC_CC += spec/x86/fpu.cc SRC_CC += spec/x86/bios_data_area.cc SRC_CC += spec/x86/io_port_session_component.cc +SRC_CC += spec/x86/io_port_session_support.cc # include less specific configuration include $(BASE_DIR)/../base-hw/lib/mk/core.inc diff --git a/repos/base-nova/src/core/target.inc b/repos/base-nova/src/core/target.inc index 3b35d62c0..271937c3b 100644 --- a/repos/base-nova/src/core/target.inc +++ b/repos/base-nova/src/core/target.inc @@ -18,6 +18,7 @@ SRC_CC = stack_area.cc \ io_mem_session_component.cc \ io_mem_session_support.cc \ io_port_session_component.cc \ + io_port_session_support.cc \ ipc_pager.cc \ irq_session_component.cc \ main.cc \ @@ -59,6 +60,7 @@ vpath pd_upgrade_ram_quota.cc $(GEN_CORE_DIR) vpath region_map_component.cc $(GEN_CORE_DIR) vpath trace_session_component.cc $(GEN_CORE_DIR) vpath io_port_session_component.cc $(GEN_CORE_DIR)/spec/x86 +vpath io_port_session_support.cc $(GEN_CORE_DIR)/spec/x86 vpath io_mem_session_component.cc $(GEN_CORE_DIR) vpath io_mem_session_support.cc $(GEN_CORE_DIR) vpath dataspace_component.cc $(GEN_CORE_DIR) diff --git a/repos/base-okl4/src/core/spec/x86/target.mk b/repos/base-okl4/src/core/spec/x86/target.mk index 915c2f2a2..c55a85cf1 100644 --- a/repos/base-okl4/src/core/spec/x86/target.mk +++ b/repos/base-okl4/src/core/spec/x86/target.mk @@ -3,9 +3,11 @@ include $(REP_DIR)/src/core/target.inc REQUIRES += x86 SRC_CC += io_port_session_component.cc \ + io_port_session_support.cc \ platform_thread_x86.cc vpath io_port_session_component.cc $(GEN_CORE_DIR)/spec/x86 +vpath io_port_session_support.cc $(GEN_CORE_DIR)/spec/x86 vpath platform_services.cc $(GEN_CORE_DIR)/spec/x86 vpath platform_thread_x86.cc $(GEN_CORE_DIR)/spec/x86 diff --git a/repos/base-pistachio/src/core/spec/x86/target.mk b/repos/base-pistachio/src/core/spec/x86/target.mk index 5d0e00a3d..6ce49cfa9 100644 --- a/repos/base-pistachio/src/core/spec/x86/target.mk +++ b/repos/base-pistachio/src/core/spec/x86/target.mk @@ -2,8 +2,10 @@ include $(REP_DIR)/src/core/target.inc REQUIRES += x86 SRC_CC += io_port_session_component.cc \ + io_port_session_support.cc \ platform_x86.cc vpath io_port_session_component.cc $(GEN_CORE_DIR)/spec/x86 +vpath io_port_session_support.cc $(GEN_CORE_DIR)/spec/x86 vpath platform_services.cc $(GEN_CORE_DIR)/spec/x86 diff --git a/repos/base/src/core/spec/x86/io_port_session_component.cc b/repos/base/src/core/spec/x86/io_port_session_component.cc index 4dda0a0d2..3bf8d9ed4 100644 --- a/repos/base/src/core/spec/x86/io_port_session_component.cc +++ b/repos/base/src/core/spec/x86/io_port_session_component.cc @@ -25,70 +25,6 @@ using namespace Genode; static const bool verbose = false; -/************** - ** Port API ** - **************/ - -unsigned char Io_port_session_component::inb(unsigned short address) -{ - /* check boundaries */ - if (!_in_bounds(address, sizeof(unsigned char))) return 0; - - unsigned char v; - asm volatile ("inb %w1, %b0" : "=a" (v) : "Nd" (address)); - return v; -} - - -unsigned short Io_port_session_component::inw(unsigned short address) -{ - /* check boundaries */ - if (!_in_bounds(address, sizeof(unsigned short))) return 0; - - unsigned short v; - asm volatile ("inw %w1, %w0" : "=a" (v) : "Nd" (address)); - return v; -} - - -unsigned Io_port_session_component::inl(unsigned short address) -{ - /* check boundaries */ - if (!_in_bounds(address, sizeof(unsigned))) return 0; - - unsigned v; - asm volatile ("inl %w1, %0" : "=a" (v) : "Nd" (address)); - return v; -} - - -void Io_port_session_component::outb(unsigned short address, unsigned char value) -{ - /* check boundaries */ - if (!_in_bounds(address, sizeof(unsigned char))) return; - - asm volatile ("outb %b0, %w1" : : "a" (value), "Nd" (address)); -} - - -void Io_port_session_component::outw(unsigned short address, unsigned short value) -{ - /* check boundaries */ - if (!_in_bounds(address, sizeof(unsigned short))) return; - - asm volatile ("outw %w0, %w1" : : "a" (value), "Nd" (address)); -} - - -void Io_port_session_component::outl(unsigned short address, unsigned value) -{ - /* check boundaries */ - if (!_in_bounds(address, sizeof(unsigned))) return; - - asm volatile ("outl %0, %w1" : : "a" (value), "Nd" (address)); -} - - /****************************** ** Constructor / destructor ** ******************************/ diff --git a/repos/base/src/core/spec/x86/io_port_session_support.cc b/repos/base/src/core/spec/x86/io_port_session_support.cc new file mode 100644 index 000000000..922ef1ca7 --- /dev/null +++ b/repos/base/src/core/spec/x86/io_port_session_support.cc @@ -0,0 +1,81 @@ +/* + * \brief Core implementation of the IO_PORT session interface + * \author Christian Helmuth + * \date 2007-04-17 + */ + +/* + * Copyright (C) 2007-2013 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + +/* core includes */ +#include + +using namespace Genode; + + +/************** + ** Port API ** + **************/ + +unsigned char Io_port_session_component::inb(unsigned short address) +{ + /* check boundaries */ + if (!_in_bounds(address, sizeof(unsigned char))) return 0; + + unsigned char v; + asm volatile ("inb %w1, %b0" : "=a" (v) : "Nd" (address)); + return v; +} + + +unsigned short Io_port_session_component::inw(unsigned short address) +{ + /* check boundaries */ + if (!_in_bounds(address, sizeof(unsigned short))) return 0; + + unsigned short v; + asm volatile ("inw %w1, %w0" : "=a" (v) : "Nd" (address)); + return v; +} + + +unsigned Io_port_session_component::inl(unsigned short address) +{ + /* check boundaries */ + if (!_in_bounds(address, sizeof(unsigned))) return 0; + + unsigned v; + asm volatile ("inl %w1, %0" : "=a" (v) : "Nd" (address)); + return v; +} + + +void Io_port_session_component::outb(unsigned short address, unsigned char value) +{ + /* check boundaries */ + if (!_in_bounds(address, sizeof(unsigned char))) return; + + asm volatile ("outb %b0, %w1" : : "a" (value), "Nd" (address)); +} + + +void Io_port_session_component::outw(unsigned short address, unsigned short value) +{ + /* check boundaries */ + if (!_in_bounds(address, sizeof(unsigned short))) return; + + asm volatile ("outw %w0, %w1" : : "a" (value), "Nd" (address)); +} + + +void Io_port_session_component::outl(unsigned short address, unsigned value) +{ + /* check boundaries */ + if (!_in_bounds(address, sizeof(unsigned))) return; + + asm volatile ("outl %0, %w1" : : "a" (value), "Nd" (address)); +}