Remove rom_fallback server
This commit is contained in:
committed by
Norman Feske
parent
e94b81d5d1
commit
9fe7643285
@@ -1,2 +0,0 @@
|
||||
SRC_DIR = src/server/rom_fallback
|
||||
include $(GENODE_DIR)/repos/base/recipes/src/content.inc
|
||||
@@ -1 +0,0 @@
|
||||
2017-08-28 20b7a65bfac6aed1c94285006623a5f35169e8bb
|
||||
@@ -1 +0,0 @@
|
||||
base
|
||||
@@ -1,86 +0,0 @@
|
||||
#
|
||||
# \brief Test of 'rom_fallback' server
|
||||
# \author Emery Hemingway
|
||||
# \date 2016-07-21
|
||||
#
|
||||
|
||||
create_boot_directory
|
||||
|
||||
import_from_depot \
|
||||
genodelabs/src/[base_src] \
|
||||
genodelabs/src/init \
|
||||
genodelabs/src/report_rom \
|
||||
genodelabs/src/rom_fallback \
|
||||
|
||||
build { server/rom_fallback test/libc }
|
||||
|
||||
append config {
|
||||
<config verbose="yes">
|
||||
<default caps="256"/>
|
||||
<parent-provides>
|
||||
<service name="CPU"/>
|
||||
<service name="LOG"/>
|
||||
<service name="PD"/>
|
||||
<service name="RAM"/>
|
||||
<service name="RM"/>
|
||||
<service name="ROM"/>
|
||||
</parent-provides>
|
||||
<default-route>
|
||||
<any-service>
|
||||
<child name="rom_fallback"/>
|
||||
<parent/> <any-child/>
|
||||
</any-service>
|
||||
</default-route>
|
||||
|
||||
<start name="report_rom">
|
||||
<resource name="RAM" quantum="1M"/>
|
||||
<provides> <service name="ROM"/> </provides>
|
||||
<config/>
|
||||
<route> <any-service> <parent/> </any-service> </route>
|
||||
</start>
|
||||
|
||||
<start name="rom_fallback">
|
||||
<resource name="RAM" quantum="1M"/>
|
||||
<provides> <service name="ROM"/> </provides>
|
||||
<config>
|
||||
<fallback label="report"/>
|
||||
<fallback/>
|
||||
</config>
|
||||
<route>
|
||||
<service name="ROM" label_prefix="report ->">
|
||||
<child name="report_rom"/> </service>
|
||||
<any-service> <parent/> </any-service>
|
||||
</route>
|
||||
</start>
|
||||
|
||||
<start name="timer">
|
||||
<resource name="RAM" quantum="1M"/>
|
||||
<provides> <service name="Timer"/> </provides>
|
||||
</start>
|
||||
|
||||
<start name="test-libc">
|
||||
<resource name="RAM" quantum="4M"/>
|
||||
<config ld_verbose="yes">
|
||||
<libc stdout="/log" stderr="log"/>
|
||||
<vfs> <log/> </vfs>
|
||||
</config>
|
||||
</start>
|
||||
|
||||
</config>
|
||||
}
|
||||
|
||||
install_config $config
|
||||
|
||||
set boot_modules {
|
||||
rom_fallback
|
||||
libc.lib.so vfs.lib.so
|
||||
libm.lib.so
|
||||
posix.lib.so
|
||||
test-libc
|
||||
}
|
||||
|
||||
build_boot_image $boot_modules
|
||||
|
||||
append qemu_args " -nographic"
|
||||
|
||||
run_genode_until {--- libC test ---} 60
|
||||
@@ -1,22 +0,0 @@
|
||||
Rom_fallback serves ROM sessions by opening sessions at its parent using
|
||||
a list of labels and returning the first successfully opened session.
|
||||
|
||||
In the following configuration example an attempt is made to forward
|
||||
sessions from the parent with a fallback at the sibling 'fs_rom'.
|
||||
! <start name="rom_fallback">
|
||||
! <.../>
|
||||
! <config>
|
||||
! <fallback/> <!-- no label prefix -->
|
||||
! <fallback label="fs"/>
|
||||
! </config>
|
||||
! <route>
|
||||
!
|
||||
! <service name="ROM" label_prefix="fs ->"> <!-- prefixed route -->
|
||||
! <child name="fs_rom"/> </service>
|
||||
!
|
||||
! <service name="ROM"> <!-- default route -->
|
||||
! <parent/> </service>
|
||||
!
|
||||
! <.../>
|
||||
! </route>
|
||||
! </start>
|
||||
@@ -1,219 +0,0 @@
|
||||
/*
|
||||
* \brief Service fallback server
|
||||
* \author Emery Hemingway
|
||||
* \date 2016-07-21
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 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.
|
||||
*/
|
||||
|
||||
/* TODO: ambiguated services */
|
||||
|
||||
/* Genode includes */
|
||||
#include <base/attached_rom_dataspace.h>
|
||||
#include <rom_session/capability.h>
|
||||
#include <base/service.h>
|
||||
#include <base/heap.h>
|
||||
#include <base/session_label.h>
|
||||
#include <base/component.h>
|
||||
|
||||
namespace Rom_fallback {
|
||||
using namespace Genode;
|
||||
struct Main;
|
||||
}
|
||||
|
||||
struct Rom_fallback::Main
|
||||
{
|
||||
struct Fallback_label;
|
||||
typedef List<Fallback_label> Fallback_labels;
|
||||
|
||||
struct Fallback_label : Session_label, Fallback_labels::Element
|
||||
{
|
||||
using Session_label::Session_label;
|
||||
};
|
||||
|
||||
Fallback_labels fallbacks;
|
||||
|
||||
struct Session : Parent::Server
|
||||
{
|
||||
Parent::Client parent_client;
|
||||
|
||||
Id_space<Parent::Client>::Element client_id;
|
||||
Id_space<Parent::Server>::Element server_id;
|
||||
|
||||
Session(Id_space<Parent::Client> &client_space,
|
||||
Id_space<Parent::Server> &server_space,
|
||||
Parent::Server::Id server_id)
|
||||
:
|
||||
client_id(parent_client, client_space),
|
||||
server_id(*this, server_space, server_id) { }
|
||||
};
|
||||
|
||||
Id_space<Parent::Server> server_id_space;
|
||||
|
||||
Env &env;
|
||||
|
||||
Attached_rom_dataspace config_rom { env, "config" };
|
||||
Attached_rom_dataspace session_requests { env, "session_requests" };
|
||||
|
||||
Heap heap { env.ram(), env.rm() };
|
||||
|
||||
void load_config()
|
||||
{
|
||||
while (Fallback_label *f = fallbacks.first()) {
|
||||
fallbacks.remove(f);
|
||||
destroy(heap, f);
|
||||
}
|
||||
|
||||
/* keep a pointer to last element of the list for inserting */
|
||||
Fallback_label *last = nullptr;
|
||||
config_rom.xml().for_each_sub_node("fallback", [&] (Xml_node node) {
|
||||
typedef String<Session_label::capacity()> Label;
|
||||
|
||||
Fallback_label *fallback = new (heap)
|
||||
Fallback_label(node.attribute_value("label", Label()).string());
|
||||
fallbacks.insert(fallback, last);
|
||||
last = fallback;
|
||||
});
|
||||
}
|
||||
|
||||
void handle_session_request(Xml_node request);
|
||||
|
||||
void handle_session_requests()
|
||||
{
|
||||
if (config_sig_rec.pending()) {
|
||||
do { config_sig_rec.pending_signal(); }
|
||||
while (config_sig_rec.pending());
|
||||
config_rom.update();
|
||||
load_config();
|
||||
}
|
||||
|
||||
session_requests.update();
|
||||
|
||||
Xml_node const requests = session_requests.xml();
|
||||
|
||||
requests.for_each_sub_node([&] (Xml_node request) {
|
||||
handle_session_request(request);
|
||||
});
|
||||
}
|
||||
|
||||
Signal_handler<Main> session_request_handler {
|
||||
env.ep(), *this, &Main::handle_session_requests };
|
||||
|
||||
Signal_context config_sig_ctx;
|
||||
Signal_receiver config_sig_rec;
|
||||
|
||||
Main(Genode::Env &env) : env(env)
|
||||
{
|
||||
load_config();
|
||||
|
||||
config_rom.sigh(config_sig_rec.manage(&config_sig_ctx));
|
||||
session_requests.sigh(session_request_handler);
|
||||
|
||||
/* handle requests that have queued before or during construction */
|
||||
handle_session_requests();
|
||||
}
|
||||
|
||||
~Main() {
|
||||
config_sig_rec.dissolve(&config_sig_ctx); }
|
||||
};
|
||||
|
||||
|
||||
void Rom_fallback::Main::handle_session_request(Xml_node request)
|
||||
{
|
||||
if (!request.has_attribute("id"))
|
||||
return;
|
||||
|
||||
Parent::Server::Id const server_id { request.attribute_value("id", 0UL) };
|
||||
|
||||
if (request.has_type("create")) {
|
||||
|
||||
if (!request.has_sub_node("args"))
|
||||
return;
|
||||
|
||||
typedef Session_state::Args Args;
|
||||
Args const args = request.sub_node("args").decoded_content<Args>();
|
||||
|
||||
Session_label const original = label_from_args(args.string());
|
||||
|
||||
enum { ARGS_MAX_LEN = 256 };
|
||||
char new_args[ARGS_MAX_LEN];
|
||||
|
||||
for (Fallback_label *f = fallbacks.first(); f; f = f->next()) {
|
||||
Session_label &prefix = *f;
|
||||
|
||||
/* create new label */
|
||||
Session_label const new_label = prefix == "" ?
|
||||
original : prefixed_label(prefix, original);
|
||||
|
||||
/* create a new argument set */
|
||||
strncpy(new_args, args.string(), sizeof(new_args));
|
||||
Arg_string::set_arg_string(new_args, sizeof(new_args), "label",
|
||||
new_label.string());
|
||||
|
||||
/* try this service */
|
||||
Session *session = nullptr;
|
||||
try {
|
||||
session = new (heap)
|
||||
Session(env.id_space(), server_id_space, server_id);
|
||||
|
||||
Affinity aff;
|
||||
Session_capability cap =
|
||||
env.session("ROM", session->client_id.id(), new_args, aff);
|
||||
|
||||
env.parent().deliver_session_cap(server_id, cap);
|
||||
return;
|
||||
}
|
||||
|
||||
catch (Service_denied) {
|
||||
warning("'", new_label, "' was denied"); }
|
||||
|
||||
catch (Insufficient_ram_quota) {
|
||||
warning("'", new_label, "' RAM quota donation was insufficient"); }
|
||||
|
||||
catch (Insufficient_cap_quota) {
|
||||
warning("'", new_label, "' cap quota donation was insufficient"); }
|
||||
|
||||
if (session)
|
||||
destroy(heap, session);
|
||||
}
|
||||
|
||||
error("no service found for ROM '", original.string(), "'");
|
||||
env.parent().session_response(server_id, Parent::SERVICE_DENIED);
|
||||
}
|
||||
|
||||
if (request.has_type("upgrade")) {
|
||||
|
||||
server_id_space.apply<Session>(server_id, [&] (Session &session) {
|
||||
|
||||
Ram_quota ram_quota { request.attribute_value("ram_quota", 0UL) };
|
||||
Cap_quota cap_quota { request.attribute_value("cap_quota", 0UL) };
|
||||
|
||||
String<80> args("ram_quota=", ram_quota, ", cap_quota=", cap_quota);
|
||||
|
||||
env.upgrade(session.client_id.id(), args.string());
|
||||
env.parent().session_response(server_id, Parent::SESSION_OK);
|
||||
});
|
||||
}
|
||||
|
||||
if (request.has_type("close")) {
|
||||
server_id_space.apply<Session>(server_id, [&] (Session &session) {
|
||||
env.close(session.client_id.id());
|
||||
destroy(heap, &session);
|
||||
env.parent().session_response(server_id, Parent::SESSION_CLOSED);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void Component::construct(Genode::Env &env)
|
||||
{
|
||||
static Rom_fallback::Main inst(env);
|
||||
|
||||
env.parent().announce("ROM");
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
TARGET = rom_fallback
|
||||
SRC_CC = component.cc
|
||||
LIBS = base
|
||||
|
||||
CC_CXX_WARN_STRICT =
|
||||
Reference in New Issue
Block a user