diff --git a/ports/src/app/gdb_monitor/app_child.h b/ports/src/app/gdb_monitor/app_child.h index 98d7256b0..2c411af9c 100644 --- a/ports/src/app/gdb_monitor/app_child.h +++ b/ports/src/app/gdb_monitor/app_child.h @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -46,7 +47,10 @@ namespace Gdb_monitor { Service_registry *_parent_services; Service_registry _local_services; + Init::Child_config _child_config; + Init::Child_policy_provide_rom_file _binary_policy; + Init::Child_policy_provide_rom_file _config_policy; Gdb_stub_thread _gdb_stub_thread; Object_pool _managed_ds_map; @@ -234,12 +238,15 @@ namespace Gdb_monitor { Genode::Ram_session_capability ram_session, Genode::Cap_session *cap_session, Service_registry *parent_services, - Genode::Rpc_entrypoint *root_ep) + Genode::Rpc_entrypoint *root_ep, + Xml_node target_node) : Init::Child_policy_enforce_labeling(unique_name), _unique_name(unique_name), _entrypoint(cap_session, STACK_SIZE, "GDB monitor entrypoint name"), _parent_services(parent_services), + _child_config(ram_session, target_node), _binary_policy("binary", elf_ds, &_entrypoint), + _config_policy("config", _child_config.dataspace(), &_entrypoint), _gdb_stub_thread(), _rm_root(&_entrypoint, env()->heap() /* should be _child.heap() */, &_managed_ds_map, &_gdb_stub_thread), _rm_session_cap(_get_rm_session_cap()), @@ -281,6 +288,10 @@ namespace Gdb_monitor { if ((service = _binary_policy.resolve_session_request(service_name, args))) return service; + /* check for config file request */ + if ((service = _config_policy.resolve_session_request(service_name, args))) + return service; + service = _local_services.find(service_name); if (service) return service; diff --git a/ports/src/app/gdb_monitor/main.cc b/ports/src/app/gdb_monitor/main.cc index 6a902540e..13891388b 100644 --- a/ports/src/app/gdb_monitor/main.cc +++ b/ports/src/app/gdb_monitor/main.cc @@ -62,6 +62,9 @@ int main() return -1; } + /* extract target node from config file */ + Xml_node target_node = config()->xml_node().sub_node("target"); + /* reserve some memory for gdb_monitor and give the rest to the child */ Number_of_bytes ram_quota = env()->ram_session()->avail() - 2*1024*1024; @@ -99,7 +102,8 @@ int main() ram.cap(), &cap_session, &parent_services, - &child_root_ep); + &child_root_ep, + target_node); sleep_forever(); return 0;