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