From 397a3e45d123daf3eb1b066287b33313c1c1cdb7 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Wed, 25 Aug 2021 17:07:43 +0200 Subject: [PATCH] Release notes for version 21.08 --- doc/release_notes/21-08.txt | 671 ++++++++++++++++++++++++++++++++++++ 1 file changed, 671 insertions(+) create mode 100644 doc/release_notes/21-08.txt diff --git a/doc/release_notes/21-08.txt b/doc/release_notes/21-08.txt new file mode 100644 index 0000000000..5da9cb3999 --- /dev/null +++ b/doc/release_notes/21-08.txt @@ -0,0 +1,671 @@ + + + =============================================== + Release notes for the Genode OS Framework 21.08 + =============================================== + + Genode Labs + + + +Genode 21.08 puts device drivers into the spotlight. It attacks the costs of +porting drivers from the Linux kernel and takes a leap forward with respect to +GPU support. This low-level work is complemented by several topics that +contribute to our vision of hosting video-conferencing scenarios natively on +Genode. + +For those of you who follow Genode's release notes over the years, the +so-called DDE-Linux is a recurring topic. DDE is short for device-driver +environment and denotes our principal approach of running unmodified Linux +device-driver code inside Genode components. For over a decade, we iterated +many times to find a sustainable and scalable solution for satisfying Genode's +driver needs. Thanks to this enduring work, Genode enjoys support for modern +hardware such as Intel wireless chips or Intel graphics devices. However, when +looking beyond PC hardware, in particular at the plethora of ARM SoCs as +potential target platforms for Genode, we found our existing DDE-Linux +approach increasingly prohibitive because the investment of manual labour per +driver would become unbearable. It was time to recollect, draw from our +collective experience gathered over the past years, and re-envision what +DDE-Linux could be. Section [Linux-device-driver environment re-imagined] +presents the results of this recent line of development that promises to dwarf +the costs of driver-porting work compared to our time-tested approach. The +results have an immediate impact on our ambition to bring Genode to the +Pinephone as our added network and framebuffer drivers for the Allwinner A64 +SoC leverage the new DDE already. + +The challenge of using hardware-accelerated graphics (GPUs) on Genode makes a +guest appearance in the release notes on-and-off since version +[https://genode.org/documentation/release-notes/10.08#Gallium3D_and_Intel_s_Graphics_Execution_Manager - 10.08]. +However, until now, GPU support has not become a commodity for Genode yet. +With the work presented in Section [Advancing GPU driver stack], we hope to +change that. For the first time, we identified a clear path to the +architectural integration of GPU support in sophisticated Genode scenarios +such as Sculpt OS. This outlook prompted us to revive the GPU stack in a +holistic way, including our custom Intel GPU multiplexer as well as the Mesa +stack. + +Further highlights of the current release are an improved and updated version +of VirtualBox 6, refined user-level networking, the maturing integration with +host file systems when running Genode on top of Linux, and new media-playback +capabilities for our port of the Chromium web engine. + + +Linux-device-driver environment re-imagined +########################################### + +Over more than a decade, the domestication of Linux device drivers for Genode +has evolved into a quest of almost epic proportions. This long-winded story +has been covered by a recent series of Genodians articles +([https://genodians.org/skalk/2021-04-06-dde-linux-experiments - first], +[https://genodians.org/skalk/2021-04-08-dde-linux-experiments-1 - second], +[https://genodians.org/skalk/2021-06-21-dde-linux-experiments-2 - third]), +which also goes into a technical deep dive of our recent developments. + +On the one hand, we draw an enormous value from the device drivers of the +Linux kernel. Genode would be nowhere as useful without the Intel wireless +stack, USB host-controller drivers, or the Intel graphics driver that we +ported over from Linux. On the other hand, those porting efforts are draining +a lot of our energy. Linux kernel code is not designed for microkernel-based +systems after all. Consequently, the transplantation of such code does not +only require a solid understanding of Linux kernel internals, but also ways to +overcome the friction between two radically different operating-system-design +schools (monolithic and component-based) and friction between implementation +languages (C and C++). + +Even though we are not short of evidence of successful driver ports, we are +very well aware of several elephants in the room: + +Economically, each driver port must be understood as a distinct project of +non-trivial costs. E.g., the port of the i.MX8 graphics driver took us two +months. That's certainly minuscule compared to a driver written from scratch. +But it is still expensive and we feel that those expenses hold us back. + +Second, once ported, later updates of drivers to a new kernel version are +costly and risky. But such updates are unavoidable to keep up with new +hardware. The larger the arsenal of device drivers, the bigger this problem +becomes. + +Third, the skill set of the porting work is the cross point of Linux kernel +competence and Genode competence. In other words, it's rare. To make Genode +compatible to a broader spectrum of hardware in the long run, driver porting +must become an easily attainable skill rather than black art. + +With the current release, we introduce a vastly improved approach to the reuse +of Linux device drivers on Genode. It entails three aspects: + +:Code: Reusable building blocks for crafting custom runtime environments + to bring Linux kernel code to fly, and for interfacing Genode's session + interfaces with Linux kernel interfaces. + +:Tooling: A custom tool set that automates repetitive work such as generating + dummy implementations of Linux kernel functions. + +:Methodology: Consistent patterns and exemplary test scenarios serving as + guiding rails for the development work. + +The following illustration maps out the first aspect, the various pieces of +code involved in hosting unmodified Linux driver code on Genode. +The clear separation of those parts reinforces a degree of formalism - in +particular about separating C and C++ - that was absent in our previous takes. + +[image dde_linux_parts] + +A driver is a Genode component. So the outer border of the picture is Genode's +bare-bones C++ API. At the lower end, the API provides access to device +resources such as interrupts and memory-mapped device registers. At the higher +end, the API allows the driver to play the role of a service for other +components through one of Genode's session interfaces. + +The lower (blueish) part of the picture is concerned with the runtime +environment needed to make the Linux kernel code feel right at home. The gap +between Genode's API and Linux kernel interfaces is closed in two steps. +First, the so-called *lx_kit* library implements handy mechanisms for building +the meaty parts of the runtime in C++. For example, it provides a user-level +task scheduling model that satisfies the semantic needs of Linux. The lx_kit +is located at _dde_linux/src/include/lx_kit_ and _dde_linux/src/lib/lx_kit/_ + +Second, the *lx_emul* (short for Linux emulation) code wraps the lx_kit +functionality into C interfaces. The functions of those interfaces are +prefixed with 'lx_emul_' and serve as basic primitives for re-implementing +(parts of) the original Linux kernel-internal ABI. Although the previous +version of DDE Linux already featured the principle lx_kit and lx_emul +fragments, the new design applies the underlying idea much more stringent, +fostering the almost galvanic separation between C and C++ code. In +particular, C++ code never includes any Linux headers. The lx_emul code also +comprises driver-specific dummy implementations of unused kernel functions. +The handy tool at _tool/dde_linux/create_dummies_ automates the creation of +those dummy implementations now. Finally, the lx_emul code drives the startup +of the Linux kernel code by executing initcalls in the correct order. The +reusable building blocks of lx_emul are located at +_dde_linux/src/include/lx_emul/_ and _dde_linux/src/lib/lx_emul/_ + +When looking from the upper (greenish) end, the *genode_c_api* library is a +thin wrapper around Genode's session interfaces. It enables C code to +implement a Genode service such as block driver or network driver. The +genode_c_api library is located at _os/include/genode_c_api/_ and +_os/src/lib/genode_c_api/_. + +The red area contains sole C code, most of which is unmodified Linux kernel +code. It is supplemented with a small *lx_user* part that uses both the +genode_c_api as well as Linux kernel interfaces to connect the unmodified +Linux kernel code with the Genode universe. + +We address the second aspect - the tooling - by the growing tool set at +_tool/dde_linux/_. The biggest time saver is the _create_dummies_ tool, which +automates the formerly manual task of implementing dummy functions to quickly +attain a linkable binary. It is complemented with the _extract_initcall_order_ +tool, which supplements lx_emul with the information needed to perform all +Linux initialization steps in the exact same order as a Linux kernel would do. + +The third aspect - the methodology - is embodied in two source-code +repositories that leverage the new DDE-Linux approach for two distinct ARM +SoCs, namely i.MX8MQ and Allwinner A64. + +:Genode support for i.MX8MQ SoC: + + [https://github.com/skalk/genode-imx8mq] + +:Genode support for Allwinner A64 SoC: + + [https://github.com/nfeske/genode-allwinner] + +The most pivotal methodological change is the way how we deal with the +Linux-internal API now. In our previous work, we used to mimic the content of +kernel headers by a custom-tailored emulation header _lx_emul.h_ per driver. +Whereas these driver-specific API flavors catered our urge to keep transitive +code complexity at bay, they required significant and boring manual labour. +Now we changed our minds to reusing the original Linux headers, thereby +greatly reducing the amount of repetitive work while reducing the likelihood +for subtle bugs. + + +Success stories +--------------- + +Both repositories linked above employ the re-imagined DDE-Linux approach to +resounding success. The i.MX8MQ repository features drivers for framebuffer +output and SD-card access, +[https://genodians.org/skalk/2021-08-02-mnt-reform2-sdcard - targeting the MNT Reform laptop]. +The Allwinner repository contains a network driver for the Pine-A64-LTS board +and a new framebuffer driver for the Pinephone. No single line of Linux code +had to be changed. + +We found that the development of those driver components took only a fraction +of time compared to our past experiences. The most unnerving aspects of the +driver porting work have simply vanished: Subtle incompatibilities between C +and C++ are ruled out by design now. The hunt for missing initcalls is no +more. No dummy function must be written by hand. The compilation of arbitrary +Linux compilation units works instantly without manual labour. +This - in turn - brings the experimental addition or removal of kernel +subsystems down from hours to seconds, turning the development work into an +exploratory experience. + +That said, it is not all roses. Components based on Linux drivers have to +carry substantial Linux-specific bureaucracy along with them. The resulting +components tend to be somewhat obese given their relatively narrow purpose. +E.g., the executable binary of the framebuffer driver for the Pinephone is +1.5 MiB in size, most of which is presumably dead weight. + + +Transition +---------- + +Our existing and time-tested Linux-based drivers located in the _dde_linux_ +repository have remained untouched by the current release. +We plan to successively update or replace those drivers using the new +approach. Until then, the original components refer to the old approach as +"legacy". E.g., the former implementation of lx_emul has been moved to +_dde_linux/src/include/legacy/lx_emul/_. + + +Advancing GPU driver stack +########################## + +With release 21.08, we take a major leap towards 3D and GPU support on Genode. +This topic has been on the slow burner for a while now and we were happy to be +able to finally revive this topic. On the Mesa front, we conducted an update +to version 21.0.0 (Section [Mesa update]), while adding more features and new +platforms to our +[https://genode.org/documentation/release-notes/17.08 - Intel GPU multiplexer]. +On Intel platforms, there exists no hardware distinction between the display +controller and 3D acceleration, as both functions are provided by the GPU. +Other platforms, e.g. ARM based SoCs, often contain a separate display and a +GPU device, making it possible to isolate display configuration within a +separate driver. Therefore, we are glad to report that we found a solution on +how to separate display and 3D acceleration on Intel systems. + + +Mesa update +----------- + +Genode's port of the +[https://www.mesa3d.org - Mesa 3D graphics library] dates back to version +11.2.2 that was released in 2016 while the current version is past 21 by now. +Because of this version gap, we decided to start with a fresh port of Mesa +instead of solely updating from version 11. The more recent version enabled us +to switch from Mesa's DRI drivers (i965) to the +[https://de.wikipedia.org/wiki/Gallium3D - Gallium] version (Iris) for Intel +GPUs. +[https://xdc2018.x.org/slides/optimizing-i965-for-the-future.pdf - Iris] +is Intel's redesigned version of the dated i965 driver that aims to lower CPU +usage and improved performance. It is the only driver that supports Gen 12 +(Intel's current Xe GPU architecture) while also removing support for old +Intel generations. As Genode supports Gen 8 (Broadwell) platforms only, we +felt that Iris is the driver of choice for the future. + + +GPU multiplexer improvements +---------------------------- + +The GPU multiplexer received stability improvements, new features required by +Mesa's Iris driver, i.e. context isolation and sync objects, and bug fixes +prompted by supporting newer GPU generations. These generations include Gen 9 +(Skylake) and Gen 9.5 (Kaby Lake), with more versions to come. Please note +that this line of work is not finished and is as of now in a preliminary state +with ongoing efforts. + + +The GPU multiplexer as a platform service +----------------------------------------- + +As stated at the beginning of this chapter, Intel PC platforms have no +distinction between the display device and the 3D rendering. Both functions +are integrated into the GPU as display engine and render engine. This implies +that Genode's Intel framebuffer/display driver has to share resources with the +GPU multiplexer. The co-location of both drivers in one component, however, +violates Genode's core principle of a minimally-complex trusted computing +base. Whereas the complex display driver should best be a disposable component +([https://fosdem.org/2021/schedule/event/microkernel_pluggable_device_drivers_for_genode/ - FOSDEM talk]), +the GPU driver must ideally be realized as a low-complexity resource +multiplexer. + +We eventually found a way to solve this contradiction: On Genode, each driver +requests the hardware resources to program a device from the platform driver +via the platform session. As these resources cannot be shared, we came up with +the idea that the GPU multiplexer requests all GPU resources and itself +provides a platform service for the display driver. It hands out the subset of +resources that are related to display handling and forwards display +interrupts. This approach is completely transparent to Genode's Intel display +driver. + +[image gpu_architecture] + System integration of the GPU driver/multiplexer and the framebuffer driver + as distinct components + +We already have implemented this solution for Gen 8 and are working on newer +generations. + + +Future prospects +---------------- + +In the current state, we are still working on newer Intel (Gen9+) GPU support +and are planning to integrate this line of work into Sculpt release 21.09 with +a small demo scenario (e.g., [https://github.com/glmark2/glmark2 - Glmark2] +that is now available in Genode world). + +Additionally, there is ongoing work to support +[https://www.verisilicon.com/en/IPPortfolio/VivanteGPUIP - Vivante] GPUs as +utilized by i.MX SoCs. As of now Mesa's etnaviv driver is included in our +Mesa update and a GPU multiplexer component based on the Linux DRM driver is +available as a preview on +[https://github.com/cnuke/genode/commits/21.08-etnaviv - this] topic branch. + + +Base framework and OS-level infrastructure +########################################## + +Revised cache-maintenance interface +=================================== + +The base library used to expose a single cache-maintenance function to +user-level components, namely 'cache_coherent'. It is primarily needed to +accommodate self-modifying code, e.g., for JIT compilers, to write back +data-cache lines, and invalidate the corresponding instruction-cache lines. +However, we found that the proper support for cached DMA buffers in Linux +device-driver ports calls for two additional semantic flavours. + +One is needed whenever driver code initially writes data to a DMA buffer +before handing over the buffer to the device. Linux driver code usually issues +a 'dma_map_*' call in this case to ensure that data gets written out to memory +and the data cache is invalidated. This scenario is now covered by the new +'cache_clean_invalidate_data' function. + +The other flavor is needed to invalidate data-cache lines before reading +device-generated content from a DMA buffer. Linux driver code usually calls a +'dma_unmap_*' function in this case. This case is now covered by the new +'cache_invalidate_data' function. + +Both functions are provided for the base-hw and Fiasco.OC kernels on the ARM +architecture. + + +Improved host file-system access on Genode/Linux +================================================ + +Genode has included a component for host file-system access on Linux for +years, but the state of the implementation and the feature set limited its +application to mere debugging or development scenarios. This release improves +*lx_fs* in certain areas to permit common use cases and scenarios. + +First, the file-system server gets support for the unlinking of files, which +was left out in the past to prevent accidental deletion of files on the host. +The current version includes a robust implementation of the feature, which is +confined to the configured sub-directory. +Further, sessions track client-specific consumption of resources (namely RAM +and capabilities) and also support dynamic resource upgrades. Last, we added +file-watching support to lx_fs, which enables monitoring files for changes +based on the inotify interface of the Linux kernel. The implementation is +prepared to handle bursts of changes by limiting the rate of notifications to +the client. + +These improvements were contributed by Pirmin Duss. + + +New black-hole component +======================== + +A commonly requested feature for Sculpt OS is that it would be nice to have +the ability to wire up various sessions of a deployed component to a dummy +version of the required service. This way, the user could easily start an +application that would normally require, for example, an audio-out session but +connect it to a "black hole" component that simply drops all audio data. This +would be especially useful if no hardware driver for a specific device is +available on a particular platform, but would also allow for more fine-grained +privacy control. + +For this release, we created a first version of the black-hole component, +which provides a dummy implementation of the audio-out session when enabled in +the configuration: + +! +! +! + +More session types are intended to be added in future releases. + + +NIC router +========== + +With this release, the NIC router receives an enhancement of its feature for +forwarding DNS configurations via DHCP, a sensible way of dealing with +fragmented IPv4 packets, and some minor cleanups regarding its configuration +interface. The update changes the configuration interface of the NIC router in +a non-compatible way. Hence, systems that integrate the router might require +adaptation. At the end of this section, you can find an overview of how to +adapt systems properly. + +The NIC router now interprets the IPv4 flags "More Fragments" and "Fragment +Offset" in order to determine whether an IPv4 packet is fragmented or not. +Fragmented packets are dropped safely while the unfragmented ones are routed +as usual. The decision to drop fragmented packets by default is the result of +a long discussion among users and developers of the NIC router. That +discussion came to the conclusion that the complexity overhead and security +risks of routing fragmented IPv4 outrun its relevance in modern world +networks. Therefore, we assume that for the common user of the router, a +simple rejection of fragmented IPv4 is the better deal. + +The consideration of IPv4 fragmentation is accompanied by several ways of +communicating the router's decision to drop fragmented packets. If the config +flag 'verbose_packet_drop' is set, the router prints a message "drop packet +(fragmented IPv4 not supported)" for each dropped fragment to the log. If the +new attribute 'dropped_fragm_ipv4' in the config tag '' is set, the +router will report the number of packets dropped due to fragmentation. Last +but not least, the NIC router can also be instructed to inform the sender of a +dropped IPv4 fragment by sending an ICMP "destination unreachable" reply. Like +the other feedback mechanisms, this is deactivated by default and can be +activated by setting the new config attribute 'icmp_type_3_code_on_fragm_ipv4'. +The attribute must be set to a valid ICMP code number that is then used for +the replies. + +The run script 'nic_router_ipv4_fragm' demonstrates the router's behavior +regarding fragmented IPv4. + +For many years, the DHCP server of the NIC router is capable of sending DNS +configuration attributes with its replies. At first, this was only a single +DNS server address. With +[https://genode.org/documentation/release-notes/21.02#NIC_router - Genode 21.02], +this has been extended to a list of DNS server addresses. Sending such address +lists has now been made more conforming to the RFCs in that the server will +list them all in one option 6 field instead of adding one option 6 field per +address. Consequently, the DHCP client of the router now also considers only +the first option 6 field of a reply but may parse multiple addresses from it. + +Another new feature is that the DHCP client of the router now remembers the +domain name (option 15) of a DHCP reply that leads to an IPv4 configuration. +Analogously, the DHCP server will send a domain name with DHCP replies if such +a name is at hand. As with DNS server addresses, the DHCP server can obtain +the domain name either statically through its configuration (new config tag +'') or dynamically from the results of a DHCP client of another +domain. The latter is achieved by setting the new config attribute +'dns_config_from' that replaces the former attribute 'dns_server_from'. If +'dns_config_from' is set to the name of another domain, the DHCP server will +use both the DNS server addresses and the DNS domain name of the domain. + +DNS domain names that were stored with a dynamic IPv4 configuration in the +router are also reported via the new report tag '' whenever the +'config' attribute in the config tag '' is set. As with DNS server +addresses, this allows for manual forwarding and filtering through individual +management components (see +[https://genode.org/documentation/release-notes/21.02#NIC_router - Genode 21.02]). + +As a delayed adaption to the +[https://genode.org/documentation/release-notes/21.02#Pluggable_network_device_drivers - introduction of the Uplink session] +two Genode releases ago, the term "Uplink", that was used in combination with +the NIC router to refer to NIC sessions that the router requested itself, has +been re-named more accurately to "NIC client". This is meant to prevent +confusion with the new session type and, most notable to users, implies that +the tag '' in router configurations got re-named to ''. + + +How to adjust Genode 21.05 systems to the new NIC router +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* At each occurrence of the '' tag in a NIC router configuration, + replace the tag name 'uplink' with 'nic-client'. The rest of the tag stays + the same. This does not yield any semantic changes. + +* At each occurrence of the 'dns_server_from' attribute in a NIC router + configuration, replace the attribute name with 'dns_config_from'. The + attribute value remains unaltered. Be aware that this will add forwarding of + DNS domain names to your system. Forwarding DNS server addresses but not DNS + domain names is not supported anymore. + + +RAM framebuffer driver for Qemu +=============================== + +During graphical application development on ARMv8, it became obvious that +Genode still lacked framebuffer-driver support on Qemu for ARMv8, thus +rendering test execution on real hardware mandatory. In order to speedup test +and development time for graphical applications, we enabled RAM framebuffer +support for the "virt_qemu" board by adding a 'driver_interactive-virt_qemu' +package. The package contains a 'ram_fb_drv' that configures a RAM framebuffer +through Qemu's firmware interface and uses the capture session interface to +provide access to the framebuffer. + +To test drive the driver, you can execute any Genode run script that requires +graphical applications. The following example shows how to execute the demo +run script in Qemu: + +* In _/build/arm_v8a/etc/build.conf_ change + ! # use time-tested graphics backend + ! QEMU_OPT += -display sdl + + to + + ! QEMU_OPT += -device ramfb + +* In _/build/arm_v8a_ execute + ! make KERNEL=hw BOARD=virt_qemu run/demo + + +Sandbox API +=========== + +When using [https://github.com/nfeske/goa - Goa], we noticed that using the os +API caused binaries to be always linked against 'sandbox.lib.so' because its +symbols were part of the api archive as well. We therefore decided to separate +the sandbox API from the os API by moving the header files to +_repos/os/include/sandbox/_ and providing them in a distinct api archive along +with the library symbols. + + +Libraries and applications +########################## + +Updated and improved VirtualBox +=============================== + +Our ongoing development efforts with VirtualBox 6.1 extended the +implementation in various aspects. With this release, we updated the version +to 6.1.26 published in July to stay in sync with upstream developments. This +version especially improves the audio back end for the OSS interface and +graphics. + +On the integration side, VirtualBox 6 now supports dynamic framebuffer +resolutions and the capslock ROM mode. The latter is important to provide the +user a consistent system-wide capslock state, which is controlled by a global +capslock ROM and virtual KEY_CAPSLOCK events forwarded to guest operating +systems. Per default, a raw mode is used and capslock input events are sent +unfiltered to the guest. For ROM mode, VirtualBox may be configured like +follows. + +! + +The network-device model in VirtualBox 5 uses the MAC address from the +connected NIC session. We added this behavior also to VirtualBox 6. During the +past months, we also observed significant performance issues with the AHCI +model, which we address in this release. The background is that our port of +VirtualBox 6 limits changes to the original code and execution model to a bare +minimum. This renders updates of the upstream version less expensive, but on +the other hand, uncovers some inherent assumptions about the runtime behavior +(i.e., scheduling of threads) in the original implementation that must be +addressed. + + +Qt5 and QtWebEngine +=================== + +In this release, we enabled SSL server certificate validation and support for +multimedia playback in our ports of QtWebEngine and the Falkon web browser. + +More specifically, we ported the 'nss' library for the SSL certificate +validation and the 'sndio' library as back end for the audio playback +functionality and enhanced our OSS audio VFS plugin accordingly. + +The following screenshot shows an example use case of Falkon as a private +multimedia browser, which stores all session data, like cookies, in RAM only. +In the future, we also want to enable support for multimedia input and, +consequently, private video conferences. + +[image falkon_youtube] + + +Modular integration of LTE modem stack in Sculpt OS +=================================================== + +In version [https://genode.org/documentation/release-notes/21.02#LTE_modem_stack - 21.02], +we announced the LTE modem support as a prerequisite for using Genode on the +Pinephone. Since most of our development laptops also come with LTE modems or +an extension slot for installing one, we explored ways to augment the Sculpt +scenario with mobile networking on demand, i.e., by the installation of +additional components. The result is documented by means of an +[https://genodians.org/jschlatow/2021-07-21-mobile-network - article on genodians.org]. + + +Webcam improvements using libuvc +================================ + +With webcam support added by the previous release, we discovered some +complications with devices that implement the UVC spec in version 1.5. We +found one of those devices in a Thinkpad T490s. Since +[https://ken.tossell.net/libuvc/doc - libuvc] did not fully implement this +version of the spec, we added a patch for this. The main issue was the +different size of the video probe and commit control messages. Interestingly, +the problematic device is quite picky in this regard and only responds when +the size was set correctly. In connection with this, we fixed a bug in our +[https://libusb.info - libusb] back end, which caused the size of USB control +messages being wrongly calculated. + +Apart from these device-specific issues, the webcam driver now enables auto +exposure in order to adapt to different lighting conditions. + + +Sndio audio library +=================== + +To complement the VFS OSS-plugin introduced in release +[https://genode.org/documentation/release-notes/20.11 - 20.11], we ported the +[https://sndio.org - sndio] library to Genode. It contains an OSS back end +that prompted us to broaden the functionality of our VFS plugin to satisfy +the requirements of the library. This is in line with the envisioned plan to +extend the OSS plugin incrementally to cover more use cases. + +The sndio framework features a server component besides the library but for +the moment, we focus solely on using sndio in a client context. Here the +component, e.g., cmus and Falkon, uses the library to access the sound device +directly. + + +Build system and tools +###################### + +Tool-chain support for RISC-V +============================= + +As one might have noticed, Genode's RISC-V tool chain is absent in tool-chain +release +[https://sourceforge.net/projects/genode/files/genode-toolchain/21.05/genode-toolchain-21.05-x86_64.tar.xz/download - 21.05] +because it still had issues at the release time. These issues, namely the +problem of the dynamic linker's self relocation during program startup have +been resolved during this release cycle. The RISC-V tool chain can now be +built manually using Genode's regular 'tool_chain' script: + +! /tool/tool_chain riscv ENABLE_FEATURES="c c++ gdb" + + +Run tool +======== + +Genode's custom workflow automation tool called 'run' received the following +enhancements. + +To ease the hosting of driver packages outside of Genode's main repository - +an emerging pattern for supporting new SoCs - we replaced the formerly +built-in names of board-specific 'drivers_nic' and 'drivers_interactive' depot +packages by the convention of appending the board name as a suffix, e.g., +'drivers_nic-pine_a64lts'. Hence, new hardware support can now be added +without touching the run tool. + +The ARM fastboot plugin can now be used on 64-bit ARM platforms in addition to +32-bit ARM. Its formerly mandatory parameter '--load-fastboot-device' has +become optional and can be omitted if only one device is present. + +A new _image/uboot_fit_ plugin enables the use of U-Boot's new FIT (flattened +image tree) image format (carrying the extension 'itb'), which supersedes the +uImage format. The new format simplifies the booting of a Linux system, which +typically requires not only a kernel image but also a device-tree binary and a +RAM disk. A FIT image combines all ingredients into a single file and adds +some metadata like checksums. Note, however, that booting an _image.itb_, +which doesn't contain a device-tree binary may cause U-Boot's 'bootm' command +to fail. A workaround for this is to execute the individual boot steps +separately, which skips the Linux-specific preparatory steps that depend on +the device-tree binary: + +! bootm start +! bootm loados +! bootm go + + +Removal of deprecated components +################################ + +In the release notes of version +[https://genode.org/documentation/release-notes/20.11#Retiring_the_monolithic_USB_driver - 20.11], +we announced the retirement of our traditional monolithic USB-driver +component, which used to combine host-controller drivers together with USB +storage, HID, and networking drivers in a single component. With the current +release, we ultimately completed the transition to our multi-component USB +stack and removed the deprecated monolithic USB driver.