mirror of
https://github.com/genodelabs/genode.git
synced 2025-06-19 07:38:28 +00:00
server/report_rom: componentize
* Check report RAM donation and buffer size. * Use explicit config ROM attachment. * Pass Env to session connections. * Replace logging macros. Issue #2036
This commit is contained in:
committed by
Norman Feske
parent
02e50ce5d7
commit
0efd5a3078
@ -13,14 +13,12 @@
|
||||
|
||||
/* Genode includes */
|
||||
#include <base/heap.h>
|
||||
#include <base/env.h>
|
||||
#include <os/server.h>
|
||||
#include <os/config.h>
|
||||
#include <base/component.h>
|
||||
#include <os/attached_rom_dataspace.h>
|
||||
#include <report_rom/rom_service.h>
|
||||
#include <report_rom/report_service.h>
|
||||
|
||||
namespace Server { struct Main; }
|
||||
namespace Clipboard { struct Main; }
|
||||
|
||||
|
||||
/**
|
||||
@ -69,16 +67,19 @@ struct Rom::Registry : Rom::Registry_for_reader, Rom::Registry_for_writer
|
||||
};
|
||||
|
||||
|
||||
struct Server::Main : Rom::Module::Read_policy, Rom::Module::Write_policy
|
||||
struct Clipboard::Main : Rom::Module::Read_policy, Rom::Module::Write_policy
|
||||
{
|
||||
Entrypoint &_ep;
|
||||
Genode::Env &_env;
|
||||
|
||||
Genode::Sliced_heap _sliced_heap = { Genode::env()->ram_session(),
|
||||
Genode::env()->rm_session() };
|
||||
|
||||
Genode::Attached_rom_dataspace _config { _env, "config" };
|
||||
|
||||
bool _verbose_config()
|
||||
{
|
||||
char const *attr = "verbose";
|
||||
return Genode::config()->xml_node().attribute_value(attr, false);
|
||||
return _config.xml().attribute_value(attr, false);
|
||||
}
|
||||
|
||||
bool verbose = _verbose_config();
|
||||
@ -87,8 +88,8 @@ struct Server::Main : Rom::Module::Read_policy, Rom::Module::Write_policy
|
||||
|
||||
Genode::Attached_rom_dataspace _focus_ds { "focus" };
|
||||
|
||||
Genode::Signal_rpc_member<Main> _focus_dispatcher =
|
||||
{ _ep, *this, &Main::_handle_focus };
|
||||
Genode::Signal_handler<Main> _focus_handler =
|
||||
{ _env.ep(), *this, &Main::_handle_focus };
|
||||
|
||||
Domain _focused_domain;
|
||||
|
||||
@ -97,7 +98,7 @@ struct Server::Main : Rom::Module::Read_policy, Rom::Module::Write_policy
|
||||
*
|
||||
* We only accept reports from the currently focused domain.
|
||||
*/
|
||||
void _handle_focus(unsigned)
|
||||
void _handle_focus()
|
||||
{
|
||||
_focus_ds.update();
|
||||
|
||||
@ -117,7 +118,7 @@ struct Server::Main : Rom::Module::Read_policy, Rom::Module::Write_policy
|
||||
using namespace Genode;
|
||||
|
||||
try {
|
||||
return Session_policy(label).attribute_value("domain", Domain());
|
||||
return Session_policy(label, _config.xml()).attribute_value("domain", Domain());
|
||||
} catch (Session_policy::No_policy_defined) { }
|
||||
|
||||
return Domain();
|
||||
@ -154,9 +155,9 @@ struct Server::Main : Rom::Module::Read_policy, Rom::Module::Write_policy
|
||||
auto match_flow = [&] (Genode::Xml_node flow) {
|
||||
if (flow.attribute_value("from", Domain()) == from
|
||||
&& flow.attribute_value("to", Domain()) == to)
|
||||
result = true; };
|
||||
result = true; };
|
||||
|
||||
Genode::config()->xml_node().for_each_sub_node("flow", match_flow);
|
||||
_config.xml().for_each_sub_node("flow", match_flow);
|
||||
|
||||
} catch (Genode::Xml_node::Nonexistent_sub_node) { }
|
||||
|
||||
@ -197,30 +198,29 @@ struct Server::Main : Rom::Module::Read_policy, Rom::Module::Write_policy
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
Rom::Registry _rom_registry { *this, *this };
|
||||
|
||||
Report::Root report_root = { _ep, _sliced_heap, _rom_registry, verbose };
|
||||
Rom ::Root rom_root = { _ep, _sliced_heap, _rom_registry };
|
||||
Report::Root report_root = { _env, _sliced_heap, _rom_registry, verbose };
|
||||
Rom ::Root rom_root = { _env, _sliced_heap, _rom_registry };
|
||||
|
||||
Main(Entrypoint &ep) : _ep(ep)
|
||||
Main(Genode::Env &env) : _env(env)
|
||||
{
|
||||
_focus_ds.sigh(_focus_dispatcher);
|
||||
_focus_ds.sigh(_focus_handler);
|
||||
|
||||
Genode::env()->parent()->announce(_ep.manage(report_root));
|
||||
Genode::env()->parent()->announce(_ep.manage(rom_root));
|
||||
env.parent().announce(env.ep().manage(report_root));
|
||||
env.parent().announce(env.ep().manage(rom_root));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
namespace Server {
|
||||
/***************
|
||||
** Component **
|
||||
***************/
|
||||
|
||||
char const *name() { return "report_rom_ep"; }
|
||||
namespace Component {
|
||||
|
||||
size_t stack_size() { return 4*1024*sizeof(long); }
|
||||
Genode::size_t stack_size() { return 4*1024*sizeof(long); }
|
||||
|
||||
void construct(Entrypoint &ep)
|
||||
{
|
||||
static Main main(ep);
|
||||
}
|
||||
void construct(Genode::Env &env) { static Clipboard::Main main(env); }
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
TARGET = clipboard
|
||||
SRC_CC = main.cc
|
||||
LIBS = base server config
|
||||
LIBS = base
|
||||
INC_DIR += $(PRG_DIR)
|
||||
|
@ -5,7 +5,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2014 Genode Labs GmbH
|
||||
* Copyright (C) 2014-2016 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU General Public License version 2.
|
||||
@ -14,51 +14,46 @@
|
||||
/* Genode includes */
|
||||
#include <base/heap.h>
|
||||
#include <base/env.h>
|
||||
#include <os/server.h>
|
||||
#include <os/config.h>
|
||||
#include <report_rom/rom_service.h>
|
||||
#include <report_rom/report_service.h>
|
||||
#include <base/attached_rom_dataspace.h>
|
||||
#include <base/component.h>
|
||||
|
||||
/* local includes */
|
||||
#include "rom_registry.h"
|
||||
|
||||
|
||||
namespace Server {
|
||||
using Genode::env;
|
||||
struct Main;
|
||||
}
|
||||
namespace Report_rom { struct Main; }
|
||||
|
||||
|
||||
struct Server::Main
|
||||
struct Report_rom::Main
|
||||
{
|
||||
Entrypoint &ep;
|
||||
Genode::Env &env;
|
||||
|
||||
Genode::Sliced_heap sliced_heap = { env()->ram_session(),
|
||||
env()->rm_session() };
|
||||
Genode::Sliced_heap sliced_heap { env.ram(), env.rm() };
|
||||
|
||||
Rom::Registry rom_registry = { sliced_heap };
|
||||
Rom::Registry rom_registry { sliced_heap, config_rom };
|
||||
|
||||
bool verbose = Genode::config()->xml_node().attribute_value("verbose", false);
|
||||
Genode::Attached_rom_dataspace config_rom { env, "config" };
|
||||
|
||||
Report::Root report_root = { ep, sliced_heap, rom_registry, verbose };
|
||||
Rom ::Root rom_root = { ep, sliced_heap, rom_registry };
|
||||
bool verbose = config_rom.xml().attribute_value("verbose", false);
|
||||
|
||||
Main(Entrypoint &ep) : ep(ep)
|
||||
Report::Root report_root { env, sliced_heap, rom_registry, verbose };
|
||||
Rom ::Root rom_root { env, sliced_heap, rom_registry };
|
||||
|
||||
Main(Genode::Env &env) : env(env)
|
||||
{
|
||||
env()->parent()->announce(ep.manage(report_root));
|
||||
env()->parent()->announce(ep.manage(rom_root));
|
||||
env.parent().announce(env.ep().manage(report_root));
|
||||
env.parent().announce(env.ep().manage(rom_root));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
namespace Server {
|
||||
/***************
|
||||
** Component **
|
||||
***************/
|
||||
|
||||
char const *name() { return "report_rom_ep"; }
|
||||
Genode::size_t Component::stack_size() { return 4*1024*sizeof(long); }
|
||||
|
||||
size_t stack_size() { return 4*1024*sizeof(long); }
|
||||
void Component::construct(Genode::Env &env) { static Report_rom::Main main(env); }
|
||||
|
||||
void construct(Entrypoint &ep)
|
||||
{
|
||||
static Main main(ep);
|
||||
}
|
||||
}
|
||||
|
@ -5,7 +5,7 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2014 Genode Labs GmbH
|
||||
* Copyright (C) 2014-2016 Genode Labs GmbH
|
||||
*
|
||||
* This file is part of the Genode OS framework, which is distributed
|
||||
* under the terms of the GNU General Public License version 2.
|
||||
@ -26,6 +26,7 @@ struct Rom::Registry : Registry_for_reader, Registry_for_writer, Genode::Noncopy
|
||||
private:
|
||||
|
||||
Genode::Allocator &_md_alloc;
|
||||
Genode::Attached_rom_dataspace &_config_rom;
|
||||
|
||||
Module_list _modules;
|
||||
|
||||
@ -118,15 +119,16 @@ struct Rom::Registry : Registry_for_reader, Registry_for_writer, Genode::Noncopy
|
||||
|
||||
String<Rom::Module::Name::capacity()> report;
|
||||
|
||||
_config_rom.update();
|
||||
try {
|
||||
Session_policy policy(rom_label);
|
||||
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()->xml_node().sub_node("rom");
|
||||
PWRN("parsing legacy <rom> policies");
|
||||
Xml_node rom_node = _config_rom.xml().sub_node("rom");
|
||||
warning("parsing legacy <rom> policies");
|
||||
|
||||
Session_policy policy(rom_label, rom_node);
|
||||
policy.attribute("report").value(&report);
|
||||
@ -135,15 +137,16 @@ struct Rom::Registry : Registry_for_reader, Registry_for_writer, Genode::Noncopy
|
||||
catch (Session_policy::No_policy_defined) { }
|
||||
}
|
||||
|
||||
PWRN("no valid policy for label \"%s\"", rom_label.string());
|
||||
warning("no valid policy for ROM request \", rom_label.string(), \"");
|
||||
throw Root::Invalid_args();
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
Registry(Genode::Allocator &md_alloc)
|
||||
Registry(Genode::Allocator &md_alloc,
|
||||
Genode::Attached_rom_dataspace &config_rom)
|
||||
:
|
||||
_md_alloc(md_alloc)
|
||||
_md_alloc(md_alloc), _config_rom(config_rom)
|
||||
{ }
|
||||
|
||||
Module &lookup(Writer &writer, Module::Name const &name) override
|
||||
|
@ -1,4 +1,4 @@
|
||||
TARGET = report_rom
|
||||
SRC_CC = main.cc
|
||||
LIBS = base server config
|
||||
LIBS = base
|
||||
INC_DIR += $(PRG_DIR)
|
||||
|
Reference in New Issue
Block a user