mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-19 05:37:54 +00:00
base-linux: core session support (IO_PORT, IO_MEM, IRQ)
This commit is contained in:
parent
8cf7aaad65
commit
93639532f0
@ -8,7 +8,8 @@ lib/import src/ld:
|
|||||||
content:
|
content:
|
||||||
for spec in x86_32 x86_64 arm; do \
|
for spec in x86_32 x86_64 arm; do \
|
||||||
mv lib/mk/spec/$$spec/ld-linux.mk lib/mk/spec/$$spec/ld.mk; done;
|
mv lib/mk/spec/$$spec/ld-linux.mk lib/mk/spec/$$spec/ld.mk; done;
|
||||||
sed -i "s/core-linux/core/" src/core/linux/target.mk
|
sed -i "s/core-linux/core/" src/core/linux/target.mk
|
||||||
sed -i "s/ld-linux/ld/" src/lib/ld/linux/target.mk
|
sed -i "s/BOARD.*unknown/BOARD := linux/" src/core/linux/target.mk
|
||||||
sed -i "s/linux_timer_drv/timer/" src/timer/linux/target.mk
|
sed -i "s/ld-linux/ld/" src/lib/ld/linux/target.mk
|
||||||
|
sed -i "s/linux_timer_drv/timer/" src/timer/linux/target.mk
|
||||||
|
|
||||||
|
@ -22,6 +22,8 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#undef size_t
|
#undef size_t
|
||||||
|
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************
|
/*******************************************************
|
||||||
** Functions used by core's ram-session support code **
|
** Functions used by core's ram-session support code **
|
||||||
@ -70,6 +72,39 @@ inline int lx_stat(const char *path, struct stat64 *buf)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************
|
||||||
|
** Functions used by core's io port session support code **
|
||||||
|
***********************************************************/
|
||||||
|
|
||||||
|
inline int lx_ioperm(unsigned long from, unsigned long num, int turn_on)
|
||||||
|
{
|
||||||
|
return lx_syscall(SYS_ioperm, from, num, turn_on);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int lx_iopl(int level)
|
||||||
|
{
|
||||||
|
return lx_syscall(SYS_iopl, level);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************
|
||||||
|
** Functions used by core's io mem session code **
|
||||||
|
**************************************************/
|
||||||
|
|
||||||
|
/* specific ioctl call for /dev/hwio since I don't want to handle variant args */
|
||||||
|
inline int lx_ioctl_iomem(int fd, unsigned long phys, Genode::size_t offset)
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
unsigned long phys;
|
||||||
|
Genode::size_t length;
|
||||||
|
} range = {phys, offset};
|
||||||
|
|
||||||
|
return lx_syscall(SYS_ioctl, fd, _IOW('g', 1, void *), &range);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int lx_ioctl_irq(int fd, int irq)
|
||||||
|
{
|
||||||
|
return lx_syscall(SYS_ioctl, fd, _IOW('g', 2, int*), &irq);
|
||||||
|
}
|
||||||
|
|
||||||
/**************************************
|
/**************************************
|
||||||
** Process creation and destruction **
|
** Process creation and destruction **
|
||||||
|
@ -79,14 +79,7 @@ namespace Genode {
|
|||||||
* reasons and should not be used.
|
* reasons and should not be used.
|
||||||
*/
|
*/
|
||||||
Dataspace_component(size_t size, addr_t, addr_t phys_addr,
|
Dataspace_component(size_t size, addr_t, addr_t phys_addr,
|
||||||
Cache_attribute, bool, Dataspace_owner *_owner)
|
Cache_attribute, bool writable, Dataspace_owner *_owner);
|
||||||
:
|
|
||||||
_size(size), _addr(phys_addr), _fd(-1), _writable(false),
|
|
||||||
_owner(_owner)
|
|
||||||
{
|
|
||||||
warning("Should only be used for IOMEM and not within Linux.");
|
|
||||||
_fname.buf[0] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This constructor is especially used for ROM dataspaces
|
* This constructor is especially used for ROM dataspaces
|
||||||
|
@ -26,6 +26,18 @@ namespace Genode {
|
|||||||
|
|
||||||
class Io_mem_session_component : public Rpc_object<Io_mem_session>
|
class Io_mem_session_component : public Rpc_object<Io_mem_session>
|
||||||
{
|
{
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
Range_allocator &_io_mem_alloc;
|
||||||
|
Dataspace_component _ds;
|
||||||
|
Rpc_entrypoint &_ds_ep;
|
||||||
|
Io_mem_dataspace_capability _ds_cap;
|
||||||
|
|
||||||
|
size_t get_arg_size(const char *);
|
||||||
|
addr_t get_arg_phys(const char *);
|
||||||
|
Cache_attribute get_arg_wc(const char *);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -55,8 +67,7 @@ namespace Genode {
|
|||||||
** Io-mem session interface **
|
** Io-mem session interface **
|
||||||
*****************************/
|
*****************************/
|
||||||
|
|
||||||
Io_mem_dataspace_capability dataspace() override {
|
Io_mem_dataspace_capability dataspace() override;
|
||||||
return Io_mem_dataspace_capability(); }
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
50
repos/base-linux/src/core/include/irq_object.h
Normal file
50
repos/base-linux/src/core/include/irq_object.h
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* \brief Core-specific instance of the IRQ session interface (Linux)
|
||||||
|
* \author Johannes Kliemann
|
||||||
|
* \date 2019-11-25
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2007-2019 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU Affero General Public License version 3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _IRQ_OBJECT_H_
|
||||||
|
#define _IRQ_OBJECT_H_
|
||||||
|
|
||||||
|
#include <base/thread.h>
|
||||||
|
|
||||||
|
namespace Genode
|
||||||
|
{
|
||||||
|
class Irq_object;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Genode::Irq_object : public Thread_deprecated<4096>
|
||||||
|
{
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
Genode::Signal_context_capability _sig_cap;
|
||||||
|
Genode::Lock _sync_ack;
|
||||||
|
Genode::Lock _sync_bootup;
|
||||||
|
unsigned const _irq;
|
||||||
|
int _fd;
|
||||||
|
|
||||||
|
bool _associate();
|
||||||
|
|
||||||
|
void entry() override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Irq_object(unsigned irq);
|
||||||
|
void sigh(Signal_context_capability cap);
|
||||||
|
void ack_irq();
|
||||||
|
|
||||||
|
void start() override;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* ifndef _IRQ_OBJECT_H_ */
|
||||||
|
|
@ -16,7 +16,9 @@
|
|||||||
|
|
||||||
#include <util/list.h>
|
#include <util/list.h>
|
||||||
#include <base/rpc_server.h>
|
#include <base/rpc_server.h>
|
||||||
|
#include <base/allocator.h>
|
||||||
#include <irq_session/irq_session.h>
|
#include <irq_session/irq_session.h>
|
||||||
|
#include <irq_object.h>
|
||||||
|
|
||||||
namespace Genode {
|
namespace Genode {
|
||||||
class Irq_session_component;
|
class Irq_session_component;
|
||||||
@ -28,30 +30,29 @@ class Genode::Irq_session_component : public Rpc_object<Irq_session>,
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
friend class List<Irq_session_component>;
|
friend class List<Irq_session_component>;
|
||||||
|
unsigned _irq_number;
|
||||||
|
Genode::Irq_object _irq_object;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
Irq_session_component(Range_allocator &, const char *) { }
|
Irq_session_component(Range_allocator &, const char *);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destructor
|
* Destructor
|
||||||
*/
|
*/
|
||||||
~Irq_session_component() { }
|
~Irq_session_component();
|
||||||
|
|
||||||
|
|
||||||
/***************************
|
/***************************
|
||||||
** Irq session interface **
|
** Irq session interface **
|
||||||
***************************/
|
***************************/
|
||||||
|
|
||||||
void ack_irq() override { }
|
void ack_irq() override;
|
||||||
void sigh(Signal_context_capability) override { }
|
void sigh(Signal_context_capability) override;
|
||||||
Info info() override {
|
Info info() override;
|
||||||
return { .type = Genode::Irq_session::Info::Type::INVALID,
|
|
||||||
.address = 0,
|
|
||||||
.value = 0 }; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _CORE__INCLUDE__IRQ_SESSION_COMPONENT_H_ */
|
#endif /* _CORE__INCLUDE__IRQ_SESSION_COMPONENT_H_ */
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
/*
|
|
||||||
* \brief Linux-specific IO_MEM service
|
|
||||||
* \author Christian Helmuth
|
|
||||||
* \date 2006-09-01
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2006-2017 Genode Labs GmbH
|
|
||||||
*
|
|
||||||
* This file is part of the Genode OS framework, which is distributed
|
|
||||||
* under the terms of the GNU Affero General Public License version 3.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <base/log.h>
|
|
||||||
|
|
||||||
#include <io_mem_session_component.h>
|
|
||||||
|
|
||||||
using namespace Genode;
|
|
||||||
|
|
||||||
|
|
||||||
Io_mem_session_component::Io_mem_session_component(Range_allocator &,
|
|
||||||
Range_allocator &,
|
|
||||||
Rpc_entrypoint &,
|
|
||||||
const char *args) {
|
|
||||||
warning("no io_mem support on Linux (args=\"", args, "\")"); }
|
|
@ -2,6 +2,8 @@ TARGET = core-linux
|
|||||||
REQUIRES = linux
|
REQUIRES = linux
|
||||||
LIBS = cxx base-linux-common syscall-linux startup-linux
|
LIBS = cxx base-linux-common syscall-linux startup-linux
|
||||||
|
|
||||||
|
BOARD ?= unknown
|
||||||
|
|
||||||
GEN_CORE_DIR = $(BASE_DIR)/src/core
|
GEN_CORE_DIR = $(BASE_DIR)/src/core
|
||||||
|
|
||||||
SRC_CC = main.cc \
|
SRC_CC = main.cc \
|
||||||
@ -23,6 +25,9 @@ SRC_CC = main.cc \
|
|||||||
ram_dataspace_factory.cc \
|
ram_dataspace_factory.cc \
|
||||||
core_rpc_cap_alloc.cc \
|
core_rpc_cap_alloc.cc \
|
||||||
io_mem_session_component.cc \
|
io_mem_session_component.cc \
|
||||||
|
io_port_session_component.cc \
|
||||||
|
io_port_session_support.cc \
|
||||||
|
irq_session_component.cc \
|
||||||
signal_source_component.cc \
|
signal_source_component.cc \
|
||||||
signal_transmitter_proxy.cc \
|
signal_transmitter_proxy.cc \
|
||||||
signal_receiver.cc \
|
signal_receiver.cc \
|
||||||
@ -34,7 +39,8 @@ SRC_CC = main.cc \
|
|||||||
default_log.cc \
|
default_log.cc \
|
||||||
env_reinit.cc \
|
env_reinit.cc \
|
||||||
heartbeat.cc \
|
heartbeat.cc \
|
||||||
thread.cc thread_myself.cc
|
thread.cc \
|
||||||
|
thread_myself.cc
|
||||||
|
|
||||||
INC_DIR += $(REP_DIR)/src/core/include \
|
INC_DIR += $(REP_DIR)/src/core/include \
|
||||||
$(GEN_CORE_DIR)/include \
|
$(GEN_CORE_DIR)/include \
|
||||||
@ -48,27 +54,32 @@ LD_SCRIPT_STATIC = $(BASE_DIR)/src/ld/genode.ld \
|
|||||||
|
|
||||||
include $(GEN_CORE_DIR)/version.inc
|
include $(GEN_CORE_DIR)/version.inc
|
||||||
|
|
||||||
vpath main.cc $(GEN_CORE_DIR)
|
vpath main.cc $(GEN_CORE_DIR)
|
||||||
vpath pd_session_component.cc $(GEN_CORE_DIR)
|
vpath pd_session_component.cc $(GEN_CORE_DIR)
|
||||||
vpath core_log.cc $(GEN_CORE_DIR)
|
vpath core_log.cc $(GEN_CORE_DIR)
|
||||||
vpath cpu_session_component.cc $(GEN_CORE_DIR)
|
vpath cpu_session_component.cc $(GEN_CORE_DIR)
|
||||||
vpath cpu_session_support.cc $(GEN_CORE_DIR)
|
vpath cpu_session_support.cc $(GEN_CORE_DIR)
|
||||||
vpath cpu_thread_component.cc $(GEN_CORE_DIR)
|
vpath cpu_thread_component.cc $(GEN_CORE_DIR)
|
||||||
vpath pd_upgrade_ram_quota.cc $(GEN_CORE_DIR)
|
vpath pd_upgrade_ram_quota.cc $(GEN_CORE_DIR)
|
||||||
vpath pd_session_support.cc $(GEN_CORE_DIR)
|
vpath pd_session_support.cc $(GEN_CORE_DIR)
|
||||||
vpath capability_space.cc $(GEN_CORE_DIR)
|
vpath capability_space.cc $(GEN_CORE_DIR)
|
||||||
vpath rpc_cap_factory_l4.cc $(GEN_CORE_DIR)
|
vpath rpc_cap_factory_l4.cc $(GEN_CORE_DIR)
|
||||||
vpath ram_dataspace_factory.cc $(GEN_CORE_DIR)
|
vpath ram_dataspace_factory.cc $(GEN_CORE_DIR)
|
||||||
vpath platform_services.cc $(GEN_CORE_DIR)
|
vpath signal_source_component.cc $(GEN_CORE_DIR)
|
||||||
vpath signal_source_component.cc $(GEN_CORE_DIR)
|
vpath signal_transmitter_proxy.cc $(GEN_CORE_DIR)
|
||||||
vpath signal_transmitter_proxy.cc $(GEN_CORE_DIR)
|
vpath signal_receiver.cc $(GEN_CORE_DIR)
|
||||||
vpath signal_receiver.cc $(GEN_CORE_DIR)
|
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
||||||
vpath trace_session_component.cc $(GEN_CORE_DIR)
|
vpath core_rpc_cap_alloc.cc $(GEN_CORE_DIR)
|
||||||
vpath core_rpc_cap_alloc.cc $(GEN_CORE_DIR)
|
vpath default_log.cc $(GEN_CORE_DIR)
|
||||||
vpath default_log.cc $(GEN_CORE_DIR)
|
vpath heartbeat.cc $(GEN_CORE_DIR)
|
||||||
vpath heartbeat.cc $(GEN_CORE_DIR)
|
vpath io_port_session_support.cc $(GEN_CORE_DIR)/spec/x86
|
||||||
vpath thread.cc $(BASE_DIR)/src/lib/base
|
vpath thread.cc $(BASE_DIR)/src/lib/base
|
||||||
vpath thread_myself.cc $(BASE_DIR)/src/lib/base
|
vpath thread_myself.cc $(BASE_DIR)/src/lib/base
|
||||||
vpath trace.cc $(BASE_DIR)/src/lib/base
|
vpath trace.cc $(BASE_DIR)/src/lib/base
|
||||||
vpath env_reinit.cc $(REP_DIR)/src/lib/base
|
vpath env_reinit.cc $(REP_DIR)/src/lib/base
|
||||||
vpath %.cc $(REP_DIR)/src/core
|
vpath dataspace_component.cc $(REP_DIR)/src/core/spec/$(BOARD)
|
||||||
|
vpath io_mem_session_component.cc $(REP_DIR)/src/core/spec/$(BOARD)
|
||||||
|
vpath irq_session_component.cc $(REP_DIR)/src/core/spec/$(BOARD)
|
||||||
|
vpath io_port_session_component.cc $(REP_DIR)/src/core/spec/$(BOARD)
|
||||||
|
vpath platform_services.cc $(REP_DIR)/src/core/spec/$(BOARD)
|
||||||
|
vpath %.cc $(REP_DIR)/src/core
|
||||||
|
77
repos/base-linux/src/core/spec/linux/dataspace_component.cc
Normal file
77
repos/base-linux/src/core/spec/linux/dataspace_component.cc
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
/*
|
||||||
|
* \brief Linux-specific core implementation of the dataspace component
|
||||||
|
* \author Stefan Kalkowski
|
||||||
|
* \date 2015-09-25
|
||||||
|
*
|
||||||
|
* The Linux version of ROM session component does not use the
|
||||||
|
* Rom_fs as provided as constructor argument. Instead, we map
|
||||||
|
* rom modules directly to files of the host file system.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015-2017 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU Affero General Public License version 3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Linux includes */
|
||||||
|
#include <core_linux_syscalls.h>
|
||||||
|
#include <sys/fcntl.h>
|
||||||
|
|
||||||
|
/* Genode includes */
|
||||||
|
#include <linux_dataspace/linux_dataspace.h>
|
||||||
|
#include <util/arg_string.h>
|
||||||
|
#include <root/root.h>
|
||||||
|
#include <base/session_label.h>
|
||||||
|
|
||||||
|
/* local includes */
|
||||||
|
#include "dataspace_component.h"
|
||||||
|
|
||||||
|
using namespace Genode;
|
||||||
|
|
||||||
|
|
||||||
|
Linux_dataspace::Filename Dataspace_component::_file_name(const char *args)
|
||||||
|
{
|
||||||
|
Session_label const label = label_from_args(args);
|
||||||
|
Linux_dataspace::Filename fname;
|
||||||
|
|
||||||
|
if (label.last_element().length() > sizeof(fname.buf)) {
|
||||||
|
Genode::error("file name too long: ", label.last_element());
|
||||||
|
throw Service_denied();
|
||||||
|
}
|
||||||
|
|
||||||
|
strncpy(fname.buf, label.last_element().string(), sizeof(fname.buf));
|
||||||
|
|
||||||
|
/* only files inside the current working directory are allowed */
|
||||||
|
for (const char *c = fname.buf; *c; ++c)
|
||||||
|
if (*c == '/') throw Service_denied();
|
||||||
|
|
||||||
|
return fname;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Genode::size_t Dataspace_component::_file_size()
|
||||||
|
{
|
||||||
|
struct stat64 s;
|
||||||
|
if (lx_stat(_fname.buf, &s) < 0) throw Service_denied();
|
||||||
|
|
||||||
|
return s.st_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Dataspace_component::Dataspace_component(const char *args)
|
||||||
|
: _fname(_file_name(args)),
|
||||||
|
_size(_file_size()),
|
||||||
|
_addr(0),
|
||||||
|
_fd(lx_open(_fname.buf, O_RDONLY | LX_O_CLOEXEC, S_IRUSR | S_IXUSR)),
|
||||||
|
_writable(false),
|
||||||
|
_owner(0) { }
|
||||||
|
|
||||||
|
Dataspace_component::Dataspace_component(size_t size, addr_t, addr_t phys_addr,
|
||||||
|
Cache_attribute, bool, Dataspace_owner *_owner) :
|
||||||
|
_size(size), _addr(phys_addr), _fd(-1), _writable(false), _owner(_owner)
|
||||||
|
{
|
||||||
|
warning("Should only be used for IOMEM and not within Linux.");
|
||||||
|
_fname.buf[0] = 0;
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* \brief Linux-specific IO_MEM service
|
||||||
|
* \author Johannes Kliemann
|
||||||
|
* \date 2019-11-25
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2006-2017 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU Affero General Public License version 3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <base/log.h>
|
||||||
|
#include <linux_dataspace/client.h>
|
||||||
|
#include <base/internal/page_size.h>
|
||||||
|
|
||||||
|
#include <core_linux_syscalls.h>
|
||||||
|
|
||||||
|
#include <io_mem_session_component.h>
|
||||||
|
|
||||||
|
|
||||||
|
using namespace Genode;
|
||||||
|
|
||||||
|
size_t Io_mem_session_component::get_arg_size(const char *)
|
||||||
|
{
|
||||||
|
warning(__func__, " not implemented");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
addr_t Io_mem_session_component::get_arg_phys(const char *)
|
||||||
|
{
|
||||||
|
warning(__func__, " not implemented");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Io_mem_session_component::Io_mem_session_component(Range_allocator &io_mem_alloc,
|
||||||
|
Range_allocator &,
|
||||||
|
Rpc_entrypoint &ds_ep,
|
||||||
|
const char *args) :
|
||||||
|
_io_mem_alloc(io_mem_alloc),
|
||||||
|
_ds(0, 0, 0, UNCACHED, true, 0),
|
||||||
|
_ds_ep(ds_ep),
|
||||||
|
_ds_cap(Io_mem_dataspace_capability())
|
||||||
|
{
|
||||||
|
warning("no io_mem support on Linux (args=\"", args, "\")"); }
|
||||||
|
|
||||||
|
Cache_attribute Io_mem_session_component::get_arg_wc(const char *)
|
||||||
|
{
|
||||||
|
warning(__func__, " not implemented");
|
||||||
|
return UNCACHED;
|
||||||
|
}
|
||||||
|
|
||||||
|
Io_mem_dataspace_capability Io_mem_session_component::dataspace()
|
||||||
|
{
|
||||||
|
return Io_mem_dataspace_capability();
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* \brief Linux-specific IO_PORT service
|
||||||
|
* \author Johannes Kliemann
|
||||||
|
* \date 2019-11-25
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2006-2019 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU Affero General Public License version 3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <util/string.h>
|
||||||
|
#include <util/arg_string.h>
|
||||||
|
#include <root/root.h>
|
||||||
|
#include <io_port_session_component.h>
|
||||||
|
|
||||||
|
|
||||||
|
Genode::Io_port_session_component::Io_port_session_component(Genode::Range_allocator &io_port_alloc, const char *)
|
||||||
|
: _io_port_alloc(io_port_alloc)
|
||||||
|
{
|
||||||
|
Genode::warning("IO PORTS are not supported on base linux");
|
||||||
|
}
|
||||||
|
|
||||||
|
Genode::Io_port_session_component::~Io_port_session_component()
|
||||||
|
{}
|
@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* \brief IRQ session implementation for base-linux
|
||||||
|
* \author Johannes Kliemann
|
||||||
|
* \date 2018-03-14
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018 Genode Labs GmbH
|
||||||
|
* Copyright (C) 2018 Componolit GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU Affero General Public License version 3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <base/log.h>
|
||||||
|
#include <base/thread.h>
|
||||||
|
|
||||||
|
#include <irq_session_component.h>
|
||||||
|
|
||||||
|
#include <core_linux_syscalls.h>
|
||||||
|
|
||||||
|
Genode::Irq_session_component::Irq_session_component(Genode::Range_allocator &, const char *)
|
||||||
|
:
|
||||||
|
_irq_number(0),
|
||||||
|
_irq_object(_irq_number)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
Genode::Irq_session_component::~Irq_session_component()
|
||||||
|
{
|
||||||
|
warning(__func__, " not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Genode::Irq_session_component::ack_irq()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void Genode::Irq_session_component::sigh(Genode::Signal_context_capability)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
Genode::Irq_session::Info Genode::Irq_session_component::info()
|
||||||
|
{
|
||||||
|
return { .type = Genode::Irq_session::Info::Type::INVALID, .address = 0, .value = 0 };
|
||||||
|
}
|
||||||
|
|
||||||
|
Genode::Irq_object::Irq_object(unsigned irq) :
|
||||||
|
Thread_deprecated<4096>("irq"),
|
||||||
|
_sig_cap(Signal_context_capability()),
|
||||||
|
_sync_ack(Lock::LOCKED),
|
||||||
|
_sync_bootup(Lock::LOCKED),
|
||||||
|
_irq(irq),
|
||||||
|
_fd(-1)
|
||||||
|
{
|
||||||
|
Genode::warning(__func__, " not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Genode::Irq_object::_associate()
|
||||||
|
{
|
||||||
|
Genode::warning(__func__, " not implemented");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Genode::Irq_object::entry()
|
||||||
|
{
|
||||||
|
Genode::warning(__func__, " not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Genode::Irq_object::ack_irq()
|
||||||
|
{
|
||||||
|
Genode::warning(__func__, " not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Genode::Irq_object::start()
|
||||||
|
{
|
||||||
|
Genode::warning(__func__, " not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Genode::Irq_object::sigh(Signal_context_capability)
|
||||||
|
{
|
||||||
|
Genode::warning(__func__, " not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
37
repos/base-linux/src/core/spec/linux/platform_services.cc
Normal file
37
repos/base-linux/src/core/spec/linux/platform_services.cc
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* \brief Platform specific services for Linux
|
||||||
|
* \author Johannes Kliemann
|
||||||
|
* \date 2017-11-08
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018 Genode Labs GmbH
|
||||||
|
* Copyright (C) 2018 Componolit GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU Affero General Public License version 3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Genode includes */
|
||||||
|
#include <base/service.h>
|
||||||
|
|
||||||
|
/* core includes */
|
||||||
|
#include <core_env.h>
|
||||||
|
#include <platform.h>
|
||||||
|
#include <platform_services.h>
|
||||||
|
#include <io_port_root.h>
|
||||||
|
|
||||||
|
#include <core_linux_syscalls.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add x86 specific ioport service
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Genode
|
||||||
|
{
|
||||||
|
void platform_add_local_services(Rpc_entrypoint &,
|
||||||
|
Sliced_heap &,
|
||||||
|
Registry<Service> &,
|
||||||
|
Trace::Source_registry &)
|
||||||
|
{ }
|
||||||
|
}
|
@ -67,3 +67,10 @@ Dataspace_component::Dataspace_component(const char *args)
|
|||||||
_fd(lx_open(_fname.buf, O_RDONLY | LX_O_CLOEXEC, S_IRUSR | S_IXUSR)),
|
_fd(lx_open(_fname.buf, O_RDONLY | LX_O_CLOEXEC, S_IRUSR | S_IXUSR)),
|
||||||
_writable(false),
|
_writable(false),
|
||||||
_owner(0) { }
|
_owner(0) { }
|
||||||
|
|
||||||
|
Dataspace_component::Dataspace_component(size_t size, addr_t, addr_t phys_addr,
|
||||||
|
Cache_attribute, bool writable, Dataspace_owner *_owner) :
|
||||||
|
_size(size), _addr(phys_addr), _fd(-1), _writable(writable), _owner(_owner)
|
||||||
|
{
|
||||||
|
_fname.buf[0] = 0;
|
||||||
|
}
|
@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* \brief Linux-specific IO_MEM service
|
||||||
|
* \author Johannes Kliemann
|
||||||
|
* \date 2019-11-25
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2006-2019 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU Affero General Public License version 3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <base/log.h>
|
||||||
|
#include <linux_dataspace/client.h>
|
||||||
|
#include <base/internal/page_size.h>
|
||||||
|
|
||||||
|
#include <core_linux_syscalls.h>
|
||||||
|
|
||||||
|
#include <io_mem_session_component.h>
|
||||||
|
|
||||||
|
|
||||||
|
using namespace Genode;
|
||||||
|
|
||||||
|
size_t Io_mem_session_component::get_arg_size(const char *args)
|
||||||
|
{
|
||||||
|
size_t const size = Arg_string::find_arg(args, "size").ulong_value(0);
|
||||||
|
addr_t base = Arg_string::find_arg(args, "base").ulong_value(0);
|
||||||
|
|
||||||
|
addr_t end = align_addr(base + size, get_page_size_log2());
|
||||||
|
base = base & ~(get_page_size() - 1);
|
||||||
|
return (size_t)(end - base);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
addr_t Io_mem_session_component::get_arg_phys(const char *args)
|
||||||
|
{
|
||||||
|
return Arg_string::find_arg(args, "base").ulong_value(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Cache_attribute Io_mem_session_component::get_arg_wc(const char *args)
|
||||||
|
{
|
||||||
|
Arg a = Arg_string::find_arg("wc", args);
|
||||||
|
if (a.valid() && a.bool_value(0)) {
|
||||||
|
return WRITE_COMBINED;
|
||||||
|
} else {
|
||||||
|
return UNCACHED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Io_mem_session_component::Io_mem_session_component(Range_allocator &io_mem_alloc,
|
||||||
|
Range_allocator &,
|
||||||
|
Rpc_entrypoint &ds_ep,
|
||||||
|
const char *args) :
|
||||||
|
_io_mem_alloc(io_mem_alloc),
|
||||||
|
_ds(get_arg_size(args), 0, get_arg_phys(args), get_arg_wc(args), true, 0),
|
||||||
|
_ds_ep(ds_ep),
|
||||||
|
_ds_cap(Io_mem_dataspace_capability())
|
||||||
|
{
|
||||||
|
int _fd = -1;
|
||||||
|
|
||||||
|
_fd = lx_open("/dev/hwio", O_RDWR | O_SYNC);
|
||||||
|
lx_ioctl_iomem(_fd, (unsigned long)get_arg_phys(args), get_arg_size(args));
|
||||||
|
if (_fd > 0) {
|
||||||
|
_ds.fd(_fd);
|
||||||
|
} else {
|
||||||
|
error("Failed to open /dev/hwio");
|
||||||
|
throw Genode::Service_denied();
|
||||||
|
}
|
||||||
|
|
||||||
|
_ds_cap = static_cap_cast<Io_mem_dataspace>(static_cap_cast<Dataspace>(_ds_ep.manage(&_ds)));
|
||||||
|
}
|
||||||
|
|
||||||
|
Io_mem_dataspace_capability Io_mem_session_component::dataspace()
|
||||||
|
{
|
||||||
|
return _ds_cap;
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* \brief Linux-specific IO_PORT service
|
||||||
|
* \author Johannes Kliemann
|
||||||
|
* \date 2019-11-25
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2006-2019 Genode Labs GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU Affero General Public License version 3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <util/string.h>
|
||||||
|
#include <util/arg_string.h>
|
||||||
|
#include <root/root.h>
|
||||||
|
#include <io_port_session_component.h>
|
||||||
|
|
||||||
|
|
||||||
|
Genode::Io_port_session_component::Io_port_session_component(Genode::Range_allocator &io_port_alloc, const char *args)
|
||||||
|
: _io_port_alloc(io_port_alloc)
|
||||||
|
{
|
||||||
|
/* parse for port properties */
|
||||||
|
_base = Arg_string::find_arg(args, "io_port_base").ulong_value(0);
|
||||||
|
_size = Arg_string::find_arg(args, "io_port_size").ulong_value(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Genode::Io_port_session_component::~Io_port_session_component()
|
||||||
|
{}
|
120
repos/base-linux/src/core/spec/pc/irq_session_component.cc
Normal file
120
repos/base-linux/src/core/spec/pc/irq_session_component.cc
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
* \brief IRQ session implementation for base-linux
|
||||||
|
* \author Johannes Kliemann
|
||||||
|
* \date 2018-03-14
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018 Genode Labs GmbH
|
||||||
|
* Copyright (C) 2018 Componolit GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU Affero General Public License version 3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <base/log.h>
|
||||||
|
#include <base/thread.h>
|
||||||
|
|
||||||
|
#include <irq_session_component.h>
|
||||||
|
#include <irq_object.h>
|
||||||
|
|
||||||
|
#include <core_linux_syscalls.h>
|
||||||
|
|
||||||
|
Genode::Irq_session_component::Irq_session_component(Genode::Range_allocator &, const char *args)
|
||||||
|
:
|
||||||
|
_irq_number(Arg_string::find_arg(args, "irq_number").long_value(-1)),
|
||||||
|
_irq_object(_irq_number)
|
||||||
|
{
|
||||||
|
_irq_object.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
Genode::Irq_session_component::~Irq_session_component()
|
||||||
|
{
|
||||||
|
warning(__func__, " not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
void Genode::Irq_session_component::ack_irq()
|
||||||
|
{
|
||||||
|
_irq_object.ack_irq();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Genode::Irq_session_component::sigh(Genode::Signal_context_capability cap)
|
||||||
|
{
|
||||||
|
_irq_object.sigh(cap);
|
||||||
|
}
|
||||||
|
|
||||||
|
Genode::Irq_session::Info Genode::Irq_session_component::info()
|
||||||
|
{
|
||||||
|
return { .type = Genode::Irq_session::Info::Type::INVALID, .address = 0, .value = 0 };
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Genode::Irq_object::Irq_object(unsigned irq) :
|
||||||
|
Thread_deprecated<4096>("irq"),
|
||||||
|
_sig_cap(Signal_context_capability()),
|
||||||
|
_sync_ack(Lock::LOCKED),
|
||||||
|
_sync_bootup(Lock::LOCKED),
|
||||||
|
_irq(irq),
|
||||||
|
_fd(-1)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
bool Genode::Irq_object::_associate()
|
||||||
|
{
|
||||||
|
_fd = lx_open("/dev/hwio", O_RDWR | O_SYNC);
|
||||||
|
|
||||||
|
if (_fd < 0){
|
||||||
|
Genode::error("failed to open /dev/hwio");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lx_ioctl_irq(_fd, _irq) < 0){
|
||||||
|
Genode::error("failed to request irq");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Genode::Irq_object::entry()
|
||||||
|
{
|
||||||
|
if (!_associate()) {
|
||||||
|
error("failed to register IRQ ", _irq);
|
||||||
|
}
|
||||||
|
|
||||||
|
_sync_bootup.unlock();
|
||||||
|
_sync_ack.lock();
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
|
||||||
|
if (lx_read(_fd, 0, 0) < 0) {
|
||||||
|
Genode::warning("failed to read on /dev/hwio");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!_sig_cap.valid()){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Genode::Signal_transmitter(_sig_cap).submit(1);
|
||||||
|
|
||||||
|
_sync_ack.lock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Genode::Irq_object::ack_irq()
|
||||||
|
{
|
||||||
|
_sync_ack.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Genode::Irq_object::start()
|
||||||
|
{
|
||||||
|
Genode::Thread::start();
|
||||||
|
_sync_bootup.lock();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Genode::Irq_object::sigh(Signal_context_capability cap)
|
||||||
|
{
|
||||||
|
_sig_cap = cap;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
44
repos/base-linux/src/core/spec/pc/platform_services.cc
Normal file
44
repos/base-linux/src/core/spec/pc/platform_services.cc
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* \brief Platform specific services for Linux
|
||||||
|
* \author Johannes Kliemann
|
||||||
|
* \date 2017-11-08
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018 Genode Labs GmbH
|
||||||
|
* Copyright (C) 2018 Componolit GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU Affero General Public License version 3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Genode includes */
|
||||||
|
#include <base/service.h>
|
||||||
|
|
||||||
|
/* core includes */
|
||||||
|
#include <core_env.h>
|
||||||
|
#include <platform.h>
|
||||||
|
#include <platform_services.h>
|
||||||
|
#include <io_port_root.h>
|
||||||
|
|
||||||
|
#include <core_linux_syscalls.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add x86 specific ioport service
|
||||||
|
*/
|
||||||
|
namespace Genode
|
||||||
|
{
|
||||||
|
void platform_add_local_services(Rpc_entrypoint &,
|
||||||
|
Sliced_heap &md,
|
||||||
|
Registry<Service> ®,
|
||||||
|
Trace::Source_registry &)
|
||||||
|
{
|
||||||
|
if (!lx_iopl(3)) {
|
||||||
|
static Io_port_root io_port_root(*core_env().pd_session(),
|
||||||
|
platform().io_port_alloc(), md);
|
||||||
|
|
||||||
|
static Core_service<Io_port_session_component>
|
||||||
|
io_port_ls(reg, io_port_root);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
using namespace Genode;
|
using namespace Genode;
|
||||||
|
|
||||||
|
class Invalid_capability : public Genode::Exception {};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return pointer to locally implemented region map
|
* Return pointer to locally implemented region map
|
||||||
@ -27,6 +28,8 @@ using namespace Genode;
|
|||||||
*/
|
*/
|
||||||
static Region_map *_local(Capability<Region_map> cap)
|
static Region_map *_local(Capability<Region_map> cap)
|
||||||
{
|
{
|
||||||
|
if (!cap.valid())
|
||||||
|
throw Invalid_capability();
|
||||||
return Local_capability<Region_map>::deref(cap);
|
return Local_capability<Region_map>::deref(cap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,6 +188,9 @@ Region_map::Local_addr Region_map_mmap::attach(Dataspace_capability ds,
|
|||||||
throw Region_conflict();
|
throw Region_conflict();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!ds.valid())
|
||||||
|
throw Invalid_dataspace();
|
||||||
|
|
||||||
size_t const remaining_ds_size = _dataspace_size(ds) > (addr_t)offset
|
size_t const remaining_ds_size = _dataspace_size(ds) > (addr_t)offset
|
||||||
? _dataspace_size(ds) - (addr_t)offset : 0;
|
? _dataspace_size(ds) - (addr_t)offset : 0;
|
||||||
|
|
||||||
|
45
repos/base-linux/src/lib/initramfs/init.c
Normal file
45
repos/base-linux/src/lib/initramfs/init.c
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* \brief Linux initramfs init binary to load Genode as init process
|
||||||
|
* \author Johannes Kliemann
|
||||||
|
* \date 2018-04-19
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018 Genode Labs GmbH
|
||||||
|
* Copyright (C) 2018 Componolit GmbH
|
||||||
|
*
|
||||||
|
* This file is part of the Genode OS framework, which is distributed
|
||||||
|
* under the terms of the GNU Affero General Public License version 3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/mount.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc __attribute__((unused)), char *argv[] __attribute__((unused)))
|
||||||
|
{
|
||||||
|
char *args = "core";
|
||||||
|
|
||||||
|
printf("preparing environment for Genode\n");
|
||||||
|
if (mount("none", "/dev", "devtmpfs", 0, ""))
|
||||||
|
perror("mount");
|
||||||
|
|
||||||
|
close(open("/dev/platform_info", O_RDONLY));
|
||||||
|
|
||||||
|
printf("loading Genode on Linux\n");
|
||||||
|
if (chdir("/genode")){
|
||||||
|
perror("failed to chdir into /genode");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (execve("core", &args, NULL)){
|
||||||
|
perror("failed to start core");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
20
repos/base-linux/src/lib/initramfs/target.mk
Normal file
20
repos/base-linux/src/lib/initramfs/target.mk
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
TARGET = lx_init
|
||||||
|
|
||||||
|
INITRAMFS = initramfs
|
||||||
|
INITRAMFS_SRC_C = init.c
|
||||||
|
|
||||||
|
EXT_OBJECTS += $(BUILD_BASE_DIR)/lib/initramfs/$(INITRAMFS)
|
||||||
|
|
||||||
|
$(TARGET): $(INITRAMFS)
|
||||||
|
|
||||||
|
$(INITRAMFS): $(INITRAMFS_SRC_C)
|
||||||
|
$(MSG_BUILD)$(INITRAMFS)
|
||||||
|
$(VERBOSE)gcc $^ -O0 $(CC_MARCH) -Wall -W -Wextra -Werror -std=gnu99 -o $@ -Wl,-O3 -Wl,--as-needed -static
|
||||||
|
$(VERBOSE)ln -sf $(BUILD_BASE_DIR)/lib/initramfs/$(INITRAMFS) $(BUILD_BASE_DIR)/bin/
|
||||||
|
|
||||||
|
clean_initramfs:
|
||||||
|
$(VERBOSE)rm -rf $(INITRAMFS)
|
||||||
|
|
||||||
|
clean: clean_initramfs
|
||||||
|
|
||||||
|
vpath init.c $(PRG_DIR)
|
Loading…
Reference in New Issue
Block a user