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