diff --git a/repos/os/include/block/driver.h b/repos/os/include/block/driver.h
index 6d3fc2309d..0e550765fb 100644
--- a/repos/os/include/block/driver.h
+++ b/repos/os/include/block/driver.h
@@ -19,8 +19,7 @@
#include
#include
#include
-
-#include
+#include
#include
namespace Block {
@@ -64,15 +63,6 @@ class Block::Driver_session : public Driver_session_base,
Genode::Dataspace_capability tx_ds,
Genode::Rpc_entrypoint &ep)
: Session_rpc_object(rm, tx_ds, ep) { }
-
- /**
- * Constructor
- *
- * \deprecated
- */
- Driver_session(Genode::Dataspace_capability tx_ds,
- Genode::Rpc_entrypoint &ep) __attribute__((deprecated))
- : Session_rpc_object(*Genode::env_deprecated()->rm_session(), tx_ds, ep) { }
};
@@ -89,7 +79,7 @@ class Block::Driver : Genode::Interface
Driver(Driver const &);
Driver &operator = (Driver const &);
- Genode::Ram_session &_ram_session;
+ Genode::Ram_allocator &_ram;
Driver_session_base *_session = nullptr;
@@ -104,8 +94,7 @@ class Block::Driver : Genode::Interface
/**
* Constructor
*/
- Driver(Genode::Ram_session &ram_session)
- : _ram_session(ram_session) { }
+ Driver(Genode::Ram_allocator &ram) : _ram(ram) { }
/**
* Destructor
@@ -215,7 +204,7 @@ class Block::Driver : Genode::Interface
*/
virtual Genode::Ram_dataspace_capability
alloc_dma_buffer(Genode::size_t size) {
- return _ram_session.alloc(size); }
+ return _ram.alloc(size); }
/**
* Free buffer which is suitable for DMA.
@@ -223,7 +212,7 @@ class Block::Driver : Genode::Interface
* Note: has to be overriden by DMA-capable devices
*/
virtual void free_dma_buffer(Genode::Ram_dataspace_capability c) {
- return _ram_session.free(c); }
+ return _ram.free(c); }
/**
* Synchronize with device.
diff --git a/repos/os/include/cli_monitor/child.h b/repos/os/include/cli_monitor/child.h
index dd6ea399d6..c963cb7912 100644
--- a/repos/os/include/cli_monitor/child.h
+++ b/repos/os/include/cli_monitor/child.h
@@ -49,6 +49,8 @@ class Cli_monitor::Child_base : public Genode::Child_policy
private:
+ Genode::Env &_env;
+
Ram &_ram;
Genode::Allocator &_alloc;
@@ -59,9 +61,6 @@ class Cli_monitor::Child_base : public Genode::Child_policy
Genode::Pd_session_capability _ref_pd_cap;
Genode::Pd_session &_ref_pd;
- Genode::Ram_session_capability _ref_ram_cap;
- Genode::Ram_session &_ref_ram;
-
Cap_quota _cap_quota;
size_t _ram_quota;
@@ -101,6 +100,26 @@ class Cli_monitor::Child_base : public Genode::Child_policy
Genode::Child _child;
+ Genode::Service &_matching_service(Genode::Service::Name const &name,
+ Genode::Session_label const &label)
+ {
+ Genode::Service *service = nullptr;
+
+ /* check for config file request */
+ if ((service = _config_policy.resolve_session_request(name, label)))
+ return *service;
+
+ /* populate session-local parent service registry on demand */
+ _parent_services.for_each([&] (Parent_service &s) {
+ if (s.name() == name)
+ service = &s; });
+
+ if (service)
+ return *service;
+
+ return *new (_alloc) Parent_service(_parent_services, _env, name);
+ }
+
public:
/**
@@ -112,14 +131,13 @@ class Cli_monitor::Child_base : public Genode::Child_policy
* \param alloc allocator used to fill parent-service registry
* on demand
*/
- Child_base(Ram &ram,
+ Child_base(Genode::Env &env,
+ Ram &ram,
Genode::Allocator &alloc,
Name const &label,
Binary_name const &binary_name,
Genode::Pd_session &ref_pd,
Genode::Pd_session_capability ref_pd_cap,
- Genode::Ram_session &ref_ram,
- Genode::Ram_session_capability ref_ram_cap,
Genode::Region_map &local_rm,
Cap_quota cap_quota,
Genode::size_t ram_quota,
@@ -127,13 +145,12 @@ class Cli_monitor::Child_base : public Genode::Child_policy
Genode::Signal_context_capability yield_response_sig_cap,
Genode::Signal_context_capability exit_sig_cap)
:
- _ram(ram), _alloc(alloc),
+ _env(env), _ram(ram), _alloc(alloc),
_label(label), _binary_name(binary_name),
- _ref_pd_cap (ref_pd_cap), _ref_pd (ref_pd),
- _ref_ram_cap(ref_ram_cap), _ref_ram(ref_ram),
+ _ref_pd_cap (ref_pd_cap), _ref_pd (ref_pd),
_cap_quota(cap_quota), _ram_quota(ram_quota), _ram_limit(ram_limit),
_entrypoint(&ref_pd, ENTRYPOINT_STACK_SIZE, _label.string(), false),
- _config_policy(local_rm, "config", _entrypoint, &ref_ram),
+ _config_policy(local_rm, "config", _entrypoint, &_env.ram()),
_yield_response_sigh_cap(yield_response_sig_cap),
_exit_sig_cap(exit_sig_cap),
_child(local_rm, _entrypoint, *this)
@@ -183,7 +200,7 @@ class Cli_monitor::Child_base : public Genode::Child_policy
if (!amount)
return;
- _ram.withdraw_from(_child.ram_session_cap(), amount);
+ _ram.withdraw_from(_child.pd_session_cap(), amount);
_ram_quota -= amount;
}
@@ -194,12 +211,12 @@ class Cli_monitor::Child_base : public Genode::Child_policy
*/
void upgrade_ram_quota(size_t amount)
{
- _ram.transfer_to(_child.ram_session_cap(), amount);
+ _ram.transfer_to(_child.pd_session_cap(), amount);
_ram_quota += amount;
/* wake up child if resource request is in flight */
size_t const req = requested_ram_quota();
- if (req && _child.ram().avail_ram().value >= req) {
+ if (req && _child.pd().avail_ram().value >= req) {
_child.notify_resource_avail();
/* clear request state */
@@ -258,16 +275,16 @@ class Cli_monitor::Child_base : public Genode::Child_policy
/**
* Return RAM quota status of the child
*
- * XXX should be a const method, but the 'Ram_session' accessors
+ * XXX should be a const method, but the 'Pd_session' accessors
* are not const
*/
Ram_status ram_status()
{
return Ram_status(_ram_quota,
_ram_limit,
- _ram_quota - _child.ram().ram_quota().value,
- _child.ram().used_ram().value,
- _child.ram().avail_ram().value,
+ _ram_quota - _child.pd().ram_quota().value,
+ _child.pd().used_ram().value,
+ _child.pd().avail_ram().value,
requested_ram_quota());
}
@@ -294,24 +311,12 @@ class Cli_monitor::Child_base : public Genode::Child_policy
_ref_pd.transfer_quota(cap, Genode::Ram_quota{_ram_quota});
}
- Genode::Service &resolve_session_request(Genode::Service::Name const &name,
- Genode::Session_state::Args const &args) override
+ Route resolve_session_request(Genode::Service::Name const &name,
+ Genode::Session_label const &label) override
{
- Genode::Service *service = nullptr;
-
- /* check for config file request */
- if ((service = _config_policy.resolve_session_request(name.string(), args.string())))
- return *service;
-
- /* populate session-local parent service registry on demand */
- _parent_services.for_each([&] (Parent_service &s) {
- if (s.name() == name)
- service = &s; });
-
- if (service)
- return *service;
-
- return *new (_alloc) Parent_service(_parent_services, name);
+ return Route { .service = _matching_service(name, label),
+ .label = label,
+ .diag = Genode::Session::Diag() };
}
void yield_response()
@@ -319,8 +324,8 @@ class Cli_monitor::Child_base : public Genode::Child_policy
if (_withdraw_on_yield_response) {
enum { RESERVE = 4*1024*1024 };
- size_t amount = _child.ram().avail_ram().value < RESERVE
- ? 0 : _child.ram().avail_ram().value - RESERVE;
+ size_t amount = _child.pd().avail_ram().value < RESERVE
+ ? 0 : _child.pd().avail_ram().value - RESERVE;
/* try to immediately withdraw freed-up resources */
try { withdraw_ram_quota(amount); }
diff --git a/repos/os/include/cli_monitor/ram.h b/repos/os/include/cli_monitor/ram.h
index 8ea492d651..7f6a42ae2a 100644
--- a/repos/os/include/cli_monitor/ram.h
+++ b/repos/os/include/cli_monitor/ram.h
@@ -106,7 +106,7 @@ class Cli_monitor::Ram
/**
* \throw Transfer_quota_failed
*/
- void withdraw_from(Genode::Ram_session_capability from, size_t amount)
+ void withdraw_from(Genode::Pd_session_capability from, size_t amount)
{
using namespace Genode;
@@ -121,7 +121,7 @@ class Cli_monitor::Ram
/**
* \throw Transfer_quota_failed
*/
- void transfer_to(Genode::Ram_session_capability to, size_t amount)
+ void transfer_to(Genode::Pd_session_capability to, size_t amount)
{
Genode::Lock::Guard guard(_lock);
diff --git a/repos/os/include/decorator/window_stack.h b/repos/os/include/decorator/window_stack.h
index cec1d9b3ca..fe11f06540 100644
--- a/repos/os/include/decorator/window_stack.h
+++ b/repos/os/include/decorator/window_stack.h
@@ -45,7 +45,7 @@ class Decorator::Window_stack : public Window_base::Draw_behind_fn
{
for (node = node.sub_node("window"); ; node = node.next()) {
- if (node.has_type("window") && attribute(node, "id", 0UL) == id)
+ if (node.has_type("window") && node.attribute_value("id", 0UL) == id)
return node;
if (node.last()) break;
diff --git a/repos/os/include/input/component.h b/repos/os/include/input/component.h
index 27d887c6ca..c606823e89 100644
--- a/repos/os/include/input/component.h
+++ b/repos/os/include/input/component.h
@@ -38,26 +38,13 @@ class Input::Session_component : public Genode::Rpc_object
/**
* Constructor
*
- * \param env Env containing local region map
- * \param ram Ram session at which to allocate session buffer
+ * \param ram allocator for the session buffer
*/
- Session_component(Genode::Env &env, Genode::Ram_session &ram)
+ Session_component(Genode::Env &env, Genode::Ram_allocator &ram)
:
_ds(ram, env.rm(), Event_queue::QUEUE_SIZE*sizeof(Input::Event))
{ }
- /**
- * Constructor
- *
- * \noapi
- * \deprecated
- */
- Session_component() __attribute__((deprecated))
- : _ds(*Genode::env_deprecated()->ram_session(),
- *Genode::env_deprecated()->rm_session(),
- Event_queue::QUEUE_SIZE*sizeof(Input::Event))
- { }
-
/**
* Return reference to event queue of the session
*/
@@ -85,11 +72,6 @@ class Input::Session_component : public Genode::Rpc_object
bool pending() const override { return !_event_queue.empty(); }
- /*
- * \deprecated use 'pending' instead
- */
- bool is_pending() const { return pending(); }
-
int flush() override
{
Input::Event *dst = _ds.local_addr();
diff --git a/repos/os/include/mixer/channel.h b/repos/os/include/mixer/channel.h
index 86d9b26983..bdbf93ac3e 100644
--- a/repos/os/include/mixer/channel.h
+++ b/repos/os/include/mixer/channel.h
@@ -41,21 +41,18 @@ struct Mixer::Channel
Channel(Genode::Xml_node const &node)
{
- Genode::String<8> tmp;
- try { node.attribute("type").value(&tmp); }
- catch (...) { throw Invalid_channel(); }
+ typedef Genode::String<8> Type;
+ Type const type_name = node.attribute_value("type", Type());
- if (tmp == "input") type = INPUT;
- else if (tmp == "output") type = OUTPUT;
- else throw Invalid_channel();
+ if (type_name == "input") type = INPUT;
+ else if (type_name == "output") type = OUTPUT;
+ else throw Invalid_channel();
- try {
- node.attribute("label").value(&label);
- number = (Channel::Number) node.attribute_value("number", 0);
- volume = node.attribute_value("volume", 0);
- active = node.attribute_value("active", true);
- muted = node.attribute_value("muted", true);
- } catch (...) { throw Invalid_channel(); }
+ label = node.attribute_value("label", Label());
+ number = (Channel::Number) node.attribute_value("number", 0L);
+ volume = node.attribute_value("volume", 0L);
+ active = node.attribute_value("active", true);
+ muted = node.attribute_value("muted", true);
}
};
diff --git a/repos/os/include/nic/component.h b/repos/os/include/nic/component.h
index e5275311e1..4f6a59b423 100644
--- a/repos/os/include/nic/component.h
+++ b/repos/os/include/nic/component.h
@@ -34,15 +34,15 @@ class Nic::Communication_buffers
Nic::Packet_allocator _rx_packet_alloc;
Genode::Attached_ram_dataspace _tx_ds, _rx_ds;
- Communication_buffers(Genode::Allocator &rx_block_md_alloc,
- Genode::Ram_session &ram_session,
- Genode::Region_map ®ion_map,
- Genode::size_t tx_size,
- Genode::size_t rx_size)
+ Communication_buffers(Genode::Allocator &rx_block_md_alloc,
+ Genode::Ram_allocator &ram,
+ Genode::Region_map ®ion_map,
+ Genode::size_t tx_size,
+ Genode::size_t rx_size)
:
_rx_packet_alloc(&rx_block_md_alloc),
- _tx_ds(ram_session, region_map, tx_size),
- _rx_ds(ram_session, region_map, rx_size)
+ _tx_ds(ram, region_map, tx_size),
+ _rx_ds(ram, region_map, rx_size)
{ }
};
diff --git a/repos/os/include/os/buffered_xml.h b/repos/os/include/os/buffered_xml.h
index 3b65be00ed..913da6eb12 100644
--- a/repos/os/include/os/buffered_xml.h
+++ b/repos/os/include/os/buffered_xml.h
@@ -16,6 +16,7 @@
/* Genode includes */
#include
+#include
namespace Genode { class Buffered_xml; }
@@ -33,8 +34,13 @@ class Genode::Buffered_xml
*/
static char const *_init_ptr(Allocator &alloc, Xml_node node)
{
- char *ptr = (char *)alloc.alloc(node.size());
- Genode::memcpy(ptr, node.addr(), node.size());
+ char *ptr = nullptr;
+
+ node.with_raw_node([&] (char const *start, size_t length) {
+ ptr = (char *)alloc.alloc(length);
+ Genode::memcpy(ptr, start, length);
+ });
+
return ptr;
}
diff --git a/repos/os/include/os/child_policy_dynamic_rom.h b/repos/os/include/os/child_policy_dynamic_rom.h
index 239ca6622c..2a305eef23 100644
--- a/repos/os/include/os/child_policy_dynamic_rom.h
+++ b/repos/os/include/os/child_policy_dynamic_rom.h
@@ -17,10 +17,10 @@
#ifndef _INCLUDE__OS__CHILD_POLICY_DYNAMIC_ROM_H_
#define _INCLUDE__OS__CHILD_POLICY_DYNAMIC_ROM_H_
-#include
-#include
+#include
#include
#include
+#include
namespace Genode { class Child_policy_dynamic_rom_file; }
@@ -36,8 +36,8 @@ class Genode::Child_policy_dynamic_rom_file : public Rpc_object,
Child_policy_dynamic_rom_file(Child_policy_dynamic_rom_file const &);
Child_policy_dynamic_rom_file &operator = (Child_policy_dynamic_rom_file const &);
- Ram_session *_ram;
- Region_map &_rm;
+ Ram_allocator *_ram;
+ Region_map &_rm;
/*
* The ROM module may be written and consumed by different threads,
@@ -85,7 +85,7 @@ class Genode::Child_policy_dynamic_rom_file : public Rpc_object,
Child_policy_dynamic_rom_file(Region_map &rm,
char const *module_name,
Rpc_entrypoint &ep,
- Ram_session *ram)
+ Ram_allocator *ram)
:
Service("ROM"),
_ram(ram), _rm(rm),
@@ -96,29 +96,6 @@ class Genode::Child_policy_dynamic_rom_file : public Rpc_object,
_module_name(module_name)
{ }
- /**
- * Constructor
- *
- * \param ram RAM session used to allocate the backing store
- * for buffering ROM module data
- *
- * \deprecated
- *
- * If 'ram' is 0, the child policy is ineffective.
- */
- Child_policy_dynamic_rom_file(char const *module_name,
- Rpc_entrypoint &ep,
- Ram_session *ram) __attribute__((deprecated))
- :
- Service("ROM"),
- _ram(ram), _rm(*env_deprecated()->rm_session()),
- _fg(*_ram, _rm, 0), _bg(*_ram, _rm, 0),
- _bg_has_pending_data(false),
- _ep(ep),
- _rom_session_cap(_ep.manage(this)),
- _module_name(module_name)
- { }
-
/**
* Destructor
*/
@@ -219,16 +196,15 @@ class Genode::Child_policy_dynamic_rom_file : public Rpc_object,
** Policy interface **
**********************/
- Service *resolve_session_request(const char *service_name,
- const char *args)
+ Service *resolve_session_request(Service::Name const &name,
+ Session_label const &label)
{
- if (!_ram) return 0;
+ if (!_ram) return nullptr;
/* ignore session requests for non-ROM services */
- if (strcmp(service_name, "ROM")) return 0;
+ if (name != "ROM") return nullptr;
/* drop out if request refers to another module name */
- Session_label const label = label_from_args(args);
return _module_name == label.last_element() ? this : 0;
}
};
diff --git a/repos/os/include/os/dynamic_rom_session.h b/repos/os/include/os/dynamic_rom_session.h
index 8eef7c62ed..69ac993ac7 100644
--- a/repos/os/include/os/dynamic_rom_session.h
+++ b/repos/os/include/os/dynamic_rom_session.h
@@ -48,7 +48,7 @@ class Genode::Dynamic_rom_session : public Rpc_object
Lock _lock { };
Rpc_entrypoint &_ep;
- Ram_session &_ram;
+ Ram_allocator &_ram;
Region_map &_rm;
Signal_context_capability _sigh { };
Content_producer &_content_producer;
@@ -135,7 +135,7 @@ class Genode::Dynamic_rom_session : public Rpc_object
* Constructor
*
* \param ep entrypoint serving the ROM session
- * \param ram RAM session used to allocate the backing
+ * \param ram Allocator used to allocate the backing
* store for the dataspace handed out to the
* client
* \param rm local region map ('env.rm()') required to
@@ -147,7 +147,7 @@ class Genode::Dynamic_rom_session : public Rpc_object
* The 'Dynamic_rom_session' associates/disassociates itself with 'ep'.
*/
Dynamic_rom_session(Rpc_entrypoint &ep,
- Ram_session &ram,
+ Ram_allocator &ram,
Region_map &rm,
Content_producer &content_producer)
:
diff --git a/repos/os/include/os/packet_stream.h b/repos/os/include/os/packet_stream.h
index 2da193e89c..c34e78ddaa 100644
--- a/repos/os/include/os/packet_stream.h
+++ b/repos/os/include/os/packet_stream.h
@@ -78,6 +78,7 @@
/* Genode includes */
#include
#include
+#include
#include
#include
#include
diff --git a/repos/os/include/os/path.h b/repos/os/include/os/path.h
index 663edf2a37..2fd22f40d3 100644
--- a/repos/os/include/os/path.h
+++ b/repos/os/include/os/path.h
@@ -375,6 +375,13 @@ class Genode::Path : public Path_base
Path(char const *path, char const *pwd = 0)
: Path_base(_buf, sizeof(_buf), path, pwd) { }
+ /**
+ * Constructor that implicitly imports a 'String'
+ */
+ template
+ Path(String const &string)
+ : Path_base(_buf, sizeof(_buf), string.string(), nullptr) { }
+
static constexpr size_t capacity() { return MAX_LEN; }
Path& operator=(char const *path)
diff --git a/repos/os/include/os/session_requester.h b/repos/os/include/os/session_requester.h
index d153f6741d..f798eba271 100644
--- a/repos/os/include/os/session_requester.h
+++ b/repos/os/include/os/session_requester.h
@@ -64,7 +64,7 @@ class Genode::Session_requester
* \param ram backing store for the ROM dataspace
* \param rm local address space, needed to populate the dataspace
*/
- Session_requester(Rpc_entrypoint &ep, Ram_session &ram, Region_map &rm)
+ Session_requester(Rpc_entrypoint &ep, Ram_allocator &ram, Region_map &rm)
:
_session(ep, ram, rm, _content_producer)
{ }
diff --git a/repos/os/include/os/single_session_service.h b/repos/os/include/os/single_session_service.h
index bf5709cf55..5b15afe21f 100644
--- a/repos/os/include/os/single_session_service.h
+++ b/repos/os/include/os/single_session_service.h
@@ -42,7 +42,7 @@ class Genode::Single_session_service
{
Client(Session_capability cap) : SESSION::Client(cap) { }
Client(Region_map &rm, Session_capability cap) : SESSION::Client(rm, cap) { }
- Session_capability cap() const { return *this; }
+ Session_capability cap() const { return this->rpc_cap(); }
};
typedef Local_service Service;
diff --git a/repos/os/include/os/static_parent_services.h b/repos/os/include/os/static_parent_services.h
index 4abc8b2fce..6f8278a09f 100644
--- a/repos/os/include/os/static_parent_services.h
+++ b/repos/os/include/os/static_parent_services.h
@@ -42,8 +42,8 @@ class Genode::Static_parent_services : public Registry service;
Service_recursive tail;
- Service_recursive(Registry > ®istry)
- : service(registry, HEAD::service_name()), tail(registry) { }
+ Service_recursive(Env &env, Registry > ®istry)
+ : service(registry, env, HEAD::service_name()), tail(env, registry) { }
};
template
@@ -51,11 +51,15 @@ class Genode::Static_parent_services : public Registry service;
- Service_recursive(Registry > ®istry)
- : service(registry, LAST::service_name()) { }
+ Service_recursive(Env &env, Registry > ®istry)
+ : service(registry, env, LAST::service_name()) { }
};
- Service_recursive _service_recursive { *this };
+ Service_recursive _service_recursive;
+
+ public:
+
+ Static_parent_services(Env &env) : _service_recursive(env, *this) { }
};
#endif /* _INCLUDE__OS__STATIC_PARENT_SERVICES_H_ */
diff --git a/repos/os/include/report_rom/rom_module.h b/repos/os/include/report_rom/rom_module.h
index 9f8013f7fd..2817876643 100644
--- a/repos/os/include/report_rom/rom_module.h
+++ b/repos/os/include/report_rom/rom_module.h
@@ -136,8 +136,8 @@ struct Rom::Module : private Module_list::Element, Readable_module
Name _name;
- Genode::Ram_session &_ram;
- Genode::Region_map &_rm;
+ Genode::Ram_allocator &_ram;
+ Genode::Region_map &_rm;
Read_policy const &_read_policy;
Write_policy const &_write_policy;
@@ -174,8 +174,7 @@ struct Rom::Module : private Module_list::Element, Readable_module
/**
* Constructor
*
- * \param ram RAM session from which to allocate the module's
- * backing store
+ * \param ram allocator for the module's backing store
* \param rm region map of the local address space, needed
* to access the allocated backing store
* \param name module name
@@ -184,11 +183,11 @@ struct Rom::Module : private Module_list::Element, Readable_module
* \param write_policy policy hook function that is evaluated each
* time when the module content is changed
*/
- Module(Genode::Ram_session &ram,
- Genode::Region_map &rm,
- Name const &name,
- Read_policy const &read_policy,
- Write_policy const &write_policy)
+ Module(Genode::Ram_allocator &ram,
+ Genode::Region_map &rm,
+ Name const &name,
+ Read_policy const &read_policy,
+ Write_policy const &write_policy)
:
_name(name), _ram(ram), _rm(rm),
_read_policy(read_policy), _write_policy(write_policy)
diff --git a/repos/os/include/report_rom/rom_service.h b/repos/os/include/report_rom/rom_service.h
index 2e0a12835d..4001fa93d9 100644
--- a/repos/os/include/report_rom/rom_service.h
+++ b/repos/os/include/report_rom/rom_service.h
@@ -35,8 +35,8 @@ class Rom::Session_component : public Genode::Rpc_object,
{
private:
- Genode::Ram_session &_ram;
- Genode::Region_map &_rm;
+ Genode::Ram_allocator &_ram;
+ Genode::Region_map &_rm;
Registry_for_reader &_registry;
@@ -71,7 +71,7 @@ class Rom::Session_component : public Genode::Rpc_object,
public:
- Session_component(Genode::Ram_session &ram, Genode::Region_map &rm,
+ Session_component(Genode::Ram_allocator &ram, Genode::Region_map &rm,
Registry_for_reader ®istry,
Genode::Session_label const &label)
:
@@ -79,20 +79,6 @@ class Rom::Session_component : public Genode::Rpc_object,
_registry(registry), _label(label), _module(_init_module(label))
{ }
- /**
- * Constructor
- *
- * \deprecated
- * \noapi
- */
- Session_component(Registry_for_reader ®istry,
- Genode::Session_label const &label) __attribute__((deprecated))
- :
- _ram(*Genode::env_deprecated()->ram_session()),
- _rm(*Genode::env_deprecated()->rm_session()),
- _registry(registry), _label(label), _module(_init_module(label))
- { }
-
~Session_component()
{
_registry.release(*this, _module);
diff --git a/repos/os/include/spec/x86/platform_device/platform_device.h b/repos/os/include/spec/x86/platform_device/platform_device.h
index 4d7f95766d..7c96ed16ae 100644
--- a/repos/os/include/spec/x86/platform_device/platform_device.h
+++ b/repos/os/include/spec/x86/platform_device/platform_device.h
@@ -11,15 +11,16 @@
* under the terms of the GNU Affero General Public License version 3.
*/
-#pragma once
+#ifndef _INCLUDE__SPEC__X86__PLATFORM_DEVICE__PLATFORM_DEVICE_H_
+#define _INCLUDE__SPEC__X86__PLATFORM_DEVICE__PLATFORM_DEVICE_H_
#include
#include
#include
+#include
#include
#include
#include
-#include
/* os includes */
#include
@@ -257,3 +258,5 @@ struct Platform::Device : Platform::Abstract_device
Rpc_class_code, Rpc_resource, Rpc_config_read,
Rpc_config_write, Rpc_irq, Rpc_io_port, Rpc_io_mem);
};
+
+#endif /* _INCLUDE__SPEC__X86__PLATFORM_DEVICE__PLATFORM_DEVICE_H_ */
diff --git a/repos/os/include/spec/x86/platform_session/platform_session.h b/repos/os/include/spec/x86/platform_session/platform_session.h
index a4212a007c..831f72e139 100644
--- a/repos/os/include/spec/x86/platform_session/platform_session.h
+++ b/repos/os/include/spec/x86/platform_session/platform_session.h
@@ -11,13 +11,14 @@
* under the terms of the GNU Affero General Public License version 3.
*/
-#pragma once
+#ifndef _INCLUDE__SPEC__X86__PLATFORM_SESSION__PLATFORM_SESSION_H_
+#define _INCLUDE__SPEC__X86__PLATFORM_SESSION__PLATFORM_SESSION_H_
-/* base */
+/* Genode includes */
#include
-#include
+#include
-/* os */
+/* os includes */
#include
#include
@@ -107,3 +108,5 @@ struct Platform::Session : Genode::Session
Rpc_release_device, Rpc_alloc_dma_buffer,
Rpc_free_dma_buffer, Rpc_device);
};
+
+#endif /* _INCLUDE__SPEC__X86__PLATFORM_SESSION__PLATFORM_SESSION_H_ */
diff --git a/repos/os/include/usb/types.h b/repos/os/include/usb/types.h
index 12c449c908..3ca90c5a9c 100644
--- a/repos/os/include/usb/types.h
+++ b/repos/os/include/usb/types.h
@@ -15,7 +15,6 @@
#define _INCLUDE__USB__TYPES_H_
#include
-#include
namespace Usb {
struct Device_descriptor;
@@ -112,7 +111,7 @@ struct Usb::String
void print()
{
char buffer[128];
- Genode::printf("%s\n", to_char(buffer, 128));
+ Genode::log(Genode::Cstring(to_char(buffer, 128)));
}
};
diff --git a/repos/os/include/vfs/dir_file_system.h b/repos/os/include/vfs/dir_file_system.h
index 524025c811..c23ba6a1d6 100644
--- a/repos/os/include/vfs/dir_file_system.h
+++ b/repos/os/include/vfs/dir_file_system.h
@@ -156,7 +156,8 @@ class Vfs::Dir_file_system : public File_system
/**
* Directory name
*/
- char _name[MAX_NAME_LEN];
+ typedef String Name;
+ Name const _name;
/**
* Returns if path corresponds to top directory of file system
@@ -244,8 +245,8 @@ class Vfs::Dir_file_system : public File_system
if (path[0] == '/')
path++;
- Genode::size_t const name_len = strlen(_name);
- if (strcmp(path, _name, name_len) != 0)
+ Genode::size_t const name_len = strlen(_name.string());
+ if (strcmp(path, _name.string(), name_len) != 0)
return 0;
path += name_len;
@@ -367,16 +368,12 @@ class Vfs::Dir_file_system : public File_system
Genode::Xml_node node,
File_system_factory &fs_factory)
:
- _env(env), _vfs_root(!node.has_type("dir"))
+ _env(env),
+ _vfs_root(!node.has_type("dir")),
+ _name(_vfs_root ? Name() : node.attribute_value("name", Name()))
{
using namespace Genode;
- /* remember directory name */
- if (_vfs_root)
- _name[0] = 0;
- else
- node.attribute("name").value(_name, sizeof(_name));
-
for (unsigned i = 0; i < node.num_sub_nodes(); i++) {
Xml_node sub_node = node.sub_node(i);
@@ -398,10 +395,12 @@ class Vfs::Dir_file_system : public File_system
Genode::error("failed to create <", sub_node.type(), "> VFS node");
try {
- String<64> value;
for (unsigned i = 0; i < 16; ++i) {
- Xml_attribute attr = sub_node.attribute(i);
- attr.value(&value);
+
+ Xml_attribute const attr = sub_node.attribute(i);
+
+ String<64> value { };
+ attr.value(value);
Genode::error("\t", attr.name(), "=\"", value, "\"");
}
@@ -533,14 +532,6 @@ class Vfs::Dir_file_system : public File_system
return false;
}
- /**
- * Return true if specified path is a directory
- *
- * \noapi
- * \deprecated use 'directory instead
- */
- bool is_directory(char const *path) { return directory(path); }
-
char const *leaf_path(char const *path) override
{
path = _sub_path(path);
@@ -911,7 +902,7 @@ class Vfs::Dir_file_system : public File_system
file_offset index = vfs_handle->seek() / sizeof(Dirent);
if (index == 0) {
- strncpy(dirent->name, _name, sizeof(dirent->name));
+ strncpy(dirent->name, _name.string(), sizeof(dirent->name));
dirent->type = DIRENT_TYPE_DIRECTORY;
dirent->fileno = 1;
diff --git a/repos/os/include/vfs/file_system_factory.h b/repos/os/include/vfs/file_system_factory.h
index 0f7e2567c2..3aae4efc16 100644
--- a/repos/os/include/vfs/file_system_factory.h
+++ b/repos/os/include/vfs/file_system_factory.h
@@ -71,11 +71,6 @@ class Vfs::Global_file_system_factory : public Vfs::File_system_factory
return "vfs_file_system_factory";
}
- /**
- * Return name of VFS node
- */
- Node_name _node_name(Genode::Xml_node node);
-
/**
* Return matching library name for a given vfs node name
*/
diff --git a/repos/os/include/vfs/single_file_system.h b/repos/os/include/vfs/single_file_system.h
index 7410dc3877..d44674720c 100644
--- a/repos/os/include/vfs/single_file_system.h
+++ b/repos/os/include/vfs/single_file_system.h
@@ -33,8 +33,9 @@ class Vfs::Single_file_system : public File_system
Node_type const _node_type;
- enum { FILENAME_MAX_LEN = 64 };
- char _filename[FILENAME_MAX_LEN];
+ typedef String<64> Filename;
+
+ Filename _filename { };
protected:
@@ -76,9 +77,10 @@ class Vfs::Single_file_system : public File_system
Genode::Allocator &alloc,
Node_type node_type,
char const *filename)
- : Single_vfs_handle(ds, fs, alloc, 0),
- _node_type(node_type),
- _filename(filename)
+ :
+ Single_vfs_handle(ds, fs, alloc, 0),
+ _node_type(node_type),
+ _filename(filename)
{ }
Read_result read(char *dst, file_size count,
@@ -126,21 +128,17 @@ class Vfs::Single_file_system : public File_system
bool _single_file(const char *path)
{
- return (strlen(path) == (strlen(_filename) + 1)) &&
- (strcmp(&path[1], _filename) == 0);
+ return (strlen(path) == (strlen(_filename.string()) + 1)) &&
+ (strcmp(&path[1], _filename.string()) == 0);
}
public:
Single_file_system(Node_type node_type, char const *type_name, Xml_node config)
:
- _node_type(node_type)
- {
- strncpy(_filename, type_name, sizeof(_filename));
-
- try { config.attribute("name").value(_filename, sizeof(_filename)); }
- catch (...) { }
- }
+ _node_type(node_type),
+ _filename(config.attribute_value("name", Filename(type_name)))
+ { }
/*********************************
@@ -210,7 +208,7 @@ class Vfs::Single_file_system : public File_system
try {
*out_handle = new (alloc)
Single_vfs_dir_handle(*this, *this, alloc,
- _node_type, _filename);
+ _node_type, _filename.string());
return OPENDIR_OK;
}
catch (Genode::Out_of_ram) { return OPENDIR_ERR_OUT_OF_RAM; }
diff --git a/repos/os/include/vfs/types.h b/repos/os/include/vfs/types.h
index d7a3039cc0..f4f555e89e 100644
--- a/repos/os/include/vfs/types.h
+++ b/repos/os/include/vfs/types.h
@@ -21,6 +21,7 @@
#include
#include
#include
+#include
#include
#include
@@ -31,7 +32,6 @@ namespace Vfs {
using Genode::Ram_dataspace_capability;
using Genode::Dataspace_capability;
using Genode::Dataspace_client;
- using Genode::env;
using Genode::min;
using Genode::ascii_to;
using Genode::strncpy;
@@ -47,6 +47,7 @@ namespace Vfs {
using Genode::Signal_context_capability;
using Genode::static_cap_cast;
using Genode::Interface;
+ using Genode::String;
typedef Genode::Path Absolute_path;
}
diff --git a/repos/os/src/app/block_tester/test_ping_pong.h b/repos/os/src/app/block_tester/test_ping_pong.h
index 8c096f2a0a..811b747c37 100644
--- a/repos/os/src/app/block_tester/test_ping_pong.h
+++ b/repos/os/src/app/block_tester/test_ping_pong.h
@@ -168,15 +168,9 @@ struct Test::Ping_pong : Test_base
_block->info(&_block_count, &_block_size, &_block_ops);
- _start = _node.attribute_value("start", 0u);
- try {
- Genode::Number_of_bytes tmp;
- _node.attribute("size").value(&tmp);
- _size = tmp;
-
- _node.attribute("length").value(&tmp);
- _length = tmp;
- } catch (...) { }
+ _start = _node.attribute_value("start", 0u);
+ _size = _node.attribute_value("size", Number_of_bytes());
+ _length = _node.attribute_value("length", Number_of_bytes());
if (_size > sizeof(_scratch_buffer)) {
Genode::error("request size exceeds scratch buffer size");
diff --git a/repos/os/src/app/block_tester/test_random.h b/repos/os/src/app/block_tester/test_random.h
index 03c27745b8..0c4209f44a 100644
--- a/repos/os/src/app/block_tester/test_random.h
+++ b/repos/os/src/app/block_tester/test_random.h
@@ -257,14 +257,8 @@ struct Test::Random : Test_base
_block->info(&_block_count, &_block_size, &_block_ops);
- try {
- Genode::Number_of_bytes tmp;
- _node.attribute("size").value(&tmp);
- _size = tmp;
-
- _node.attribute("length").value(&tmp);
- _length = tmp;
- } catch (...) { }
+ _size = _node.attribute_value("size", Number_of_bytes());
+ _length = _node.attribute_value("length", Number_of_bytes());
if (_size > sizeof(_scratch_buffer)) {
Genode::error("request size exceeds scratch buffer size");
diff --git a/repos/os/src/app/block_tester/test_replay.h b/repos/os/src/app/block_tester/test_replay.h
index d0b4887465..4e2a89a208 100644
--- a/repos/os/src/app/block_tester/test_replay.h
+++ b/repos/os/src/app/block_tester/test_replay.h
@@ -149,24 +149,20 @@ struct Test::Replay : Test_base
try {
config.for_each_sub_node("request", [&](Xml_node request) {
+
+ typedef Genode::String<8> Type;
+
+ Block::sector_t const nr = request.attribute_value("lba", (Block::sector_t)0u);
+ Genode::size_t const count = request.attribute_value("count", 0UL);
+ Type const type = request.attribute_value("type", Type());
+
Block::Packet_descriptor::Opcode op;
- Block::sector_t nr { 0 };
- Genode::size_t count { 0 };
+ if (type == "read") { op = Block::Packet_descriptor::READ; }
+ else if (type == "write") { op = Block::Packet_descriptor::WRITE; }
+ else { throw -1; }
- try {
- request.attribute("lba").value(&nr);
- request.attribute("count").value(&count);
-
- Genode::String<8> tmp;
- request.attribute("type").value(&tmp);
- if (tmp == "read") { op = Block::Packet_descriptor::READ; }
- else if (tmp == "write") { op = Block::Packet_descriptor::WRITE; }
- else { throw -1; }
-
- Request *req = new (&alloc) Request(op, nr, count);
- requests.enqueue(req);
- ++request_num;
- } catch (...) { return; }
+ requests.enqueue(new (&alloc) Request(op, nr, count));
+ ++request_num;
});
} catch (...) {
Genode::error("could not read request list");
diff --git a/repos/os/src/app/block_tester/test_sequential.h b/repos/os/src/app/block_tester/test_sequential.h
index e05bae2b6b..bd52bfd07c 100644
--- a/repos/os/src/app/block_tester/test_sequential.h
+++ b/repos/os/src/app/block_tester/test_sequential.h
@@ -196,15 +196,9 @@ struct Test::Sequential : Test_base
_synchronous = _node.attribute_value("synchronous", false);
- _start = _node.attribute_value("start", 0u);
- try {
- Genode::Number_of_bytes tmp;
- _node.attribute("size").value(&tmp);
- _size = tmp;
-
- _node.attribute("length").value(&tmp);
- _length = tmp;
- } catch (...) { }
+ _start = _node.attribute_value("start", 0u);
+ _size = _node.attribute_value("size", Genode::Number_of_bytes());
+ _length = _node.attribute_value("length", Genode::Number_of_bytes());
if (_size > sizeof(_scratch_buffer)) {
Genode::error("request size exceeds scratch buffer size");
diff --git a/repos/os/src/app/cli_monitor/child.h b/repos/os/src/app/cli_monitor/child.h
index 47fe79cb8b..755c3241ce 100644
--- a/repos/os/src/app/cli_monitor/child.h
+++ b/repos/os/src/app/cli_monitor/child.h
@@ -31,14 +31,13 @@ struct Cli_monitor::Child : Child_base, private List::Element
Argument argument;
- Child(Ram &ram,
+ Child(Genode::Env &env,
+ Ram &ram,
Genode::Allocator &alloc,
Name const &label,
Binary_name const &binary,
Genode::Pd_session &ref_pd,
Genode::Pd_session_capability ref_pd_cap,
- Genode::Ram_session &ref_ram,
- Genode::Ram_session_capability ref_ram_cap,
Genode::Region_map &local_rm,
Cap_quota cap_quota,
Genode::size_t ram_quota,
@@ -46,14 +45,13 @@ struct Cli_monitor::Child : Child_base, private List::Element
Genode::Signal_context_capability yield_response_sig_cap,
Genode::Signal_context_capability exit_sig_cap)
:
- Child_base(ram,
+ Child_base(env,
+ ram,
alloc,
label,
binary,
ref_pd,
ref_pd_cap,
- ref_ram,
- ref_ram_cap,
local_rm,
cap_quota,
ram_quota,
diff --git a/repos/os/src/app/cli_monitor/line_editor.h b/repos/os/src/app/cli_monitor/line_editor.h
index 0e7d2480af..1fbcd09afc 100644
--- a/repos/os/src/app/cli_monitor/line_editor.h
+++ b/repos/os/src/app/cli_monitor/line_editor.h
@@ -15,7 +15,6 @@
#define _LINE_EDITOR_H_
/* Genode includes */
-#include
#include
#include
#include
diff --git a/repos/os/src/app/cli_monitor/main.cc b/repos/os/src/app/cli_monitor/main.cc
index be0230ccea..6c0a6029e4 100644
--- a/repos/os/src/app/cli_monitor/main.cc
+++ b/repos/os/src/app/cli_monitor/main.cc
@@ -142,7 +142,7 @@ struct Cli_monitor::Main
.attribute_value("name", Genode::Number_of_bytes(0));
}
- Ram _ram { _env.ram(), _env.ram_session_cap(), _ram_preservation_from_config(),
+ Ram _ram { _env.pd(), _env.pd_session_cap(), _ram_preservation_from_config(),
_yield_broadcast_handler, _yield_response_handler };
Heap _heap { _env.ram(), _env.rm() };
@@ -162,9 +162,8 @@ struct Cli_monitor::Main
/* initialize generic commands */
Registered _help_command { _commands };
Registered _kill_command { _commands, _children, _heap };
- Registered _start_command { _commands, _ram, _heap,
+ Registered _start_command { _commands, _env, _ram, _heap,
_env.pd(), _env.pd_session_cap(),
- _env.ram(), _env.ram_session_cap(),
_env.rm(), _children,
_subsystem_config_registry,
_yield_response_handler,
diff --git a/repos/os/src/app/cli_monitor/start_command.h b/repos/os/src/app/cli_monitor/start_command.h
index 5cf4bdfba7..ccdac8774a 100644
--- a/repos/os/src/app/cli_monitor/start_command.h
+++ b/repos/os/src/app/cli_monitor/start_command.h
@@ -31,13 +31,12 @@ class Cli_monitor::Start_command : public Command
typedef Genode::Signal_context_capability Signal_context_capability;
typedef Genode::Dataspace_capability Dataspace_capability;
+ Genode::Env &_env;
Ram &_ram;
Genode::Allocator &_alloc;
Child_registry &_children;
Genode::Pd_session &_ref_pd;
Genode::Pd_session_capability _ref_pd_cap;
- Genode::Ram_session &_ref_ram;
- Genode::Ram_session_capability _ref_ram_cap;
Genode::Region_map &_local_rm;
Subsystem_config_registry &_subsystem_configs;
List _arguments { };
@@ -58,10 +57,10 @@ class Cli_monitor::Start_command : public Command
Xml_node rsc = subsystem_node.sub_node("resource");
for (;; rsc = rsc.next("resource")) {
if (rsc.attribute("name").has_value("RAM")) {
- rsc.attribute("quantum").value(&ram);
+ rsc.attribute("quantum").value(ram);
if (rsc.has_attribute("limit"))
- rsc.attribute("limit").value(&ram_limit);
+ rsc.attribute("limit").value(ram_limit);
break;
}
}
@@ -85,11 +84,11 @@ class Cli_monitor::Start_command : public Command
*
* Use subsystem name by default, override with '' declaration.
*/
- char binary_name[128];
- strncpy(binary_name, name, sizeof(binary_name));
+ typedef Genode::String<128> Binary_name;
+ Binary_name binary_name;
try {
Xml_node bin = subsystem_node.sub_node("binary");
- bin.attribute("name").value(binary_name, sizeof(binary_name));
+ binary_name = bin.attribute_value("name", Binary_name());
} catch (...) { }
for (unsigned i = 0; i < count; i++) {
@@ -109,15 +108,14 @@ class Cli_monitor::Start_command : public Command
tprint_bytes(terminal, ram_limit);
tprintf(terminal,"\n");
}
- tprintf(terminal, " binary: %s\n", binary_name);
+ tprintf(terminal, " binary: %s\n", binary_name.string());
}
Child *child = 0;
try {
child = new (_alloc)
- Child(_ram, _alloc, label, binary_name,
- _ref_pd, _ref_pd_cap, _ref_ram,
- _ref_ram_cap, _local_rm,
+ Child(_env, _ram, _alloc, label, binary_name,
+ _ref_pd, _ref_pd_cap, _local_rm,
Genode::Cap_quota{caps}, ram, ram_limit,
_yield_response_sigh_cap, _exit_sig_cap);
}
@@ -142,7 +140,9 @@ class Cli_monitor::Start_command : public Command
/* configure child */
try {
Xml_node config_node = subsystem_node.sub_node("config");
- child->configure(config_node.addr(), config_node.size());
+ config_node.with_raw_node([&] (char const *start, size_t length) {
+ child->configure(start, length); });
+
if (verbose)
tprintf(terminal, " config: inline\n");
} catch (...) {
@@ -162,12 +162,11 @@ class Cli_monitor::Start_command : public Command
public:
- Start_command(Ram &ram,
+ Start_command(Genode::Env &env,
+ Ram &ram,
Genode::Allocator &alloc,
Genode::Pd_session &ref_pd,
Genode::Pd_session_capability ref_pd_cap,
- Genode::Ram_session &ref_ram,
- Genode::Ram_session_capability ref_ram_cap,
Genode::Region_map &local_rm,
Child_registry &children,
Subsystem_config_registry &subsustem_configs,
@@ -175,10 +174,8 @@ class Cli_monitor::Start_command : public Command
Signal_context_capability exit_sig_cap)
:
Command("start", "create new subsystem"),
- _ram(ram), _alloc(alloc), _children(children),
- _ref_pd(ref_pd), _ref_pd_cap(ref_pd_cap),
- _ref_ram(ref_ram), _ref_ram_cap(ref_ram_cap),
- _local_rm(local_rm),
+ _env(env), _ram(ram), _alloc(alloc), _children(children),
+ _ref_pd(ref_pd), _ref_pd_cap(ref_pd_cap), _local_rm(local_rm),
_subsystem_configs(subsustem_configs),
_yield_response_sigh_cap(yield_response_sigh_cap),
_exit_sig_cap(exit_sig_cap)
@@ -194,26 +191,31 @@ class Cli_monitor::Start_command : public Command
/* functor for processing a subsystem configuration */
auto process_subsystem_config_fn = [&] (Genode::Xml_node node) {
- char name[Parameter::Name::size()];
- try { node.attribute("name").value(name, sizeof(name)); }
- catch (Xml_node::Nonexistent_attribute) {
- PWRN("Missing name in '' configuration");
+ if (!node.has_attribute("name")) {
+ Genode::warning("Missing name in '' configuration");
return;
}
+ typedef Genode::String<64> Name;
+ Name const name = node.attribute_value("name", Name());
+
char const *prefix = "config: ";
size_t const prefix_len = strlen(prefix);
char help[Parameter::Short_help::size() + prefix_len];
strncpy(help, prefix, ~0);
- try { node.attribute("help").value(help + prefix_len,
- sizeof(help) - prefix_len); }
+ try {
+ Genode::Xml_attribute const help_attr = node.attribute("help");
+ help_attr.with_raw_value([&] (char const *start, size_t len) {
+ strncpy(help + prefix_len, start,
+ Genode::min(len, Parameter::Short_help::size())); });
+ }
catch (Xml_node::Nonexistent_attribute) {
- PWRN("Missing help in '' configuration");
+ Genode::warning("Missing help in '' configuration");
return;
}
- Argument arg(name, help);
+ Argument arg(name.string(), help);
fn(arg);
};
diff --git a/repos/os/src/app/dummy/main.cc b/repos/os/src/app/dummy/main.cc
index 3c937638c6..ab9dab699d 100644
--- a/repos/os/src/app/dummy/main.cc
+++ b/repos/os/src/app/dummy/main.cc
@@ -78,13 +78,13 @@ struct Dummy::Log_service
struct Root : Root_component
{
- Ram_session &_ram;
+ Pd_session &_pd;
bool const _verbose;
- Root(Entrypoint &ep, Allocator &alloc, Ram_session &ram, bool verbose)
+ Root(Entrypoint &ep, Allocator &alloc, Pd_session &pd, bool verbose)
:
- Root_component(ep, alloc), _ram(ram), _verbose(verbose)
+ Root_component(ep, alloc), _pd(pd), _verbose(verbose)
{ }
Session_component *_create_session(const char *args, Affinity const &) override
@@ -97,12 +97,12 @@ struct Dummy::Log_service
size_t const ram_quota =
Arg_string::find_arg(args, "ram_quota").ulong_value(0);
- if (_ram.avail_ram().value >= ram_quota)
+ if (_pd.avail_ram().value >= ram_quota)
log("received session quota upgrade");
}
};
- Root _root { _env.ep(), _heap, _env.ram(), _verbose };
+ Root _root { _env.ep(), _heap, _env.pd(), _verbose };
Log_service(Env &env, bool verbose) : _env(env), _verbose(verbose)
{
@@ -162,9 +162,9 @@ struct Dummy::Ram_consumer
Ram_dataspace_capability _ds_cap { };
- Ram_session &_ram;
+ Ram_allocator &_ram;
- Ram_consumer(Ram_session &ram) : _ram(ram) { }
+ Ram_consumer(Ram_allocator &ram) : _ram(ram) { }
void release()
{
@@ -286,7 +286,7 @@ struct Dummy::Main
Signal_handler _config_handler { _env.ep(), *this, &Main::_handle_config };
Ram_consumer _ram_consumer { _env.ram() };
- Cap_consumer _cap_consumer { _env.ep() };
+ Cap_consumer _cap_consumer { _env.ep() };
Constructible _resource_yield_handler { };
diff --git a/repos/os/src/app/pointer/main.cc b/repos/os/src/app/pointer/main.cc
index ee0281d550..f47eb6c317 100644
--- a/repos/os/src/app/pointer/main.cc
+++ b/repos/os/src/app/pointer/main.cc
@@ -28,7 +28,6 @@
#include
/* local includes */
-#include "util.h"
#include "rom_registry.h"
#include "big_mouse.h"
@@ -59,7 +58,7 @@ class Pointer::Main : public Rom::Reader
{
private:
- typedef Pointer::String String;
+ typedef Genode::String<128> String;
Genode::Env &_env;
@@ -285,8 +284,6 @@ void Pointer::Main::_update_pointer()
void Pointer::Main::_handle_hover()
{
- using Pointer::read_string_attribute;
-
_hover_ds->update();
if (!_hover_ds->valid())
return;
@@ -295,9 +292,8 @@ void Pointer::Main::_handle_hover()
try {
Genode::Xml_node node(_hover_ds->local_addr());
- Genode::Session_label hovered_label { read_string_attribute(node,
- "label",
- String()) };
+ Genode::Session_label hovered_label {
+ node.attribute_value("label", String()) };
hovered_label = hovered_label.prefix();
diff --git a/repos/os/src/app/pointer/rom_registry.h b/repos/os/src/app/pointer/rom_registry.h
index ed9093d746..b89e073e25 100644
--- a/repos/os/src/app/pointer/rom_registry.h
+++ b/repos/os/src/app/pointer/rom_registry.h
@@ -26,7 +26,7 @@ struct Rom::Registry : Registry_for_reader, Registry_for_writer, Genode::Noncopy
private:
Genode::Allocator &_md_alloc;
- Genode::Ram_session &_ram;
+ Genode::Ram_allocator &_ram;
Genode::Region_map &_rm;
Reader &_reader;
@@ -97,7 +97,7 @@ struct Rom::Registry : Registry_for_reader, Registry_for_writer, Genode::Noncopy
public:
Registry(Genode::Allocator &md_alloc,
- Genode::Ram_session &ram, Genode::Region_map &rm,
+ Genode::Ram_allocator &ram, Genode::Region_map &rm,
Reader &reader)
:
_md_alloc(md_alloc), _ram(ram), _rm(rm), _reader(reader)
diff --git a/repos/os/src/app/pointer/util.h b/repos/os/src/app/pointer/util.h
deleted file mode 100644
index b7f4a4ce94..0000000000
--- a/repos/os/src/app/pointer/util.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * \brief VirtualBox pointer utilities
- * \author Christian Helmuth
- * \date 2015-06-08
- */
-
-/*
- * 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.
- */
-
-#ifndef _POINTER_UTIL_H_
-#define _POINTER_UTIL_H_
-
-/* Genode includes */
-#include
-#include
-
-
-namespace Pointer {
- typedef Genode::String<64> String;
-
- inline String read_string_attribute(Genode::Xml_node const &node,
- char const *attr,
- String const &default_value);
-}
-
-
-Pointer::String Pointer::read_string_attribute(Genode::Xml_node const &node,
- char const *attr,
- String const &default_value)
-{
- try {
- char buf[String::capacity()];
- node.attribute(attr).value(buf, sizeof(buf));
- return String(Genode::Cstring(buf));
- } catch (...) { return default_value; }
-}
-
-#endif /* _POINTER_UTIL_H_ */
diff --git a/repos/os/src/app/rom_logger/main.cc b/repos/os/src/app/rom_logger/main.cc
index ef568b13cf..f0f791f5e2 100644
--- a/repos/os/src/app/rom_logger/main.cc
+++ b/repos/os/src/app/rom_logger/main.cc
@@ -67,17 +67,17 @@ void Rom_logger::Main::_handle_update()
/*
* Query name of ROM module from config
*/
- Rom_name rom_name;
- try {
- _config_rom.xml().attribute("rom").value(&rom_name);
- } catch (...) {
+ Genode::Xml_node const config = _config_rom.xml();
+
+ if (!config.has_attribute("rom")) {
Genode::warning("could not determine ROM name from config");
return;
}
+ Rom_name const rom_name = config.attribute_value("rom", Rom_name());
+
typedef Genode::String<8> Format_string;
- Format_string format =
- _config_rom.xml().attribute_value("format", Format_string("text"));
+ Format_string const format = config.attribute_value("format", Format_string("text"));
/*
* If ROM name changed, reconstruct '_rom_ds'
diff --git a/repos/os/src/app/rom_reporter/main.cc b/repos/os/src/app/rom_reporter/main.cc
index 7ffdb80a61..46bae3070e 100644
--- a/repos/os/src/app/rom_reporter/main.cc
+++ b/repos/os/src/app/rom_reporter/main.cc
@@ -53,7 +53,8 @@ struct Rom_reporter::Rom_module
_reporter->enabled(true);
}
- _reporter->report(xml.addr(), content_size);
+ xml.with_raw_node([&] (char const *start, size_t length) {
+ _reporter->report(start, length); });
}
Rom_module(Env &env, Label const &label) : _env(env), _label(label)
diff --git a/repos/os/src/app/sequence/main.cc b/repos/os/src/app/sequence/main.cc
index 292e847555..6c9e111fe8 100644
--- a/repos/os/src/app/sequence/main.cc
+++ b/repos/os/src/app/sequence/main.cc
@@ -42,7 +42,7 @@ struct Sequence::Child : Genode::Child_policy
{
Binary_name name;
try {
- _start_node.sub_node("binary").attribute("name").value(&name);
+ _start_node.sub_node("binary").attribute("name").value(name);
return name != "" ? name : _name;
}
catch (...) { return _name; }
@@ -85,7 +85,8 @@ struct Sequence::Child : Genode::Child_policy
{
if (_have_config) {
Xml_node config_node = start_node.sub_node("config");
- _config_policy.load(config_node.addr(), config_node.size());
+ config_node.with_raw_node([&] (char const *start, size_t length) {
+ _config_policy.load(start, length); });
}
}
@@ -108,17 +109,25 @@ struct Sequence::Child : Genode::Child_policy
* Provide a "config" ROM if configured to do so,
* otherwise forward directly to the parent.
*/
- Service &resolve_session_request(Service::Name const &name,
- Session_state::Args const &args)
+ Route resolve_session_request(Service::Name const &name,
+ Session_label const &label) override
{
+ auto route = [&] (Service &service) {
+ return Route { .service = service,
+ .label = label,
+ .diag = Session::Diag() }; };
+
if (_have_config) {
- Service *s = _config_policy.resolve_session_request(
- name.string(), args.string());
+ Service *s =
+ _config_policy.resolve_session_request(name, label);
if (s)
- return *s;
+ return route(*s);
}
- return *new (_services_heap) Parent_service(_parent_services, _env, name);
+ Service &service = *new (_services_heap)
+ Parent_service(_parent_services, _env, name);
+
+ return route(service);
}
/**
diff --git a/repos/os/src/app/usb_report_filter/main.cc b/repos/os/src/app/usb_report_filter/main.cc
index 168f75e237..37483171c5 100644
--- a/repos/os/src/app/usb_report_filter/main.cc
+++ b/repos/os/src/app/usb_report_filter/main.cc
@@ -186,7 +186,8 @@ class Usb_filter::Device_registry
/* copy other nodes */
drv_config.for_each_sub_node([&] (Xml_node &node) {
if (!node.has_type("raw")) {
- xml.append(node.addr(), node.size());
+ node.with_raw_node([&] (char const *start, size_t length) {
+ xml.append(start, length); });
return;
}
});
@@ -401,7 +402,7 @@ class Usb_filter::Device_registry
config.for_each_sub_node("device", add_new_entry);
try {
- config.sub_node("client").attribute("label").value(&_client_label);
+ config.sub_node("client").attribute("label").value(_client_label);
} catch (...) {
error("could not update client label");
}
diff --git a/repos/os/src/drivers/acpi/acpi.h b/repos/os/src/drivers/acpi/acpi.h
index 59bd151184..04a862664a 100644
--- a/repos/os/src/drivers/acpi/acpi.h
+++ b/repos/os/src/drivers/acpi/acpi.h
@@ -16,6 +16,7 @@
/* Genode includes */
#include
+#include
namespace Acpi
diff --git a/repos/os/src/drivers/ahci/ahci.cc b/repos/os/src/drivers/ahci/ahci.cc
index e43604a295..fdb16017ca 100644
--- a/repos/os/src/drivers/ahci/ahci.cc
+++ b/repos/os/src/drivers/ahci/ahci.cc
@@ -120,7 +120,7 @@ struct Ahci
log("64-bit support: ", hba.supports_64bit() ? "yes" : "no");
}
- void scan_ports(Genode::Region_map &rm, Genode::Ram_session &ram)
+ void scan_ports(Genode::Region_map &rm, Genode::Ram_allocator &ram)
{
log("number of ports: ", hba.port_count(), " pi: ",
Hex(hba.read()));
diff --git a/repos/os/src/drivers/ahci/ahci.h b/repos/os/src/drivers/ahci/ahci.h
index 9120bdc572..652cf82196 100644
--- a/repos/os/src/drivers/ahci/ahci.h
+++ b/repos/os/src/drivers/ahci/ahci.h
@@ -823,13 +823,13 @@ struct Port_driver : Port, Block::Driver
Ahci_root &root;
unsigned &sem;
- Port_driver(Genode::Ram_session &ram,
- Ahci_root &root,
- unsigned &sem,
- Genode::Region_map &rm,
- Hba &hba,
- Platform::Hba &platform_hba,
- unsigned number)
+ Port_driver(Genode::Ram_allocator &ram,
+ Ahci_root &root,
+ unsigned &sem,
+ Genode::Region_map &rm,
+ Hba &hba,
+ Platform::Hba &platform_hba,
+ unsigned number)
: Port(rm, hba, platform_hba, number), Block::Driver(ram), root(root),
sem(sem) { sem++; }
diff --git a/repos/os/src/drivers/ahci/ata_driver.h b/repos/os/src/drivers/ahci/ata_driver.h
index f43e86d678..5e71f9aacb 100644
--- a/repos/os/src/drivers/ahci/ata_driver.h
+++ b/repos/os/src/drivers/ahci/ata_driver.h
@@ -191,14 +191,14 @@ struct Ata_driver : Port_driver
Signal_context_capability device_identified;
- Ata_driver(Genode::Allocator &alloc,
- Genode::Ram_session &ram,
- Ahci_root &root,
- unsigned &sem,
- Genode::Region_map &rm,
- Hba &hba,
- Platform::Hba &platform_hba,
- unsigned number,
+ Ata_driver(Genode::Allocator &alloc,
+ Genode::Ram_allocator &ram,
+ Ahci_root &root,
+ unsigned &sem,
+ Genode::Region_map &rm,
+ Hba &hba,
+ Platform::Hba &platform_hba,
+ unsigned number,
Genode::Signal_context_capability device_identified)
: Port_driver(ram, root, sem, rm, hba, platform_hba, number),
alloc(alloc), device_identified(device_identified)
diff --git a/repos/os/src/drivers/ahci/atapi_driver.h b/repos/os/src/drivers/ahci/atapi_driver.h
index 83f451563d..12b3a6d018 100644
--- a/repos/os/src/drivers/ahci/atapi_driver.h
+++ b/repos/os/src/drivers/ahci/atapi_driver.h
@@ -24,13 +24,13 @@ struct Atapi_driver : Port_driver
unsigned sense_tries = 0;
Block::Packet_descriptor pending { };
- Atapi_driver(Genode::Ram_session &ram,
- Ahci_root &root,
- unsigned &sem,
- Genode::Region_map &rm,
- Hba &hba,
- Platform::Hba &platform_hba,
- unsigned number)
+ Atapi_driver(Genode::Ram_allocator &ram,
+ Ahci_root &root,
+ unsigned &sem,
+ Genode::Region_map &rm,
+ Hba &hba,
+ Platform::Hba &platform_hba,
+ unsigned number)
: Port_driver(ram, root, sem, rm, hba, platform_hba, number)
{
Port::init();
diff --git a/repos/os/src/drivers/framebuffer/boot/framebuffer.cc b/repos/os/src/drivers/framebuffer/boot/framebuffer.cc
index f177fe93c2..2d70adb608 100644
--- a/repos/os/src/drivers/framebuffer/boot/framebuffer.cc
+++ b/repos/os/src/drivers/framebuffer/boot/framebuffer.cc
@@ -27,11 +27,11 @@ Session_component::Session_component(Genode::Env &env,
try {
Genode::Xml_node fb = pinfo.sub_node("boot").sub_node("framebuffer");
- fb.attribute("phys").value(&_core_fb.addr);
- fb.attribute("width").value(&_core_fb.width);
- fb.attribute("height").value(&_core_fb.height);
- fb.attribute("bpp").value(&_core_fb.bpp);
- fb.attribute("pitch").value(&_core_fb.pitch);
+ fb.attribute("phys").value(_core_fb.addr);
+ fb.attribute("width").value(_core_fb.width);
+ fb.attribute("height").value(_core_fb.height);
+ fb.attribute("bpp").value(_core_fb.bpp);
+ fb.attribute("pitch").value(_core_fb.pitch);
fb_boot_type = fb.attribute_value("type", 0U);
} catch (...) {
Genode::error("No boot framebuffer information available.");
diff --git a/repos/os/src/drivers/gpu/intel/types.h b/repos/os/src/drivers/gpu/intel/types.h
index 487e24b551..4a839d818c 100644
--- a/repos/os/src/drivers/gpu/intel/types.h
+++ b/repos/os/src/drivers/gpu/intel/types.h
@@ -15,11 +15,10 @@
#define _TYPES_H_
/* Genode includes */
-#include
+#include
namespace Igd {
- using Ram_dataspace_capability = Genode::Ram_dataspace_capability;
using Ram = Genode::Ram_dataspace_capability;
using uint8_t = Genode::uint8_t;
diff --git a/repos/os/src/drivers/gpu/intel/utils.h b/repos/os/src/drivers/gpu/intel/utils.h
index d2f5f68820..8ddd17abbe 100644
--- a/repos/os/src/drivers/gpu/intel/utils.h
+++ b/repos/os/src/drivers/gpu/intel/utils.h
@@ -16,7 +16,7 @@
/* Genode includes */
#include
-#include
+#include
namespace Utils {
diff --git a/repos/os/src/drivers/platform/spec/x86/device_pd.h b/repos/os/src/drivers/platform/spec/x86/device_pd.h
index 89a17bf1e6..f3edcb4cd4 100644
--- a/repos/os/src/drivers/platform/spec/x86/device_pd.h
+++ b/repos/os/src/drivers/platform/spec/x86/device_pd.h
@@ -75,7 +75,7 @@ class Platform::Device_pd
enum { UPGRADE_CAP_QUOTA = 2 };
Genode::Cap_quota const caps { UPGRADE_CAP_QUOTA };
_cap_guard.withdraw(caps);
- _env.pd().transfer_quota(_pd, caps);
+ _env.pd().transfer_quota(_pd.rpc_cap(), caps);
}
);
},
@@ -83,7 +83,7 @@ class Platform::Device_pd
enum { UPGRADE_RAM_QUOTA = 4096 };
Genode::Ram_quota const ram { UPGRADE_RAM_QUOTA };
_ram_guard.withdraw(ram);
- _env.pd().transfer_quota(_pd, ram);
+ _env.pd().transfer_quota(_pd.rpc_cap(), ram);
}
);
}
diff --git a/repos/os/src/drivers/platform/spec/x86/irq.h b/repos/os/src/drivers/platform/spec/x86/irq.h
index 62ab82e591..dc9ade3e96 100644
--- a/repos/os/src/drivers/platform/spec/x86/irq.h
+++ b/repos/os/src/drivers/platform/spec/x86/irq.h
@@ -11,9 +11,11 @@
* under the terms of the GNU Affero General Public License version 3.
*/
-#pragma once
+#ifndef _X86__IRQ_H_
+#define _X86__IRQ_H_
#include
+#include
#include
#include
@@ -182,3 +184,5 @@ class Platform::Irq_routing : public Genode::List::Elemen
static unsigned short rewrite(unsigned char bus, unsigned char dev,
unsigned char func, unsigned char pin);
};
+
+#endif /* _X86__IRQ_H_ */
diff --git a/repos/os/src/drivers/platform/spec/x86/main.cc b/repos/os/src/drivers/platform/spec/x86/main.cc
index d4d4802b29..a39e22f69c 100644
--- a/repos/os/src/drivers/platform/spec/x86/main.cc
+++ b/repos/os/src/drivers/platform/spec/x86/main.cc
@@ -72,13 +72,13 @@ struct Platform::Main
void system_update()
{
- if (acpi_ready.is_constructed())
+ if (acpi_ready.constructed())
acpi_ready->update();
- if (!root.is_constructed())
+ if (!root.constructed())
return;
- if (acpi_ready.is_constructed() && acpi_ready->is_valid()) {
+ if (acpi_ready.constructed() && acpi_ready->valid()) {
Genode::Xml_node system(acpi_ready->local_addr(),
acpi_ready->size());
diff --git a/repos/os/src/drivers/platform/spec/x86/pci_session_component.h b/repos/os/src/drivers/platform/spec/x86/pci_session_component.h
index 32a1950dd1..5cab8a1743 100644
--- a/repos/os/src/drivers/platform/spec/x86/pci_session_component.h
+++ b/repos/os/src/drivers/platform/spec/x86/pci_session_component.h
@@ -19,7 +19,6 @@
#include
#include
#include
-#include
#include
#include
@@ -279,11 +278,13 @@ class Platform::Session_component : public Genode::Rpc_object
return config_space;
}
+ typedef Genode::String<32> Alias_name;
+
/*
* List of aliases for PCI Class/Subclas/Prog I/F triple used
* by xml config for this platform driver
*/
- unsigned class_subclass_prog(const char * name)
+ unsigned class_subclass_prog(Alias_name const &name)
{
using namespace Genode;
@@ -304,7 +305,7 @@ class Platform::Session_component : public Genode::Rpc_object
};
for (unsigned i = 0; i < sizeof(aliases) / sizeof(aliases[0]); i++) {
- if (strcmp(aliases[i].alias, name))
+ if (name != aliases[i].alias)
continue;
return 0U | aliases[i].pci_class << 16 |
@@ -324,58 +325,81 @@ class Platform::Session_component : public Genode::Rpc_object
try {
_policy.for_each_sub_node("device", [&] (Xml_node dev) {
- try {
- /* enforce restriction based on name name */
- char policy_name[8];
- dev.attribute("name").value(policy_name,
- sizeof(policy_name));
- if (!strcmp(policy_name, name))
- /* found identical match - permit access */
- throw true;
-
- } catch (Xml_attribute::Nonexistent_attribute) { }
+ /* enforce restriction based on name name */
+ if (dev.attribute_value("name", Genode::String<10>()) == name)
+ /* found identical match - permit access */
+ throw true;
});
} catch (bool result) { return result; }
return false;
}
+ static bool _bdf_exactly_specified(Xml_node node)
+ {
+ return node.has_attribute("bus")
+ && node.has_attribute("device")
+ && node.has_attribute("function");
+ }
+
+ struct Bdf
+ {
+ unsigned b, d, f;
+
+ bool equals(Bdf const &other) const
+ {
+ return other.b == b && other.d == d && other.f == f;
+ }
+
+ void print(Genode::Output &out) const
+ {
+ Genode::print(out, Genode::Hex(b), ":", Genode::Hex(d), ".", f);
+ }
+ };
+
+ static Bdf _bdf_from_xml(Xml_node node)
+ {
+ return Bdf { .b = node.attribute_value("bus", 0U),
+ .d = node.attribute_value("device", 0U),
+ .f = node.attribute_value("function", 0U) };
+ }
+
+ static bool _bdf_attributes_in_valid_range(Xml_node node)
+ {
+ return _bdf_exactly_specified(node)
+ && (node.attribute_value("bus", 0U) < Device_config::MAX_BUSES)
+ && (node.attribute_value("device", 0U) < Device_config::MAX_DEVICES)
+ && (node.attribute_value("function", 0U) < Device_config::MAX_FUNCTIONS);
+ }
+
+ static bool _bdf_matches(Xml_node node, Bdf bdf)
+ {
+ return _bdf_from_xml(node).equals(bdf);
+ }
+
/**
* Check according session policy device usage
*/
- bool permit_device(Genode::uint8_t b, Genode::uint8_t d,
- Genode::uint8_t f, unsigned class_code)
+ bool permit_device(Bdf const bdf, unsigned class_code)
{
using namespace Genode;
try {
_policy.for_each_sub_node("pci", [&] (Xml_node node) {
- try {
- unsigned bus, device, function;
- node.attribute("bus").value(&bus);
- node.attribute("device").value(&device);
- node.attribute("function").value(&function);
-
- if (b == bus && d == device && f == function)
+ if (_bdf_exactly_specified(node)) {
+ if (_bdf_matches(node, bdf))
throw true;
+ /* check also for class entry */
+ }
+ if (!node.has_attribute("class"))
return;
- } catch (Xml_attribute::Nonexistent_attribute) { }
/* enforce restriction based upon classes */
- unsigned class_sub_prog = 0;
-
- try {
- char alias_class[32];
- node.attribute("class").value(alias_class,
- sizeof(alias_class));
-
- class_sub_prog = class_subclass_prog(alias_class);
- } catch (Xml_attribute::Nonexistent_attribute) {
- return;
- }
+ auto alias = node.attribute_value("class", Alias_name());
+ unsigned const class_sub_prog = class_subclass_prog(alias);
enum { DONT_CHECK_PROGIF = 8 };
/* if class/subclass don't match - deny */
@@ -383,7 +407,7 @@ class Platform::Session_component : public Genode::Rpc_object
return;
/* if this bdf is used by some policy - deny */
- if (find_dev_in_policy(b, d, f))
+ if (find_dev_in_policy(bdf))
return;
throw true;
@@ -403,17 +427,14 @@ class Platform::Session_component : public Genode::Rpc_object
try {
_config.xml().for_each_sub_node("policy", [&] (Xml_node policy) {
policy.for_each_sub_node("device", [&] (Xml_node device) {
- try {
- /* device attribute from policy node */
- char policy_device[8];
- device.attribute("name").value(policy_device, sizeof(policy_device));
- if (!strcmp(policy_device, dev_name)) {
- if (once)
- throw true;
- once = true;
- }
- } catch (Xml_node::Nonexistent_attribute) { }
+ typedef Genode::String<10> Name;
+ if (device.attribute_value("name", Name()) == dev_name) {
+
+ if (once)
+ throw true;
+ once = true;
+ }
});
});
} catch (bool result) { return result; }
@@ -424,8 +445,7 @@ class Platform::Session_component : public Genode::Rpc_object
/**
* Lookup a given device name.
*/
- bool find_dev_in_policy(Genode::uint8_t b, Genode::uint8_t d,
- Genode::uint8_t f, bool once = true)
+ bool find_dev_in_policy(Bdf const bdf, bool once = true)
{
using namespace Genode;
@@ -433,19 +453,16 @@ class Platform::Session_component : public Genode::Rpc_object
Xml_node xml = _config.xml();
xml.for_each_sub_node("policy", [&] (Xml_node policy) {
policy.for_each_sub_node("pci", [&] (Xml_node node) {
- try {
- unsigned bus, device, function;
- node.attribute("bus").value(&bus);
- node.attribute("device").value(&device);
- node.attribute("function").value(&function);
+ if (_bdf_exactly_specified(node)) {
+
+ if (_bdf_matches(node, bdf)) {
- if (b == bus && d == device && f == function) {
if (once)
throw true;
once = true;
}
- } catch (Xml_node::Nonexistent_attribute) { }
+ }
});
});
} catch (bool result) { return result; }
@@ -478,32 +495,30 @@ class Platform::Session_component : public Genode::Rpc_object
/* subtract the RPC session and session dataspace capabilities */
_cap_guard.withdraw(Genode::Cap_quota{2});
- /* non-pci devices */
+ /* check policy for non-pci devices */
_policy.for_each_sub_node("device", [&] (Genode::Xml_node device_node) {
- try {
- char policy_device[8];
- device_node.attribute("name").value(policy_device,
- sizeof(policy_device));
- enum { DOUBLET = false };
- if (!find_dev_in_policy(policy_device, DOUBLET))
- return;
-
- Genode::error("'", _label, "' - device "
- "'", Genode::Cstring(policy_device), "' "
- "is part of more than one policy");
- }
- catch (Genode::Xml_node::Nonexistent_attribute) {
+ if (!device_node.has_attribute("name")) {
Genode::error("'", _label, "' - device node "
- "misses a 'name' attribute");
+ "misses 'name' attribute");
+ throw Genode::Service_denied();
+ }
+
+ typedef Genode::String<16> Name;
+ Name const name = device_node.attribute_value("name", Name());
+
+ enum { DOUBLET = false };
+ if (find_dev_in_policy(name.string(), DOUBLET)) {
+ Genode::error("'", _label, "' - device '", name, "' "
+ "is part of more than one policy");
+ throw Genode::Service_denied();
}
- throw Genode::Service_denied();
});
/* pci devices */
_policy.for_each_sub_node("pci", [&] (Genode::Xml_node node) {
+
enum { INVALID_CLASS = 0x1000000U };
- unsigned class_sub_prog = INVALID_CLASS;
using Genode::Xml_attribute;
@@ -512,21 +527,16 @@ class Platform::Session_component : public Genode::Rpc_object
* 'function' attributes or a single 'class' attribute.
* All other attribute names are traded as wrong.
*/
- try {
- char alias_class[32];
- node.attribute("class").value(alias_class,
- sizeof(alias_class));
+ if (node.has_attribute("class")) {
- class_sub_prog = class_subclass_prog(alias_class);
- if (class_sub_prog >= INVALID_CLASS) {
+ Alias_name const alias = node.attribute_value("class", Alias_name());
+
+ if (class_subclass_prog(alias) >= INVALID_CLASS) {
Genode::error("'", _label, "' - invalid 'class' ",
- "attribute '", Genode::Cstring(alias_class), "'");
+ "attribute '", alias, "'");
throw Genode::Service_denied();
}
- } catch (Xml_attribute::Nonexistent_attribute) { }
- /* if we read a class attribute all is fine */
- if (class_sub_prog < INVALID_CLASS) {
/* sanity check that 'class' is the only attribute */
try {
node.attribute(1);
@@ -548,32 +558,23 @@ class Platform::Session_component : public Genode::Rpc_object
} catch (Xml_attribute::Nonexistent_attribute) { }
- try {
- unsigned bus, device, function;
+ if (_bdf_exactly_specified(node)) {
- node.attribute("bus").value(&bus);
- node.attribute("device").value(&device);
- node.attribute("function").value(&function);
+ if (!_bdf_attributes_in_valid_range(node)) {
+ Genode::error("'", _label, "' - "
+ "invalid pci node attributes for bdf");
+ throw Genode::Service_denied();
+ }
- if ((bus >= Device_config::MAX_BUSES) ||
- (device >= Device_config::MAX_DEVICES) ||
- (function >= Device_config::MAX_FUNCTIONS))
- throw Xml_attribute::Nonexistent_attribute();
+ Bdf const bdf = _bdf_from_xml(node);
enum { DOUBLET = false };
- if (!find_dev_in_policy(bus, device, function, DOUBLET))
- return;
-
- Genode::error("'", _label, "' - device '",
- Genode::Hex(bus), ":",
- Genode::Hex(device), ".", function, "' "
- "is part of more than one policy");
-
- } catch (Xml_attribute::Nonexistent_attribute) {
- Genode::error("'", _label, "' - "
- "invalid pci node attributes for bdf");
+ if (find_dev_in_policy(bdf, DOUBLET)) {
+ Genode::error("'", _label, "' - device '", bdf, "' "
+ "is part of more than one policy");
+ throw Genode::Service_denied();
+ }
}
- throw Genode::Service_denied();
});
}
@@ -618,14 +619,8 @@ class Platform::Session_component : public Genode::Rpc_object
*/
bool msi_usage()
{
- try {
- char mode[8];
- _policy.attribute("irq_mode").value(mode, sizeof(mode));
- if (!Genode::strcmp("nomsi", mode))
- return false;
- } catch (Genode::Xml_node::Nonexistent_attribute) { }
-
- return true;
+ typedef Genode::String<10> Mode;
+ return _policy.attribute_value("irq_mode", Mode()) != "nomsi";
}
@@ -686,8 +681,10 @@ class Platform::Session_component : public Genode::Rpc_object
continue;
/* check that policy permit access to the matched device */
- if (permit_device(bus, device, function,
- config.class_code()))
+ if (permit_device(Bdf { (unsigned)bus,
+ (unsigned)device,
+ (unsigned)function },
+ config.class_code()))
break;
}
@@ -855,13 +852,9 @@ class Platform::Root : public Genode::Root_component
xml_acpi.for_each_sub_node("bdf", [&] (Xml_node &node) {
- uint32_t bdf_start = 0;
- uint32_t func_count = 0;
- addr_t base = 0;
-
- node.attribute("start").value(&bdf_start);
- node.attribute("count").value(&func_count);
- node.attribute("base").value(&base);
+ uint32_t const bdf_start = node.attribute_value("start", 0U);
+ uint32_t const func_count = node.attribute_value("count", 0U);
+ addr_t const base = node.attribute_value("base", 0UL);
Session_component::add_config_space(bdf_start, func_count,
base, _heap);
@@ -897,13 +890,9 @@ class Platform::Root : public Genode::Root_component
continue;
if (node.has_type("irq_override")) {
- unsigned irq = 0xff;
- unsigned gsi = 0xff;
- unsigned flags = 0xff;
-
- node.attribute("irq").value(&irq);
- node.attribute("gsi").value(&gsi);
- node.attribute("flags").value(&flags);
+ unsigned const irq = node.attribute_value("irq", 0xffU);
+ unsigned const gsi = node.attribute_value("gsi", 0xffU);
+ unsigned const flags = node.attribute_value("flags", 0xffU);
if (!acpi_platform) {
warning("MADT IRQ ", irq, "-> GSI ", gsi, " flags ",
@@ -924,9 +913,9 @@ class Platform::Root : public Genode::Root_component
}
if (node.has_type("rmrr")) {
- uint64_t mem_start = 0, mem_end = 0;
- node.attribute("start").value(&mem_start);
- node.attribute("end").value(&mem_end);
+ uint64_t const
+ mem_start = node.attribute_value("start", (uint64_t)0),
+ mem_end = node.attribute_value("end", (uint64_t)0);
if (node.num_sub_nodes() == 0)
throw 3;
@@ -940,15 +929,15 @@ class Platform::Root : public Genode::Root_component
throw 4;
unsigned bus = 0, dev = 0, func = 0;
- scope.attribute("bus_start").value(&bus);
+ scope.attribute("bus_start").value(bus);
for (unsigned p = 0; p < scope.num_sub_nodes(); p++) {
Xml_node path = scope.sub_node(p);
if (!path.has_type("path"))
throw 5;
- path.attribute("dev").value(&dev);
- path.attribute("func").value(&func);
+ path.attribute("dev") .value(dev);
+ path.attribute("func").value(func);
Device_config bridge(bus, dev, func,
&config_access);
@@ -964,7 +953,7 @@ class Platform::Root : public Genode::Root_component
}
if (node.has_type("root_bridge")) {
- node.attribute("bdf").value(&Platform::Bridge::root_bridge_bdf);
+ node.attribute("bdf").value(Platform::Bridge::root_bridge_bdf);
continue;
}
@@ -973,15 +962,10 @@ class Platform::Root : public Genode::Root_component
throw __LINE__;
}
- unsigned gsi;
- unsigned bridge_bdf;
- unsigned device;
- unsigned device_pin;
-
- node.attribute("gsi").value(&gsi);
- node.attribute("bridge_bdf").value(&bridge_bdf);
- node.attribute("device").value(&device);
- node.attribute("device_pin").value(&device_pin);
+ unsigned const gsi = node.attribute_value("gsi", 0U),
+ bridge_bdf = node.attribute_value("bridge_bdf", 0U),
+ device = node.attribute_value("device", 0U),
+ device_pin = node.attribute_value("device_pin", 0U);
/* drop routing information on non ACPI platform */
if (!acpi_platform)
diff --git a/repos/os/src/drivers/sd_card/adma2.cc b/repos/os/src/drivers/sd_card/adma2.cc
index ceda88aa6d..9464957984 100644
--- a/repos/os/src/drivers/sd_card/adma2.cc
+++ b/repos/os/src/drivers/sd_card/adma2.cc
@@ -20,7 +20,7 @@
using namespace Adma2;
-Table::Table(Ram_session &ram, Region_map &rm)
+Table::Table(Ram_allocator &ram, Region_map &rm)
:
_ds(ram, rm, _ds_size, UNCACHED),
_base_virt(_ds.local_addr()),
diff --git a/repos/os/src/drivers/sd_card/adma2.h b/repos/os/src/drivers/sd_card/adma2.h
index d2d0bbcd62..f6c5a4822a 100644
--- a/repos/os/src/drivers/sd_card/adma2.h
+++ b/repos/os/src/drivers/sd_card/adma2.h
@@ -74,7 +74,7 @@ class Adma2::Table
public:
- Table(Ram_session &ram, Region_map &rm);
+ Table(Ram_allocator &ram, Region_map &rm);
/**
* Marshal descriptors according to block request
diff --git a/repos/os/src/drivers/sd_card/driver_base.h b/repos/os/src/drivers/sd_card/driver_base.h
index 64809ab23a..582dbe5385 100644
--- a/repos/os/src/drivers/sd_card/driver_base.h
+++ b/repos/os/src/drivers/sd_card/driver_base.h
@@ -30,7 +30,7 @@ class Sd_card::Driver_base : public Block::Driver,
{
public:
- Driver_base(Genode::Ram_session &ram)
+ Driver_base(Genode::Ram_allocator &ram)
: Block::Driver(ram) { }
/*******************
diff --git a/repos/os/src/drivers/uart/uart_component.h b/repos/os/src/drivers/uart/uart_component.h
index 3c4069660b..98b29174dd 100644
--- a/repos/os/src/drivers/uart/uart_component.h
+++ b/repos/os/src/drivers/uart/uart_component.h
@@ -219,32 +219,16 @@ class Uart::Root : public Uart::Root_component
Session_component *_create_session(const char *args)
{
- try {
- Session_label label = label_from_args(args);
- Session_policy policy(label, _config.xml());
+ Session_label const label = label_from_args(args);
+ Session_policy const policy(label, _config.xml());
- unsigned index = 0;
- policy.attribute("uart").value(&index);
+ unsigned const index = policy.attribute_value("uart", 0U);
+ unsigned const baudrate = policy.attribute_value("baudrate", 0U);
+ bool const detect_size = policy.attribute_value("detect_size", false);
- unsigned baudrate = 0;
- try {
- policy.attribute("baudrate").value(&baudrate);
- } catch (Xml_node::Nonexistent_attribute) { }
-
- bool detect_size = policy.attribute_value("detect_size", false);
-
- return new (md_alloc())
- Session_component(_env, _driver_factory, index,
- baudrate, detect_size);
- }
- catch (Xml_node::Nonexistent_attribute) {
- Genode::error("Missing \"uart\" attribute in policy definition");
- throw Genode::Service_denied();
- }
- catch (Session_policy::No_policy_defined) {
- Genode::error("Invalid session request, no matching policy");
- throw Genode::Service_denied();
- }
+ return new (md_alloc())
+ Session_component(_env, _driver_factory, index,
+ baudrate, detect_size);
}
public:
diff --git a/repos/os/src/drivers/usb_block/main.cc b/repos/os/src/drivers/usb_block/main.cc
index 876527c027..64f26a8fd5 100644
--- a/repos/os/src/drivers/usb_block/main.cc
+++ b/repos/os/src/drivers/usb_block/main.cc
@@ -108,7 +108,7 @@ struct Usb::Block_driver : Usb::Completion,
{
static Genode::String<256> usb_label;
try {
- node.attribute("label").value(&usb_label);
+ node.attribute("label").value(usb_label);
return usb_label.string();
} catch (...) { }
diff --git a/repos/os/src/init/child.cc b/repos/os/src/init/child.cc
index 3f691d4fda..ce3eeb0df0 100644
--- a/repos/os/src/init/child.cc
+++ b/repos/os/src/init/child.cc
@@ -54,11 +54,11 @@ Init::Child::apply_config(Xml_node start_node)
Config_update config_update = CONFIG_UNCHANGED;
- /* import new start node if new version differs */
- if (start_node.size() != _start_node->xml().size() ||
- Genode::memcmp(start_node.addr(), _start_node->xml().addr(),
- start_node.size()) != 0)
- {
+ /*
+ * Import new start node if new version differs
+ */
+ if (start_node.differs_from(_start_node->xml())) {
+
/*
* Check for a change of the version attribute, force restart
* if the version changed.
@@ -85,11 +85,10 @@ Init::Child::apply_config(Xml_node start_node)
if (config_was_present && config_is_present) {
- Xml_node old_config = _start_node->xml().sub_node(tag);
- Xml_node new_config = start_node.sub_node(tag);
+ Xml_node const old_config = _start_node->xml().sub_node(tag);
+ Xml_node const new_config = start_node.sub_node(tag);
- if (Genode::memcmp(old_config.addr(), new_config.addr(),
- min(old_config.size(), new_config.size())))
+ if (new_config.differs_from(old_config))
config_update = CONFIG_CHANGED;
}
@@ -354,14 +353,14 @@ void Init::Child::report_state(Xml_generator &xml, Report_detail const &detail)
if (_heartbeat_enabled && _child.skipped_heartbeats())
xml.attribute("skipped_heartbeats", _child.skipped_heartbeats());
- if (detail.child_ram() && _child.ram_session_cap().valid()) {
+ if (detail.child_ram() && _child.pd_session_cap().valid()) {
xml.node("ram", [&] () {
xml.attribute("assigned", String<32> {
Number_of_bytes(_resources.assigned_ram_quota.value) });
if (pd_alive)
- generate_ram_info(xml, _child.ram());
+ generate_ram_info(xml, _child.pd());
if (_requested_resources.constructed() && _requested_resources->ram.value)
xml.attribute("requested", String<32>(_requested_resources->ram));
@@ -423,7 +422,7 @@ void Init::Child::init(Pd_session &session, Pd_session_capability cap)
catch (Out_of_caps) {
error(name(), ": unable to initialize cap quota of PD"); }
- try { _env.ram().transfer_quota(cap, ram_quota); }
+ try { _env.pd().transfer_quota(cap, ram_quota); }
catch (Out_of_ram) {
error(name(), ": unable to initialize RAM quota of PD"); }
}
diff --git a/repos/os/src/init/child.h b/repos/os/src/init/child.h
index cc819a523e..895d71065f 100644
--- a/repos/os/src/init/child.h
+++ b/repos/os/src/init/child.h
@@ -286,15 +286,18 @@ class Init::Child : Child_policy, Routed_service::Wakeup
if (config_len + 1 /* null termination */ >= dst_len)
throw Buffer_capacity_exceeded();
- /*
- * The 'config.size()' method returns the number of bytes of
- * the config-node content, which is not null-terminated. Since
- * 'Genode::strncpy' always null-terminates the result, the
- * last byte of the source string is not copied. Hence, it is
- * safe to add '1' to 'config_len' and thereby include the
- * last actual config-content character in the result.
- */
- Genode::strncpy(dst, config.addr(), config_len + 1);
+ config.with_raw_node([&] (char const *start, size_t length) {
+
+ /*
+ * The 'length' is the number of bytes of the config-node
+ * content, which is not null-terminated. Since
+ * 'Genode::strncpy' always null-terminates the result, the
+ * last byte of the source string is not copied. Hence, it
+ * is safe to add '1' to 'length' and thereby include the
+ * last actual config-content character in the result.
+ */
+ Genode::strncpy(dst, start, length + 1);
+ });
}
void trigger_update() { _session.trigger_update(); }
@@ -337,20 +340,27 @@ class Init::Child : Child_policy, Routed_service::Wakeup
Genode::Child _child { _env.rm(), _env.ep().rpc_ep(), *this };
- struct Ram_pd_accessor : Routed_service::Ram_accessor,
- Routed_service::Pd_accessor
+ struct Pd_accessor : Routed_service::Pd_accessor
{
Genode::Child &_child;
- Ram_pd_accessor(Genode::Child &child) : _child(child) { }
+ Pd_accessor(Genode::Child &child) : _child(child) { }
- Ram_session &ram() override { return _child.ram(); }
- Ram_session_capability ram_cap() const override { return _child.ram_session_cap(); }
+ Pd_session &pd() override { return _child.pd(); }
+ Pd_session_capability pd_cap() const override { return _child.pd_session_cap(); }
- Pd_session &pd() override { return _child.pd(); }
- Pd_session_capability pd_cap() const override { return _child.pd_session_cap(); }
+ } _pd_accessor { _child };
- } _ram_pd_accessor { _child };
+ struct Ram_accessor : Routed_service::Ram_accessor
+ {
+ Genode::Child &_child;
+
+ Ram_accessor(Genode::Child &child) : _child(child) { }
+
+ Pd_session &ram() override { return _child.pd(); }
+ Pd_session_capability ram_cap() const override { return _child.pd_session_cap(); }
+
+ } _ram_accessor { _child };
/**
* Async_service::Wakeup callback
@@ -418,7 +428,7 @@ class Init::Child : Child_policy, Routed_service::Wakeup
new (_alloc)
Routed_service(_child_services, this->name(),
- _ram_pd_accessor, _ram_pd_accessor,
+ _pd_accessor, _ram_accessor,
_session_requester.id_space(),
_child.session_factory(),
name, *this);
@@ -481,7 +491,7 @@ class Init::Child : Child_policy, Routed_service::Wakeup
Ram_quota ram_quota() const { return _resources.assigned_ram_quota; }
Cap_quota cap_quota() const { return _resources.assigned_cap_quota; }
- void initiate_env_ram_session()
+ void initiate_env_pd_session()
{
if (_state == STATE_INITIAL) {
_child.initiate_env_ram_session();
diff --git a/repos/os/src/init/main.cc b/repos/os/src/init/main.cc
index dd0aa71c1a..b29ed53d98 100644
--- a/repos/os/src/init/main.cc
+++ b/repos/os/src/init/main.cc
@@ -63,7 +63,7 @@ struct Init::Main : State_reporter::Producer,
{
Ram_quota const preserved_ram = _preserved_ram_from_config(_config_xml);
- Ram_quota avail_ram = _env.ram().avail_ram();
+ Ram_quota avail_ram = _env.pd().avail_ram();
if (preserved_ram.value > avail_ram.value) {
error("RAM preservation exceeds available memory");
@@ -115,7 +115,7 @@ struct Init::Main : State_reporter::Producer,
void produce_state_report(Xml_generator &xml, Report_detail const &detail) const
{
if (detail.init_ram())
- xml.node("ram", [&] () { generate_ram_info (xml, _env.ram()); });
+ xml.node("ram", [&] () { generate_ram_info (xml, _env.pd()); });
if (detail.init_caps())
xml.node("caps", [&] () { generate_caps_info(xml, _env.pd()); });
@@ -444,7 +444,7 @@ void Init::Main::_handle_config()
*/
_children.for_each_child([&] (Child &child) {
if (!child.abandoned())
- child.initiate_env_ram_session(); });
+ child.initiate_env_pd_session(); });
/*
* Initiate remaining environment sessions of all new children
diff --git a/repos/os/src/init/server.cc b/repos/os/src/init/server.cc
index 48fd525128..ac5dd3a26f 100644
--- a/repos/os/src/init/server.cc
+++ b/repos/os/src/init/server.cc
@@ -162,7 +162,7 @@ void Init::Server::_close_session(Session_state &session,
Ram_transfer::Account &service_ram_account = session.service();
Cap_transfer::Account &service_cap_account = session.service();
- service_ram_account.try_transfer(_env.ram_session_cap(),
+ service_ram_account.try_transfer(_env.pd_session_cap(),
session.donated_ram_quota());
service_cap_account.try_transfer(_env.pd_session_cap(),
@@ -233,8 +233,8 @@ void Init::Server::_handle_create_session_request(Xml_node request,
/* transfer session quota */
try {
- Ram_transfer::Remote_account env_ram_account(_env.ram(), _env.ram_session_cap());
- Cap_transfer::Remote_account env_cap_account(_env.pd(), _env.pd_session_cap());
+ Ram_transfer::Remote_account env_ram_account(_env.pd(), _env.pd_session_cap());
+ Cap_transfer::Remote_account env_cap_account(_env.pd(), _env.pd_session_cap());
Ram_transfer ram_transfer(forward_ram_quota, env_ram_account, route.service);
Cap_transfer cap_transfer(cap_quota, env_cap_account, route.service);
@@ -298,8 +298,8 @@ void Init::Server::_handle_upgrade_session_request(Xml_node request,
session.phase = Session_state::UPGRADE_REQUESTED;
try {
- Ram_transfer::Remote_account env_ram_account(_env.ram(), _env.ram_session_cap());
- Cap_transfer::Remote_account env_cap_account(_env.pd(), _env.pd_session_cap());
+ Ram_transfer::Remote_account env_ram_account(_env.pd(), _env.pd_session_cap());
+ Cap_transfer::Remote_account env_cap_account(_env.pd(), _env.pd_session_cap());
Ram_transfer ram_transfer(ram_quota, env_ram_account, session.service());
Cap_transfer cap_transfer(cap_quota, env_cap_account, session.service());
diff --git a/repos/os/src/init/service.h b/repos/os/src/init/service.h
index d31246dd35..fc08c45650 100644
--- a/repos/os/src/init/service.h
+++ b/repos/os/src/init/service.h
@@ -65,24 +65,23 @@ class Init::Routed_service : public Async_service, public Abandonable
typedef Child_policy::Name Child_name;
- struct Ram_accessor : Interface
- {
- virtual Ram_session &ram() = 0;
- virtual Ram_session_capability ram_cap() const = 0;
- };
-
struct Pd_accessor : Interface
{
virtual Pd_session &pd() = 0;
virtual Pd_session_capability pd_cap() const = 0;
};
+ struct Ram_accessor : Interface
+ {
+ virtual Pd_session &ram() = 0;
+ virtual Pd_session_capability ram_cap() const = 0;
+ };
+
private:
Child_name _child_name;
- Ram_accessor &_ram_accessor;
- Pd_accessor &_pd_accessor;
+ Pd_accessor &_pd_accessor;
Session_state::Factory &_factory;
@@ -100,16 +99,15 @@ class Init::Routed_service : public Async_service, public Abandonable
*/
Routed_service(Registry &services,
Child_name const &child_name,
- Ram_accessor &ram_accessor,
Pd_accessor &pd_accessor,
+ Ram_accessor &,
Id_space &server_id_space,
Session_state::Factory &factory,
Service::Name const &name,
Wakeup &wakeup)
:
Async_service(name, server_id_space, factory, wakeup),
- _child_name(child_name),
- _ram_accessor(ram_accessor), _pd_accessor(pd_accessor),
+ _child_name(child_name), _pd_accessor(pd_accessor),
_factory(factory), _registry_element(services, *this)
{ }
@@ -120,17 +118,17 @@ class Init::Routed_service : public Async_service, public Abandonable
/**
* Ram_transfer::Account interface
*/
- void transfer(Ram_session_capability to, Ram_quota amount) override
+ void transfer(Pd_session_capability to, Ram_quota amount) override
{
- if (to.valid()) _ram_accessor.ram().transfer_quota(to, amount);
+ if (to.valid()) _pd_accessor.pd().transfer_quota(to, amount);
}
/**
* Ram_transfer::Account interface
*/
- Ram_session_capability cap(Ram_quota) const override
+ Pd_session_capability cap(Ram_quota) const override
{
- return _ram_accessor.ram_cap();
+ return _pd_accessor.pd_cap();
}
/**
diff --git a/repos/os/src/init/utils.h b/repos/os/src/init/utils.h
index ac0f511b0a..f3bb084cc0 100644
--- a/repos/os/src/init/utils.h
+++ b/repos/os/src/init/utils.h
@@ -162,12 +162,12 @@ namespace Init {
}
- inline void generate_ram_info(Xml_generator &xml, Ram_session const &ram)
+ inline void generate_ram_info(Xml_generator &xml, Pd_session const &pd)
{
typedef String<32> Value;
- xml.attribute("quota", Value(ram.ram_quota()));
- xml.attribute("used", Value(ram.used_ram()));
- xml.attribute("avail", Value(ram.avail_ram()));
+ xml.attribute("quota", Value(pd.ram_quota()));
+ xml.attribute("used", Value(pd.used_ram()));
+ xml.attribute("avail", Value(pd.avail_ram()));
}
inline void generate_caps_info(Xml_generator &xml, Pd_session const &pd)
@@ -196,9 +196,9 @@ namespace Init {
inline long priority_from_xml(Xml_node start_node, Prio_levels prio_levels)
{
- long priority = Cpu_session::DEFAULT_PRIORITY;
- try { start_node.attribute("priority").value(&priority); }
- catch (...) { }
+ long const default_priority = Cpu_session::DEFAULT_PRIORITY;
+
+ long priority = start_node.attribute_value("priority", default_priority);
/*
* All priority declarations in the config file are
@@ -211,9 +211,9 @@ namespace Init {
if (priority && (priority >= prio_levels.value)) {
long new_prio = prio_levels.value ? prio_levels.value - 1 : 0;
- char name[Service::Name::capacity()];
- start_node.attribute("name").value(name, sizeof(name));
- warning(Cstring(name), ": invalid priority, upgrading "
+
+ Service::Name const name = start_node.attribute_value("name", Service::Name());
+ warning(name, ": invalid priority, upgrading "
"from ", -priority, " to ", -new_prio);
return new_prio;
}
diff --git a/repos/os/src/lib/vfs/block_file_system.h b/repos/os/src/lib/vfs/block_file_system.h
index ee4de85bee..9772dddc3d 100644
--- a/repos/os/src/lib/vfs/block_file_system.h
+++ b/repos/os/src/lib/vfs/block_file_system.h
@@ -341,15 +341,12 @@ class Vfs::Block_file_system : public Single_file_system
_env(env),
_label(config.attribute_value("label", Label())),
_block_buffer(0),
- _block_buffer_count(1),
+ _block_buffer_count(config.attribute_value("block_buffer_count", 1UL)),
_tx_source(_block.tx()),
_readable(false),
_writeable(false),
_source_submit_cap(_signal_receiver.manage(&_signal_context))
{
- try { config.attribute("block_buffer_count").value(&_block_buffer_count); }
- catch (...) { }
-
_block.info(&_block_count, &_block_size, &_block_ops);
_readable = _block_ops.supported(Block::Packet_descriptor::READ);
diff --git a/repos/os/src/lib/vfs/file_system_factory.cc b/repos/os/src/lib/vfs/file_system_factory.cc
index 175e77e283..cf62e5100f 100644
--- a/repos/os/src/lib/vfs/file_system_factory.cc
+++ b/repos/os/src/lib/vfs/file_system_factory.cc
@@ -111,17 +111,6 @@ Vfs::Global_file_system_factory::_try_create(Vfs::Env &env,
}
-/**
- * Return name of VFS node
- */
-Node_name Vfs::Global_file_system_factory::_node_name(Genode::Xml_node node)
-{
- char node_name [Node_name::capacity()];
- node.type_name(node_name, sizeof(node_name));
- return Node_name(node_name);
-}
-
-
/**
* Return matching library name for a given vfs node name
*/
@@ -173,15 +162,14 @@ Vfs::File_system_factory &Vfs::Global_file_system_factory::_load_factory(Vfs::En
/**
* Try to load external File_system_factory provider
*/
-bool Vfs::Global_file_system_factory::_probe_external_factory(Vfs::Env &env,
- Genode::Xml_node node)
+bool Vfs::Global_file_system_factory::_probe_external_factory(Vfs::Env &env,
+ Genode::Xml_node node)
{
- Library_name const lib_name = _library_name(_node_name(node));
+ Library_name const lib_name = _library_name(node.type());
try {
_list.insert(new (env.alloc())
- External_entry(_node_name(node).string(),
- _load_factory(env, lib_name)));
+ External_entry(node.type().string(), _load_factory(env, lib_name)));
return true;
} catch (Factory_not_available) { return false; }
diff --git a/repos/os/src/lib/vfs/inline_file_system.h b/repos/os/src/lib/vfs/inline_file_system.h
index 7f96398f91..2816839392 100644
--- a/repos/os/src/lib/vfs/inline_file_system.h
+++ b/repos/os/src/lib/vfs/inline_file_system.h
@@ -26,14 +26,7 @@ class Vfs::Inline_file_system : public Single_file_system
{
private:
- char const * const _base;
- file_size const _size;
-
- /*
- * Noncopyable
- */
- Inline_file_system(Inline_file_system const &);
- Inline_file_system &operator = (Inline_file_system const &);
+ Xml_node _node;
class Inline_vfs_handle : public Single_vfs_handle
{
@@ -101,11 +94,16 @@ class Vfs::Inline_file_system : public Single_file_system
public:
+ /**
+ * Constructor
+ *
+ * The 'config' XML node (that points to its content) is stored within
+ * the object after construction time. The underlying backing store
+ * must be kept in tact during the lifefile of the object.
+ */
Inline_file_system(Vfs::Env&, Genode::Xml_node config)
:
- Single_file_system(NODE_TYPE_FILE, name(), config),
- _base(config.content_base()),
- _size(config.content_size())
+ Single_file_system(NODE_TYPE_FILE, name(), config), _node(config)
{ }
static char const *name() { return "inline"; }
@@ -123,8 +121,10 @@ class Vfs::Inline_file_system : public Single_file_system
return OPEN_ERR_UNACCESSIBLE;
try {
- *out_handle = new (alloc)
- Inline_vfs_handle(*this, *this, alloc, _base, _size);
+ _node.with_raw_content([&] (char const *base, Genode::size_t size) {
+ *out_handle = new (alloc)
+ Inline_vfs_handle(*this, *this, alloc, base, size);
+ });
return OPEN_OK;
}
catch (Genode::Out_of_ram) { return OPEN_ERR_OUT_OF_RAM; }
@@ -134,7 +134,8 @@ class Vfs::Inline_file_system : public Single_file_system
Stat_result stat(char const *path, Stat &out) override
{
Stat_result result = Single_file_system::stat(path, out);
- out.size = _size;
+ _node.with_raw_content([&] (char const *, Genode::size_t size) {
+ out.size = size; });
return result;
}
};
diff --git a/repos/os/src/lib/vfs/rom_file_system.h b/repos/os/src/lib/vfs/rom_file_system.h
index 6e6c9735e0..6c7f610149 100644
--- a/repos/os/src/lib/vfs/rom_file_system.h
+++ b/repos/os/src/lib/vfs/rom_file_system.h
@@ -26,28 +26,11 @@ class Vfs::Rom_file_system : public Single_file_system
enum Rom_type { ROM_TEXT, ROM_BINARY };
- struct Label
- {
- enum { LABEL_MAX_LEN = 64 };
- char string[LABEL_MAX_LEN];
- bool const binary;
+ typedef String<64> Label;
- Label(Xml_node config)
- :
- binary(config.attribute_value("binary", true))
- {
- /* obtain label from config */
- string[0] = 0;
- try { config.attribute("label").value(string, sizeof(string)); }
- catch (...)
- {
- /* use VFS node name if label was not provided */
- string[0] = 0;
- try { config.attribute("name").value(string, sizeof(string)); }
- catch (...) { }
- }
- }
- } _label;
+ Label const _label;
+
+ bool const _binary;
Genode::Attached_rom_dataspace _rom;
@@ -125,8 +108,14 @@ class Vfs::Rom_file_system : public Single_file_system
Genode::Xml_node config)
:
Single_file_system(NODE_TYPE_FILE, name(), config),
- _label(config),
- _rom(env.env(), _label.string)
+
+ /* use 'label' attribute if present, fall back to 'name' if not */
+ _label(config.attribute_value("label",
+ config.attribute_value("name", Label()))),
+
+ _binary(config.attribute_value("binary", true)),
+
+ _rom(env.env(), _label.string())
{ }
static char const *name() { return "rom"; }
@@ -147,7 +136,7 @@ class Vfs::Rom_file_system : public Single_file_system
try {
*out_handle = new (alloc)
- Rom_vfs_handle(*this, *this, alloc, _rom, _label.binary ? ROM_BINARY : ROM_TEXT);
+ Rom_vfs_handle(*this, *this, alloc, _rom, _binary ? ROM_BINARY : ROM_TEXT);
return OPEN_OK;
}
catch (Genode::Out_of_ram) { return OPEN_ERR_OUT_OF_RAM; }
diff --git a/repos/os/src/server/chroot/component.cc b/repos/os/src/server/chroot/component.cc
index 16c7d3393d..138eeeba92 100644
--- a/repos/os/src/server/chroot/component.cc
+++ b/repos/os/src/server/chroot/component.cc
@@ -106,7 +106,8 @@ struct Chroot::Main
Session_capability request_session(Parent::Client::Id const &id,
Session_state::Args const &args)
{
- char tmp[PATH_MAX_LEN];
+ typedef String Prefix;
+
Path root_path;
Session_label const label = label_from_args(args.string());
@@ -114,22 +115,24 @@ struct Chroot::Main
if (policy.has_attribute("path_prefix")) {
/* Use a chroot path from policy and label sub-directories */
- policy.attribute("path_prefix").value(tmp, sizeof(tmp));
- root_path.import(tmp);
+ Prefix const prefix = policy.attribute_value("path_prefix", Prefix());
+ root_path.import(prefix.string());
root_path.append(path_from_label(label.string()).string());
} else if (policy.has_attribute("path")) {
/* Use a chroot path from policy */
- policy.attribute("path").value(tmp, sizeof(tmp));
- root_path.import(tmp);
+ root_path.import(policy.attribute_value("path", Prefix()).string());
} else {
/* generate implicit chroot path from the label */
root_path = path_from_label(label.string());
}
- /* extract and append the orginal root */
- Arg_string::find_arg(args.string(), "root").string(
- tmp, sizeof(tmp), "/");
- root_path.append_element(tmp);
+ /* extract and append the session argument */
+ {
+ char tmp[PATH_MAX_LEN];
+ Arg_string::find_arg(args.string(), "root").string(tmp, sizeof(tmp), "/");
+ root_path.append_element(tmp);
+ }
+
root_path.remove_trailing('/');
char const *new_root = root_path.base();
diff --git a/repos/os/src/server/clipboard/main.cc b/repos/os/src/server/clipboard/main.cc
index ffdba7630d..4e74902f38 100644
--- a/repos/os/src/server/clipboard/main.cc
+++ b/repos/os/src/server/clipboard/main.cc
@@ -59,7 +59,7 @@ struct Rom::Registry : Rom::Registry_for_reader, Rom::Registry_for_writer
/**
* Constructor
*/
- Registry(Genode::Ram_session &ram, Genode::Region_map &rm,
+ Registry(Genode::Ram_allocator &ram, Genode::Region_map &rm,
Module::Read_policy const &read_policy,
Module::Write_policy const &write_policy)
:
diff --git a/repos/os/src/server/dynamic_rom/main.cc b/repos/os/src/server/dynamic_rom/main.cc
index f5ed390286..c890f766f3 100644
--- a/repos/os/src/server/dynamic_rom/main.cc
+++ b/repos/os/src/server/dynamic_rom/main.cc
@@ -120,8 +120,9 @@ class Dynamic_rom::Session_component : public Rpc_object
if (curr_step.has_type("sleep")
&& curr_step.has_attribute("milliseconds")) {
- unsigned long milliseconds = 0;
- curr_step.attribute("milliseconds").value(&milliseconds);
+ unsigned long const milliseconds =
+ curr_step.attribute_value("milliseconds", 0UL);
+
_timer.trigger_once(milliseconds*1000);
_log("sleep ", milliseconds, " milliseconds");
@@ -175,9 +176,8 @@ class Dynamic_rom::Session_component : public Rpc_object
/* fill with content of current step */
Xml_node step_node = _rom_node.sub_node(_last_content_idx);
- memcpy(_ram_ds->local_addr(),
- step_node.content_addr(),
- step_node.content_size());
+ step_node.with_raw_content([&] (char const *start, size_t size) {
+ memcpy(_ram_ds->local_addr(), start, size); });
/* cast RAM into ROM dataspace capability */
Dataspace_capability ds_cap = static_cap_cast(_ram_ds->cap());
diff --git a/repos/os/src/server/fs_log/session.h b/repos/os/src/server/fs_log/session.h
index b0cd47d26a..3902cd6d4b 100644
--- a/repos/os/src/server/fs_log/session.h
+++ b/repos/os/src/server/fs_log/session.h
@@ -80,7 +80,7 @@ class Fs_log::Session_component : public Genode::Rpc_object
{
using namespace Genode;
- if (!msg.is_valid_string()) {
+ if (!msg.valid_string()) {
Genode::error("received corrupted string");
return 0;
}
diff --git a/repos/os/src/server/input_merger/main.cc b/repos/os/src/server/input_merger/main.cc
index c6d7c9c291..0d1146de87 100644
--- a/repos/os/src/server/input_merger/main.cc
+++ b/repos/os/src/server/input_merger/main.cc
@@ -92,8 +92,7 @@ struct Input_merger::Main
config_rom.xml().for_each_sub_node("input", [&] (Xml_node input_node) {
try {
- Label label;
- input_node.attribute("label").value(&label);
+ Label label = input_node.attribute_value("label", Label());
try {
Input_source *input_source = new (heap)
diff --git a/repos/os/src/server/loader/child.h b/repos/os/src/server/loader/child.h
index 3471b014cb..7e04c7a6e4 100644
--- a/repos/os/src/server/loader/child.h
+++ b/repos/os/src/server/loader/child.h
@@ -56,6 +56,25 @@ class Loader::Child : public Child_policy
Genode::Child _child;
+ Service &_matching_service(Service::Name const &name)
+ {
+ if (name == "Nitpicker") return _local_nitpicker_service;
+ if (name == "ROM") return _local_rom_service;
+ if (name == "CPU") return _local_cpu_service;
+ if (name == "PD") return _local_pd_service;
+
+ /* populate session-local parent service registry on demand */
+ Service *service = nullptr;
+ _parent_services.for_each([&] (Parent_service &s) {
+ if (s.name() == name)
+ service = &s; });
+
+ if (service)
+ return *service;
+
+ return *new (_alloc) Parent_service(_parent_services, _env, name);
+ }
+
public:
Child(Env &env,
@@ -106,24 +125,12 @@ class Loader::Child : public Child_policy
ref_pd().transfer_quota(pd_cap, _ram_quota);
}
- Service &resolve_session_request(Service::Name const &name,
- Session_state::Args const &) override
+ Route resolve_session_request(Service::Name const &name,
+ Session_label const &label) override
{
- if (name == "Nitpicker") return _local_nitpicker_service;
- if (name == "ROM") return _local_rom_service;
- if (name == "CPU") return _local_cpu_service;
- if (name == "PD") return _local_pd_service;
-
- /* populate session-local parent service registry on demand */
- Service *service = nullptr;
- _parent_services.for_each([&] (Parent_service &s) {
- if (s.name() == name)
- service = &s; });
-
- if (service)
- return *service;
-
- return *new (_alloc) Parent_service(_parent_services, name);
+ return Route { .service = _matching_service(name),
+ .label = label,
+ .diag = Session::Diag() };
}
};
diff --git a/repos/os/src/server/loader/main.cc b/repos/os/src/server/loader/main.cc
index 20b2b98526..627f6b8318 100644
--- a/repos/os/src/server/loader/main.cc
+++ b/repos/os/src/server/loader/main.cc
@@ -22,7 +22,6 @@
/* local includes */
#include
#include
-#include
#include
@@ -206,7 +205,9 @@ class Loader::Session_component : public Rpc_object
Xml_node const _config;
Cap_quota const _cap_quota;
Ram_quota const _ram_quota;
- Ram_session_client_guard _local_ram { _env.ram_session_cap(), _ram_quota };
+ Cap_quota_guard _cap_guard { _cap_quota };
+ Ram_quota_guard _ram_guard { _ram_quota };
+ Constrained_ram_allocator _local_ram { _env.ram(), _ram_guard, _cap_guard };
Heap _md_alloc { _local_ram, _env.rm() };
size_t _subsystem_cap_quota_limit = 0;
size_t _subsystem_ram_quota_limit = 0;
diff --git a/repos/os/src/server/loader/ram_session_client_guard.h b/repos/os/src/server/loader/ram_session_client_guard.h
deleted file mode 100644
index 2b7628dae2..0000000000
--- a/repos/os/src/server/loader/ram_session_client_guard.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * \brief A guard for RAM session clients to limit memory exhaustion
- * \author Christian Prochaska
- * \date 2012-04-25
- */
-
-/*
- * Copyright (C) 2012-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.
- */
-
-#ifndef _RAM_SESSION_CLIENT_GUARD_H_
-#define _RAM_SESSION_CLIENT_GUARD_H_
-
-#include
-#include
-#include
-#include
-#include
-
-namespace Genode {
-
- class Ram_session_client_guard : public Ram_allocator
- {
- private:
-
- Pd_session_client _pd;
- size_t const _amount; /* total amount */
- size_t _consumed; /* already consumed bytes */
- Lock mutable _consumed_lock { };
-
- public:
-
- Ram_session_client_guard(Pd_session_capability session, Ram_quota amount)
- : _pd(session), _amount(amount.value), _consumed(0) { }
-
- Ram_dataspace_capability alloc(size_t size, Cache_attribute cached) override
- {
- Lock::Guard _consumed_lock_guard(_consumed_lock);
-
- if ((_amount - _consumed) < size) {
- warning("quota exceeded! amount=", _amount, ", "
- "size=", size, ", consumed=", _consumed);
- return Ram_dataspace_capability();
- }
-
- Ram_dataspace_capability cap = _pd.alloc(size, cached);
-
- _consumed += size;
-
- return cap;
- }
-
- void free(Ram_dataspace_capability ds) override
- {
- Lock::Guard _consumed_lock_guard(_consumed_lock);
-
- _consumed -= Dataspace_client(ds).size();
-
- _pd.free(ds);
- }
-
- size_t dataspace_size(Ram_dataspace_capability ds) const override
- {
- Lock::Guard _consumed_lock_guard(_consumed_lock);
-
- return _pd.dataspace_size(ds);
- }
- };
-}
-
-#endif /* _RAM_SESSION_CLIENT_GUARD_H_ */
diff --git a/repos/os/src/server/log_report/main.cc b/repos/os/src/server/log_report/main.cc
index 62671699d9..b788fb9673 100644
--- a/repos/os/src/server/log_report/main.cc
+++ b/repos/os/src/server/log_report/main.cc
@@ -41,7 +41,7 @@ class Report::Session_component : public Genode::Rpc_object
public:
- Session_component(Ram_session &ram,
+ Session_component(Ram_allocator &ram,
Region_map &rm,
Genode::Session_label const &label,
size_t buffer_size)
@@ -75,8 +75,8 @@ class Report::Root : public Genode::Root_component
{
private:
- Ram_session &_ram;
- Region_map &_rm;
+ Ram_allocator &_ram;
+ Region_map &_rm;
protected:
@@ -98,7 +98,7 @@ class Report::Root : public Genode::Root_component
public:
Root(Entrypoint &ep, Genode::Allocator &md_alloc,
- Ram_session &ram, Region_map &rm)
+ Ram_allocator &ram, Region_map &rm)
:
Genode::Root_component(&ep.rpc_ep(), &md_alloc),
_ram(ram), _rm(rm)
diff --git a/repos/os/src/server/log_terminal/main.cc b/repos/os/src/server/log_terminal/main.cc
index 901919e26e..e2d2f77fdf 100644
--- a/repos/os/src/server/log_terminal/main.cc
+++ b/repos/os/src/server/log_terminal/main.cc
@@ -99,9 +99,9 @@ class Terminal::Session_component : public Rpc_object(&ep.rpc_ep(), &md_alloc),
_ram(ram), _rm(rm)
diff --git a/repos/os/src/server/lx_block/main.cc b/repos/os/src/server/lx_block/main.cc
index 79fdfde088..24c0c54f57 100644
--- a/repos/os/src/server/lx_block/main.cc
+++ b/repos/os/src/server/lx_block/main.cc
@@ -41,7 +41,7 @@ class Lx_block_driver : public Block::Driver
Genode::Env &_env;
Block::sector_t _block_count { 0 };
- Genode::size_t _block_size { 512 };
+ Genode::size_t const _block_size { 512 };
Block::Session::Operations _block_ops { };
int _fd { -1 };
@@ -51,26 +51,22 @@ class Lx_block_driver : public Block::Driver
struct Could_not_open_file : Genode::Exception { };
Lx_block_driver(Genode::Env &env, Genode::Xml_node config)
- : Block::Driver(env.ram()), _env(env)
+ :
+ Block::Driver(env.ram()),
+ _env(env),
+ _block_size(config.attribute_value("block_size", Genode::Number_of_bytes()))
{
- Genode::String<256> file;
- try {
- config.attribute("file").value(&file);
- } catch (...) {
+ if (!config.has_attribute("block_size"))
+ Genode::warning("block size missing, assuming 512b");
+
+ bool const writeable = xml_attr_ok(config, "writeable");
+
+ if (!config.has_attribute("file")) {
Genode::error("mandatory file attribute missing");
throw Could_not_open_file();
}
- try {
- Genode::Number_of_bytes bytes;
- config.attribute("block_size").value(&bytes);
- _block_size = bytes;
- } catch (...) {
- Genode::warning("block size missing, assuming 512b");
- }
-
- bool const writeable = xml_attr_ok(config, "writeable");
-
+ auto const file = config.attribute_value("file", Genode::String<256>());
struct stat st;
if (stat(file.string(), &st)) {
perror("stat");
diff --git a/repos/os/src/server/nic_bridge/component.cc b/repos/os/src/server/nic_bridge/component.cc
index 6a7cda7ff0..f61475f560 100644
--- a/repos/os/src/server/nic_bridge/component.cc
+++ b/repos/os/src/server/nic_bridge/component.cc
@@ -108,18 +108,19 @@ void Session_component::set_ipv4_address(Ipv4_address ip_addr)
}
-Session_component::Session_component(Genode::Ram_session &ram,
+Session_component::Session_component(Genode::Ram_allocator &ram,
Genode::Region_map &rm,
Genode::Entrypoint &ep,
- Genode::size_t amount,
+ Genode::Ram_quota ram_quota,
+ Genode::Cap_quota cap_quota,
Genode::size_t tx_buf_size,
Genode::size_t rx_buf_size,
Mac_address vmac,
Net::Nic &nic,
bool const &verbose,
Genode::Session_label const &label,
- char *ip_addr)
-: Stream_allocator(ram, rm, amount),
+ Ip_addr const &ip_addr)
+: Stream_allocator(ram, rm, ram_quota, cap_quota),
Stream_dataspaces(ram, tx_buf_size, rx_buf_size),
Session_rpc_object(rm,
Stream_dataspaces::tx_ds,
@@ -133,12 +134,12 @@ Session_component::Session_component(Genode::Ram_session &ram,
vlan().mac_tree.insert(&_mac_node);
vlan().mac_list.insert(&_mac_node);
- /* static ip parsing */
- if (ip_addr != 0 && Genode::strlen(ip_addr)) {
- Ipv4_address ip = Ipv4_packet::ip_from_string(ip_addr);
+ /* static IP parsing */
+ if (ip_addr.valid()) {
+ Ipv4_address ip = Ipv4_packet::ip_from_string(ip_addr.string());
if (ip == Ipv4_address()) {
- Genode::warning("Empty or error ip address. Skipped.");
+ Genode::warning("Empty or error IP address. Skipped.");
} else {
set_ipv4_address(ip);
Genode::log("vmac = ", vmac, " ip = ", ip);
diff --git a/repos/os/src/server/nic_bridge/component.h b/repos/os/src/server/nic_bridge/component.h
index f817d1af42..1795b30883 100644
--- a/repos/os/src/server/nic_bridge/component.h
+++ b/repos/os/src/server/nic_bridge/component.h
@@ -17,10 +17,10 @@
/* Genode includes */
#include
#include
+#include
#include
#include
#include
-#include
#include
#include
#include
@@ -50,18 +50,24 @@ class Net::Stream_allocator
{
protected:
- Genode::Ram_session_guard _ram;
- Genode::Heap _heap;
- ::Nic::Packet_allocator _range_alloc;
+ Genode::Ram_quota_guard _ram_guard;
+ Genode::Cap_quota_guard _cap_guard;
+ Genode::Constrained_ram_allocator _ram;
+ Genode::Heap _heap;
+ ::Nic::Packet_allocator _range_alloc;
public:
- Stream_allocator(Genode::Ram_session &ram,
- Genode::Region_map &rm,
- Genode::size_t amount)
- : _ram(ram, amount),
- _heap(ram, rm),
- _range_alloc(&_heap) {}
+ Stream_allocator(Genode::Ram_allocator &ram,
+ Genode::Region_map &rm,
+ Genode::Ram_quota ram_quota,
+ Genode::Cap_quota cap_quota)
+ :
+ _ram_guard(ram_quota), _cap_guard(cap_quota),
+ _ram(ram, _ram_guard, _cap_guard),
+ _heap(ram, rm),
+ _range_alloc(&_heap)
+ { }
Genode::Range_allocator *range_allocator() {
return static_cast(&_range_alloc); }
@@ -70,9 +76,9 @@ class Net::Stream_allocator
struct Net::Stream_dataspace : Genode::Ram_dataspace_capability
{
- Genode::Ram_session &ram;
+ Genode::Ram_allocator &ram;
- Stream_dataspace(Genode::Ram_session &ram, Genode::size_t size)
+ Stream_dataspace(Genode::Ram_allocator &ram, Genode::size_t size)
: Genode::Ram_dataspace_capability(ram.alloc(size)), ram(ram) { }
~Stream_dataspace() { ram.free(*this); }
@@ -83,7 +89,7 @@ struct Net::Stream_dataspaces
{
Stream_dataspace tx_ds, rx_ds;
- Stream_dataspaces(Genode::Ram_session &ram, Genode::size_t tx_size,
+ Stream_dataspaces(Genode::Ram_allocator &ram, Genode::size_t tx_size,
Genode::size_t rx_size)
: tx_ds(ram, tx_size), rx_ds(ram, rx_size) { }
};
@@ -112,6 +118,8 @@ class Net::Session_component : private Net::Stream_allocator,
public:
+ typedef Genode::String<32> Ip_addr;
+
/**
* Constructor
*
@@ -123,17 +131,18 @@ class Net::Session_component : private Net::Stream_allocator,
* \param rx_buf_size buffer size for rx channel
* \param vmac virtual mac address
*/
- Session_component(Genode::Ram_session &ram,
+ Session_component(Genode::Ram_allocator &ram,
Genode::Region_map &rm,
Genode::Entrypoint &ep,
- Genode::size_t amount,
+ Genode::Ram_quota ram_quota,
+ Genode::Cap_quota cap_quota,
Genode::size_t tx_buf_size,
Genode::size_t rx_buf_size,
Mac_address vmac,
Net::Nic &nic,
bool const &verbose,
Genode::Session_label const &label,
- char *ip_addr = 0);
+ Ip_addr const &ip_addr);
~Session_component();
@@ -200,66 +209,84 @@ class Net::Root : public Genode::Root_component
Genode::Xml_node _config;
bool const &_verbose;
+ struct Policy
+ {
+ Session_component::Ip_addr ip_addr;
+
+ Mac_address mac;
+ };
+
+ static Policy _session_policy(Genode::Session_label const &label,
+ Genode::Xml_node config,
+ Mac_allocator &mac_alloc)
+ {
+ using namespace Genode;
+
+ typedef Session_component::Ip_addr Ip_addr;
+
+ Ip_addr ip_addr { };
+
+ try {
+ Session_policy const policy(label, config);
+
+ /* read IP address from policy */
+ if (!policy.has_attribute("ip_addr"))
+ warning("Missing \"ip_addr\" attribute in policy definition");
+
+ ip_addr = policy.attribute_value("ip_addr", Ip_addr());
+
+ /* determine session MAC address */
+ if (policy.has_attribute("mac")) {
+
+ Mac_address const mac = policy.attribute_value("mac", Mac_address());
+
+ if (mac_alloc.mac_managed_by_allocator(mac)) {
+ Genode::warning("Bad MAC address in policy");
+ throw Service_denied();
+ }
+ return Policy { .ip_addr = ip_addr, .mac = mac };
+ }
+
+ } catch (Session_policy::No_policy_defined) { }
+
+ /*
+ * If no policy is defined or if the policy lacks a 'mac'
+ * attribute, allocate a MAC from the allocator.
+ */
+ auto alloc_mac = [&] ()
+ {
+ try { return mac_alloc.alloc(); }
+ catch (Mac_allocator::Alloc_failed) {
+ Genode::warning("MAC address allocation failed!"); }
+
+ throw Service_denied();
+ };
+
+ return Policy { .ip_addr = ip_addr, .mac = alloc_mac() };
+ }
+
protected:
Session_component *_create_session(const char *args)
{
using namespace Genode;
- enum { MAX_IP_ADDR_LENGTH = 16, };
- char ip_addr[MAX_IP_ADDR_LENGTH];
- memset(ip_addr, 0, MAX_IP_ADDR_LENGTH);
+ Session_label const label = label_from_args(args);
- Session_label label;
- Mac_address mac;
- try {
- label = label_from_args(args);
- Session_policy policy(label, _config);
+ Policy const policy = _session_policy(label, _config, _mac_alloc);
- /* determine session MAC address */
- try {
- policy.attribute("mac").value(&mac);
- if (_mac_alloc.mac_managed_by_allocator(mac)) {
- Genode::warning("Bad MAC address in policy");
- throw Service_denied();
- }
- }
- catch (Xml_node::Nonexistent_attribute) {
- mac = _mac_alloc.alloc(); }
-
- policy.attribute("ip_addr").value(ip_addr, sizeof(ip_addr));
- }
- catch (Xml_node::Nonexistent_attribute) {
- Genode::log("Missing \"ip_addr\" attribute in policy definition"); }
-
- catch (Session_policy::No_policy_defined) {
- mac = _mac_alloc.alloc(); }
-
- catch (Mac_allocator::Alloc_failed) {
- Genode::warning("Mac address allocation failed!");
- throw Service_denied();
- }
- size_t ram_quota =
- Arg_string::find_arg(args, "ram_quota" ).ulong_value(0);
- size_t tx_buf_size =
+ size_t const tx_buf_size =
Arg_string::find_arg(args, "tx_buf_size").ulong_value(0);
- size_t rx_buf_size =
+ size_t const rx_buf_size =
Arg_string::find_arg(args, "rx_buf_size").ulong_value(0);
- try {
- return new (md_alloc())
- Session_component(_env.ram(), _env.rm(), _env.ep(),
- ram_quota, tx_buf_size, rx_buf_size,
- mac, _nic, _verbose, label, ip_addr);
- }
- catch (Out_of_ram) {
- Genode::warning("insufficient 'ram_quota'");
- throw Insufficient_ram_quota();
- }
- catch (Out_of_caps) {
- Genode::warning("insufficient 'cap_quota'");
- throw Insufficient_cap_quota();
- }
+ return new (md_alloc())
+ Session_component(_env.ram(), _env.rm(), _env.ep(),
+ ram_quota_from_args(args),
+ cap_quota_from_args(args),
+ tx_buf_size, rx_buf_size,
+ policy.mac, _nic, _verbose, label,
+ policy.ip_addr);
}
public:
diff --git a/repos/os/src/server/nic_bridge/mac_allocator.h b/repos/os/src/server/nic_bridge/mac_allocator.h
index d34179e644..b9112bab0e 100644
--- a/repos/os/src/server/nic_bridge/mac_allocator.h
+++ b/repos/os/src/server/nic_bridge/mac_allocator.h
@@ -53,7 +53,7 @@ class Net::Mac_allocator
void free(Mac_address mac) { _free[mac.addr[5]] = true; }
- bool mac_managed_by_allocator(Mac_address &mac)
+ bool mac_managed_by_allocator(Mac_address const &mac) const
{
return _base.addr[0] == mac.addr[0] &&
_base.addr[1] == mac.addr[1] &&
diff --git a/repos/os/src/server/nic_dump/component.cc b/repos/os/src/server/nic_dump/component.cc
index 765a71d1f7..011b946ba2 100644
--- a/repos/os/src/server/nic_dump/component.cc
+++ b/repos/os/src/server/nic_dump/component.cc
@@ -26,8 +26,8 @@ using namespace Genode;
** Communication_buffer **
**************************/
-Communication_buffer::Communication_buffer(Ram_session &ram,
- Genode::size_t const size)
+Communication_buffer::Communication_buffer(Ram_allocator &ram,
+ Genode::size_t const size)
:
Ram_dataspace_capability(ram.alloc(size)), _ram(ram)
{ }
@@ -38,11 +38,11 @@ Communication_buffer::Communication_buffer(Ram_session &ram,
****************************/
Session_component_base::
-Session_component_base(Allocator &guarded_alloc_backing,
- size_t const guarded_alloc_amount,
- Ram_session &buf_ram,
- size_t const tx_buf_size,
- size_t const rx_buf_size)
+Session_component_base(Allocator &guarded_alloc_backing,
+ size_t const guarded_alloc_amount,
+ Ram_allocator &buf_ram,
+ size_t const tx_buf_size,
+ size_t const rx_buf_size)
:
_guarded_alloc(&guarded_alloc_backing, guarded_alloc_amount),
_range_alloc(&_guarded_alloc), _tx_buf(buf_ram, tx_buf_size),
diff --git a/repos/os/src/server/nic_dump/component.h b/repos/os/src/server/nic_dump/component.h
index cad99c81f2..7feddbec69 100644
--- a/repos/os/src/server/nic_dump/component.h
+++ b/repos/os/src/server/nic_dump/component.h
@@ -37,12 +37,12 @@ class Net::Communication_buffer : public Genode::Ram_dataspace_capability
{
private:
- Genode::Ram_session &_ram;
+ Genode::Ram_allocator &_ram;
public:
- Communication_buffer(Genode::Ram_session &ram,
- Genode::size_t const size);
+ Communication_buffer(Genode::Ram_allocator &ram,
+ Genode::size_t const size);
~Communication_buffer() { _ram.free(*this); }
};
@@ -59,11 +59,11 @@ class Net::Session_component_base
public:
- Session_component_base(Genode::Allocator &guarded_alloc_backing,
- Genode::size_t const guarded_alloc_amount,
- Genode::Ram_session &buf_ram,
- Genode::size_t const tx_buf_size,
- Genode::size_t const rx_buf_size);
+ Session_component_base(Genode::Allocator &guarded_alloc_backing,
+ Genode::size_t const guarded_alloc_amount,
+ Genode::Ram_allocator &buf_ram,
+ Genode::size_t const tx_buf_size,
+ Genode::size_t const rx_buf_size);
};
diff --git a/repos/os/src/server/nic_loopback/main.cc b/repos/os/src/server/nic_loopback/main.cc
index e75e22d394..3255e73847 100644
--- a/repos/os/src/server/nic_loopback/main.cc
+++ b/repos/os/src/server/nic_loopback/main.cc
@@ -41,9 +41,6 @@ class Nic_loopback::Session_component : public Nic::Session_component
* \param rx_buf_size buffer size for rx channel
* \param rx_block_md_alloc backing store of the meta data of the
* rx block allocator
- * \param ram_session RAM session to allocate tx and rx buffers
- * \param ep entry point used for packet stream
- * channels
*/
Session_component(size_t const tx_buf_size,
size_t const rx_buf_size,
diff --git a/repos/os/src/server/nic_router/dhcp_client.h b/repos/os/src/server/nic_router/dhcp_client.h
index 3c8b621b8e..d89c29c2b7 100644
--- a/repos/os/src/server/nic_router/dhcp_client.h
+++ b/repos/os/src/server/nic_router/dhcp_client.h
@@ -16,6 +16,7 @@
/* Genode includes */
#include
+#include
#include
namespace Net {
diff --git a/repos/os/src/server/nitpicker/buffer.h b/repos/os/src/server/nitpicker/buffer.h
index 39f925a490..6b8763df7c 100644
--- a/repos/os/src/server/nitpicker/buffer.h
+++ b/repos/os/src/server/nitpicker/buffer.h
@@ -42,7 +42,7 @@ class Nitpicker::Buffer
* \throw Out_of_caps
* \throw Region_map::Region_conflict
*/
- Buffer(Ram_session &ram, Region_map &rm,
+ Buffer(Ram_allocator &ram, Region_map &rm,
Area size, Framebuffer::Mode::Format format, size_t bytes)
:
_size(size), _format(format), _ram_ds(ram, rm, bytes)
diff --git a/repos/os/src/server/nitpicker/chunky_texture.h b/repos/os/src/server/nitpicker/chunky_texture.h
index e085c0809f..56ce169f3f 100644
--- a/repos/os/src/server/nitpicker/chunky_texture.h
+++ b/repos/os/src/server/nitpicker/chunky_texture.h
@@ -44,7 +44,7 @@ class Nitpicker::Chunky_texture : public Buffer, public Texture
/**
* Constructor
*/
- Chunky_texture(Ram_session &ram, Region_map &rm, Area size, bool use_alpha)
+ Chunky_texture(Ram_allocator &ram, Region_map &rm, Area size, bool use_alpha)
:
Buffer(ram, rm, size, _format(), calc_num_bytes(size, use_alpha)),
Texture((PT *)local_addr(),
diff --git a/repos/os/src/server/nitpicker/domain_registry.h b/repos/os/src/server/nitpicker/domain_registry.h
index bd4adda6a0..56e6d02b47 100644
--- a/repos/os/src/server/nitpicker/domain_registry.h
+++ b/repos/os/src/server/nitpicker/domain_registry.h
@@ -183,21 +183,13 @@ class Nitpicker::Domain_registry
void _insert(Xml_node domain)
{
- char buf[sizeof(Entry::Name)];
- buf[0] = 0;
- bool name_defined = false;
- try {
- domain.attribute("name").value(buf, sizeof(buf));
- name_defined = true;
- } catch (...) { }
+ Entry::Name const name = domain.attribute_value("name", Entry::Name());
- if (!name_defined) {
+ if (!name.valid()) {
error("no valid domain name specified");
return;
}
- Entry::Name const name(buf);
-
if (lookup(name)) {
error("domain name \"", name, "\" is not unique");
return;
diff --git a/repos/os/src/server/nitpicker/session_component.cc b/repos/os/src/server/nitpicker/session_component.cc
index 9284d47f15..3ab27fe6b3 100644
--- a/repos/os/src/server/nitpicker/session_component.cc
+++ b/repos/os/src/server/nitpicker/session_component.cc
@@ -316,14 +316,10 @@ void Session_component::apply_session_policy(Xml_node config,
return;
}
- typedef Domain_registry::Entry::Name Domain_name;
- char buf[sizeof(Domain_name)];
- buf[0] = 0;
- try {
- policy.attribute("domain").value(buf, sizeof(buf)); }
- catch (...) { }
+ typedef Domain_registry::Entry::Name Name;
+
+ Name const name = policy.attribute_value("domain", Name());
- Domain_name name(buf);
_domain = domain_registry.lookup(name);
if (!_domain)
@@ -481,7 +477,7 @@ Buffer *Session_component::realloc_buffer(Framebuffer::Mode mode, bool use_alpha
if (texture()) {
enum { PRESERVED_RAM = 128*1024 };
- if (_env.ram().avail_ram().value > _buffer_size + PRESERVED_RAM) {
+ if (_env.pd().avail_ram().value > _buffer_size + PRESERVED_RAM) {
src_texture = static_cast const *>(texture());
} else {
warning("not enough RAM to preserve buffer content during resize");
diff --git a/repos/os/src/server/part_block/component.h b/repos/os/src/server/part_block/component.h
index b70f9b6aed..e1cef43f75 100644
--- a/repos/os/src/server/part_block/component.h
+++ b/repos/os/src/server/part_block/component.h
@@ -273,7 +273,7 @@ class Block::Root :
Session_policy policy(label, _config);
/* read partition attribute */
- policy.attribute("partition").value(&num);
+ num = policy.attribute_value("partition", -1L);
/* sessions are not writeable by default */
writeable = policy.attribute_value("writeable", false);
diff --git a/repos/os/src/server/ram_block/main.cc b/repos/os/src/server/ram_block/main.cc
index c796ad3528..70dae3635a 100644
--- a/repos/os/src/server/ram_block/main.cc
+++ b/repos/os/src/server/ram_block/main.cc
@@ -78,7 +78,8 @@ class Ram_block : public Block::Driver
*/
Ram_block(Env &env, Allocator &alloc,
const char *name, size_t block_size)
- : Block::Driver(env.ram()),
+ :
+ Block::Driver(env.ram()),
_env(env), _alloc(&alloc),
_rom_ds(new (_alloc) Attached_rom_dataspace(_env, name)),
_size(_rom_ds->size()),
@@ -152,29 +153,28 @@ struct Main
Env &env;
Allocator &alloc;
- bool use_file { false };
- char file[64];
+ bool use_file { false };
+
+ typedef String<64> File;
+ File file { };
size_t size { 0 };
size_t block_size { 512 };
- Factory(Env &env, Allocator &alloc,
- Xml_node config)
+ Factory(Env &env, Allocator &alloc, Xml_node config)
: env(env), alloc(alloc)
{
use_file = config.has_attribute("file");
if (use_file) {
- config.attribute("file").value(file, sizeof(file));
+ file = config.attribute_value("file", File());
+
} else {
- try {
- Genode::Number_of_bytes bytes;
- config.attribute("size").value(&bytes);
- size = bytes;
- }
- catch (...) {
+
+ if (!config.has_attribute("size")) {
error("neither file nor size attribute specified");
throw Exception();
}
+ size = config.attribute_value("size", Number_of_bytes());
}
block_size = config.attribute_value("block_size", block_size);
@@ -185,8 +185,9 @@ struct Main
try {
if (use_file) {
Genode::log("Creating RAM-basd block device populated by file='",
- Genode::Cstring(file), "' with block size ", block_size);
- return new (&alloc) Ram_block(env, alloc, file, block_size);
+ file, "' with block size ", block_size);
+ return new (&alloc)
+ Ram_block(env, alloc, file.string(), block_size);
} else {
Genode::log("Creating RAM-based block device with size ",
size, " and block size ", block_size);
diff --git a/repos/os/src/server/ram_fs/main.cc b/repos/os/src/server/ram_fs/main.cc
index 32807eec78..cd0e547677 100644
--- a/repos/os/src/server/ram_fs/main.cc
+++ b/repos/os/src/server/ram_fs/main.cc
@@ -47,7 +47,7 @@ class Ram_fs::Session_component : public File_system::Session_rpc_object
typedef File_system::Open_node Open_node;
Genode::Entrypoint &_ep;
- Genode::Ram_session &_ram;
+ Genode::Ram_allocator &_ram;
Genode::Allocator &_alloc;
Directory &_root;
Id_space _open_node_registry { };
@@ -194,7 +194,7 @@ class Ram_fs::Session_component : public File_system::Session_rpc_object
* Constructor
*/
Session_component(size_t tx_buf_size, Genode::Entrypoint &ep,
- Genode::Ram_session &ram, Genode::Region_map &rm,
+ Genode::Ram_allocator &ram, Genode::Region_map &rm,
Genode::Allocator &alloc,
Directory &root, bool writable)
:
@@ -535,7 +535,7 @@ class Ram_fs::Root : public Root_component
Genode::Entrypoint &_ep;
Genode::Allocator &_alloc;
- Genode::Ram_session &_ram;
+ Genode::Ram_allocator &_ram;
Genode::Region_map &_rm;
Genode::Xml_node const _config;
Directory &_root_dir;
@@ -549,9 +549,7 @@ class Ram_fs::Root : public Root_component
* the client's label.
*/
- enum { ROOT_MAX_LEN = 256 };
Genode::Path session_root;
- char tmp[MAX_PATH_LEN];
Directory *session_root_dir = nullptr;
bool writeable = false;
@@ -564,14 +562,15 @@ class Ram_fs::Root : public Root_component
* Determine directory that is used as root directory of
* the session. Clients without a specified root are denied.
*/
- try {
- policy.attribute("root").value(tmp, sizeof(tmp));
- session_root.import(tmp, "/");
- } catch (Xml_node::Nonexistent_attribute) {
+ if (!policy.has_attribute("root")) {
Genode::error("missing \"root\" attribute in policy definition");
throw Service_denied();
}
+ typedef String Root;
+ Root const root = policy.attribute_value("root", Root());
+ session_root.import(root.string(), "/");
+
/*
* Determine if the session is writeable.
* Policy overrides client argument, both default to false.
@@ -585,10 +584,13 @@ class Ram_fs::Root : public Root_component
}
/* apply client's root offset */
- Arg_string::find_arg(args, "root").string(tmp, sizeof(tmp), "/");
- if (Genode::strcmp("/", tmp, sizeof(tmp))) {
- session_root.append("/");
- session_root.append(tmp);
+ {
+ char tmp[MAX_PATH_LEN] { };
+ Arg_string::find_arg(args, "root").string(tmp, sizeof(tmp), "/");
+ if (Genode::strcmp("/", tmp, sizeof(tmp))) {
+ session_root.append("/");
+ session_root.append(tmp);
+ }
}
session_root.remove_trailing('/');
if (session_root == "/") {
@@ -641,7 +643,7 @@ class Ram_fs::Root : public Root_component
* \param alloc general-purpose allocator
* \param root_dir root-directory handle (anchor for fs)
*/
- Root(Genode::Entrypoint &ep, Genode::Ram_session &ram,
+ Root(Genode::Entrypoint &ep, Genode::Ram_allocator &ram,
Genode::Region_map &rm, Genode::Xml_node config,
Allocator &md_alloc, Allocator &alloc, Directory &root_dir)
:
@@ -652,45 +654,6 @@ class Ram_fs::Root : public Root_component
};
-/**
- * Helper for conveniently accessing 'Xml_node' attribute strings
- */
-struct Attribute_string
-{
- char buf[File_system::MAX_NAME_LEN];
-
- /**
- * Constructor
- *
- * \param attr attribute name
- * \param fallback if non-null, this is the string used if the attribute
- * is not defined. If null, the constructor throws
- * an 'Nonexistent_attribute' exception'
- * \throw Xml_node::Nonexistent_attribute
- */
- Attribute_string(Genode::Xml_node node, char const *attr, char *fallback = 0)
- {
- try { node.attribute(attr).value(buf, sizeof(buf)); }
- catch (Genode::Xml_node::Nonexistent_attribute) {
-
- if (fallback) {
- Genode::strncpy(buf, fallback, sizeof(buf));
- } else {
- char type_name[16];
- node.type_name(type_name, sizeof(type_name));
- Genode::warning("missing \"", attr, "\" attribute in "
- "<", Genode::Cstring(type_name), "> node");
- throw Genode::Xml_node::Nonexistent_attribute();
- }
- }
- }
-
- operator char * () { return buf; }
-
- void print(Genode::Output &out) const { Genode::print(out, Genode::Cstring(buf)); }
-};
-
-
static void preload_content(Genode::Env &env,
Genode::Allocator &alloc,
Genode::Xml_node node,
@@ -705,14 +668,15 @@ static void preload_content(Genode::Env &env,
* Lookup name attribtue, let 'Nonexistent_attribute' exception fall
* through because this configuration error is considered fatal.
*/
- Attribute_string name(sub_node, "name");
+ typedef String Name;
+ Name const name = sub_node.attribute_value("name", Name());
/*
* Create directory
*/
if (sub_node.has_type("dir")) {
- Ram_fs::Directory *sub_dir = new (&alloc) Ram_fs::Directory(name);
+ Ram_fs::Directory *sub_dir = new (&alloc) Ram_fs::Directory(name.string());
/* traverse into the new directory */
preload_content(env, alloc, sub_node, *sub_dir);
@@ -726,15 +690,15 @@ static void preload_content(Genode::Env &env,
if (sub_node.has_type("rom")) {
/* read "as" attribute, use "name" as default */
- Attribute_string as(sub_node, "as", name);
+ Name const as = sub_node.attribute_value("as", name);
/* read file content from ROM module */
try {
- Attached_rom_dataspace rom(env, name);
+ Attached_rom_dataspace rom(env, name.string());
- Ram_fs::File *file = new (&alloc) Ram_fs::File(alloc, as);
- file->write(rom.local_addr(), rom.size(), 0);
- dir.adopt_unsynchronized(file);
+ Ram_fs::File &file = *new (&alloc) Ram_fs::File(alloc, as.string());
+ file.write(rom.local_addr(), rom.size(), 0);
+ dir.adopt_unsynchronized(&file);
}
catch (Rom_connection::Rom_connection_failed) {
Genode::warning("failed to open ROM module \"", name, "\""); }
@@ -747,9 +711,12 @@ static void preload_content(Genode::Env &env,
*/
if (sub_node.has_type("inline")) {
- Ram_fs::File *file = new (&alloc) Ram_fs::File(alloc, name);
- file->write(sub_node.content_addr(), sub_node.content_size(), 0);
- dir.adopt_unsynchronized(file);
+ Ram_fs::File &file = *new (&alloc) Ram_fs::File(alloc, name.string());
+
+ sub_node.with_raw_content([&] (char const *start, size_t length) {
+ file.write(start, length, 0); });
+
+ dir.adopt_unsynchronized(&file);
}
}
}
diff --git a/repos/os/src/server/report_rom/rom_registry.h b/repos/os/src/server/report_rom/rom_registry.h
index 71bee2277e..bccf2cab93 100644
--- a/repos/os/src/server/report_rom/rom_registry.h
+++ b/repos/os/src/server/report_rom/rom_registry.h
@@ -26,7 +26,7 @@ struct Rom::Registry : Registry_for_reader, Registry_for_writer, Genode::Noncopy
private:
Genode::Allocator &_md_alloc;
- Genode::Ram_session &_ram;
+ Genode::Ram_allocator &_ram;
Genode::Region_map &_rm;
Genode::Attached_rom_dataspace &_config_rom;
@@ -119,26 +119,13 @@ struct Rom::Registry : Registry_for_reader, Registry_for_writer, Genode::Noncopy
{
using namespace Genode;
- String report;
-
_config_rom.update();
+
try {
Session_policy policy(rom_label, _config_rom.xml());
- policy.attribute("report").value(&report);
- return Rom::Module::Name(report.string());
- } catch (Session_policy::No_policy_defined) {
- /* FIXME backwards compatibility, remove at next release */
- try {
- Xml_node rom_node = _config_rom.xml().sub_node("rom");
- warning("parsing legacy policies");
-
- Session_policy policy(rom_label, rom_node);
- policy.attribute("report").value(&report);
- return Rom::Module::Name(report.string());
- }
- catch (Xml_node::Nonexistent_sub_node) { /* no node */ }
- catch (Session_policy::No_policy_defined) { }
+ return policy.attribute_value("report", Module::Name());
}
+ catch (Session_policy::No_policy_defined) { }
warning("no valid policy for ROM request '", rom_label, "'");
throw Service_denied();
@@ -147,7 +134,7 @@ struct Rom::Registry : Registry_for_reader, Registry_for_writer, Genode::Noncopy
public:
Registry(Genode::Allocator &md_alloc,
- Genode::Ram_session &ram, Genode::Region_map &rm,
+ Genode::Ram_allocator &ram, Genode::Region_map &rm,
Genode::Attached_rom_dataspace &config_rom)
:
_md_alloc(md_alloc), _ram(ram), _rm(rm), _config_rom(config_rom)
diff --git a/repos/os/src/server/rom_block/main.cc b/repos/os/src/server/rom_block/main.cc
index aac22142a9..d33fc90d56 100644
--- a/repos/os/src/server/rom_block/main.cc
+++ b/repos/os/src/server/rom_block/main.cc
@@ -35,7 +35,7 @@ class Rom_block : public Block::Driver
using String = Genode::String<64UL>;
- Rom_block(Env &env, String &name, size_t blk_sz)
+ Rom_block(Env &env, String const &name, size_t blk_sz)
: Block::Driver(env.ram()), _env(env), _rom(env, name.string()),
_blk_sz(blk_sz) {}
@@ -92,23 +92,22 @@ struct Main
Block::Driver *create()
{
- Rom_block::String file;
- size_t blk_sz = 512;
+ Attached_rom_dataspace config(env, "config");
- try {
- Attached_rom_dataspace config(env, "config");
- config.xml().attribute("file").value(&file);
- config.xml().attribute("block_size").value(&blk_sz);
- }
- catch (...) { }
+ Rom_block::String const file =
+ config.xml().attribute_value("file", Rom_block::String());
- log("Using file=", file, " as device with block size ", blk_sz, ".");
+ size_t const blk_sz =
+ config.xml().attribute_value("block_size", 512UL);
+
+ log("using file=", file, " as device with block size ", blk_sz, ".");
try {
return new (&heap) Rom_block(env, file, blk_sz);
- } catch(Rom_connection::Rom_connection_failed) {
- error("cannot open file ", file);
}
+ catch (Rom_connection::Rom_connection_failed) {
+ error("cannot open file ", file); }
+
throw Service_denied();
}
diff --git a/repos/os/src/server/rom_filter/input_rom_registry.h b/repos/os/src/server/rom_filter/input_rom_registry.h
index 6727b146b4..4e5f8ce8dd 100644
--- a/repos/os/src/server/rom_filter/input_rom_registry.h
+++ b/repos/os/src/server/rom_filter/input_rom_registry.h
@@ -30,8 +30,6 @@ namespace Rom_filter {
typedef Genode::String<80> Node_type_name;
typedef Genode::String<80> Attribute_name;
-
- using Genode::env;
using Genode::Signal_context_capability;
using Genode::Signal_handler;
using Genode::Xml_node;
@@ -439,7 +437,8 @@ class Rom_filter::Input_rom_registry
if (!e)
throw Nonexistent_input_node();
- xml.append(e->node().addr(), e->node().size());
+ e->node().with_raw_node([&] (char const *start, Genode::size_t length) {
+ xml.append(start, length); });
}
};
diff --git a/repos/os/src/server/rom_filter/main.cc b/repos/os/src/server/rom_filter/main.cc
index 75026c56da..22bc9de314 100644
--- a/repos/os/src/server/rom_filter/main.cc
+++ b/repos/os/src/server/rom_filter/main.cc
@@ -322,26 +322,27 @@ void Rom_filter::Main::_evaluate_node(Xml_node node, Xml_generator &xml)
} else
if (node.has_type("inline")) {
- char const *src = node.content_base();
- size_t src_len = node.content_size();
- /*
- * The 'Xml_generator::append' method puts the content at a fresh
- * line, and also adds a newline before the closing tag. We strip
- * eventual newlines from the '' node content to avoid
- * double newlines in the output.
- */
+ node.with_raw_content([&] (char const *src, size_t len) {
- /* remove leading newline */
- if (src_len > 0 && src[0] == '\n') {
- src++;
- src_len--;
- }
+ /*
+ * The 'Xml_generator::append' method puts the content at a
+ * fresh line, and also adds a newline before the closing tag.
+ * We strip eventual newlines from the '' node content
+ * to avoid double newlines in the output.
+ */
- /* remove trailing whilespace including newlines */
- for (; src_len > 0 && Genode::is_whitespace(src[src_len - 1]); src_len--);
+ /* remove leading newline */
+ if (len > 0 && src[0] == '\n') {
+ src++;
+ len--;
+ }
- xml.append(src, src_len);
+ /* remove trailing whilespace including newlines */
+ for (; len > 0 && Genode::is_whitespace(src[len - 1]); len--);
+
+ xml.append(src, len);
+ });
} else
if (node.has_type("input")) {
diff --git a/repos/os/src/server/tar_rom/main.cc b/repos/os/src/server/tar_rom/main.cc
index 824aa28d42..ecea46755b 100755
--- a/repos/os/src/server/tar_rom/main.cc
+++ b/repos/os/src/server/tar_rom/main.cc
@@ -42,7 +42,7 @@ class Tar_rom::Rom_session_component : public Rpc_object
Rom_session_component(Rom_session_component const &);
Rom_session_component &operator = (Rom_session_component const &);
- Ram_session &_ram;
+ Ram_allocator &_ram;
char const * const _tar_addr;
size_t const _tar_size;
@@ -76,7 +76,7 @@ class Tar_rom::Rom_session_component : public Rpc_object
/**
* Initialize dataspace containing the content of the archived file
*/
- Ram_dataspace_capability _init_file_ds(Ram_session &ram, Region_map &rm,
+ Ram_dataspace_capability _init_file_ds(Ram_allocator &ram, Region_map &rm,
Session_label const &name)
{
/* measure size of archive in blocks */
@@ -151,7 +151,7 @@ class Tar_rom::Rom_session_component : public Rpc_object
*
* \throw Service_denied
*/
- Rom_session_component(Ram_session &ram, Region_map &rm,
+ Rom_session_component(Ram_allocator &ram, Region_map &rm,
char const *tar_addr, unsigned tar_size,
Session_label const &label)
:
diff --git a/repos/os/src/server/terminal_crosslink/terminal_session_component.cc b/repos/os/src/server/terminal_crosslink/terminal_session_component.cc
index 1f5bfb350a..c2f8575fb5 100644
--- a/repos/os/src/server/terminal_crosslink/terminal_session_component.cc
+++ b/repos/os/src/server/terminal_crosslink/terminal_session_component.cc
@@ -14,9 +14,7 @@
/* Genode includes */
#include
-#include
#include
-#include
#include
/* local includes */
diff --git a/repos/os/src/server/trace_fs/main.cc b/repos/os/src/server/trace_fs/main.cc
index 36208de2b8..577956499b 100644
--- a/repos/os/src/server/trace_fs/main.cc
+++ b/repos/os/src/server/trace_fs/main.cc
@@ -39,12 +39,44 @@ namespace Trace_fs {
using File_system::Path;
class Trace_file_system;
+ struct Policy;
struct Main;
struct Session_component;
struct Root;
}
+/**
+ * Session-specific policy defined by the configuation
+ */
+struct Trace_fs::Policy
+{
+ unsigned interval; /* in milliseconds */
+ unsigned subject_limit;
+ Genode::Number_of_bytes trace_quota;
+ Genode::Number_of_bytes trace_meta_quota;
+ Genode::Number_of_bytes buffer_size;
+ Genode::Number_of_bytes buffer_size_max;
+ unsigned trace_parent_levels;
+
+ static Number_of_bytes _kib(size_t value) { return value * (1 << 10); }
+ static Number_of_bytes _mib(size_t value) { return value * (1 << 20); }
+
+ static Policy from_xml(Xml_node node)
+ {
+ return Policy {
+ .interval = node.attribute_value("interval", 1000U),
+ .subject_limit = node.attribute_value("subject_limit", 128U),
+ .trace_quota = node.attribute_value("trace_quota", _mib(32)),
+ .trace_meta_quota = node.attribute_value("trace_meta_quota", _kib(256)),
+ .buffer_size = node.attribute_value("buffer_size", _kib(32)),
+ .buffer_size_max = node.attribute_value("buffer_size_max", _mib(1)),
+ .trace_parent_levels = node.attribute_value("parent_levels", 0U)
+ };
+ }
+};
+
+
/**
* Return true if 'str' is a valid file name
*/
@@ -610,7 +642,7 @@ class Trace_fs::Session_component : public Session_rpc_object
typedef File_system::Open_node Open_node;
Genode::Entrypoint &_ep;
- Ram_session &_ram;
+ Ram_allocator &_ram;
Allocator &_md_alloc;
Directory &_root_dir;
Id_space _open_node_registry;
@@ -624,8 +656,11 @@ class Trace_fs::Session_component : public Session_rpc_object
Trace::Connection *_trace;
Trace_file_system *_trace_fs;
- Signal_handler _process_packet_dispatcher;
- Signal_handler _fs_update_dispatcher;
+ Signal_handler _process_packet_handler {
+ _ep, *this, &Session_component::_process_packets };
+
+ Signal_handler _fs_update_handler {
+ _ep, *this, &Session_component::_fs_update };
/**************************
@@ -740,7 +775,7 @@ class Trace_fs::Session_component : public Session_rpc_object
}
/**
- * Called by signal dispatcher, executed in the context of the main
+ * Called by signal handler, executed in the context of the main
* thread (not serialized with the RPC functions)
*/
void _process_packets()
@@ -783,42 +818,40 @@ class Trace_fs::Session_component : public Session_rpc_object
/**
* Constructor
*/
- Session_component(size_t tx_buf_size,
- Genode::Entrypoint &ep,
- Genode::Ram_session &ram,
- Genode::Region_map &rm,
- Genode::Env &env,
- Directory &root_dir,
- Allocator &md_alloc,
- unsigned subject_limit,
- unsigned poll_interval,
- size_t trace_quota,
- size_t trace_meta_quota,
- size_t trace_parent_levels,
- size_t buffer_size,
- size_t buffer_size_max)
+ Session_component(size_t tx_buf_size,
+ Genode::Entrypoint &ep,
+ Genode::Ram_allocator &ram,
+ Genode::Region_map &rm,
+ Genode::Env &env,
+ Directory &root_dir,
+ Allocator &md_alloc,
+ Trace_fs::Policy policy)
:
Session_rpc_object(ram.alloc(tx_buf_size), rm, ep.rpc_ep()),
_ep(ep),
_ram(ram),
_md_alloc(md_alloc),
_root_dir(root_dir),
- _subject_limit(subject_limit),
- _poll_interval(poll_interval),
+
+ _subject_limit(policy.subject_limit),
+ _poll_interval(policy.interval),
_fs_update_timer(env),
- _trace(new (&_md_alloc) Genode::Trace::Connection(env, trace_quota, trace_meta_quota, trace_parent_levels)),
- _trace_fs(new (&_md_alloc) Trace_file_system(rm, _md_alloc, *_trace, _root_dir, buffer_size, buffer_size_max)),
- _process_packet_dispatcher(_ep, *this, &Session_component::_process_packets),
- _fs_update_dispatcher(_ep, *this, &Session_component::_fs_update)
+ _trace(new (&_md_alloc)
+ Genode::Trace::Connection(env, policy.trace_quota,
+ policy.trace_meta_quota,
+ policy.trace_parent_levels)),
+ _trace_fs(new (&_md_alloc)
+ Trace_file_system(rm, _md_alloc, *_trace, _root_dir,
+ policy.buffer_size, policy.buffer_size_max))
{
- _tx.sigh_packet_avail(_process_packet_dispatcher);
- _tx.sigh_ready_to_ack(_process_packet_dispatcher);
+ _tx.sigh_packet_avail(_process_packet_handler);
+ _tx.sigh_ready_to_ack(_process_packet_handler);
/**
* Register '_fs_update' dispatch function as signal handler
* for polling the trace session.
*/
- _fs_update_timer.sigh(_fs_update_dispatcher);
+ _fs_update_timer.sigh(_fs_update_handler);
/**
* We need to scale _poll_interval because trigger_periodic()
@@ -1004,12 +1037,12 @@ class Trace_fs::Root : public Root_component
{
private:
- Genode::Entrypoint &_ep;
- Genode::Ram_session &_ram;
- Genode::Region_map &_rm;
- Genode::Env &_env;
+ Genode::Entrypoint &_ep;
+ Genode::Ram_allocator &_ram;
+ Genode::Region_map &_rm;
+ Genode::Env &_env;
- Directory &_root_dir;
+ Directory &_root_dir;
Genode::Attached_rom_dataspace _config { _env, "config" };
@@ -1021,74 +1054,18 @@ class Trace_fs::Root : public Root_component
* Determine client-specific policy defined implicitly by
* the client's label.
*/
-
- enum { ROOT_MAX_LEN = 256 };
- char root[ROOT_MAX_LEN];
- root[0] = 0;
-
- /* default settings */
- unsigned interval = 1000; /* 1 sec */
- unsigned subject_limit = 128;
-
- Genode::Number_of_bytes trace_quota = 32 * (1 << 20); /* 32 MiB */
- Genode::Number_of_bytes trace_meta_quota = 256 * (1 << 10); /* 256 KiB */
- Genode::Number_of_bytes buffer_size = 32 * (1 << 10); /* 32 KiB */
- Genode::Number_of_bytes buffer_size_max = 1 * (1 << 20); /* 1 MiB */
- unsigned trace_parent_levels = 0;
-
Session_label const label = label_from_args(args);
- try {
- Session_policy policy(label, _config.xml());
- /*
- * Override default settings with specific session settings by
- * evaluating the policy.
- */
- try { policy.attribute("interval").value(&interval); }
- catch (...) { }
- try { policy.attribute("subject_limit").value(&subject_limit); }
- catch (...) { }
- try { policy.attribute("trace_quota").value(&trace_quota); }
- catch (...) { }
- try { policy.attribute("trace_meta_quota").value(&trace_meta_quota); }
- catch (...) { }
- try { policy.attribute("parent_levels").value(&trace_parent_levels); }
- catch (...) { }
- try { policy.attribute("buffer_size").value(&buffer_size); }
- catch (...) { }
- try { policy.attribute("buffer_size_max").value(&buffer_size_max); }
- catch (...) { }
+ Session_policy policy(label, _config.xml());
- /*
- * Determine directory that is used as root directory of
- * the session.
- */
- try {
- policy.attribute("root").value(root, sizeof(root));
-
- /*
- * Make sure the root path is specified with a
- * leading path delimiter. For performing the
- * lookup, we skip the first character.
- */
- if (root[0] != '/')
- throw Lookup_failed();
- }
- catch (Xml_node::Nonexistent_attribute) {
- Genode::error("Missing \"root\" attribute in policy definition");
- throw Service_denied();
- }
- catch (Lookup_failed) {
- Genode::error("session root directory "
- "\"", Genode::Cstring(root), "\" does not exist");
- throw Service_denied();
- }
- }
- catch (Session_policy::No_policy_defined) {
- Genode::error("Invalid session request, no matching policy");
+ /* make sure that root directory is defined */
+ if (!policy.has_attribute("root")) {
+ Genode::error("Missing \"root\" attribute in policy definition");
throw Service_denied();
}
+ Trace_fs::Policy const attributes = Trace_fs::Policy::from_xml(policy);
+
size_t ram_quota =
Arg_string::find_arg(args, "ram_quota" ).ulong_value(0);
size_t tx_buf_size =
@@ -1111,10 +1088,7 @@ class Trace_fs::Root : public Root_component
}
return new (md_alloc())
Session_component(tx_buf_size, _ep, _ram, _rm, _env, _root_dir,
- *md_alloc(), subject_limit, interval,
- trace_quota, trace_meta_quota,
- trace_parent_levels, buffer_size,
- buffer_size_max);
+ *md_alloc(), attributes);
}
public:
@@ -1127,7 +1101,7 @@ class Trace_fs::Root : public Root_component
* data-flow signals of packet streams
* \param md_alloc meta-data allocator
*/
- Root(Genode::Entrypoint &ep, Allocator &md_alloc, Ram_session &ram,
+ Root(Genode::Entrypoint &ep, Allocator &md_alloc, Ram_allocator &ram,
Region_map &rm, Env &env, Directory &root_dir)
:
Root_component(&ep.rpc_ep(), &md_alloc),
diff --git a/repos/os/src/server/tz_vmm/include/serial_driver.h b/repos/os/src/server/tz_vmm/include/serial_driver.h
index 77bd757f7f..b1c4329c37 100644
--- a/repos/os/src/server/tz_vmm/include/serial_driver.h
+++ b/repos/os/src/server/tz_vmm/include/serial_driver.h
@@ -40,7 +40,7 @@ class Genode::Serial_driver
void handle_smc(Vm_base &vm);
- Serial_driver(Ram_session &ram) : _buf(&ram, BUF_SIZE) { }
+ Serial_driver(Ram_allocator &ram) : _buf(&ram, BUF_SIZE) { }
};
#endif /* _SERIAL_DRIVER_H_ */
diff --git a/repos/os/src/server/vfs/main.cc b/repos/os/src/server/vfs/main.cc
index 9a6296c468..0625b58b07 100644
--- a/repos/os/src/server/vfs/main.cc
+++ b/repos/os/src/server/vfs/main.cc
@@ -853,34 +853,34 @@ class Vfs_server::Root : public Genode::Root_component
/* pull in policy changes */
_config_rom.update();
- char tmp[MAX_PATH_LEN];
- try {
- Session_policy policy(label, _config_rom.xml());
+ typedef String Root_path;
- /* determine optional session root offset. */
- try {
- policy.attribute("root").value(tmp, sizeof(tmp));
- session_root.import(tmp, "/");
- } catch (Xml_node::Nonexistent_attribute) { }
+ Session_policy policy(label, _config_rom.xml());
- /*
- * Determine if the session is writeable.
- * Policy overrides client argument, both default to false.
- */
- if (policy.attribute_value("writeable", false))
- writeable = Arg_string::find_arg(args, "writeable").bool_value(false);
-
- } catch (Session_policy::No_policy_defined) {
- /* missing policy - deny request */
+ /* check and apply session root offset */
+ if (!policy.has_attribute("root")) {
+ error("policy lacks 'root' attribute");
throw Service_denied();
}
+ Root_path const root_path = policy.attribute_value("root", Root_path());
+ session_root.import(root_path.string(), "/");
+
+ /*
+ * Determine if the session is writeable.
+ * Policy overrides client argument, both default to false.
+ */
+ if (policy.attribute_value("writeable", false))
+ writeable = Arg_string::find_arg(args, "writeable").bool_value(false);
/* apply client's root offset. */
- Arg_string::find_arg(args, "root").string(tmp, sizeof(tmp), "/");
- if (Genode::strcmp("/", tmp, sizeof(tmp))) {
- session_root.append("/");
- session_root.append(tmp);
- session_root.remove_trailing('/');
+ {
+ char tmp[MAX_PATH_LEN] { };
+ Arg_string::find_arg(args, "root").string(tmp, sizeof(tmp), "/");
+ if (Genode::strcmp("/", tmp, sizeof(tmp))) {
+ session_root.append("/");
+ session_root.append(tmp);
+ session_root.remove_trailing('/');
+ }
}
/* check if the session root exists */
@@ -942,7 +942,7 @@ class Vfs_server::Root : public Genode::Root_component
void Component::construct(Genode::Env &env)
{
- static Genode::Sliced_heap sliced_heap { &env.ram(), &env.rm() };
+ static Genode::Sliced_heap sliced_heap { env.ram(), env.rm() };
static Vfs_server::Root root { env, sliced_heap };
}
diff --git a/repos/os/src/test/audio_out/main.cc b/repos/os/src/test/audio_out/main.cc
index 00dc48ded8..f2d2c35be8 100644
--- a/repos/os/src/test/audio_out/main.cc
+++ b/repos/os/src/test/audio_out/main.cc
@@ -163,8 +163,8 @@ void Main::handle_config()
return;
}
- filenames[track_count++] =
- Filename(Cstring(node.content_addr(), node.content_size()));
+ node.with_raw_content([&] (char const *start, size_t length) {
+ filenames[track_count++] = Filename(Cstring(start, length)); });
});
}
catch (...) {
diff --git a/repos/os/src/test/block/client/main.cc b/repos/os/src/test/block/client/main.cc
index da71d50828..c3ede34aba 100644
--- a/repos/os/src/test/block/client/main.cc
+++ b/repos/os/src/test/block/client/main.cc
@@ -410,7 +410,7 @@ void Component::construct(Genode::Env &env)
try {
Genode::Number_of_bytes test_size;;
Genode::Attached_rom_dataspace config { env, "config" };
- config.xml().attribute("test_size").value(&test_size);
+ config.xml().attribute("test_size").value(test_size);
test_cnt = Genode::min(test_size / blk_sz, blk_cnt);
} catch (...) { test_cnt = blk_cnt; }
diff --git a/repos/os/src/test/block/server/main.cc b/repos/os/src/test/block/server/main.cc
index 722bf45ad8..9baf2828ae 100644
--- a/repos/os/src/test/block/server/main.cc
+++ b/repos/os/src/test/block/server/main.cc
@@ -127,8 +127,8 @@ struct Main
try {
Genode::Attached_rom_dataspace config { env, "config" };
- config.xml().attribute("sectors").value(&blk_nr);
- config.xml().attribute("block_size").value(&blk_sz);
+ config.xml().attribute("sectors").value(blk_nr);
+ config.xml().attribute("block_size").value(blk_sz);
}
catch (...) { }
diff --git a/repos/os/src/test/bomb/main.cc b/repos/os/src/test/bomb/main.cc
index c5062c1aff..ce1c67c7ed 100644
--- a/repos/os/src/test/bomb/main.cc
+++ b/repos/os/src/test/bomb/main.cc
@@ -81,14 +81,13 @@ class Bomb_child : public Child_policy
Pd_session &ref_pd() override { return _env.pd(); }
Pd_session_capability ref_pd_cap() const override { return _env.pd_session_cap(); }
- Service &resolve_session_request(Service::Name const &service_name,
- Session_state::Args const &args) override
+ Service &_matching_service(Service::Name const &service_name,
+ Session_label const &label)
{
Service *service = nullptr;
/* check for config file request */
- if ((service = _config_policy.resolve_session_request(service_name.string(),
- args.string())))
+ if ((service = _config_policy.resolve_session_request(service_name, label)))
return *service;
_parent_services.for_each([&] (Service &s) {
@@ -100,6 +99,14 @@ class Bomb_child : public Child_policy
return *service;
}
+
+ Route resolve_session_request(Service::Name const &service_name,
+ Session_label const &label) override
+ {
+ return Route { .service = _matching_service(service_name, label),
+ .label = label,
+ .diag = Session::Diag() };
+ }
};
@@ -168,13 +175,13 @@ struct Bomb
Children child_registry { };
- Static_parent_services parent_services { };
+ Static_parent_services
+ parent_services { env };
void construct_children()
{
size_t const preserved_ram = Pd_connection::RAM_QUOTA;
- size_t const avail_ram = env.ram().avail_ram().value;
+ size_t const avail_ram = env.pd().avail_ram().value;
if (avail_ram < preserved_ram + ram_demand) {
error("RAM demand exceeds available RAM");
diff --git a/repos/os/src/test/dynamic_config/main.cc b/repos/os/src/test/dynamic_config/main.cc
index a979713ed4..29dac12018 100644
--- a/repos/os/src/test/dynamic_config/main.cc
+++ b/repos/os/src/test/dynamic_config/main.cc
@@ -28,9 +28,9 @@ struct Main
{
config.update();
try {
- long counter = 1;
- config.xml().sub_node("counter").value(&counter);
- log("obtained counter value ", counter, " from config");
+ Xml_node const counter = config.xml().sub_node("counter");
+ counter.with_raw_content([&] (char const *start, size_t length) {
+ log("obtained counter value ", Cstring(start, length), " from config"); });
}
catch (...) { error("could not parse configuration"); }
}
diff --git a/repos/os/src/test/dynamic_config/master/main.cc b/repos/os/src/test/dynamic_config/master/main.cc
index e071dde155..c393ddd821 100644
--- a/repos/os/src/test/dynamic_config/master/main.cc
+++ b/repos/os/src/test/dynamic_config/master/main.cc
@@ -29,14 +29,15 @@ namespace Test {
struct Test::Policy
:
- private Static_parent_services,
public Slave::Policy
{
Policy(Env &env, Name const &name)
:
+ Static_parent_services(env),
Slave::Policy(name, name, *this, env.ep().rpc_ep(), env.rm(),
- env.pd(), env.pd_session_cap(),
+ env.pd(), env.pd_session_cap(),
Cap_quota{100}, Ram_quota{1024*1024})
{ }
};
diff --git a/repos/os/src/test/fault_detection/main.cc b/repos/os/src/test/fault_detection/main.cc
index a2cfabf41c..2a02a4eb27 100644
--- a/repos/os/src/test/fault_detection/main.cc
+++ b/repos/os/src/test/fault_detection/main.cc
@@ -119,13 +119,18 @@ class Test_child : public Genode::Child_policy
address_space.fault_handler(_sigh);
}
- Service &resolve_session_request(Service::Name const &service,
- Session_state::Args const &) override
+ Route resolve_session_request(Service::Name const &service,
+ Session_label const &label) override
{
- if (service == Cpu_session::service_name()) return _cpu_service;
- if (service == Pd_session::service_name()) return _pd_service;
- if (service == Log_session::service_name()) return _log_service;
- if (service == Rom_session::service_name()) return _rom_service;
+ auto route = [&] (Service &service) {
+ return Route { .service = service,
+ .label = label,
+ .diag = Session::Diag() }; };
+
+ if (service == Cpu_session::service_name()) return route(_cpu_service);
+ if (service == Pd_session::service_name()) return route( _pd_service);
+ if (service == Log_session::service_name()) return route(_log_service);
+ if (service == Rom_session::service_name()) return route(_rom_service);
throw Service_denied();
}
diff --git a/repos/os/src/test/framebuffer/main.cc b/repos/os/src/test/framebuffer/main.cc
index b62f5b8540..6a16af08e4 100644
--- a/repos/os/src/test/framebuffer/main.cc
+++ b/repos/os/src/test/framebuffer/main.cc
@@ -169,7 +169,7 @@ void Test_environment::_draw()
void Test_environment::_mode_handle()
{
_mode = _fb.mode();
- if (_fb_ds.is_constructed())
+ if (_fb_ds.constructed())
_fb_ds.destruct();
_fb_ds.construct(_env.rm(), _fb.dataspace());
diff --git a/repos/os/src/test/init/main.cc b/repos/os/src/test/init/main.cc
index da928e1702..3d9d5adbad 100644
--- a/repos/os/src/test/init/main.cc
+++ b/repos/os/src/test/init/main.cc
@@ -202,7 +202,8 @@ struct Test::Main : Log_message_handler
if (version.valid())
xml.attribute("version", version);
- xml.append(node.content_base(), node.content_size());
+ node.with_raw_content([&] (char const *start, size_t length) {
+ xml.append(start, length); });
});
}
diff --git a/repos/os/src/test/input_filter/main.cc b/repos/os/src/test/input_filter/main.cc
index f9d99d0134..6357db5df7 100644
--- a/repos/os/src/test/input_filter/main.cc
+++ b/repos/os/src/test/input_filter/main.cc
@@ -238,7 +238,8 @@ struct Test::Main : Input_from_filter::Event_handler
void _publish_report(Reporter &reporter, Xml_node node)
{
Reporter::Xml_generator xml(reporter, [&] () {
- xml.append(node.content_base(), node.content_size()); });
+ node.with_raw_content([&] (char const *start, size_t length) {
+ xml.append(start, length); }); });
}
void _gen_chargen_rec(Xml_generator &xml, unsigned depth)
diff --git a/repos/os/src/test/resource_request/main.cc b/repos/os/src/test/resource_request/main.cc
index 4f0a444fcf..4e51c24b4f 100644
--- a/repos/os/src/test/resource_request/main.cc
+++ b/repos/os/src/test/resource_request/main.cc
@@ -139,7 +139,7 @@ void Component::construct(Genode::Env &env)
* Consume initial quota to let the test trigger the corner cases of
* exceeded quota.
*/
- size_t const avail_quota = env.ram().avail_ram().value;
+ size_t const avail_quota = env.pd().avail_ram().value;
enum { KEEP_QUOTA = 64*1024 };
size_t const wasted_quota = (avail_quota >= KEEP_QUOTA)
? avail_quota - KEEP_QUOTA : 0;
@@ -148,7 +148,7 @@ void Component::construct(Genode::Env &env)
log("wasted available quota of ", wasted_quota, " bytes");
- print_quota_stats(env.ram());
+ print_quota_stats(env.pd());
/*
* Drain PD session by allocating a lot of signal-context capabilities.
@@ -167,13 +167,13 @@ void Component::construct(Genode::Env &env)
for (unsigned i = 0; i < NUM_SIGH; i++)
dummy_handlers[i].construct(env.ep());
- print_quota_stats(env.ram());
+ print_quota_stats(env.pd());
for (unsigned i = 0; i < NUM_SIGH; i++)
dummy_handlers[i].destruct();
}
- print_quota_stats(env.ram());
- size_t const used_quota_after_draining_session = env.ram().used_ram().value;
+ print_quota_stats(env.pd());
+ size_t const used_quota_after_draining_session = env.pd().used_ram().value;
/*
* When creating a new session, we try to donate RAM quota to the server.
@@ -183,26 +183,26 @@ void Component::construct(Genode::Env &env)
log("\n-- out-of-memory during session request --");
static Pd_connection pd(env);
pd.ref_account(env.pd_session_cap());
- print_quota_stats(env.ram());
- size_t const used_quota_after_session_request = env.ram().used_ram().value;
+ print_quota_stats(env.pd());
+ size_t const used_quota_after_session_request = env.pd().used_ram().value;
/*
* Quota transfers from the component's RAM session may result in resource
* requests, too.
*/
log("\n-- out-of-memory during transfer-quota --");
- env.ram().transfer_quota(pd.cap(), Ram_quota{512*1024});
- print_quota_stats(env.ram());
- size_t const used_quota_after_transfer = env.ram().used_ram().value;
+ env.pd().transfer_quota(pd.cap(), Ram_quota{512*1024});
+ print_quota_stats(env.pd());
+ size_t const used_quota_after_transfer = env.pd().used_ram().value;
/*
* Finally, resource requests could be caused by a regular allocation,
* which is the most likely case in normal scenarios.
*/
log("\n-- out-of-memory during RAM allocation --");
- env.ram().alloc(512*1024);
- print_quota_stats(env.ram());
- size_t const used_quota_after_alloc = env.ram().used_ram().value;
+ env.pd().alloc(512*1024);
+ print_quota_stats(env.pd());
+ size_t const used_quota_after_alloc = env.pd().used_ram().value;
/*
* Validate asserted effect of the individual steps on the used quota.
diff --git a/repos/os/src/test/resource_yield/main.cc b/repos/os/src/test/resource_yield/main.cc
index de26ff79ea..b38ae7c038 100644
--- a/repos/os/src/test/resource_yield/main.cc
+++ b/repos/os/src/test/resource_yield/main.cc
@@ -98,7 +98,7 @@ void Test::Child::_handle_periodic_timeout()
{
size_t const chunk_size = 1024*1024;
- if (_env.ram().avail_ram().value < chunk_size) {
+ if (_env.pd().avail_ram().value < chunk_size) {
if (_expand) {
log("quota consumed, request additional resources");
@@ -197,8 +197,8 @@ class Test::Parent
void _print_status()
{
- log("quota: ", _child.ram().ram_quota().value / 1024, " KiB "
- "used: ", _child.ram().used_ram().value / 1024, " KiB");
+ log("quota: ", _child.pd().ram_quota().value / 1024, " KiB "
+ "used: ", _child.pd().used_ram().value / 1024, " KiB");
}
size_t _used_ram_prior_yield = 0;
@@ -229,7 +229,7 @@ class Test::Parent
void _request_yield()
{
/* remember quantum of resources used by the child */
- _used_ram_prior_yield = _child.ram().used_ram().value;
+ _used_ram_prior_yield = _child.pd().used_ram().value;
log("request yield (ram prior yield: ", _used_ram_prior_yield);
@@ -259,7 +259,7 @@ class Test::Parent
_print_status();
/* validate that the amount of yielded resources matches the request */
- size_t const used_after_yield = _child.ram().used_ram().value;
+ size_t const used_after_yield = _child.pd().used_ram().value;
if (used_after_yield + 5*1024*1024 > _used_ram_prior_yield) {
error("child has not yielded enough resources");
throw Insufficient_yield();
@@ -278,8 +278,7 @@ class Test::Parent
struct Policy
:
- private Static_parent_services,
public Slave::Policy
{
@@ -294,9 +293,10 @@ class Test::Parent
Policy(Parent &parent, Env &env)
:
+ Static_parent_services(env),
Slave::Policy(Label("child"), "test-resource_yield",
*this, env.ep().rpc_ep(), env.rm(),
- env.pd(), env.pd_session_cap(),
+ env.pd(), env.pd_session_cap(),
Cap_quota{SLAVE_CAPS}, Ram_quota{SLAVE_RAM}),
_parent(parent)
{
diff --git a/repos/os/src/test/trace/main.cc b/repos/os/src/test/trace/main.cc
index 50807754be..d0fcf9c462 100644
--- a/repos/os/src/test/trace/main.cc
+++ b/repos/os/src/test/trace/main.cc
@@ -230,8 +230,8 @@ struct Test_tracing
try {
Xml_node policy = config.xml().sub_node("trace_policy");
- policy.attribute("label").value(&policy_label);
- policy.attribute("module").value(&policy_module);
+ policy.attribute("label").value(policy_label);
+ policy.attribute("module").value(policy_module);
Rom_connection policy_rom(env, policy_module.string());
policy_module_rom_ds = policy_rom.dataspace();
diff --git a/repos/os/src/test/vfs_stress/main.cc b/repos/os/src/test/vfs_stress/main.cc
index 8b091f35f4..c2ba5230fb 100644
--- a/repos/os/src/test/vfs_stress/main.cc
+++ b/repos/os/src/test/vfs_stress/main.cc
@@ -547,7 +547,7 @@ void Component::construct(Genode::Env &env)
/* populate the directory file system at / */
vfs_root.num_dirent("/");
- size_t initial_consumption = env.ram().used_ram().value;
+ size_t initial_consumption = env.pd().used_ram().value;
/**************************
** Generate directories **
@@ -572,7 +572,7 @@ void Component::construct(Genode::Env &env)
if (count > 0)
log("created ",count," empty directories, ",
(elapsed_ms*1000)/count,"μs/op , ",
- env.ram().used_ram().value/1024,"KiB consumed");
+ env.pd().used_ram().value/1024,"KiB consumed");
}
@@ -597,7 +597,7 @@ void Component::construct(Genode::Env &env)
if (count > 0)
log("created ",count," empty files, ",
(elapsed_ms*1000)/count,"μs/op, ",
- env.ram().used_ram().value/1024,"KiB consumed");
+ env.pd().used_ram().value/1024,"KiB consumed");
}
@@ -607,7 +607,7 @@ void Component::construct(Genode::Env &env)
if (!config_xml.attribute_value("write", true)) {
elapsed_ms = timer.elapsed_ms();
- log("total: ",elapsed_ms,"ms, ",env.ram().used_ram().value/1024,"K consumed");
+ log("total: ",elapsed_ms,"ms, ",env.pd().used_ram().value/1024,"K consumed");
return die(env, 0);
}
{
@@ -629,10 +629,10 @@ void Component::construct(Genode::Env &env)
if (elapsed_ms > 0)
log("wrote ",count," bytes, ",
count/elapsed_ms,"kB/s, ",
- env.ram().used_ram().value/1024,"KiB consumed");
+ env.pd().used_ram().value/1024,"KiB consumed");
else
log("wrote ",count," bytes, ",
- env.ram().used_ram().value/1024,"KiB consumed");
+ env.pd().used_ram().value/1024,"KiB consumed");
}
@@ -643,7 +643,7 @@ void Component::construct(Genode::Env &env)
if (!config_xml.attribute_value("read", true)) {
elapsed_ms = timer.elapsed_ms();
- log("total: ",elapsed_ms,"ms, ",env.ram().used_ram().value/1024,"KiB consumed");
+ log("total: ",elapsed_ms,"ms, ",env.pd().used_ram().value/1024,"KiB consumed");
return die(env, 0);
}
{
@@ -664,10 +664,10 @@ void Component::construct(Genode::Env &env)
if (elapsed_ms > 0)
log("read ",count," bytes, ",
count/elapsed_ms,"kB/s, ",
- env.ram().used_ram().value/1024,"KiB consumed");
+ env.pd().used_ram().value/1024,"KiB consumed");
else
log("read ",count," bytes, ",
- env.ram().used_ram().value/1024,"KiB consumed");
+ env.pd().used_ram().value/1024,"KiB consumed");
}
@@ -677,7 +677,7 @@ void Component::construct(Genode::Env &env)
if (!config_xml.attribute_value("unlink", true)) {
elapsed_ms = timer.elapsed_ms();
- log("total: ",elapsed_ms,"ms, ",env.ram().used_ram().value/1024,"KiB consumed");
+ log("total: ",elapsed_ms,"ms, ",env.pd().used_ram().value/1024,"KiB consumed");
return die(env, 0);
}
@@ -699,13 +699,13 @@ void Component::construct(Genode::Env &env)
vfs_root_sync();
log("unlinked ",count," files in ",elapsed_ms,"ms, ",
- env.ram().used_ram().value/1024,"KiB consumed");
+ env.pd().used_ram().value/1024,"KiB consumed");
}
log("total: ",timer.elapsed_ms(),"ms, ",
- env.ram().used_ram().value/1024,"KiB consumed");
+ env.pd().used_ram().value/1024,"KiB consumed");
- size_t outstanding = env.ram().used_ram().value - initial_consumption;
+ size_t outstanding = env.pd().used_ram().value - initial_consumption;
if (outstanding) {
if (outstanding < 1024)
error(outstanding, "B not freed after unlink and sync!");
diff --git a/repos/ports/src/app/seoul/disk.cc b/repos/ports/src/app/seoul/disk.cc
index 1051e60c07..69648f717d 100644
--- a/repos/ports/src/app/seoul/disk.cc
+++ b/repos/ports/src/app/seoul/disk.cc
@@ -30,7 +30,7 @@
/* local includes */
#include "disk.h"
-static Genode::Heap * disk_heap(Genode::Ram_session *ram = nullptr,
+static Genode::Heap * disk_heap(Genode::Ram_allocator *ram = nullptr,
Genode::Region_map *rm = nullptr)
{
static Genode::Heap heap(ram, rm);