From 8763b6925a1699e6b988a6eb60c4d3581418d60c Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Tue, 22 Sep 2015 12:24:51 +0200 Subject: [PATCH] os: new ROM logger component --- repos/os/src/app/rom_logger/README | 5 ++ repos/os/src/app/rom_logger/main.cc | 113 ++++++++++++++++++++++++++ repos/os/src/app/rom_logger/target.mk | 3 + 3 files changed, 121 insertions(+) create mode 100644 repos/os/src/app/rom_logger/README create mode 100644 repos/os/src/app/rom_logger/main.cc create mode 100644 repos/os/src/app/rom_logger/target.mk diff --git a/repos/os/src/app/rom_logger/README b/repos/os/src/app/rom_logger/README new file mode 100644 index 000000000..587f62523 --- /dev/null +++ b/repos/os/src/app/rom_logger/README @@ -0,0 +1,5 @@ +The rom_logger component requests a ROM session and writes the content of the +ROM dataspace to the LOG. It responds to configuration and ROM-module updates. + +The name of the ROM module must be specified via the 'rom' attribute of the +components '' node. For example: ''. diff --git a/repos/os/src/app/rom_logger/main.cc b/repos/os/src/app/rom_logger/main.cc new file mode 100644 index 000000000..27bad74c1 --- /dev/null +++ b/repos/os/src/app/rom_logger/main.cc @@ -0,0 +1,113 @@ +/* + * \brief Write content of ROM module to LOG + * \author Norman Feske + * \date 2015-09-22 + */ + +/* + * Copyright (C) 2015 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. + */ + +/* Genode includes */ +#include +#include +#include +#include +#include +#include +#include + +namespace Rom_logger { struct Main; } + + +struct Rom_logger::Main +{ + Server::Entrypoint &_ep; + + Genode::Lazy_volatile_object _rom_ds; + + typedef Genode::String<100> Rom_name; + + /** + * Name of currently requested ROM module + * + * Solely used to detect configuration changes. + */ + Rom_name _rom_name; + + /** + * Signal handler that is invoked when the configuration or the ROM module + * changes. + */ + void _handle_update(unsigned); + + Genode::Signal_rpc_member
_update_dispatcher = + { _ep, *this, &Main::_handle_update }; + + Main(Server::Entrypoint &ep) : _ep(ep) + { + Genode::config()->sigh(_update_dispatcher); + _handle_update(0); + } +}; + + +void Rom_logger::Main::_handle_update(unsigned) +{ + using Genode::config; + + config()->reload(); + + /* + * Query name of ROM module from config + */ + Rom_name rom_name; + try { + rom_name = config()->xml_node().attribute_value("rom", rom_name); + + } catch (...) { + PWRN("could not determine ROM name from config"); + return; + } + + /* + * If ROM name changed, reconstruct '_rom_ds' + */ + if (rom_name != _rom_name) { + _rom_ds.construct(rom_name.string()); + _rom_ds->sigh(_update_dispatcher); + _rom_name = rom_name; + } + + /* + * Update ROM module and print content to LOG + */ + if (_rom_ds.is_constructed()) { + _rom_ds->update(); + + if (_rom_ds->is_valid()) { + PLOG("ROM '%s':", _rom_name.string()); + + Genode::print_lines<200>(_rom_ds->local_addr(), _rom_ds->size(), + [&] (char const *line) { PLOG(" %s", line); }); + } else { + PLOG("ROM '%s' is invalid", _rom_name.string()); + } + } +} + + +namespace Server { + + char const *name() { return "ep"; } + + size_t stack_size() { return 4*1024*sizeof(long); } + + void construct(Entrypoint &ep) + { + static Rom_logger::Main main(ep); + } +} diff --git a/repos/os/src/app/rom_logger/target.mk b/repos/os/src/app/rom_logger/target.mk new file mode 100644 index 000000000..d70ed0085 --- /dev/null +++ b/repos/os/src/app/rom_logger/target.mk @@ -0,0 +1,3 @@ +TARGET = rom_logger +SRC_CC = main.cc +LIBS = base config server