Remove rom_fallback server

This commit is contained in:
Emery Hemingway
2019-02-22 15:59:33 +01:00
committed by Norman Feske
parent e94b81d5d1
commit 9fe7643285
7 changed files with 0 additions and 336 deletions

View File

@@ -1,2 +0,0 @@
SRC_DIR = src/server/rom_fallback
include $(GENODE_DIR)/repos/base/recipes/src/content.inc

View File

@@ -1 +0,0 @@
2017-08-28 20b7a65bfac6aed1c94285006623a5f35169e8bb

View File

@@ -1 +0,0 @@
base

View File

@@ -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

View File

@@ -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>

View File

@@ -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");
}

View File

@@ -1,5 +0,0 @@
TARGET = rom_fallback
SRC_CC = component.cc
LIBS = base
CC_CXX_WARN_STRICT =