From 464181b01d7b8b1b9ae756d571807a2a6865ffe9 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Tue, 26 Jul 2016 13:12:45 +0200 Subject: [PATCH] base: refactor io_port session implementation Split port API implementation into separate io_port_session_support.cc file, so that base-sel4 may implement this part alternatively. Issue #2044 --- repos/base-fiasco/src/core/spec/x86/target.mk | 1 + repos/base-fiasco/src/core/target.inc | 1 + repos/base-foc/src/core/spec/x86/target.inc | 2 + repos/base-hw/lib/mk/spec/x86/core.inc | 1 + repos/base-nova/src/core/target.inc | 2 + repos/base-okl4/src/core/spec/x86/target.mk | 2 + .../src/core/spec/x86/target.mk | 2 + .../spec/x86/io_port_session_component.cc | 64 --------------- .../core/spec/x86/io_port_session_support.cc | 81 +++++++++++++++++++ 9 files changed, 92 insertions(+), 64 deletions(-) create mode 100644 repos/base/src/core/spec/x86/io_port_session_support.cc diff --git a/repos/base-fiasco/src/core/spec/x86/target.mk b/repos/base-fiasco/src/core/spec/x86/target.mk index 0cb8c5da89..919ee322f8 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 5009ac58b8..63603ddbdd 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 10d780c7d3..6528f4ec2b 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 8d95f41d5a..cfe4d5b214 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 3b35d62c0b..271937c3b0 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 915c2f2a24..c55a85cf16 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 5d0e00a3d1..6ce49cfa9b 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 4dda0a0d2a..3bf8d9ed45 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 0000000000..922ef1ca7f --- /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)); +}