diff --git a/repos/gems/run/depot_autopilot.run b/repos/gems/run/depot_autopilot.run index 9d85ab7fa7..46f5bf6f7f 100644 --- a/repos/gems/run/depot_autopilot.run +++ b/repos/gems/run/depot_autopilot.run @@ -264,7 +264,6 @@ proc prepare_to_run_genode { } { } [depot_user] {/src/report_rom } [depot_user] {/src/fs_rom } [depot_user] {/src/vfs - } [depot_user] {/src/loader } [depot_user] {/src/init } [depot_user] {/src/depot_query } @@ -658,7 +657,6 @@ set default_test_pkgs { test-depot_query_index test-ds_ownership test-dynamic_config - test-dynamic_config_loader test-entrypoint test-expat test-fault_detection diff --git a/repos/libports/include/qpluginwidget/qpluginwidget.h b/repos/libports/include/qpluginwidget/qpluginwidget.h deleted file mode 100644 index 01186ff026..0000000000 --- a/repos/libports/include/qpluginwidget/qpluginwidget.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - * \brief A Qt Widget that can load a plugin application and show its GUI view - * \author Christian Prochaska - * \date 2010-08-26 - */ - -/* - * Copyright (C) 2010-2020 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 QPLUGINWIDGET_H -#define QPLUGINWIDGET_H - -/* Genode includes */ -#include -#include - -/* Qt includes */ -#include -#include - -#include - -enum Plugin_loading_state -{ - LOADING, - LOADED, - NETWORK_ERROR, - INFLATE_ERROR, - CAP_QUOTA_EXCEEDED_ERROR, - RAM_QUOTA_EXCEEDED_ERROR, - ROM_CONNECTION_FAILED_EXCEPTION, - TIMEOUT_EXCEPTION -}; - -class QPluginWidget; - -/* separate class, because meta object features are not supported in nested classes */ -class PluginStarter : public QThread -{ - Q_OBJECT - - private: - - Libc::Env *_env; - QUrl _plugin_url; - QByteArray _args; - int _max_width; - int _max_height; - Gui::View_capability _parent_view; - - Loader::Connection *_pc; - enum Plugin_loading_state _plugin_loading_state; - QString _plugin_loading_error_string; - - QNetworkAccessManager *_qnam; - QNetworkReply *_reply; - - void _start_plugin(QString &file_name, QByteArray const &file_buf); - - protected slots: - void networkReplyFinished(); - - public: - PluginStarter(Libc::Env *env, - QUrl plugin_url, QString &args, - int max_width, int max_height, - Gui::View_capability parent_view); - - void run(); - enum Plugin_loading_state plugin_loading_state() { return _plugin_loading_state; } - QString &plugin_loading_error_string() { return _plugin_loading_error_string; } - - /** - * Requst size of the Genode GUI view of the loaded subsystem - */ - Loader::Area view_size(); - - /** - * Set geometry of the Genode GUI view of the loaded subsystem - */ - void view_geometry(Loader::Rect rect, Loader::Point offset); - - signals: - void finished(); -}; - - -class QPluginWidget : public QEmbeddedViewWidget -{ - Q_OBJECT - - private: - - static Libc::Env *_env; - static QPluginWidget *_last; - - enum Plugin_loading_state _plugin_loading_state; - QString _plugin_loading_error_string; - - PluginStarter *_plugin_starter; - bool _plugin_starter_started; - - QUrl _plugin_url; - QString _plugin_args; - - int _max_width; - int _max_height; - - public: - - enum { PRESERVED_CAPS = 150 }; - enum { PRESERVED_RAM_QUOTA = 5*1024*1024 }; - - void cleanup(); - - protected: - virtual void paintEvent(QPaintEvent *); - virtual void showEvent(QShowEvent *); - virtual void hideEvent(QHideEvent *); - - protected slots: - void pluginStartFinished(); - - public: - QPluginWidget(QWidget *parent, QUrl plugin_url, QString &args, - int max_width = -1, int max_height = -1); - ~QPluginWidget(); - - static void env(Libc::Env &env) { _env = &env; } -}; - - -class QPluginWidgetInterface -{ - public: - virtual void env(Libc::Env &env) = 0; - virtual QWidget *createWidget(QWidget *parent, QUrl plugin_url, QString &args, - int max_width = -1, int max_height = -1) = 0; -}; - - -Q_DECLARE_INTERFACE(QPluginWidgetInterface, "org.genode.QPluginWidgetInterface") - - -class QPluginWidgetPlugin : public QObject, public QPluginWidgetInterface -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID "org.genode.QPluginWidgetInterface" FILE "qpluginwidget.json") - Q_INTERFACES(QPluginWidgetInterface) - - public: - - explicit QPluginWidgetPlugin(QObject *parent = 0) : QObject(parent) { } - - void env(Libc::Env &env) { QPluginWidget::env(env); } - - QWidget *createWidget(QWidget *parent, QUrl plugin_url, QString &args, - int max_width = -1, int max_height = -1) - { - return new QPluginWidget(parent, plugin_url, args, max_width, max_height); - } - -}; - -#endif // QPLUGINWIDGET_H diff --git a/repos/libports/lib/mk/libqpluginwidget.mk b/repos/libports/lib/mk/libqpluginwidget.mk deleted file mode 100644 index fa262a57cc..0000000000 --- a/repos/libports/lib/mk/libqpluginwidget.mk +++ /dev/null @@ -1,22 +0,0 @@ -QMAKE_PROJECT_FILE = $(REP_DIR)/src/lib/qpluginwidget/qpluginwidget.pro - -QMAKE_TARGET_BINARIES = libqpluginwidget.lib.so - -QT5_PORT_LIBS = libQt5Core libQt5Gui libQt5Network libQt5Widgets libqgenode - -LIBS = libc libm libqgenodeviewwidget mesa qoost stdcxx zlib $(QT5_PORT_LIBS) - -include $(call select_from_repositories,lib/import/import-qt5_qmake.mk) - -QT5_GENODE_LIBS_SHLIB += libqgenodeviewwidget.lib.so libqgenode.lib.so - -qmake_root/include/qpluginwidget: qmake_root/include - ln -snf $(call select_from_repositories,include/qpluginwidget) $@ - -qmake_prepared.tag: qmake_root/include/qpluginwidget \ - qmake_root/lib/libqgenodeviewwidget.lib.so \ - qmake_root/lib/libqgenode.lib.so - -ifeq ($(called_from_lib_mk),yes) -all: build_with_qmake -endif diff --git a/repos/libports/lib/symbols/libqpluginwidget b/repos/libports/lib/symbols/libqpluginwidget deleted file mode 100644 index dfe5446f0b..0000000000 --- a/repos/libports/lib/symbols/libqpluginwidget +++ /dev/null @@ -1,128 +0,0 @@ -_ZN13PluginStarter11qt_metacallEN11QMetaObject4CallEiPPv T -_ZN13PluginStarter11qt_metacastEPKc T -_ZN13PluginStarter13_start_pluginER7QStringRK10QByteArray T -_ZN13PluginStarter13view_geometryEN6Genode4RectIijEENS0_5PointIiEE T -_ZN13PluginStarter16staticMetaObjectE D 48 -_ZN13PluginStarter20networkReplyFinishedEv T -_ZN13PluginStarter3runEv T -_ZN13PluginStarter8finishedEv T -_ZN13PluginStarter9view_sizeEv T -_ZN13PluginStarterC1EPN4Libc3EnvE4QUrlR7QStringiiN6Genode10CapabilityIN3Gui4ViewEEE T -_ZN13PluginStarterC2EPN4Libc3EnvE4QUrlR7QStringiiN6Genode10CapabilityIN3Gui4ViewEEE T -_ZN13QPluginWidget10paintEventEP11QPaintEvent T -_ZN13QPluginWidget11qt_metacallEN11QMetaObject4CallEiPPv T -_ZN13QPluginWidget11qt_metacastEPKc T -_ZN13QPluginWidget16staticMetaObjectE D 48 -_ZN13QPluginWidget19pluginStartFinishedEv T -_ZN13QPluginWidget4_envE B 8 -_ZN13QPluginWidget5_lastE B 8 -_ZN13QPluginWidget7cleanupEv T -_ZN13QPluginWidget9hideEventEP10QHideEvent T -_ZN13QPluginWidget9showEventEP10QShowEvent T -_ZN13QPluginWidgetC1EP7QWidget4QUrlR7QStringii T -_ZN13QPluginWidgetC2EP7QWidget4QUrlR7QStringii T -_ZN13QPluginWidgetD0Ev T -_ZN13QPluginWidgetD1Ev T -_ZN13QPluginWidgetD2Ev T -_ZN19QPluginWidgetPlugin11qt_metacallEN11QMetaObject4CallEiPPv T -_ZN19QPluginWidgetPlugin11qt_metacastEPKc T -_ZN19QPluginWidgetPlugin16staticMetaObjectE D 48 -_ZNK13PluginStarter10metaObjectEv T -_ZNK13QPluginWidget10metaObjectEv T -_ZNK19QPluginWidgetPlugin10metaObjectEv T -_ZTI13PluginStarter D 24 -_ZTI13QPluginWidget D 24 -_ZTI18Signal_wait_thread D 24 -_ZTI19QPluginWidgetPlugin D 56 -_ZTI22QPluginWidgetInterface D 16 -_ZTIN6Genode10ConnectionIN6Loader7SessionEEE D 24 -_ZTIN6Genode10ConnectionINS_11Rom_sessionEEE D 24 -_ZTIN6Genode10Rpc_clientIN6Loader7SessionEEE D 24 -_ZTIN6Genode10Rpc_clientINS_11Rom_sessionEEE D 24 -_ZTIN6Genode10Rpc_clientINS_9DataspaceEEE D 24 -_ZTIN6Genode11Msgbuf_base13Too_many_capsE D 24 -_ZTIN6Genode11NoncopyableE D 16 -_ZTIN6Genode11Rom_sessionE D 24 -_ZTIN6Genode14Rom_connection21Rom_connection_failedE D 24 -_ZTIN6Genode14Rom_connectionE D 56 -_ZTIN6Genode14Service_deniedE D 24 -_ZTIN6Genode14String_consoleE D 24 -_ZTIN6Genode15Connection_baseE D 56 -_ZTIN6Genode16Dataspace_clientE D 24 -_ZTIN6Genode18Rom_session_clientE D 24 -_ZTIN6Genode6Parent6ClientE D 24 -_ZTIN6Genode7SessionE D 16 -_ZTIN6Genode8Id_spaceINS_6Parent6ClientEE10Out_of_idsE D 40 -_ZTIN6Genode9DataspaceE D 24 -_ZTIN6Genode9ExceptionE D 16 -_ZTIN6Genode9InterfaceE D 16 -_ZTIN6Genode9Ipc_errorE D 24 -_ZTIN6Loader10ConnectionE D 56 -_ZTIN6Loader14Session_clientE D 24 -_ZTIN6Loader7Session19View_does_not_existE D 24 -_ZTIN6Loader7Session25Rom_module_does_not_existE D 24 -_ZTIN6Loader7Session9ExceptionE D 24 -_ZTIN6Loader7SessionE D 24 -_ZTS13PluginStarter R 16 -_ZTS13QPluginWidget R 16 -_ZTS18Signal_wait_thread D 21 -_ZTS19QPluginWidgetPlugin R 22 -_ZTS22QPluginWidgetInterface D 25 -_ZTSN6Genode10ConnectionIN6Loader7SessionEEE D 41 -_ZTSN6Genode10ConnectionINS_11Rom_sessionEEE D 41 -_ZTSN6Genode10Rpc_clientIN6Loader7SessionEEE D 41 -_ZTSN6Genode10Rpc_clientINS_11Rom_sessionEEE D 41 -_ZTSN6Genode10Rpc_clientINS_9DataspaceEEE D 38 -_ZTSN6Genode11Msgbuf_base13Too_many_capsE D 38 -_ZTSN6Genode11NoncopyableE D 23 -_ZTSN6Genode11Rom_sessionE D 23 -_ZTSN6Genode14Rom_connection21Rom_connection_failedE D 49 -_ZTSN6Genode14Rom_connectionE D 26 -_ZTSN6Genode14Service_deniedE D 26 -_ZTSN6Genode14String_consoleE D 26 -_ZTSN6Genode15Connection_baseE D 27 -_ZTSN6Genode16Dataspace_clientE D 28 -_ZTSN6Genode18Rom_session_clientE D 30 -_ZTSN6Genode6Parent6ClientE D 24 -_ZTSN6Genode7SessionE D 18 -_ZTSN6Genode8Id_spaceINS_6Parent6ClientEE10Out_of_idsE D 51 -_ZTSN6Genode9DataspaceE D 20 -_ZTSN6Genode9ExceptionE D 20 -_ZTSN6Genode9InterfaceE D 20 -_ZTSN6Genode9Ipc_errorE D 20 -_ZTSN6Loader10ConnectionE D 22 -_ZTSN6Loader14Session_clientE D 26 -_ZTSN6Loader7Session19View_does_not_existE D 39 -_ZTSN6Loader7Session25Rom_module_does_not_existE D 45 -_ZTSN6Loader7Session9ExceptionE D 28 -_ZTSN6Loader7SessionE D 18 -_ZTV13PluginStarter D 128 -_ZTV13QPluginWidget D 520 -_ZTV18Signal_wait_thread D 128 -_ZTV19QPluginWidgetPlugin D 168 -_ZTV22QPluginWidgetInterface D 32 -_ZTVN6Genode10ConnectionIN6Loader7SessionEEE D 32 -_ZTVN6Genode10ConnectionINS_11Rom_sessionEEE D 32 -_ZTVN6Genode10Rpc_clientIN6Loader7SessionEEE D 120 -_ZTVN6Genode10Rpc_clientINS_11Rom_sessionEEE D 56 -_ZTVN6Genode10Rpc_clientINS_9DataspaceEEE D 56 -_ZTVN6Genode11Rom_sessionE D 56 -_ZTVN6Genode14Rom_connectionE D 88 -_ZTVN6Genode14String_consoleE D 48 -_ZTVN6Genode15Connection_baseE D 32 -_ZTVN6Genode16Dataspace_clientE D 56 -_ZTVN6Genode18Rom_session_clientE D 56 -_ZTVN6Genode6Parent6ClientE D 32 -_ZTVN6Genode7SessionE D 32 -_ZTVN6Genode9DataspaceE D 56 -_ZTVN6Genode9InterfaceE D 32 -_ZTVN6Loader10ConnectionE D 152 -_ZTVN6Loader14Session_clientE D 120 -_ZTVN6Loader7SessionE D 120 -_ZThn16_N13QPluginWidgetD0Ev T -_ZThn16_N13QPluginWidgetD1Ev T -_ZThn8_N13QPluginWidgetD0Ev T -_ZThn8_N13QPluginWidgetD1Ev T -config D 8 -qt_plugin_instance T -qt_plugin_query_metadata T diff --git a/repos/libports/recipes/api/libqpluginwidget/content.mk b/repos/libports/recipes/api/libqpluginwidget/content.mk deleted file mode 100644 index 4d747580f7..0000000000 --- a/repos/libports/recipes/api/libqpluginwidget/content.mk +++ /dev/null @@ -1,10 +0,0 @@ -MIRROR_FROM_REP_DIR := include/qpluginwidget \ - lib/symbols/libqpluginwidget - -content: $(MIRROR_FROM_REP_DIR) LICENSE - -$(MIRROR_FROM_REP_DIR): - $(mirror_from_rep_dir) - -LICENSE: - cp $(GENODE_DIR)/LICENSE $@ diff --git a/repos/libports/recipes/api/libqpluginwidget/hash b/repos/libports/recipes/api/libqpluginwidget/hash deleted file mode 100644 index af65d2f2fb..0000000000 --- a/repos/libports/recipes/api/libqpluginwidget/hash +++ /dev/null @@ -1 +0,0 @@ -2020-07-12 a577a19b5fd06a2545f5c7d23ea207ae9f969f7a diff --git a/repos/libports/recipes/src/libqpluginwidget/api b/repos/libports/recipes/src/libqpluginwidget/api deleted file mode 100644 index 0d91f1fde4..0000000000 --- a/repos/libports/recipes/src/libqpluginwidget/api +++ /dev/null @@ -1 +0,0 @@ -libqpluginwidget diff --git a/repos/libports/recipes/src/libqpluginwidget/content.mk b/repos/libports/recipes/src/libqpluginwidget/content.mk deleted file mode 100644 index 4ab0384681..0000000000 --- a/repos/libports/recipes/src/libqpluginwidget/content.mk +++ /dev/null @@ -1,10 +0,0 @@ -MIRROR_FROM_REP_DIR := lib/mk/libqpluginwidget.mk \ - src/lib/qpluginwidget - -content: $(MIRROR_FROM_REP_DIR) LICENSE - -$(MIRROR_FROM_REP_DIR): - $(mirror_from_rep_dir) - -LICENSE: - cp $(GENODE_DIR)/LICENSE $@ diff --git a/repos/libports/recipes/src/libqpluginwidget/hash b/repos/libports/recipes/src/libqpluginwidget/hash deleted file mode 100644 index 91da7abb3a..0000000000 --- a/repos/libports/recipes/src/libqpluginwidget/hash +++ /dev/null @@ -1 +0,0 @@ -2024-04-18 0e1e1d72700cded78c10738da97b037922615141 diff --git a/repos/libports/recipes/src/libqpluginwidget/used_apis b/repos/libports/recipes/src/libqpluginwidget/used_apis deleted file mode 100644 index db482ae3d8..0000000000 --- a/repos/libports/recipes/src/libqpluginwidget/used_apis +++ /dev/null @@ -1,14 +0,0 @@ -base -framebuffer_session -gui_session -input_session -libc -libqgenodeviewwidget -loader_session -mesa -os -qoost -qt5_base -stdcxx -vfs -zlib diff --git a/repos/libports/recipes/src/test-qpluginwidget/content.mk b/repos/libports/recipes/src/test-qpluginwidget/content.mk deleted file mode 100644 index b057169847..0000000000 --- a/repos/libports/recipes/src/test-qpluginwidget/content.mk +++ /dev/null @@ -1,9 +0,0 @@ -MIRROR_FROM_REP_DIR := src/test/qt5/qpluginwidget - -content: $(MIRROR_FROM_REP_DIR) LICENSE - -$(MIRROR_FROM_REP_DIR): - $(mirror_from_rep_dir) - -LICENSE: - cp $(GENODE_DIR)/LICENSE $@ diff --git a/repos/libports/recipes/src/test-qpluginwidget/hash b/repos/libports/recipes/src/test-qpluginwidget/hash deleted file mode 100644 index 8c588a775b..0000000000 --- a/repos/libports/recipes/src/test-qpluginwidget/hash +++ /dev/null @@ -1 +0,0 @@ -2024-04-18 17be4478bdcc509cef17276f8e97dacc56bd5c69 diff --git a/repos/libports/recipes/src/test-qpluginwidget/used_apis b/repos/libports/recipes/src/test-qpluginwidget/used_apis deleted file mode 100644 index c65a4e7504..0000000000 --- a/repos/libports/recipes/src/test-qpluginwidget/used_apis +++ /dev/null @@ -1,15 +0,0 @@ -base -framebuffer_session -input_session -libc -libqgenodeviewwidget -libqpluginwidget -loader_session -mesa -gui_session -os -qoost -qt5_base -qt5_component -stdcxx -vfs diff --git a/repos/libports/run/qt5_qpluginwidget.run b/repos/libports/run/qt5_qpluginwidget.run deleted file mode 100644 index df80c1702d..0000000000 --- a/repos/libports/run/qt5_qpluginwidget.run +++ /dev/null @@ -1,74 +0,0 @@ -source ${genode_dir}/repos/libports/run/qt5_common.inc - -import_from_depot [depot_user]/src/qt5_component \ - [depot_user]/src/libqgenodeviewwidget \ - [depot_user]/src/libqpluginwidget \ - [depot_user]/src/test-qpluginwidget \ - [depot_user]/src/zlib - -build { server/loader server/tar_rom test/nitpicker } - -install_config { - - - } [qt5_parent_provides] { - - - - - - } [qt5_start_nodes] { - - - - - - - - - - - - - - - - - - - - - - - 2018-01-01 00:01 - - - - - - - - - - - - - - - - - - - - - - - - - - -} - -build_boot_image [qt5_boot_modules] - -run_genode_until forever diff --git a/repos/libports/src/lib/qpluginwidget/qpluginwidget.cpp b/repos/libports/src/lib/qpluginwidget/qpluginwidget.cpp deleted file mode 100644 index cc38310378..0000000000 --- a/repos/libports/src/lib/qpluginwidget/qpluginwidget.cpp +++ /dev/null @@ -1,506 +0,0 @@ -/* - * \brief A Qt Widget that can load a plugin application and show its GUI view - * \author Christian Prochaska - * \date 2010-08-26 - */ - -/* - * Copyright (C) 2010-2020 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. - */ - -/* Genode includes */ -#include -#include -#include -#include - -/* libc includes */ -#include -#include -#include - -/* Qt includes */ -#include - -#include - -#include - -Libc::Env *QPluginWidget::_env = 0; -QPluginWidget *QPluginWidget::_last = 0; - -using namespace Genode; - - -const char *config = " \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ -"; - - -class Signal_wait_thread : public QThread -{ - private: - - Signal_receiver &_signal_receiver; - QMutex &_timeout_mutex; - - protected: - - void run() - { - _signal_receiver.wait_for_signal(); - _timeout_mutex.unlock(); - } - - public: - - Signal_wait_thread(Signal_receiver &signal_receiver, QMutex &timeout_mutex) - : _signal_receiver(signal_receiver), - _timeout_mutex(timeout_mutex) { } -}; - - -PluginStarter::PluginStarter(Libc::Env *env, - QUrl plugin_url, QString &args, - int max_width, int max_height, - Gui::View_capability parent_view) -: - _env(env), - _plugin_url(plugin_url), - _args(args.toLatin1()), - _max_width(max_width), - _max_height(max_height), - _parent_view(parent_view), - _pc(0), - _plugin_loading_state(LOADING), - _qnam(0), - _reply(0) -{ } - - -void PluginStarter::_start_plugin(QString &file_name, QByteArray const &file_buf) -{ - Genode::size_t caps = Arg_string::find_arg(_args.constData(), "caps").ulong_value(0); - - if ((long)_env->pd().avail_caps().value - (long)caps < QPluginWidget::PRESERVED_CAPS) { - Genode::error("Cannot donate ", caps, " capabilities to the plugin (quota exceeded)."); - _plugin_loading_state = CAP_QUOTA_EXCEEDED_ERROR; - return; - } - - if (file_name.endsWith(".gz")) { - file_name.remove(".gz"); - - uint32_t file_size = *(uint32_t*)(file_buf.constData() + - file_buf.size() - sizeof(uint32_t)); - - Genode::log(__func__, ": file_size_uncompressed=", file_size); - - Genode::size_t ram_quota = Arg_string::find_arg(_args.constData(), - "ram_quota").ulong_value(0) + - file_size; - - if (((long)_env->pd().avail_ram().value - (long)ram_quota) < - QPluginWidget::PRESERVED_RAM_QUOTA) { - Genode::error("Cannot donate ", ram_quota, " bytes of RAM to the plugin (quota exceeded)."); - _plugin_loading_state = RAM_QUOTA_EXCEEDED_ERROR; - return; - } - - _pc = new Loader::Connection(*_env, - Genode::Ram_quota{ram_quota}, - Genode::Cap_quota{caps}); - - Dataspace_capability ds = _pc->alloc_rom_module(file_name.toUtf8().constData(), file_size); - if (ds.valid()) { - void *ds_addr = _env->rm().attach(ds); - - z_stream zs; - zs.next_in = (Bytef*)(file_buf.data()); - zs.avail_in = file_buf.size(); - zs.total_in = 0; - zs.next_out = (Bytef*)ds_addr; - zs.avail_out = file_size; - zs.total_out = 0; - zs.zalloc = Z_NULL; - zs.zfree = Z_NULL; - - /* enable gzip format detection */ - if (inflateInit2(&zs, 16 + MAX_WBITS) != Z_OK) { - Genode::error("inflateInit2() failed"); - _plugin_loading_state = INFLATE_ERROR; - - inflateEnd(&zs); - _env->rm().detach(ds_addr); - return; - } - - /* uncompress */ - if (inflate(&zs, Z_SYNC_FLUSH) != Z_STREAM_END) { - Genode::error("inflate() failed"); - _plugin_loading_state = INFLATE_ERROR; - - inflateEnd(&zs); - _env->rm().detach(ds_addr); - return; - } - - inflateEnd(&zs); - - _env->rm().detach(ds_addr); - _pc->commit_rom_module(file_name.toUtf8().constData()); - } - } else { - Genode::size_t ram_quota = Arg_string::find_arg(_args.constData(), "ram_quota").ulong_value(0); - - if (((long)_env->pd().avail_ram().value - (long)ram_quota) < - QPluginWidget::PRESERVED_RAM_QUOTA) { - _plugin_loading_state = RAM_QUOTA_EXCEEDED_ERROR; - return; - } - - _pc = new Loader::Connection(*_env, - Genode::Ram_quota{ram_quota}, - Genode::Cap_quota{caps}); - - Dataspace_capability plugin_ds = _pc->alloc_rom_module("plugin.tar", file_buf.size()); - if (plugin_ds.valid()) { - void *plugin_ds_addr = _env->rm().attach(plugin_ds); - ::memcpy(plugin_ds_addr, file_buf.constData(), file_buf.size()); - _env->rm().detach(plugin_ds_addr); - _pc->commit_rom_module("plugin.tar"); - } - } - - Dataspace_capability config_ds = _pc->alloc_rom_module("config", ::strlen(config) + 1); - if (config_ds.valid()) { - void *config_ds_addr = _env->rm().attach(config_ds); - ::memcpy(config_ds_addr, config, ::strlen(config) + 1); - _env->rm().detach(config_ds_addr); - _pc->commit_rom_module("config"); - } - - Signal_context sig_ctx; - Signal_receiver sig_rec; - - _pc->view_ready_sigh(sig_rec.manage(&sig_ctx)); - _pc->constrain_geometry(Loader::Area(_max_width, _max_height)); - _pc->parent_view(_parent_view); - _pc->start("init", "init"); - - QMutex view_ready_mutex; - Signal_wait_thread signal_wait_thread(sig_rec, view_ready_mutex); - signal_wait_thread.start(); - if (view_ready_mutex.tryLock(10000)) { - _plugin_loading_state = LOADED; - } else { - _plugin_loading_state = TIMEOUT_EXCEPTION; - signal_wait_thread.terminate(); - } - signal_wait_thread.wait(); -} - - -void PluginStarter::run() -{ - if (_plugin_url.scheme() == "rom") { - - QString file_name = _plugin_url.path().remove("/"); - - try { - Rom_connection rc(*_env, file_name.toLatin1().constData()); - - Dataspace_capability rom_ds = rc.dataspace(); - - char const *rom_ds_addr = (char const *)_env->rm().attach(rom_ds); - - QByteArray file_buf = QByteArray::fromRawData(rom_ds_addr, Dataspace_client(rom_ds).size()); - - _start_plugin(file_name, file_buf); - - _env->rm().detach(rom_ds_addr); - - } catch (Rom_connection::Rom_connection_failed) { - _plugin_loading_state = ROM_CONNECTION_FAILED_EXCEPTION; - } - - emit finished(); - - } else if (_plugin_url.scheme() == "http") { - - _qnam = new QNetworkAccessManager(); - _reply = _qnam->get(QNetworkRequest(_plugin_url)); - - connect(_reply, SIGNAL(finished()), this, SLOT(networkReplyFinished())); - } - - exec(); - - delete _pc; - - moveToThread(QApplication::instance()->thread()); -} - - -void PluginStarter::networkReplyFinished() -{ - if (_reply->error() != QNetworkReply::NoError) { - _plugin_loading_state = NETWORK_ERROR; - _plugin_loading_error_string = _reply->errorString(); - _reply->deleteLater(); - emit finished(); - return; - } - - qDebug() << "download finished, size = " << _reply->size(); - - QString file_name = _plugin_url.path().remove("/");; - QByteArray file_buf = _reply->readAll(); - - _start_plugin(file_name, file_buf); - - _reply->deleteLater(); - _qnam->deleteLater(); - - emit finished(); -} - - -Loader::Area PluginStarter::view_size() -{ - return _pc ? _pc->view_size() : Loader::Area(); -} - - -void PluginStarter::view_geometry(Loader::Rect rect, Loader::Point offset) -{ - if (_pc) - _pc->view_geometry(rect, offset); -} - - -/******************* - ** QPluginWidget ** - *******************/ - -QPluginWidget::QPluginWidget(QWidget *parent, QUrl plugin_url, QString &args, - int max_width, int max_height) -: - QEmbeddedViewWidget(parent), - _plugin_loading_state(LOADING), - _plugin_starter(0), - _plugin_starter_started(false), - _plugin_url(plugin_url), - _plugin_args(args), - _max_width(max_width), - _max_height(max_height) -{ - qDebug() << "plugin_url = " << plugin_url; - qDebug() << "plugin_url.scheme() = " << plugin_url.scheme(); - qDebug() << "plugin_url.path() = " << plugin_url.path(); - qDebug() << "plugin_url.toLocalFile() = " << plugin_url.toLocalFile(); - qDebug() << "args =" << args; - - if (_last) { - _last->cleanup(); - _last = this; - } -} - - -QPluginWidget::~QPluginWidget() -{ - cleanup(); - - if (_last == this) - _last = 0; -} - - -void QPluginWidget::cleanup() -{ - if (_plugin_starter) { - /* make the thread leave the event loop */ - _plugin_starter->exit(); - /* wait until the thread has left the run() function */ - _plugin_starter->wait(); - /* delete the QThread object */ - delete _plugin_starter; - _plugin_starter = 0; - } -} - - -void QPluginWidget::paintEvent(QPaintEvent *event) -{ - QWidget::paintEvent(event); - - if (_plugin_loading_state == LOADED) { - - QEmbeddedViewWidget::View_geometry const view_geometry = - QEmbeddedViewWidget::_calc_view_geometry(); - - if (mask().isEmpty()) { - - Loader::Rect const geometry(Loader::Point(view_geometry.x, - view_geometry.y), - Loader::Area(view_geometry.w, - view_geometry.h)); - - Loader::Point const offset(view_geometry.buf_x, - view_geometry.buf_y); - - _plugin_starter->view_geometry(geometry, offset); - - } else { - - Loader::Rect const - geometry(Loader::Point(mapToGlobal(mask().boundingRect().topLeft()).x(), - mapToGlobal(mask().boundingRect().topLeft()).y()), - Loader::Area(mask().boundingRect().width(), - mask().boundingRect().height())); - - Loader::Point const offset(view_geometry.buf_x, view_geometry.buf_y); - - _plugin_starter->view_geometry(geometry, offset); - } - - } else { - - QPainter painter(this); - painter.drawRect(0, 0, width() - 1, height() - 1); - switch (_plugin_loading_state) { - case LOADING: - painter.drawText(rect(), Qt::AlignCenter, tr("Loading plugin...")); - break; - case NETWORK_ERROR: - painter.drawText(rect(), Qt::AlignCenter, tr("Could not load plugin: ") + - _plugin_loading_error_string); - break; - case INFLATE_ERROR: - painter.drawText(rect(), Qt::AlignCenter, - tr("Could not load plugin: error decompressing gzipped file.")); - break; - case CAP_QUOTA_EXCEEDED_ERROR: - painter.drawText(rect(), Qt::AlignCenter, - tr("Could not load plugin: not enough capabilities.")); - break; - case RAM_QUOTA_EXCEEDED_ERROR: - painter.drawText(rect(), Qt::AlignCenter, - tr("Could not load plugin: not enough memory.")); - break; - case TIMEOUT_EXCEPTION: - painter.drawText(rect(), Qt::AlignCenter, tr("Could not load plugin: timeout.")); - break; - case ROM_CONNECTION_FAILED_EXCEPTION: - painter.drawText(rect(), Qt::AlignCenter, tr("Could not load plugin: file not found.")); - break; - default: - break; - } - } -} - - -void QPluginWidget::showEvent(QShowEvent *event) -{ - /* only now do we know the parent widget for sure */ - - if (!_plugin_starter_started) { - - QGenodePlatformWindow *platform_window = - dynamic_cast(window()->windowHandle()->handle()); - - assert(_env != nullptr); - - _plugin_starter = new PluginStarter(_env, - _plugin_url, _plugin_args, - _max_width, _max_height, - platform_window->view_cap()); - _plugin_starter->moveToThread(_plugin_starter); - connect(_plugin_starter, SIGNAL(finished()), this, SLOT(pluginStartFinished())); - _plugin_starter->start(); - - _plugin_starter_started = true; - } - - QEmbeddedViewWidget::showEvent(event); -} - - -void QPluginWidget::pluginStartFinished() -{ - _plugin_loading_state = _plugin_starter->plugin_loading_state(); - - if (_plugin_loading_state == LOADED) { - - Loader::Area const size = _plugin_starter->view_size(); - - QEmbeddedViewWidget::_orig_geometry(size.w(), size.h(), 0, 0); - - int w = (_max_width > -1) ? qMin(size.w(), (unsigned)_max_width) : size.w(); - int h = (_max_height > -1) ? qMin(size.h(), (unsigned)_max_height) : size.h(); - - setFixedSize(w, h); - - } else { - _plugin_loading_error_string = _plugin_starter->plugin_loading_error_string(); - setFixedSize((_max_width > -1) ? _max_width : 100, - (_max_height > -1) ? _max_height : 100); - cleanup(); - } - - update(); -} - - -void QPluginWidget::hideEvent(QHideEvent *event) -{ - QWidget::hideEvent(event); - - if (_plugin_loading_state == LOADED) { - - QEmbeddedViewWidget::View_geometry const view_geometry = - QEmbeddedViewWidget::_calc_view_geometry(); - - Loader::Rect geometry(Loader::Point(mapToGlobal(pos()).x(), - mapToGlobal(pos()).y()), - Loader::Area(0, 0)); - - Loader::Point offset(view_geometry.buf_x, view_geometry.buf_y); - - _plugin_starter->view_geometry(geometry, offset); - } -} diff --git a/repos/libports/src/lib/qpluginwidget/qpluginwidget.json b/repos/libports/src/lib/qpluginwidget/qpluginwidget.json deleted file mode 100644 index ca1bf4582f..0000000000 --- a/repos/libports/src/lib/qpluginwidget/qpluginwidget.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "Keys": [ "qpluginwidget" ] -} diff --git a/repos/libports/src/lib/qpluginwidget/qpluginwidget.pro b/repos/libports/src/lib/qpluginwidget/qpluginwidget.pro deleted file mode 100644 index 435c330f02..0000000000 --- a/repos/libports/src/lib/qpluginwidget/qpluginwidget.pro +++ /dev/null @@ -1,6 +0,0 @@ -TEMPLATE = lib -CONFIG += plugin -QT = core gui gui_private network widgets -HEADERS = qmake_root/include/qpluginwidget/qpluginwidget.h -SOURCES = qpluginwidget.cpp -OTHER_FILES = qpluginwidget.json diff --git a/repos/libports/src/test/qt5/qpluginwidget/config.plugin b/repos/libports/src/test/qt5/qpluginwidget/config.plugin deleted file mode 100644 index ffad389613..0000000000 --- a/repos/libports/src/test/qt5/qpluginwidget/config.plugin +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/repos/libports/src/test/qt5/qpluginwidget/main.cpp b/repos/libports/src/test/qt5/qpluginwidget/main.cpp deleted file mode 100644 index bd072c04f7..0000000000 --- a/repos/libports/src/test/qt5/qpluginwidget/main.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * \brief QPluginWidget test - * \author Christian Prochaska - * \date 2012-04-23 - */ - -/* - * Copyright (C) 2012-2020 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. - */ - -/* Qt includes */ -#include -#include - -/* Qoost includes */ -#include - -/* qpluginwidget includes */ -#include - -/* qt5_component includes */ -#include - -void Libc::Component::construct(Libc::Env &env) -{ - Libc::with_libc([&] { - - qpa_init(env); - - int argc = 1; - char const *argv[] = { "test-qpluginwidget", 0 }; - - QApplication app(argc, (char**)argv); - - Compound_widget w; - - QPluginLoader plugin_loader("/qt/plugins/qpluginwidget/libqpluginwidget.lib.so"); - - QObject *plugin = plugin_loader.instance(); - - if (!plugin) - qFatal("Error: Could not load QPluginWidget Qt plugin"); - - QPluginWidgetInterface *plugin_widget_interface = qobject_cast(plugin); - - plugin_widget_interface->env(env); - - QString plugin_args("ram_quota=6M, caps=500"); - - QPluginWidget *plugin_widget = static_cast( - plugin_widget_interface->createWidget(&w, - QUrl("rom:///test-plugin.tar"), - plugin_args, 100, 100) - ); - - w.layout()->addWidget(plugin_widget); - - w.resize(150, 150); - - w.show(); - - return app.exec(); - }); -} - - -/* dummy will not be called */ -int main(int argc, char *argv[]) -{ - qFatal("Error: '", __func__, "' should not be called."); - return -1; -} diff --git a/repos/libports/src/test/qt5/qpluginwidget/qpluginwidget.pro b/repos/libports/src/test/qt5/qpluginwidget/qpluginwidget.pro deleted file mode 100644 index 931269034d..0000000000 --- a/repos/libports/src/test/qt5/qpluginwidget/qpluginwidget.pro +++ /dev/null @@ -1,4 +0,0 @@ -TEMPLATE = app -TARGET = test-qpluginwidget -QT = core gui network widgets -SOURCES = main.cpp diff --git a/repos/libports/src/test/qt5/qpluginwidget/target.mk b/repos/libports/src/test/qt5/qpluginwidget/target.mk deleted file mode 100644 index 3f9fdb112a..0000000000 --- a/repos/libports/src/test/qt5/qpluginwidget/target.mk +++ /dev/null @@ -1,23 +0,0 @@ -QMAKE_PROJECT_FILE = $(PRG_DIR)/qpluginwidget.pro - -QMAKE_TARGET_BINARIES = test-qpluginwidget - -QT5_PORT_LIBS = libQt5Core libQt5Gui libQt5Network libQt5Widgets - -LIBS = libc libm mesa qt5_component stdcxx libqgenodeviewwidget libqpluginwidget qoost $(QT5_PORT_LIBS) - -include $(call select_from_repositories,lib/import/import-qt5_qmake.mk) - -# -# create tar archive for test plugin -# - -TEST_PLUGIN_TAR = $(BUILD_BASE_DIR)/bin/test-plugin.tar - -$(TARGET): $(TEST_PLUGIN_TAR) - -$(TEST_PLUGIN_TAR): config.plugin - $(VERBOSE)tar cf $@ -C $(PRG_DIR) config.plugin - -clean: - $(VERBOSE)rm $(TEST_PLUGIN_TAR) diff --git a/repos/os/include/loader_session/capability.h b/repos/os/include/loader_session/capability.h deleted file mode 100644 index 4c97121037..0000000000 --- a/repos/os/include/loader_session/capability.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * \brief Loader-session capability type - * \author Christian Prochaska - * \date 2009-10-05 - */ - -/* - * Copyright (C) 2009-2017 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 _INCLUDE__LOADER_SESSION__CAPABILITY_H_ -#define _INCLUDE__LOADER_SESSION__CAPABILITY_H_ - -#include -#include - -namespace Loader { typedef Genode::Capability Session_capability; } - -#endif /* _INCLUDE__LOADER_SESSION__CAPABILITY_H_ */ diff --git a/repos/os/include/loader_session/client.h b/repos/os/include/loader_session/client.h deleted file mode 100644 index 2ad5837aec..0000000000 --- a/repos/os/include/loader_session/client.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * \brief Client-side loader-session interface - * \author Christian Prochaska - * \date 2009-10-05 - */ - -/* - * Copyright (C) 2009-2017 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 _INCLUDE__LOADER_SESSION__CLIENT_H_ -#define _INCLUDE__LOADER_SESSION__CLIENT_H_ - -#include -#include -#include - - -namespace Loader { struct Session_client; } - - -struct Loader::Session_client : Genode::Rpc_client -{ - explicit Session_client(Loader::Session_capability session) - : Rpc_client(session) { } - - Dataspace_capability alloc_rom_module(Name const &name, - size_t size) override { - return call(name, size); } - - void commit_rom_module(Name const &name) override { - call(name); } - - void cap_quota(Cap_quota limit) override { - call(limit); } - - void ram_quota(Ram_quota quantum) override { - call(quantum); } - - void constrain_geometry(Area size) override { - call(size); } - - void parent_view(Gui::View_capability view) override { - call(view); } - - void view_ready_sigh(Signal_context_capability sigh) override { - call(sigh); } - - void fault_sigh(Signal_context_capability sigh) override { - call(sigh); } - - void start(Name const &binary, Name const &label = "") override { - call(binary, label); } - - void view_geometry(Rect rect, Point offset) override { - call(rect, offset); } - - Area view_size() const override { - return call(); } -}; - -#endif /* _INCLUDE__PLUGIN_SESSION__CLIENT_H_ */ diff --git a/repos/os/include/loader_session/connection.h b/repos/os/include/loader_session/connection.h deleted file mode 100644 index 5ab130b44f..0000000000 --- a/repos/os/include/loader_session/connection.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * \brief Connection to Loader service - * \author Christian Prochaska - * \author Norman Feske - * \date 2009-10-05 - */ - -/* - * Copyright (C) 2009-2017 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 _INCLUDE__LOADER_SESSION__CONNECTION_H_ -#define _INCLUDE__LOADER_SESSION__CONNECTION_H_ - -#include -#include - -namespace Loader { struct Connection; } - - -struct Loader::Connection : Genode::Connection, Session_client -{ - Connection(Genode::Env &env, Ram_quota ram_quota, Cap_quota cap_quota) - : - Genode::Connection(env, Label(), ram_quota, Args()), - Session_client(cap()) - { - upgrade_caps(cap_quota.value); - } -}; - -#endif /* _INCLUDE__LOADER_SESSION__CONNECTION_H_ */ diff --git a/repos/os/include/loader_session/loader_session.h b/repos/os/include/loader_session/loader_session.h deleted file mode 100644 index d8bce00b0c..0000000000 --- a/repos/os/include/loader_session/loader_session.h +++ /dev/null @@ -1,201 +0,0 @@ -/* - * \brief Loader session interface - * \author Christian Prochaska - * \author Norman Feske - * \date 2009-10-05 - */ - -/* - * Copyright (C) 2009-2017 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 _INCLUDE__LOADER_SESSION__LOADER_SESSION_H_ -#define _INCLUDE__LOADER_SESSION__LOADER_SESSION_H_ - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace Loader { - - typedef Genode::Point<> Point; - typedef Genode::Area<> Area; - typedef Genode::Rect<> Rect; - - using Genode::Dataspace_capability; - using Genode::Signal_context_capability; - using Genode::Ram_quota; - using Genode::Cap_quota; - - struct Session; -} - - -struct Loader::Session : Genode::Session -{ - /* - * Resolve ambiguity of 'size_t' type when using 'loader_session.h' - * together with libc headers. - */ - typedef Genode::size_t size_t; - - /* - * Exception types - */ - struct Exception : Genode::Exception { }; - struct View_does_not_exist : Exception { }; - struct Rom_module_does_not_exist : Exception { }; - - typedef Genode::Rpc_in_buffer<64> Name; - typedef Genode::Rpc_in_buffer<128> Path; - - /** - * \noapi - */ - static const char *service_name() { return "Loader"; } - - static constexpr unsigned CAP_QUOTA = 2; - - virtual ~Session() { } - - /** - * Allocate dataspace to be used as ROM module by the loaded subsystem - * - * \param name designated name of the ROM module - * \param size size of ROM module - * - * \return Dataspace_capability dataspace that contains the backing - * store of the ROM module - * - * The content of the dataspace is made visible to the loaded subsystem - * not before 'commit_rom_module' has been called. This two-step - * procedure enables the client to update the content of the ROM module - * during the lifetime of the session by subsequently calling dataspace - * with the same name as argument. Each time, a new dataspace is - * allocated but not yet presented to the loaded subsystem. When - * calling 'commit_rom_module', the most recently allocated dataspace - * becomes visible. The server frees intermediate dataspaces that are - * no longer used. - */ - virtual Dataspace_capability alloc_rom_module(Name const &name, size_t size) = 0; - - /** - * Expose ROM module to loaded subsystem - * - * \throw Rom_module_does_not_exist if the ROM module name wasn't - * allocated beforehand - */ - virtual void commit_rom_module(Name const &name) = 0; - - /** - * Define capability quota assigned to the subsystem - */ - virtual void cap_quota(Cap_quota) = 0; - - /** - * Define RAM quota assigned to the subsystem - * - * The quantum specified must be in the bounds of the quota attached - * the session. Note that RAM resources used for ROM modules are - * accounted, too. If ROM modules are modified at runtime by subsequent - * calls of 'alloc_rom_module', the resources needed for the respective - * ROM modules are doubled. - * - * If 'ram_quota' is not called prior calling 'start', all available - * session resources will be assigned to the subsystem. - */ - virtual void ram_quota(Ram_quota quantum) = 0; - - /** - * Constrain size of the nitpicker buffer used by the subsystem - * - * Calling this method prior 'start()' enables the virtualization - * of the nitpicker session interface. - */ - virtual void constrain_geometry(Area size) = 0; - - /** - * Set the parent view of the subsystem's view. - * - * If 'parent_view' is not called prior calling 'start', the - * subsystem's view will not have a parent view. - */ - virtual void parent_view(Gui::View_capability view) = 0; - - /** - * Register signal handler notified at creation time of the first view - */ - virtual void view_ready_sigh(Signal_context_capability sigh) = 0; - - /** - * Register signal handler notified when a failure occurs in the - * loaded subsystem. - * - * This signal is delivered if any child process of the subsystem - * produces an unresolvable page fault, exists, or triggers a CPU - * exception. (e.g., division by zero) For more information about - * the possible types of faults, please refer to the documentation of - * 'Rm_session::fault_handler' and 'Cpu_session::exception_handler'. - * - * This method should not be called after the 'start' method. - */ - virtual void fault_sigh(Signal_context_capability sigh) = 0; - - /** - * Start subsystem - * - * \throw Rom_module_does_not_exist if the specified binary could - * not obtained as ROM module - */ - virtual void start(Name const &binary, Name const &label = "") = 0; - - /** - * Set view geometry and buffer offset - */ - virtual void view_geometry(Rect rect, Point offset) = 0; - - /** - * Return view size as initialized by the loaded subsystem - */ - virtual Area view_size() const = 0; - - - /******************* - ** RPC interface ** - *******************/ - - GENODE_RPC(Rpc_alloc_rom_module, Dataspace_capability, alloc_rom_module, - Name const &, size_t); - GENODE_RPC_THROW(Rpc_commit_rom_module, void, commit_rom_module, - GENODE_TYPE_LIST(Rom_module_does_not_exist), - Name const &); - GENODE_RPC(Rpc_cap_quota, void, cap_quota, Cap_quota); - GENODE_RPC(Rpc_ram_quota, void, ram_quota, Ram_quota); - GENODE_RPC(Rpc_constrain_geometry, void, constrain_geometry, Area); - GENODE_RPC(Rpc_parent_view, void, parent_view, Gui::View_capability); - GENODE_RPC(Rpc_view_ready_sigh, void, view_ready_sigh, Signal_context_capability); - GENODE_RPC(Rpc_fault_sigh, void, fault_sigh, Signal_context_capability); - GENODE_RPC_THROW(Rpc_start, void, start, - GENODE_TYPE_LIST(Rom_module_does_not_exist), - Name const &, Name const &); - GENODE_RPC_THROW(Rpc_view_geometry, void, view_geometry, - GENODE_TYPE_LIST(View_does_not_exist), - Rect, Point); - GENODE_RPC_THROW(Rpc_view_size, Area, view_size, - GENODE_TYPE_LIST(View_does_not_exist)); - - GENODE_RPC_INTERFACE(Rpc_alloc_rom_module, Rpc_commit_rom_module, - Rpc_cap_quota, Rpc_ram_quota, Rpc_constrain_geometry, - Rpc_parent_view, Rpc_view_ready_sigh, Rpc_fault_sigh, - Rpc_start, Rpc_view_geometry, Rpc_view_size); -}; - -#endif /* _INCLUDE__LOADER_SESSION__LOADER_SESSION_H_ */ diff --git a/repos/os/recipes/api/loader_session/content.mk b/repos/os/recipes/api/loader_session/content.mk deleted file mode 100644 index cd7769511e..0000000000 --- a/repos/os/recipes/api/loader_session/content.mk +++ /dev/null @@ -1,2 +0,0 @@ -MIRRORED_FROM_REP_DIR := include/loader_session -include $(REP_DIR)/recipes/api/session.inc diff --git a/repos/os/recipes/api/loader_session/hash b/repos/os/recipes/api/loader_session/hash deleted file mode 100644 index 741f226ce5..0000000000 --- a/repos/os/recipes/api/loader_session/hash +++ /dev/null @@ -1 +0,0 @@ -2023-05-26 96b84925b69e7133e72c8e9c1d160c5ba49e36b7 diff --git a/repos/os/recipes/pkg/test-dynamic_config_loader/README b/repos/os/recipes/pkg/test-dynamic_config_loader/README deleted file mode 100644 index eeee918c6f..0000000000 --- a/repos/os/recipes/pkg/test-dynamic_config_loader/README +++ /dev/null @@ -1 +0,0 @@ -Test for changing the configuration of a loader plugin at runtime. diff --git a/repos/os/recipes/pkg/test-dynamic_config_loader/archives b/repos/os/recipes/pkg/test-dynamic_config_loader/archives deleted file mode 100644 index 5ba2a45b6b..0000000000 --- a/repos/os/recipes/pkg/test-dynamic_config_loader/archives +++ /dev/null @@ -1,3 +0,0 @@ -_/src/init -_/src/test-dynamic_config -_/src/loader diff --git a/repos/os/recipes/pkg/test-dynamic_config_loader/hash b/repos/os/recipes/pkg/test-dynamic_config_loader/hash deleted file mode 100644 index cb5840d69c..0000000000 --- a/repos/os/recipes/pkg/test-dynamic_config_loader/hash +++ /dev/null @@ -1 +0,0 @@ -2024-04-11 730c3ed6f7b932dac3f5f3dcbba9e5ddce5a5c2b diff --git a/repos/os/recipes/pkg/test-dynamic_config_loader/runtime b/repos/os/recipes/pkg/test-dynamic_config_loader/runtime deleted file mode 100644 index be0ae3c8cc..0000000000 --- a/repos/os/recipes/pkg/test-dynamic_config_loader/runtime +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - [init -> loader -> test-dynamic_config_loader -> -> test-label] obtained counter value 11 from config - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/repos/os/recipes/pkg/test-fault_detection/archives b/repos/os/recipes/pkg/test-fault_detection/archives index 3df241e73f..478d5c8617 100644 --- a/repos/os/recipes/pkg/test-fault_detection/archives +++ b/repos/os/recipes/pkg/test-fault_detection/archives @@ -1,4 +1,2 @@ -_/src/init -_/src/loader _/src/test-segfault _/src/test-fault_detection diff --git a/repos/os/recipes/pkg/test-fault_detection/runtime b/repos/os/recipes/pkg/test-fault_detection/runtime index 2462ad777a..dd744f9848 100644 --- a/repos/os/recipes/pkg/test-fault_detection/runtime +++ b/repos/os/recipes/pkg/test-fault_detection/runtime @@ -1,39 +1,14 @@ - + --- finished fault_detection test --- + + - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/repos/os/recipes/src/loader/content.mk b/repos/os/recipes/src/loader/content.mk deleted file mode 100644 index f580948c1c..0000000000 --- a/repos/os/recipes/src/loader/content.mk +++ /dev/null @@ -1,2 +0,0 @@ -SRC_DIR := src/server/loader include/init -include $(GENODE_DIR)/repos/base/recipes/src/content.inc diff --git a/repos/os/recipes/src/loader/hash b/repos/os/recipes/src/loader/hash deleted file mode 100644 index bbbf105f99..0000000000 --- a/repos/os/recipes/src/loader/hash +++ /dev/null @@ -1 +0,0 @@ -2024-04-11 2e67e65d674e6c3ae78d9d7335ec47ae25b9c6a2 diff --git a/repos/os/recipes/src/loader/used_apis b/repos/os/recipes/src/loader/used_apis deleted file mode 100644 index d46b347afe..0000000000 --- a/repos/os/recipes/src/loader/used_apis +++ /dev/null @@ -1,6 +0,0 @@ -base -os -framebuffer_session -input_session -loader_session -gui_session diff --git a/repos/os/recipes/src/test-dynamic_config/used_apis b/repos/os/recipes/src/test-dynamic_config/used_apis index d2e11505b0..0c84d51108 100644 --- a/repos/os/recipes/src/test-dynamic_config/used_apis +++ b/repos/os/recipes/src/test-dynamic_config/used_apis @@ -3,5 +3,4 @@ os input_session framebuffer_session gui_session -loader_session timer_session diff --git a/repos/os/recipes/src/test-fault_detection/used_apis b/repos/os/recipes/src/test-fault_detection/used_apis index 1e6ef720b0..3c50c8f2bf 100644 --- a/repos/os/recipes/src/test-fault_detection/used_apis +++ b/repos/os/recipes/src/test-fault_detection/used_apis @@ -1,6 +1,5 @@ base os -loader_session gui_session framebuffer_session input_session diff --git a/repos/os/run/loader.run b/repos/os/run/loader.run deleted file mode 100644 index 3b5ba4fad0..0000000000 --- a/repos/os/run/loader.run +++ /dev/null @@ -1,73 +0,0 @@ -create_boot_directory -import_from_depot [depot_user]/src/[base_src] \ - [depot_user]/pkg/[drivers_interactive_pkg] \ - [depot_user]/src/init \ - [depot_user]/src/nitpicker -build { - server/loader - test/loader - test/nitpicker -} - -install_config { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -} - -build_boot_image [build_artifacts] -run_genode_until forever diff --git a/repos/os/src/server/loader/README b/repos/os/src/server/loader/README deleted file mode 100644 index d5ea4cac29..0000000000 --- a/repos/os/src/server/loader/README +++ /dev/null @@ -1,12 +0,0 @@ -This directory contains a loader service, which allows for the instantiation of -subsystems via a session interface. The resources for the new subsystem are -provided by the client when opening the session. The client has no control over -the functioning of the subsystem except for the controlling the lifetime of the -subsystem. - -By default, the loaded subsystem can access only those ROM modules that were -loaded into the loader session by the loader client. However, it is possible -to define a whitelist of ROM modules to be obtained from the loader's parent. -For an example, refer to the example 'run/loader.run' script. - - diff --git a/repos/os/src/server/loader/child.h b/repos/os/src/server/loader/child.h deleted file mode 100644 index 393df50ab2..0000000000 --- a/repos/os/src/server/loader/child.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * \brief Loader child interface - * \author Christian Prochaska - * \author Norman Feske - * \date 2009-10-05 - */ - -/* - * Copyright (C) 2009-2017 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 _CHILD_H_ -#define _CHILD_H_ - -/* Genode includes */ -#include -#include -#include -#include -#include -#include - -namespace Loader { - - using namespace Genode; - - typedef Registered Parent_service; - typedef Registry Parent_services; - - class Child; -} - - -class Loader::Child : public Child_policy -{ - private: - - Env &_env; - Allocator &_alloc; - - Session_label const _label; - Name const _binary_name; - - Cap_quota const _cap_quota; - Ram_quota const _ram_quota; - - Parent_services &_parent_services; - - Service &_local_gui_service; - Service &_local_rom_service; - Service &_local_cpu_service; - Service &_local_pd_service; - - Genode::Child _child; - - Service &_matching_service(Service::Name const &name) - { - if (name == "Gui") return _local_gui_service; - if (name == "ROM") return _local_rom_service; - if (name == "CPU") return _local_cpu_service; - if (name == "PD") return _local_pd_service; - - /* populate session-local parent service registry on demand */ - Service *service = nullptr; - _parent_services.for_each([&] (Parent_service &s) { - if (s.name() == name) - service = &s; }); - - if (service) - return *service; - - return *new (_alloc) Parent_service(_parent_services, _env, name); - } - - public: - - Child(Env &env, - Allocator &alloc, - Name const &binary_name, - Session_label const &label, - Cap_quota cap_quota, - Ram_quota ram_quota, - Parent_services &parent_services, - Service &local_rom_service, - Service &local_cpu_service, - Service &local_pd_service, - Service &local_gui_service, - Signal_context_capability /* fault_sigh */) - : - _env(env), - _alloc(alloc), - _label(label), - _binary_name(binary_name), - _cap_quota(Genode::Child::effective_quota(cap_quota)), - _ram_quota(Genode::Child::effective_quota(ram_quota)), - _parent_services(parent_services), - _local_gui_service(local_gui_service), - _local_rom_service(local_rom_service), - _local_cpu_service(local_cpu_service), - _local_pd_service(local_pd_service), - _child(_env.rm(), _env.ep().rpc_ep(), *this) - { } - - ~Child() { } - - - /**************************** - ** Child-policy interface ** - ****************************/ - - Name name() const override { return _label; } - - Binary_name binary_name() const override { return _binary_name; } - - Pd_session &ref_pd() override { return _env.pd(); } - Pd_session_capability ref_pd_cap() const override { return _env.pd_session_cap(); } - - void init(Pd_session &pd, Pd_session_capability pd_cap) override - { - pd.ref_account(ref_pd_cap()); - ref_pd().transfer_quota(pd_cap, _cap_quota); - ref_pd().transfer_quota(pd_cap, _ram_quota); - } - - Route resolve_session_request(Service::Name const &name, - Session_label const &label, - Session::Diag const diag) override - { - return Route { .service = _matching_service(name), - .label = label, - .diag = diag }; - } -}; - -#endif /* _CHILD_H_ */ diff --git a/repos/os/src/server/loader/gui.h b/repos/os/src/server/loader/gui.h deleted file mode 100644 index 17cd171301..0000000000 --- a/repos/os/src/server/loader/gui.h +++ /dev/null @@ -1,288 +0,0 @@ -/* - * \brief Virtualized GUI session interface exposed to the subsystem - * \author Christian Prochaska - * \author Norman Feske - * \date 2009-10-05 - */ - -/* - * Copyright (C) 2009-2017 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 _GUI_H_ -#define _GUI_H_ - -/* Genode includes */ -#include -#include -#include -#include -#include - -/* local includes */ -#include - -namespace Gui { - using namespace Genode; - class Session_component; -} - - -class Gui::Session_component : public Rpc_object -{ - private: - - /** - * Signal handler to be notified once the geometry of the view is - * known. - */ - Signal_context_capability _view_ready_sigh; - - Entrypoint &_ep; - - Area _max_size; - - Gui::Connection _gui; - - View_handle _parent_view_handle; - - /* - * Physical view - */ - View_handle _view_handle; - Rect _view_geometry { }; - Point _view_offset { }; - - /* - * Geometry of virtual view presented to the loaded subsystem - */ - Rect _virt_view_geometry { }; - Point _virt_view_offset { }; - bool _virt_view_geometry_defined = false; - - Input::Motion_delta _motion_delta { }; - - Input::Session_component _proxy_input; - - static long _session_arg(const char *arg, const char *key) { - return Arg_string::find_arg(arg, key).long_value(0); } - - /* - * Command buffer - */ - typedef Gui::Session::Command_buffer Command_buffer; - Attached_ram_dataspace _command_ds; - Command_buffer &_command_buffer = *_command_ds.local_addr(); - - void _propagate_view_offset() - { - _gui.enqueue(_view_handle, - _view_offset + _virt_view_offset); - } - - void _update_motion_delta() - { - _motion_delta = _virt_view_geometry.p1() - _view_geometry.p1(); - } - - void _execute_command(Command const &command) - { - switch (command.opcode) { - - case Command::OP_GEOMETRY: - { - _virt_view_geometry = command.geometry.rect; - - if (!_virt_view_geometry_defined) - Signal_transmitter(_view_ready_sigh).submit(); - - _virt_view_geometry_defined = true; - - _update_motion_delta(); - return; - } - - case Command::OP_OFFSET: - { - _virt_view_offset = command.offset.offset; - _propagate_view_offset(); - _gui.execute(); - return; - } - - case Command::OP_TO_FRONT: - { - _gui.enqueue(_view_handle, _parent_view_handle); - _gui.execute(); - return; - } - - case Command::OP_TO_BACK: - { - warning("OP_TO_BACK not implemented"); - return; - } - - case Command::OP_BACKGROUND: - { - warning("OP_BACKGROUND not implemented"); - return; - } - - case Command::OP_TITLE: - { - _gui.enqueue(command); - _gui.execute(); - return; - } - - case Command::OP_NOP: - return; - } - } - - public: - - /** - * Constructor - */ - Session_component(Entrypoint &ep, - Env &env, - Region_map &rm, - Ram_allocator &ram, - Area max_size, - Gui::View_capability parent_view, - Signal_context_capability view_ready_sigh, - char const * /* args */) - : - _view_ready_sigh(view_ready_sigh), - _ep(ep), - _max_size(max_size), - _gui(env), - - /* import parent view */ - _parent_view_handle(_gui.view_handle(parent_view)), - - /* create GUI view */ - _view_handle(_gui.create_view(_parent_view_handle)), - - _proxy_input(rm, _gui.input_session(), _motion_delta), - - _command_ds(ram, env.rm(), sizeof(Command_buffer)) - { - _ep.manage(_proxy_input); - _ep.manage(*this); - } - - ~Session_component() - { - _ep.dissolve(_proxy_input); - _ep.dissolve(*this); - } - - - /*************************** - ** GUI session interface ** - ***************************/ - - Framebuffer::Session_capability framebuffer_session() override - { - return _gui.framebuffer_session(); - } - - Input::Session_capability input_session() override - { - return _proxy_input.cap(); - } - - View_handle create_view(View_handle) override - { - return View_handle(1); - } - - void destroy_view(View_handle) override { } - - View_handle view_handle(View_capability, View_handle) override - { - return View_handle(); - } - - View_capability view_capability(View_handle) override - { - return View_capability(); - } - - void release_view_handle(View_handle) override { } - - Dataspace_capability command_dataspace() override - { - return _command_ds.cap(); - } - - void execute() override - { - for (unsigned i = 0; i < _command_buffer.num(); i++) - _execute_command(_command_buffer.get(i)); - } - - Framebuffer::Mode mode() override - { - unsigned const mode_width = _max_size.valid() ? - _max_size.w() : - _gui.mode().area.w(); - - unsigned const mode_height = _max_size.valid() ? - _max_size.h() : - _gui.mode().area.h(); - - return Framebuffer::Mode { .area = { mode_width, mode_height } }; - } - - void mode_sigh(Signal_context_capability) override { } - - void buffer(Framebuffer::Mode mode, bool use_alpha) override - { - _gui.buffer(mode, use_alpha); - } - - void focus(Capability) override { } - - /** - * Return geometry of loader view - */ - Area loader_view_size() const - { - int const width = _max_size.valid() - ? min(_virt_view_geometry.w(), _max_size.w()) - : _virt_view_geometry.w(); - - int const height = _max_size.valid() - ? min(_virt_view_geometry.h(), _max_size.h()) - : _virt_view_geometry.h(); - - return Area(width, height); - } - - /** - * Define geometry of loader view - */ - void loader_view_geometry(Rect rect, Point offset) - { - typedef Gui::Session::Command Command; - - _view_geometry = rect; - _view_offset = offset; - - _propagate_view_offset(); - _gui.enqueue(_view_handle, _view_geometry); - _gui.enqueue(_view_handle, _parent_view_handle); - _gui.execute(); - - _update_motion_delta(); - } -}; - -#endif /* _GUI_H_ */ diff --git a/repos/os/src/server/loader/input.h b/repos/os/src/server/loader/input.h deleted file mode 100644 index 4f440ec826..0000000000 --- a/repos/os/src/server/loader/input.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - * \brief Virtualized input session - * \author Christian Prochaska - * \author Norman Feske - * \date 2010-09-02 - * - * This input service implementation is used by the virtualized GUI - * service to translate the input coordinate system from the coordinates - * seen by the user of the virtualized session and the physical coordinates - * dictated by the loader-session client. - */ - -/* - * Copyright (C) 2010-2017 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 _INPUT_H_ -#define _INPUT_H_ - -#include -#include -#include -#include - -namespace Input { - - using namespace Genode; - - typedef Genode::Point<> Motion_delta; - - class Session_component; -} - - -class Input::Session_component : public Rpc_object -{ - private: - - /* - * Noncopyable - */ - Session_component(Session_component const &); - Session_component &operator = (Session_component const &); - - Session_client _real_input; - Motion_delta &_motion_delta; - Attached_dataspace _ev_ds; - Event * const _ev_buf; - - Genode::Signal_context_capability _sigh { }; - - public: - - /** - * Constructor - */ - Session_component(Region_map &rm, - Session_capability real_input, - Motion_delta &motion_delta) - : - _real_input(rm, real_input), _motion_delta(motion_delta), - _ev_ds(rm, _real_input.dataspace()), - _ev_buf(_ev_ds.local_addr()) - { } - - - /***************************** - ** Input session interface ** - *****************************/ - - Dataspace_capability dataspace() override { return _real_input.dataspace(); } - - bool pending() const override { return _real_input.pending(); } - - int flush() override - { - /* translate mouse position to child's coordinate system */ - Motion_delta const delta = _motion_delta; - - int const num_ev = _real_input.flush(); - for (int i = 0; i < num_ev; i++) { - - Input::Event &ev = _ev_buf[i]; - - ev.handle_absolute_motion([&] (int x, int y) { - Point<> p = Point<>(x, y) + delta; - ev = Input::Absolute_motion{p.x(), p.y()}; - }); - } - - return num_ev; - } - - void sigh(Signal_context_capability sigh) override - { - /* - * Maintain local copy of signal-context capability to keep - * NOVA from flushing transitive delegations of the capability. - */ - _sigh = sigh; - - _real_input.sigh(sigh); - } -}; - -#endif /* _INPUT_H_ */ diff --git a/repos/os/src/server/loader/main.cc b/repos/os/src/server/loader/main.cc deleted file mode 100644 index 8579ee2ac4..0000000000 --- a/repos/os/src/server/loader/main.cc +++ /dev/null @@ -1,438 +0,0 @@ -/* - * \brief Loader service - * \author Norman Feske - * \date 2012-04-17 - */ - -/* - * Copyright (C) 2010-2017 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. - */ - -/* Genode includes */ -#include -#include -#include -#include -#include -#include -#include - -/* local includes */ -#include -#include -#include - - -namespace Loader { - - using namespace Genode; - - class Session_component; - class Root; -} - - -class Loader::Session_component : public Session_object -{ - private: - - struct Local_rom_factory : Local_service::Factory - { - Entrypoint &_ep; - Allocator &_md_alloc; - Rom_module_registry &_rom_modules; - Mutex _mutex { }; - List _rom_sessions { }; - - void _close(Rom_session_component &rom) - { - _rom_sessions.remove(&rom); - Genode::destroy(_md_alloc, &rom); - } - - Local_rom_factory(Entrypoint &ep, - Allocator &md_alloc, - Rom_module_registry &rom_modules) - : - _ep(ep), _md_alloc(md_alloc), _rom_modules(rom_modules) - { } - - ~Local_rom_factory() - { - Mutex::Guard guard(_mutex); - - while (_rom_sessions.first()) - _close(*_rom_sessions.first()); - } - - Rom_session_component &create(Args const &args, Affinity) override - { - /* try to find ROM module at local ROM service */ - try { - Mutex::Guard guard(_mutex); - - Session_label const label = label_from_args(args.string()); - Session_label const name = label.last_element(); - - Rom_module &module = _rom_modules.lookup_and_lock(name.string()); - - Rom_session_component *rom = new (_md_alloc) - Rom_session_component(_ep, module); - - _rom_sessions.insert(rom); - - return *rom; - - } catch (...) { } - - throw Service_denied(); - } - - void upgrade(Rom_session_component &, Args const &) override { } - - void destroy(Rom_session_component &session) override - { - Mutex::Guard guard(_mutex); - - _close(session); - } - }; - - typedef Local_service Local_rom_service; - - /** - * Common base class of 'Local_cpu_service' and 'Local_pd_service' - */ - struct Intercepted_parent_service : Genode::Parent_service - { - Signal_context_capability fault_sigh { }; - - Intercepted_parent_service(Env &env, Service::Name const &name) - : Parent_service(env, name) { } - }; - - /** - * Intercept CPU session requests to install default exception - * handler - */ - struct Local_cpu_service : Intercepted_parent_service - { - Local_cpu_service(Env &env) : Intercepted_parent_service(env, "CPU") { } - - void initiate_request(Session_state &session) override - { - Intercepted_parent_service::initiate_request(session); - - if (session.phase != Session_state::AVAILABLE) - return; - - Cpu_session_client cpu(reinterpret_cap_cast(session.cap)); - cpu.exception_sigh(fault_sigh); - } - }; - - /** - * Intercept PD session requests to install default fault handler - */ - struct Local_pd_service : Intercepted_parent_service - { - Local_pd_service(Env &env) : Intercepted_parent_service(env, "PD") { } - - void initiate_request(Session_state &session) override - { - Intercepted_parent_service::initiate_request(session); - - if (session.phase != Session_state::AVAILABLE) - return; - - Pd_session_client pd(reinterpret_cap_cast(session.cap)); - - Region_map_client(pd.address_space()).fault_handler(fault_sigh); - Region_map_client(pd.stack_area()) .fault_handler(fault_sigh); - Region_map_client(pd.linker_area()) .fault_handler(fault_sigh); - } - }; - - struct Local_gui_factory : Local_service::Factory - { - Entrypoint &_ep; - Env &_env; - Region_map &_rm; - Ram_allocator &_ram; - - Area _max_size { }; - Gui::View_capability _parent_view { }; - - Signal_context_capability view_ready_sigh { }; - - Constructible session { }; - - Local_gui_factory(Entrypoint &ep, Env &env, - Region_map &rm, Ram_allocator &ram) - : _ep(ep), _env(env), _rm(rm), _ram(ram) { } - - void constrain_geometry(Area size) { _max_size = size; } - - void parent_view(Gui::View_capability view) - { - _parent_view = view; - } - - Gui::Session_component &create(Args const &args, Affinity) override - { - if (session.constructed()) { - Genode::warning("attempt to open more than one GUI session"); - throw Service_denied(); - } - - session.construct(_ep, _env, _rm, _ram, _max_size, - _parent_view, view_ready_sigh, args.string()); - return *session; - } - - void upgrade(Gui::Session_component &, Args const &) override { } - void destroy(Gui::Session_component &) override { } - }; - - typedef Local_service Local_gui_service; - - enum { STACK_SIZE = 2*4096 }; - - Env &_env; - Xml_node const _config; - Constrained_ram_allocator _local_ram { _env.ram(), _ram_quota_guard(), - _cap_quota_guard() }; - Heap _md_alloc { _local_ram, _env.rm() }; - size_t _subsystem_cap_quota_limit = 0; - size_t _subsystem_ram_quota_limit = 0; - Parent_services _parent_services { }; - Rom_module_registry _rom_modules { _env, _config, _local_ram, _md_alloc }; - Local_rom_factory _rom_factory { _env.ep(), _md_alloc, _rom_modules }; - Local_rom_service _rom_service { _rom_factory }; - Local_cpu_service _cpu_service { _env }; - Local_pd_service _pd_service { _env }; - Local_gui_factory _gui_factory { _env.ep(), _env, _env.rm(), _local_ram }; - Local_gui_service _gui_service { _gui_factory }; - Signal_context_capability _fault_sigh { }; - Constructible _child { }; - - /** - * Return virtual GUI session component - */ - Gui::Session_component &_virtual_gui_session() - { - if (!_gui_factory.session.constructed()) - throw View_does_not_exist(); - - return *_gui_factory.session; - } - - Gui::Session_component const &_virtual_gui_session() const - { - if (!_gui_factory.session.constructed()) - throw View_does_not_exist(); - - return *_gui_factory.session; - } - - public: - - /** - * Constructor - */ - Session_component(Env &env, Session_label const &label, Xml_node config, - Resources const &resources) - : - Session_object(env.ep(), resources, label, Diag { }), - _env(env), _config(config) - { - /* fetch all parent-provided ROMs according to the config */ - config.for_each_sub_node("parent-rom", [&] (Xml_node rom) - { - typedef Rom_module::Name Name; - Name name = rom.attribute_value("name", Name()); - _rom_modules.fetch_parent_rom_module(name); - }); - } - - ~Session_component() - { - _child.destruct(); - - /* - * The parent-service registry is populated by the 'Child' - * on demand. Revert those allocations. - */ - _parent_services.for_each([&] (Parent_service &service) { - destroy(_md_alloc, &service); }); - } - - - /****************************** - ** Loader session interface ** - ******************************/ - - Dataspace_capability alloc_rom_module(Name const &name, size_t size) override - { - return _rom_modules.alloc_rom_module(name.string(), size); - } - - void commit_rom_module(Name const &name) override - { - try { - _rom_modules.commit_rom_module(name.string()); } - catch (Rom_module_registry::Lookup_failed) { - throw Rom_module_does_not_exist(); } - } - - void cap_quota(Cap_quota caps) override - { - _subsystem_cap_quota_limit = caps.value; - } - - void ram_quota(Ram_quota quantum) override - { - _subsystem_ram_quota_limit = quantum.value; - } - - void constrain_geometry(Area size) override - { - _gui_factory.constrain_geometry(size); - } - - void parent_view(Gui::View_capability view) override - { - _gui_factory.parent_view(view); - } - - void view_ready_sigh(Signal_context_capability sigh) override - { - _gui_factory.view_ready_sigh = sigh; - } - - void fault_sigh(Signal_context_capability sigh) override - { - /* - * CPU exception handler for CPU sessions originating from the - * subsystem. - */ - _cpu_service.fault_sigh = sigh; - - /* - * Region-map fault handler for PD sessions originating from the - * subsystem. - */ - _pd_service.fault_sigh = sigh; - - /* - * CPU exception and RM fault handler for the immediate child. - */ - _fault_sigh = sigh; - } - - void start(Name const &binary_name, Name const &label) override - { - if (_child.constructed()) { - warning("cannot start subsystem twice"); - return; - } - - size_t const avail_cap_quota = _cap_quota_guard().avail().value; - - size_t const cap_quota = (_subsystem_cap_quota_limit > 0) - ? min(_subsystem_cap_quota_limit, avail_cap_quota) - : avail_cap_quota; - - size_t const avail_ram_quota = _ram_quota_guard().avail().value; - - size_t const ram_quota = (_subsystem_ram_quota_limit > 0) - ? min(_subsystem_ram_quota_limit, avail_ram_quota) - : avail_ram_quota; - - try { - _child.construct(_env, _md_alloc, binary_name.string(), - prefixed_label(_label, Session_label(label.string())), - Cap_quota{cap_quota}, Ram_quota{ram_quota}, - _parent_services, _rom_service, - _cpu_service, _pd_service, _gui_service, - _fault_sigh); - } - catch (Genode::Service_denied) { - throw Rom_module_does_not_exist(); } - } - - void view_geometry(Rect rect, Point offset) override - { - _virtual_gui_session().loader_view_geometry(rect, offset); - } - - Area view_size() const override - { - return _virtual_gui_session().loader_view_size(); - } -}; - - -class Loader::Root : public Root_component -{ - private: - - Env &_env; - Xml_node const _config; - - protected: - - Session_component *_create_session(const char *args) override - { - Xml_node session_config(""); - - Session_label const label = label_from_args(args); - - try { session_config = Session_policy(label, _config); } - catch (...) { } - - return new (md_alloc()) - Session_component(_env, label, session_config, - session_resources_from_args(args)); - } - - void _upgrade_session(Session_component *s, const char *args) override - { - s->upgrade(ram_quota_from_args(args)); - s->upgrade(cap_quota_from_args(args)); - } - - public: - - Root(Env &env, Xml_node config, Allocator &md_alloc) - : - Root_component(&env.ep().rpc_ep(), &md_alloc), - _env(env), _config(config) - { } -}; - - -namespace Loader { struct Main; } - - -struct Loader::Main -{ - Env &_env; - - Heap _heap { _env.ram(), _env.rm() }; - - Attached_rom_dataspace _config { _env, "config" }; - - Root _root { _env, _config.xml(), _heap }; - - Main(Env &env) : _env(env) - { - _env.parent().announce(_env.ep().manage(_root)); - } -}; - - -void Component::construct(Genode::Env &env) { static Loader::Main main(env); } diff --git a/repos/os/src/server/loader/rom.h b/repos/os/src/server/loader/rom.h deleted file mode 100644 index e31133158b..0000000000 --- a/repos/os/src/server/loader/rom.h +++ /dev/null @@ -1,301 +0,0 @@ -/* - * \brief ROM service exposed to the loaded subsystem - * \author Norman Feske - * \date 2012-04-17 - */ - -/* - * Copyright (C) 2012-2017 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 _ROM_H_ -#define _ROM_H_ - -#include -#include -#include -#include - -namespace Genode { - - class Rom_module : public List::Element - { - public: - - typedef String<128> Name; - - private: - - Name const _name; - - Ram_allocator &_ram; - Attached_ram_dataspace _fg; - Attached_ram_dataspace _bg; - - Constructible _parent_rom { }; - - bool _bg_has_pending_data = false; - - Signal_context_capability _sigh { }; - - Blockade _blockade { }; - - public: - - enum Origin { PARENT_PROVIDED, SESSION_LOCAL }; - - Rom_module(Env &env, Xml_node /* config */, Name const &name, - Ram_allocator &ram_allocator, Origin origin) - : - _name(name), _ram(ram_allocator), - _fg(_ram, env.rm(), 0), _bg(_ram, env.rm(), 0) - { - if (origin == SESSION_LOCAL) - return; - - try { - _parent_rom.construct(env, name.string()); } - catch (...) { - warning("ROM ", name, " unavailable from parent, " - "try to use session-local ROM"); - } - } - - bool has_name(Name const &name) const { return _name == name; } - - void lock() { _blockade.block(); } - void unlock() { _blockade.wakeup(); } - - /** - * Return dataspace as handed out to loader session - * - * The loader session submits the data into the ROM module into - * the background dataspace. Once it is ready, the 'commit_bg()' - * function is called. - */ - Dataspace_capability bg_dataspace(size_t size) - { - /* let background buffer grow if needed */ - if (_bg.size() < size) - _bg.realloc(&_ram, size); - - return _bg.cap(); - } - - /** - * Return dataspace as handed out to ROM session client - */ - Rom_dataspace_capability fg_dataspace() - { - if (_parent_rom.constructed()) - return static_cap_cast(_parent_rom->cap()); - - if (!_fg.size() && !_bg_has_pending_data) { - Genode::error("no data loaded"); - return Rom_dataspace_capability(); - } - - /* - * Keep foreground if no background exists. Otherwise, use - * old background as new foreground. - */ - if (_bg_has_pending_data) { - _fg.swap(_bg); - _bg_has_pending_data = false; - } - - Dataspace_capability ds_cap = _fg.cap(); - return static_cap_cast(ds_cap); - } - - /** - * Set signal handler to inform about ROM module updates - * - * This function is indirectly called by the ROM session client. - */ - void sigh(Signal_context_capability sigh) - { - if (_parent_rom.constructed()) - _parent_rom->sigh(sigh); - - _sigh = sigh; - } - - /** - * Commit data contained in background dataspace - * - * This function is indirectly called by the loader session. - */ - void commit_bg() - { - _bg_has_pending_data = true; - - if (_sigh.valid()) - Signal_transmitter(_sigh).submit(); - } - }; - - - struct Rom_module_lock_guard - { - Rom_module &rom; - - Rom_module_lock_guard(Rom_module &rom) : rom(rom) { } - - ~Rom_module_lock_guard() { rom.unlock(); } - }; - - - class Rom_module_registry - { - private: - - Env &_env; - Xml_node const _config; - Mutex _mutex { }; - Ram_allocator &_ram_allocator; - Allocator &_md_alloc; - List _list { }; - - public: - - /** - * Exception type - */ - class Lookup_failed { }; - - /** - * Constructor - * - * \param ram_allocator RAM allocator used as backing store for - * module data - * \param md_alloc backing store for ROM module meta data - */ - Rom_module_registry(Env &env, Xml_node config, - Ram_allocator &ram_allocator, - Allocator &md_alloc) - : - _env(env), _config(config), _ram_allocator(ram_allocator), - _md_alloc(md_alloc) - { } - - ~Rom_module_registry() - { - Mutex::Guard guard(_mutex); - - while (_list.first()) { - Rom_module *rom = _list.first(); - rom->lock(); - _list.remove(rom); - destroy(&_md_alloc, rom); - } - } - - /** - * Lookup ROM module by name - * - * \throw Lookup_failed - */ - Rom_module &lookup_and_lock(Rom_module::Name const &name) - { - Mutex::Guard guard(_mutex); - - Rom_module *curr = _list.first(); - for (; curr; curr = curr->next()) { - if (curr->has_name(name)) { - curr->lock(); - return *curr; - } - } - throw Lookup_failed(); - } - - Dataspace_capability alloc_rom_module(Rom_module::Name const &name, size_t size) - { - try { - Rom_module &module = lookup_and_lock(name); - Rom_module_lock_guard guard(module); - return module.bg_dataspace(size); - } - catch (Lookup_failed) { - - Mutex::Guard guard(_mutex); - - Rom_module *module = new (&_md_alloc) - Rom_module(_env, _config, name, _ram_allocator, - Rom_module::SESSION_LOCAL); - - Rom_module_lock_guard module_guard(*module); - - _list.insert(module); - - return module->bg_dataspace(size); - } - } - - void fetch_parent_rom_module(Rom_module::Name const &name) - { - try { - lookup_and_lock(name); - } - catch (Lookup_failed) { - - Mutex::Guard guard(_mutex); - - Rom_module *module = new (&_md_alloc) - Rom_module(_env, _config, name, _ram_allocator, - Rom_module::PARENT_PROVIDED); - - Rom_module_lock_guard module_guard(*module); - - _list.insert(module); - } - } - - /** - * \throw Lookup_failed - */ - void commit_rom_module(char const *name) - { - Rom_module &rom_module = lookup_and_lock(name); - rom_module.commit_bg(); - rom_module.unlock(); - } - }; - - - class Rom_session_component : public Rpc_object, - private List::Element - { - private: - - friend class List; - - Entrypoint &_ep; - Rom_module &_rom_module; - - public: - - Rom_session_component(Entrypoint &ep, Rom_module &rom_module) - : _ep(ep), _rom_module(rom_module) { _ep.manage(*this); } - - ~Rom_session_component() { _ep.dissolve(*this); } - - Rom_dataspace_capability dataspace() override - { - Rom_module_lock_guard guard(_rom_module); - return _rom_module.fg_dataspace(); - } - - void sigh(Signal_context_capability sigh) override - { - Rom_module_lock_guard guard(_rom_module); - _rom_module.sigh(sigh); - } - }; -} - -#endif /* _ROM_H_ */ diff --git a/repos/os/src/server/loader/target.mk b/repos/os/src/server/loader/target.mk deleted file mode 100644 index 5917ceb277..0000000000 --- a/repos/os/src/server/loader/target.mk +++ /dev/null @@ -1,4 +0,0 @@ -TARGET = loader -LIBS = base -SRC_CC = main.cc -INC_DIR += $(PRG_DIR) diff --git a/repos/os/src/test/dynamic_config/loader/main.cc b/repos/os/src/test/dynamic_config/loader/main.cc deleted file mode 100644 index 4343c487d3..0000000000 --- a/repos/os/src/test/dynamic_config/loader/main.cc +++ /dev/null @@ -1,51 +0,0 @@ -/* - * \brief Test for changing the configuration of a loader plugin at runtime - * \author Christian Prochaska - * \date 2012-04-20 - */ - -/* - * Copyright (C) 2012-2017 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. - */ - -/* Genode includes */ -#include -#include -#include - -using namespace Genode; - -struct Main -{ - enum { CONFIG_SIZE = 100 }; - - Env &env; - int counter { -1 }; - Loader::Connection loader { env, Ram_quota{8*1024*1024}, Cap_quota{100} }; - Timer::Connection timer { env }; - Signal_handler
timer_handler { env.ep(), *this, &Main::handle_timer }; - - void handle_timer() - { - char *config_ds_addr = - env.rm().attach(loader.alloc_rom_module("config", CONFIG_SIZE)); - - String<100> config("", counter++, ""); - copy_cstring(config_ds_addr, config.string(), CONFIG_SIZE); - env.rm().detach(config_ds_addr); - loader.commit_rom_module("config"); - timer.trigger_once(250 * 1000); - } - - Main(Env &env) : env(env) - { - timer.sigh(timer_handler); - handle_timer(); - loader.start("test-dynamic_config", "test-label"); - } -}; - -void Component::construct(Env &env) { static Main main(env); } diff --git a/repos/os/src/test/dynamic_config/loader/target.mk b/repos/os/src/test/dynamic_config/loader/target.mk deleted file mode 100644 index 4dc7523223..0000000000 --- a/repos/os/src/test/dynamic_config/loader/target.mk +++ /dev/null @@ -1,3 +0,0 @@ -TARGET = test-dynamic_config_loader -SRC_CC = main.cc -LIBS = base diff --git a/repos/os/src/test/fault_detection/main.cc b/repos/os/src/test/fault_detection/main.cc index 13300b35b9..505f28b9b6 100644 --- a/repos/os/src/test/fault_detection/main.cc +++ b/repos/os/src/test/fault_detection/main.cc @@ -16,7 +16,6 @@ #include #include #include -#include #include using namespace Genode; @@ -151,120 +150,25 @@ struct Faulting_child_test }; -/****************************************************************** - ** Test for detecting failures in a child started by the loader ** - ******************************************************************/ - -struct Faulting_loader_child_test -{ - static char const *name() { return "failure detection in loaded child"; } - - Constructible loader; - - void start_iteration(Env &env, Signal_context_capability fault_sigh) - { - loader.construct(env, Ram_quota{1024*1024}, Cap_quota{100}); - - /* register fault handler at loader session */ - loader->fault_sigh(fault_sigh); - - /* start subsystem */ - loader->start("test-segfault"); - } -}; - - -/*********************************************************************** - ** Test for detecting failures in a grandchild started by the loader ** - ***********************************************************************/ - -struct Faulting_loader_grand_child_test -{ - static char const *name() { return "failure detection of loaded grand child"; } - - static char const *config() - { - return - "\n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - ""; - } - - static size_t config_size() { return strlen(config()); } - - Constructible loader; - - void start_iteration(Env &env, Signal_context_capability fault_sigh) - { - loader.construct(env, Ram_quota{4*1024*1024}, Cap_quota{130}); - - /* import config into loader session */ - { - Attached_dataspace ds(env.rm(), - loader->alloc_rom_module("config", config_size())); - memcpy(ds.local_addr(), config(), config_size()); - loader->commit_rom_module("config"); - } - - /* register fault handler at loader session */ - loader->fault_sigh(fault_sigh); - - /* start subsystem */ - loader->start("init", "init"); - } -}; - - struct Main { Env &_env; - Constructible > _test_1 { }; - Constructible > _test_2 { }; - Constructible > _test_3 { }; + Constructible > _test { }; - Signal_handler
_test_1_finished_handler { - _env.ep(), *this, &Main::_handle_test_1_finished }; + Signal_handler
_test_finished_handler { + _env.ep(), *this, &Main::_handle_test_finished }; - Signal_handler
_test_2_finished_handler { - _env.ep(), *this, &Main::_handle_test_2_finished }; - - Signal_handler
_test_3_finished_handler { - _env.ep(), *this, &Main::_handle_test_3_finished }; - - void _handle_test_1_finished() + void _handle_test_finished() { - _test_1.destruct(); - _test_2.construct(_env, _test_2_finished_handler); - } - - void _handle_test_2_finished() - { - _test_2.destruct(); - _test_3.construct(_env, _test_3_finished_handler); - } - - void _handle_test_3_finished() - { - _test_3.destruct(); + _test.destruct(); log("--- finished fault_detection test ---"); _env.parent().exit(0); } Main(Env &env) : _env(env) { - _test_1.construct(_env, _test_1_finished_handler); + _test.construct(_env, _test_finished_handler); } }; diff --git a/repos/os/src/test/loader/main.cc b/repos/os/src/test/loader/main.cc deleted file mode 100644 index 4c6b0644de..0000000000 --- a/repos/os/src/test/loader/main.cc +++ /dev/null @@ -1,62 +0,0 @@ -/* - * \brief Loader test program - * \author Christian Prochaska - * \date 2011-07-07 - */ - -/* - * Copyright (C) 2011-2017 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. - */ - -#include -#include -#include - -namespace Test { - using namespace Genode; - struct Main; -} - - -struct Test::Main -{ - Env &_env; - - Loader::Connection _loader { _env, Ram_quota{8*1024*1024}, Cap_quota{100} }; - Timer::Connection _timer { _env }; - - Loader::Area _size { }; - Loader::Point _pos { }; - - void _handle_view_ready() - { - _size = _loader.view_size(); - _timer.trigger_periodic(250*1000); - } - - Signal_handler
_view_ready_handler { - _env.ep(), *this, &Main::_handle_view_ready }; - - void _handle_timer() - { - _loader.view_geometry(Loader::Rect(_pos, _size), Loader::Point(0, 0)); - _pos = Loader::Point((_pos.x() + 50) % 500, (_pos.y() + 30) % 300); - } - - Signal_handler
_timer_handler { - _env.ep(), *this, &Main::_handle_timer }; - - Main(Env &env) : _env(env) - { - _loader.view_ready_sigh(_view_ready_handler); - _timer.sigh(_timer_handler); - - _loader.start("testnit", "test-label"); - } -}; - - -void Component::construct(Genode::Env &env) { static Test::Main main(env); } diff --git a/repos/os/src/test/loader/target.mk b/repos/os/src/test/loader/target.mk deleted file mode 100644 index bc26ce534b..0000000000 --- a/repos/os/src/test/loader/target.mk +++ /dev/null @@ -1,3 +0,0 @@ -TARGET = test-loader -SRC_CC = main.cc -LIBS = base