2011-12-22 16:19:25 +01:00
|
|
|
/*
|
|
|
|
* \brief Core-internal dataspace representation on Linux
|
|
|
|
* \author Norman Feske
|
|
|
|
* \date 2006-05-19
|
|
|
|
*
|
|
|
|
* On Linux userland, we do not deal with physical memory. Instead,
|
|
|
|
* we create a file for each dataspace that is to be mmapped.
|
|
|
|
* Therefore, the allocator is not really used for allocating
|
|
|
|
* memory but only as a container for quota.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
2017-02-20 13:23:52 +01:00
|
|
|
* Copyright (C) 2006-2017 Genode Labs GmbH
|
2011-12-22 16:19:25 +01:00
|
|
|
*
|
|
|
|
* This file is part of the Genode OS framework, which is distributed
|
2017-02-20 13:23:52 +01:00
|
|
|
* under the terms of the GNU Affero General Public License version 3.
|
2011-12-22 16:19:25 +01:00
|
|
|
*/
|
|
|
|
|
2016-01-20 20:52:51 +01:00
|
|
|
#ifndef _CORE__INCLUDE__DATASPACE_COMPONENT_H_
|
|
|
|
#define _CORE__INCLUDE__DATASPACE_COMPONENT_H_
|
2011-12-22 16:19:25 +01:00
|
|
|
|
|
|
|
#include <linux_dataspace/linux_dataspace.h>
|
|
|
|
#include <util/string.h>
|
|
|
|
#include <util/misc_math.h>
|
|
|
|
#include <base/rpc_server.h>
|
|
|
|
|
2016-06-15 15:04:54 +02:00
|
|
|
/* base-internal includes */
|
|
|
|
#include <base/internal/capability_space_tpl.h>
|
|
|
|
|
2011-12-22 16:19:25 +01:00
|
|
|
namespace Genode {
|
|
|
|
|
2012-04-20 10:59:41 +02:00
|
|
|
/**
|
|
|
|
* Deriving classes can own a dataspace to implement conditional behavior
|
|
|
|
*/
|
|
|
|
class Dataspace_owner { };
|
|
|
|
|
2011-12-22 16:19:25 +01:00
|
|
|
class Dataspace_component : public Rpc_object<Linux_dataspace>
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
|
2015-09-25 10:50:08 +02:00
|
|
|
Filename _fname; /* filename for mmap */
|
2011-12-22 16:19:25 +01:00
|
|
|
size_t _size; /* size of dataspace in bytes */
|
|
|
|
addr_t _addr; /* meaningless on linux */
|
2012-08-10 14:21:26 +02:00
|
|
|
int _fd; /* file descriptor */
|
2011-12-22 16:19:25 +01:00
|
|
|
bool _writable; /* false if read-only */
|
|
|
|
|
2012-04-20 10:59:41 +02:00
|
|
|
/* Holds the dataspace owner if a distinction between owner and
|
|
|
|
* others is necessary on the dataspace, otherwise it is 0 */
|
|
|
|
Dataspace_owner * _owner;
|
|
|
|
|
2015-09-25 10:50:08 +02:00
|
|
|
static Filename _file_name(const char *args);
|
|
|
|
size_t _file_size();
|
|
|
|
|
2011-12-22 16:19:25 +01:00
|
|
|
public:
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Constructor
|
|
|
|
*/
|
2012-06-18 15:20:31 +02:00
|
|
|
Dataspace_component(size_t size, addr_t addr,
|
2014-06-19 16:37:31 +02:00
|
|
|
Cache_attribute, bool writable,
|
2012-06-18 15:20:31 +02:00
|
|
|
Dataspace_owner * owner)
|
2012-08-10 14:21:26 +02:00
|
|
|
: _size(size), _addr(addr), _fd(-1), _writable(writable),
|
2012-04-20 10:59:41 +02:00
|
|
|
_owner(owner) { }
|
2011-12-22 16:19:25 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Default constructor returns invalid dataspace
|
|
|
|
*/
|
2012-08-10 14:21:26 +02:00
|
|
|
Dataspace_component()
|
|
|
|
: _size(0), _addr(0), _fd(-1), _writable(false), _owner(0) { }
|
2011-12-22 16:19:25 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* This constructor is only provided for compatibility
|
|
|
|
* reasons and should not be used.
|
|
|
|
*/
|
|
|
|
Dataspace_component(size_t size, addr_t core_local_addr,
|
2014-06-19 16:37:31 +02:00
|
|
|
addr_t phys_addr, Cache_attribute,
|
2012-06-18 15:20:31 +02:00
|
|
|
bool writable, Dataspace_owner * _owner)
|
2012-08-10 14:21:26 +02:00
|
|
|
:
|
|
|
|
_size(size), _addr(phys_addr), _fd(-1), _owner(_owner)
|
2011-12-22 16:19:25 +01:00
|
|
|
{
|
2016-10-10 16:22:43 +02:00
|
|
|
warning("Should only be used for IOMEM and not within Linux.");
|
2012-08-10 14:21:26 +02:00
|
|
|
_fname.buf[0] = 0;
|
2011-12-22 16:19:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2015-09-25 10:50:08 +02:00
|
|
|
* This constructor is especially used for ROM dataspaces
|
2011-12-22 16:19:25 +01:00
|
|
|
*
|
2015-09-25 10:50:08 +02:00
|
|
|
* \param args session parameters containing 'filename' key/value
|
2011-12-22 16:19:25 +01:00
|
|
|
*/
|
2015-09-25 10:50:08 +02:00
|
|
|
Dataspace_component(const char *args);
|
2011-12-22 16:19:25 +01:00
|
|
|
|
2012-08-10 14:21:26 +02:00
|
|
|
/**
|
|
|
|
* Assign file descriptor to dataspace
|
|
|
|
*
|
|
|
|
* The file descriptor assigned to the dataspace will be enable
|
|
|
|
* processes outside of core to mmap the dataspace.
|
|
|
|
*/
|
|
|
|
void fd(int fd) { _fd = fd; }
|
|
|
|
|
2012-04-20 10:59:41 +02:00
|
|
|
/**
|
|
|
|
* Check if dataspace is owned by a specified object
|
|
|
|
*/
|
2017-05-07 23:49:43 +02:00
|
|
|
bool owner(Dataspace_owner const *o) const { return _owner == o; }
|
2011-12-22 16:19:25 +01:00
|
|
|
|
2015-07-06 13:06:27 +02:00
|
|
|
/**
|
|
|
|
* Detach dataspace from all rm sessions.
|
|
|
|
*/
|
|
|
|
void detach_from_rm_sessions() { }
|
|
|
|
|
2011-12-22 16:19:25 +01:00
|
|
|
/*************************
|
|
|
|
** Dataspace interface **
|
|
|
|
*************************/
|
|
|
|
|
|
|
|
size_t size() { return _size; }
|
|
|
|
addr_t phys_addr() { return _addr; }
|
|
|
|
bool writable() { return _writable; }
|
|
|
|
|
|
|
|
|
|
|
|
/****************************************
|
|
|
|
** Linux-specific dataspace interface **
|
|
|
|
****************************************/
|
|
|
|
|
|
|
|
Filename fname() { return _fname; }
|
2012-08-10 14:21:26 +02:00
|
|
|
|
|
|
|
Untyped_capability fd()
|
|
|
|
{
|
2016-06-15 15:04:54 +02:00
|
|
|
Untyped_capability fd_cap =
|
|
|
|
Capability_space::import(Rpc_destination(_fd), Rpc_obj_key());
|
|
|
|
|
|
|
|
return fd_cap;
|
2012-08-10 14:21:26 +02:00
|
|
|
}
|
2011-12-22 16:19:25 +01:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2016-01-20 20:52:51 +01:00
|
|
|
#endif /* _CORE__INCLUDE__DATASPACE_COMPONENT_H_ */
|