diff --git a/repos/os/recipes/pkg/black_hole/runtime b/repos/os/recipes/pkg/black_hole/runtime
index 151b976374..f4eb3d6cda 100644
--- a/repos/os/recipes/pkg/black_hole/runtime
+++ b/repos/os/recipes/pkg/black_hole/runtime
@@ -9,6 +9,7 @@
+
@@ -20,6 +21,7 @@
+
diff --git a/repos/os/recipes/pkg/test-black_hole/runtime b/repos/os/recipes/pkg/test-black_hole/runtime
index a6a7158d1b..a95f68f3c8 100644
--- a/repos/os/recipes/pkg/test-black_hole/runtime
+++ b/repos/os/recipes/pkg/test-black_hole/runtime
@@ -30,6 +30,7 @@
+
@@ -40,6 +41,7 @@
+
@@ -61,6 +63,7 @@
+
diff --git a/repos/os/recipes/src/black_hole/used_apis b/repos/os/recipes/src/black_hole/used_apis
index c7a5c95daa..7a3603f7a3 100644
--- a/repos/os/recipes/src/black_hole/used_apis
+++ b/repos/os/recipes/src/black_hole/used_apis
@@ -6,4 +6,5 @@ event_session
nic_session
uplink_session
gpu_session
+usb_session
os
diff --git a/repos/os/recipes/src/test-black_hole/used_apis b/repos/os/recipes/src/test-black_hole/used_apis
index 94e0398cf3..ffa5224b72 100644
--- a/repos/os/recipes/src/test-black_hole/used_apis
+++ b/repos/os/recipes/src/test-black_hole/used_apis
@@ -8,3 +8,4 @@ capture_session
nic_session
uplink_session
gpu_session
+usb_session
diff --git a/repos/os/src/server/black_hole/README b/repos/os/src/server/black_hole/README
index 75766e389c..d1d31197a0 100644
--- a/repos/os/src/server/black_hole/README
+++ b/repos/os/src/server/black_hole/README
@@ -12,6 +12,7 @@ in the configuration of the component:
* Uplink
* ROM
* Gpu
+* Usb
@@ -22,4 +23,9 @@ in the configuration of the component:
+
+
+Be aware, that the USB service is merely announced but always throws a
+Service_denied exception when trying to request a session. This is considered
+a temporary solution.
diff --git a/repos/os/src/server/black_hole/config.xsd b/repos/os/src/server/black_hole/config.xsd
index ce5f03e69e..ec86ec2d09 100644
--- a/repos/os/src/server/black_hole/config.xsd
+++ b/repos/os/src/server/black_hole/config.xsd
@@ -4,6 +4,7 @@
+
diff --git a/repos/os/src/server/black_hole/main.cc b/repos/os/src/server/black_hole/main.cc
index a25b52d0d1..3a06ab2ffa 100644
--- a/repos/os/src/server/black_hole/main.cc
+++ b/repos/os/src/server/black_hole/main.cc
@@ -29,6 +29,7 @@
#include "uplink.h"
#include "rom.h"
#include "gpu.h"
+#include "usb.h"
/***************
@@ -51,6 +52,7 @@ struct Black_hole::Main
Genode::Constructible uplink_root { };
Genode::Constructible rom_root { };
Genode::Constructible gpu_root { };
+ Genode::Constructible usb_root { };
Main(Genode::Env &env) : env(env)
{
@@ -88,6 +90,10 @@ struct Black_hole::Main
gpu_root.construct(env, heap);
env.parent().announce(env.ep().manage(*gpu_root));
}
+ if (_config_rom.xml().has_sub_node("usb")) {
+ usb_root.construct(env, heap);
+ env.parent().announce(env.ep().manage(*usb_root));
+ }
}
};
diff --git a/repos/os/src/server/black_hole/usb.h b/repos/os/src/server/black_hole/usb.h
new file mode 100644
index 0000000000..689cb65177
--- /dev/null
+++ b/repos/os/src/server/black_hole/usb.h
@@ -0,0 +1,96 @@
+/*
+ * \brief Usb session component and root
+ * \author Martin Stein
+ * \date 2022-02-12
+ */
+
+/*
+ * Copyright (C) 2022 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU Affero General Public License version 3.
+ */
+
+#ifndef _USB_H_
+#define _USB_H_
+
+/* base includes */
+#include
+
+/* os includes */
+#include
+
+namespace Black_hole {
+
+ using namespace Genode;
+ using namespace Usb;
+
+ class Usb_session;
+ class Usb_root;
+}
+
+
+class Black_hole::Usb_session : public Usb::Session_rpc_object
+{
+ public:
+
+ void sigh_state_change(Signal_context_capability /* sigh */) override { }
+
+ bool plugged() override { return false; }
+
+ void config_descriptor(Device_descriptor * /* device_descr */,
+ Config_descriptor * /* config_descr */) override { }
+
+ unsigned alt_settings(unsigned /* index */) override { return 0; }
+
+ void interface_descriptor(unsigned /* index */,
+ unsigned /* alt_setting */,
+ Interface_descriptor * /* interface_descr */) override { }
+
+ bool interface_extra(unsigned /* index */,
+ unsigned /* alt_setting */,
+ Interface_extra * /* interface_data */) override { return false; }
+
+ void endpoint_descriptor(unsigned /* interface_num */,
+ unsigned /* alt_setting */,
+ unsigned /* endpoint_num */,
+ Endpoint_descriptor * /* endpoint_descr */) override { }
+
+ void claim_interface(unsigned /* interface_num */) override { }
+
+ void release_interface(unsigned /* interface_num */) override { }
+};
+
+
+class Black_hole::Usb_root : public Root_component
+{
+ private:
+
+ Env &_env;
+
+ protected:
+
+ Usb_session *_create_session(char const * /* args */) override
+ {
+ /*
+ * FIXME
+ *
+ * Currently, we're fine with a service that is routable but
+ * not usable. In the long term, this exception should be removed
+ * and a session object should be returned that can be used as if
+ * it was a real USB session.
+ */
+ throw Service_denied { };
+ }
+
+ public:
+
+ Usb_root(Env &env,
+ Allocator &alloc)
+ :
+ Root_component { env.ep(), alloc },
+ _env { env }
+ { }
+};
+
+#endif /* _USB_H_ */
diff --git a/repos/os/src/test/black_hole/main.cc b/repos/os/src/test/black_hole/main.cc
index 94702911aa..29824c2625 100644
--- a/repos/os/src/test/black_hole/main.cc
+++ b/repos/os/src/test/black_hole/main.cc
@@ -25,6 +25,7 @@
/* os includes */
#include
#include
+#include
#include
#include
#include
@@ -41,6 +42,7 @@ namespace Black_hole_test {
class Uplink_test;
class Capture_test;
class Event_test;
+ class Usb_test;
class Rom_test;
class Main;
}
@@ -328,6 +330,41 @@ class Black_hole_test::Rom_test
};
+class Black_hole_test::Usb_test
+{
+ private:
+
+ Env &_env;
+ Allocator_avl _alloc;
+ bool _finished { false };
+
+ public:
+
+ Usb_test(Env &env,
+ Heap &heap)
+ :
+ _env { env },
+ _alloc { &heap }
+ {
+ try {
+ Usb::Connection connection { _env, &_alloc };
+ class Session_request_succeeded { };
+ throw Session_request_succeeded { };
+
+ } catch (Service_denied) {
+
+ _finished = true;
+ }
+ }
+
+ bool finished() const
+ {
+ return _finished;
+ }
+};
+
+
+
class Black_hole_test::Main
{
private:
@@ -342,6 +379,7 @@ class Black_hole_test::Main
Uplink_test _uplink_test { _env, _heap, _signal_handler };
Capture_test _capture_test { _env };
Event_test _event_test { _env };
+ Usb_test _usb_test { _env, _heap };
Rom_test _rom_test { _env };
void _handle_signal()
@@ -357,6 +395,7 @@ class Black_hole_test::Main
_uplink_test.finished() &&
_capture_test.finished() &&
_event_test.finished() &&
+ _usb_test.finished() &&
_rom_test.finished()) {
log("Finished");