mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-18 21:27:56 +00:00
Release notes for version 23.05
This commit is contained in:
parent
dfc1b97fa2
commit
66c3463749
861
doc/release_notes/23-05.txt
Normal file
861
doc/release_notes/23-05.txt
Normal file
@ -0,0 +1,861 @@
|
||||
|
||||
|
||||
===============================================
|
||||
Release notes for the Genode OS Framework 23.05
|
||||
===============================================
|
||||
|
||||
Genode Labs
|
||||
|
||||
|
||||
|
||||
Besides our annual documentation update, our major tool-chain update as
|
||||
scheduled every two years, and the switch to C++20, version 23.05 puts the
|
||||
spotlight on the Goa tool, which allows us to leverage existing SDKs like
|
||||
Lomiri and Rust's cargo for Genode applications. In line with the previous
|
||||
versions, DDE-Linux is prominently featured as enabler of our cross-platform
|
||||
Wifi stack and the updated (6.1.20) drivers for Intel graphics and USB.
|
||||
|
||||
: <div class="visualClear"><!-- --></div>
|
||||
: <p>
|
||||
: <div style="clear: both; float: left; margin-right:20px;">
|
||||
: <a class="internal-link" href="https://genode.org/documentation/genode-foundations-23-05.pdf">
|
||||
: <img class="image-inline" src="https://genode.org/documentation/genode-foundations-title.png">
|
||||
: </a>
|
||||
: <a class="internal-link" href="https://genode.org/documentation/genode-platforms-23-05.pdf">
|
||||
: <img class="image-inline" src="https://genode.org/documentation/genode-platforms-title.png">
|
||||
: </a>
|
||||
: </div>
|
||||
: </p>
|
||||
|
||||
Before getting to the technical achievements, we'd like to draw your attention
|
||||
to the books "Genode Foundations" and "Genode Platforms", which have been
|
||||
updated to reflect the most recent state of the framework. Whereas the
|
||||
"Foundations" cover Genode's architecture, developer work flows, and reference
|
||||
material, the "Platforms" document is focused on low-level hardware topics and
|
||||
provides plenty of practical guidance.
|
||||
|
||||
: <div class="visualClear"><!-- --></div>
|
||||
|
||||
Every two years, we update Genode's tool chain to the latest stable releases
|
||||
of GCC and binutils. This time, we took the update as opportunity to switch
|
||||
Genode's default from C++17 to C++20 so that modern C++ niceties can be used
|
||||
for regular Genode components. The new tool chain is covered by
|
||||
Section [New tool chain based on GCC 12.3, C++20 enabled by default].
|
||||
|
||||
For application developers, the evolving Goa tool is certainly the most
|
||||
interesting feature of the current release. As detailed in
|
||||
Section [Goa tool updated to Sculpt OS 23.04, initial support for Rust],
|
||||
this tool enables us to reuse existing SDKs to target Genode. In particular,
|
||||
we enabled the use of the Lomiri mobile UI toolkit (formerly known as Ubuntu
|
||||
Touch UI toolkit) for targeting the PinePhone, and Rust's cargo.
|
||||
|
||||
System integrators may appreciate our continued development of the Linux
|
||||
device-driver environment, which received an update to Linux 6.1.20
|
||||
(Section [Device drivers]) and ultimately enabled us to use the same Wifi
|
||||
stack across PC and ARM platforms
|
||||
(Section [Uniform Wifi stack across PC and ARM platforms]).
|
||||
|
||||
Even though not end-user facing yet, two noteworthy development milestones of
|
||||
the current release are the new use of our custom base-hw microkernel as x86
|
||||
hypervisor (Section [Base-HW microkernel]) and the profound work on storage
|
||||
encryption covered in
|
||||
Section [Revision of Genode's custom block-encryption infrastructure].
|
||||
Further topics making an appearance in version 23.05 range from RISC-V, over
|
||||
WireGuard, VirtualBox, to seL4.
|
||||
|
||||
|
||||
Goa tool updated to Sculpt OS 23.04, initial support for Rust
|
||||
#############################################################
|
||||
|
||||
Last month, we [https://genode.org/news/sculpt-os-release-23.04 - released]
|
||||
Sculpt OS 23.04 for PC and PinePhone. The new release comes with various
|
||||
[https://genodians.org/nfeske/2023-05-11-sculpt-os - usability improvements]
|
||||
such as presets and on-target system updates.
|
||||
|
||||
[image mobile_sculpt_23_04]
|
||||
Interactive software management on the mobile variant of Sculpt OS
|
||||
|
||||
In particular, with Sculpt OS 23.04 running on the PinePhone, we have carved
|
||||
out the base for hosting mobile apps on a Genode-based system. Yet, there are
|
||||
only very few apps available right now. Since an OS is of no practical use
|
||||
without apps, this urgently called for an SDK to simplify (mobile) app
|
||||
development. After careful investigation, we opted for porting the
|
||||
Ubuntu-Touch-UI toolkit to Genode and integrate it into Goa (Section
|
||||
[Using Goa for bringing apps based on the Ubuntu-Touch-UI toolkit to Genode]),
|
||||
our streamlined workflow tool for application development. In addition, we
|
||||
integrated initial support for Rust's _cargo_ to make Goa palatable to a
|
||||
broader developer audience (Section [Initial Rust support]).
|
||||
|
||||
The growing attention of the Goa tool prompted us to move it under the
|
||||
[https://genodians.org/nfeske/2023-05-02-goa-genode-labs - umbrella of Genode Labs]
|
||||
as we are increasing our development and maintenance efforts for the tool.
|
||||
Aligned with the Sculpt release, the Goa tool has been updated with the
|
||||
corresponding depot archive versions. With this Genode release, we put a
|
||||
cherry on top and added bash completion to improve the user experience even
|
||||
further. Having Goa installed, bash completion is enabled by the following
|
||||
commands:
|
||||
|
||||
! goa update-goa master
|
||||
! GOA_DIR=$(realpath $(which goa) | sed s#bin/goa##)
|
||||
! echo "source ${GOA_DIR}/share/bash-completion/goa" >> ~/.bashrc
|
||||
|
||||
:Goa tool:
|
||||
|
||||
[https://github.com/genodelabs/goa/]
|
||||
|
||||
|
||||
Using Goa for bringing apps based on the Ubuntu-Touch-UI toolkit to Genode
|
||||
==========================================================================
|
||||
|
||||
While writing mobile apps might be fun, it is outside our core expertise.
|
||||
Therefore, we have looked into ways of supporting established open-source SDKs
|
||||
for app development on Genode. We investigated two possible options in depth,
|
||||
namely Ubuntu Touch's UI toolkit now called [https://lomiri.com - Lomiri] and
|
||||
the [https://docs.sailfishos.org/Tools/Sailfish_SDK - Sailfish SDK]. We have
|
||||
tried to port applications for both stacks and after many iterations settled
|
||||
with the Ubuntu UI toolkit. The full story can be read
|
||||
[https://genodians.org/ssumpf/2023-05-06-ubunutu_ui - here]. Therefore, a port
|
||||
of the Ubuntu UI toolkit is available on Genode right now and support for it
|
||||
has been added to the Goa tool.
|
||||
|
||||
The workflow for crafting an app for the PinePhone using the Goa tool is a
|
||||
fairly streamlined experience now:
|
||||
|
||||
# Since the UI toolkit depends on Qt5, add "genodelabs/api/qt5" to your
|
||||
[https://genodians.org/nfeske/2019-11-25-goa - _used_apis_ file]
|
||||
|
||||
# Add "ssumpf/pkg/ubuntu_ui_toolkit" to your _archives_
|
||||
[https://genodians.org/nfeske/2019-11-25-goa - file] to have the UI toolkit
|
||||
available within your package
|
||||
|
||||
# In order to have your QML code within your packet installed, add
|
||||
"<packet-name>.tar: install/" to your
|
||||
[https://genodians.org/nfeske/2019-11-25-goa - _artifacts_ file]
|
||||
|
||||
# Configure your
|
||||
[https://genodians.org/nfeske/2019-12-19-goa-unix-terminal - _runtime_ file]
|
||||
|
||||
# Execute your scenario on Linux for development
|
||||
! goa run
|
||||
|
||||
# Build for the PinePhone
|
||||
! goa build --arch arm_v8a
|
||||
|
||||
# [https://genodians.org/nfeske/2020-01-16-goa-publish - Publish] your package
|
||||
! goa publish --depot-user john --depot-overwrite
|
||||
|
||||
Examples using QML, Qt5, and C++ can be found
|
||||
[https://github.com/ssumpf/goa-projects - here]
|
||||
|
||||
|
||||
Initial Rust support
|
||||
====================
|
||||
|
||||
The Rust programming language has grown in popularity in the recent years.
|
||||
The Genode OS Framework had support for the Rust programming language
|
||||
before, contributed to Genode release 16.05 by Waylon Cude. However, as an
|
||||
on-off contribution it never got traction and the support was eventually
|
||||
removed with release 20.05.
|
||||
While the original support focused on some low-level runtime libraries and
|
||||
integration into the Genode build system, our new attempt has a somewhat
|
||||
different objective, which is to facilitate the use of the existing Rust
|
||||
ecosystem on the Genode OS Framework. The removal note already envisioned a
|
||||
possible comeback using the Goa tool and Rust's cargo build system, for which
|
||||
we have added initial support with this release.
|
||||
|
||||
Our objective led to the following guidelines for Rust integration:
|
||||
|
||||
# Make use of the native build system, cargo, to make the existing ecosystem
|
||||
accessible.
|
||||
# Aim for a seamless integration into the Genode OS Framework using the Goa
|
||||
build tool.
|
||||
# Instead of introducing our own Genode
|
||||
[https://doc.rust-lang.org/nightly/rustc/platform-support.html - target triples],
|
||||
leverage Genode's FreeBSD-based C library interface to use existing
|
||||
supported standard library targets like 'x86_64-unknown-freebsd'.
|
||||
# Strive to use the upstream tool chain, or at least stay as close to upstream
|
||||
as possible.
|
||||
|
||||
While we largely succeeded in following these guidelines, our initial
|
||||
proof-of-concept implementation relies on a marginally adapted tool chain to
|
||||
work around missing support for versioned library symbols in our linker.
|
||||
We are exploring avenues to overcome these limitations and expand the support
|
||||
to cover more complex use cases in the next release.
|
||||
|
||||
To learn more about our Rust support, head over to the
|
||||
[https://genodians.org/atopia/2023-05-30-bringing-rust-back-to-genode - article on Genodians.org].
|
||||
|
||||
|
||||
Uniform Wifi stack across PC and ARM platforms
|
||||
##############################################
|
||||
|
||||
Support for wireless LAN was mostly focused on the
|
||||
[https://genode.org/documentation/release-notes/14.11#Intel_wireless_stack - PC platform]
|
||||
as it was the platform predominately used for using Genode and, in extension,
|
||||
Sculpt on a daily basis. In the last couple of years, however, we started to
|
||||
embrace ARM-based platforms like the MNT Reform 2 and the PinePhone as well,
|
||||
longing for thorough support of Sculpt OS on such systems. Thanks to our Linux
|
||||
device-driver environment, we have now taken the opportunity to reuse the
|
||||
existing wireless stack on vastly different platforms.
|
||||
|
||||
|
||||
Making the wireless stack globally accessible
|
||||
---------------------------------------------
|
||||
|
||||
The
|
||||
[https://genode.org/documentation/release-notes/23.02#Realtek_Wifi - previous release]
|
||||
already featured additional support for a different wireless LAN device driver -
|
||||
the rtlwifi driver that supports Realtek-based devices - giving us a good
|
||||
intuition on how easy it has become to extend even a complex Linux-based
|
||||
driver component stack such as our wifi-driver component ('wifi_drv').
|
||||
|
||||
The first step was making it less x86-centric. We started by making the various
|
||||
ingredients of the driver available on the ARM platforms.
|
||||
|
||||
On the one hand, that includes the WPA supplicant and its dependencies like
|
||||
the 'nl80211' driver that in turn depends on 'libnl'. Enabling them was
|
||||
straight-forward because they are already pretty platform independent and
|
||||
the platform-dependent portions, e.g. libcrypto, are readily available for ARM.
|
||||
|
||||
On the other hand, the wireless stack was slightly more complicated because
|
||||
the hardware integration of wireless networking devices on ARM platforms
|
||||
varies from platform to platform. In case of the MNT Reform 2 and PC, the
|
||||
integrated wireless devices are normally connected via PCIe. In contrast, the
|
||||
PinePhone relies on SDIO. We separated the code to allow for a "mix-and-match"
|
||||
way of selecting the necessary compilation units as the used Linux
|
||||
configuration might differ between each target and could result in compilation
|
||||
issues otherwise.
|
||||
|
||||
The next step was to make the wireless stack globally accessible by moving it
|
||||
from the _pc_ to the _dde_linux_ repository. This move was motivated by the
|
||||
fact that the _dde_linux_ repository is already available in all platform or
|
||||
rather board-specific repositories while the _pc_ repository is not. It is
|
||||
in itself a board-specific repository and therefore having it appear as
|
||||
dependency for other such repositories feels unnatural.
|
||||
|
||||
So the bulk of the driver code now lives in the _dde_linux_ repository from
|
||||
where it can be referenced by other repositories.
|
||||
|
||||
While moving the code, we noticed that in contrast to all other Linux-based
|
||||
drivers the 'wifi_drv' is special. Since the binary itself is a libc component,
|
||||
care was taken to isolate the application code, the 'wpa_supplicant', from
|
||||
the driver code, the library containing the Linux wireless stack and drivers.
|
||||
On all platforms, the binary stays the same while the driver library contains
|
||||
all the platform-specific code. For this reason, the 'wifi_drv' binary is now
|
||||
delegated to be a generic harness that includes all configuration and
|
||||
management functionality shared by all wireless device driver components,
|
||||
e.g., the WPA supplicant. The code of the device driver emulation environment
|
||||
is located in _repos/dde_linux/src/lib/wifi_. It is referenced by the
|
||||
platform-specific driver library that resides in the corresponding platform
|
||||
repository. The runtime configuration needs to point the driver to a proper
|
||||
driver library.
|
||||
|
||||
The platform-specific library is in charge of orchestrating the 3rd-party
|
||||
sources utilized by the driver as well as providing the _source.list_ and
|
||||
_dep.list_ files. It must include the generic library snippet
|
||||
_repos/dde_linux/lib/wifi.inc_ that deals with managing the emulation
|
||||
environment code. The amount of code added by the platform-specific libraries
|
||||
is unimposing as it mostly consists of the dummy implementations needed by
|
||||
the Linux configuration.
|
||||
|
||||
[image wifi_drv_architecture]
|
||||
Composition of the wireless LAN driver component
|
||||
|
||||
All recipes for the depot archives are prefixed to the specific driver, for
|
||||
example 'pkg/pc_wifi' contains a reference to 'src/pc_wifi_drv' as well as to
|
||||
'raw/pc_wifi_firmware'.
|
||||
|
||||
Thanks to the steps outlined above, we now have three different wireless LAN
|
||||
drivers, one for the PinePhone, one for the MNT Reform 2, and one for the PC
|
||||
that nicely follow the same approach.
|
||||
|
||||
|
||||
New firmware loading mechanism
|
||||
------------------------------
|
||||
|
||||
Additionally to making it easier to enable and use the driver for new
|
||||
platforms, we also refined how the driver loads its firmware images. In the
|
||||
past, the driver contained a list of well-known working firmware images that
|
||||
needed to be updated every now and then when new devices where enabled or the
|
||||
firmware version changed due to a Linux update. In particular using the driver
|
||||
with new devices was cumbersome as the driver itself already supported the
|
||||
device most of the time, but it solely missed the corresponding entry in the
|
||||
firmware list and adding that required recompiling the driver.
|
||||
|
||||
[image wifi_firmware_loading]
|
||||
Firmware image loading sequence
|
||||
|
||||
So instead, the driver now loads the firmware images via its local VFS rather
|
||||
than requesting a predetermined ROM module. Since the platform-specific driver
|
||||
library has no direct access to the VFS - after all both worlds are
|
||||
intentionally isolated from each other - a request/response interface was
|
||||
added. The library submits a request to the _wifi_drv_ binary and will suspend
|
||||
its execution waiting for the completion of the request. The binary will
|
||||
acquire the firmware image and notify the driver library in return.
|
||||
Streamlining the firmware acquisition in such a manner allows for using the
|
||||
original probing mechanism available in Linux. Rather than following the
|
||||
firmware list the actual driver code is now free to probe as it sees fit,
|
||||
exactly pointing to the required uAPI revision in case the firmware is
|
||||
missing.
|
||||
|
||||
The following snippet illustrates the configuration of the driver on the
|
||||
PinePhone (omitting any integration-related routes for the config ROM as well
|
||||
as state and scan reports):
|
||||
|
||||
!<start name="wifi_drv" caps="250" priority="-1">
|
||||
! <resource name="RAM" quantum="32M"/>
|
||||
! <config ld_verbose="yes">
|
||||
! <report mac_address="true"/>
|
||||
! <libc stdout="/dev/log" stderr="/dev/log"
|
||||
! rtc="/dev/rtc" rng="/dev/urandom"/>
|
||||
! <vfs>
|
||||
! <dir name="dev"> <log/> <null/> <rtc/>
|
||||
! <jitterentropy name="random"/>
|
||||
! <jitterentropy name="urandom"/>
|
||||
! <wifi/>
|
||||
! </dir>
|
||||
! <dir name="firmware">
|
||||
! <tar name="wifi_firmware.tar"/>
|
||||
! </dir>
|
||||
! </vfs>
|
||||
! </config>
|
||||
! <route>
|
||||
! <service name="ROM" label="wifi.lib.so">
|
||||
! <parent label="a64_wifi.lib.so"/>
|
||||
! </service>
|
||||
! <service name="ROM" label="wifi_firmware.tar">
|
||||
! <parent label="a64_wifi_firmware.tar"/>
|
||||
! </service>
|
||||
! <service name="ROM" label="dtb">
|
||||
! <parent label="wifi-pinephone.dtb"/>
|
||||
! </service>
|
||||
! […]
|
||||
! <any-services> <parent/> <any->child/> </service>
|
||||
! </route>
|
||||
!</start>
|
||||
|
||||
In this configuration, the firmware images are provided as a _.tar_ archive
|
||||
that itself is requested via a ROM connection. The driver will always look
|
||||
into the _/firmware_ directory to access any firmware related files. How the
|
||||
directory is populated is up to the integrator of the driver.
|
||||
|
||||
As a further simplification step, we removed the need for the firmware library
|
||||
used to contain firmware images. It is superseded by the use of a plain data
|
||||
depot archive, e.g., _raw/pc_wifi_firmware_.
|
||||
|
||||
|
||||
Additional device support and updates
|
||||
-------------------------------------
|
||||
|
||||
We updated the firmware images to the most recent ones supported by
|
||||
Linux version 6.1.20.
|
||||
|
||||
We enabled the ath9k PCIe driver that can be used on the MNT Reform 2 and the
|
||||
PC. As the ath9k device (168c:0034) used to test the driver on the PC exhibited
|
||||
problems when using MSIs, we disable their usage in the 'pci_decoder'. Similar
|
||||
treatment might be necessary if other ath9k-based devices are used.
|
||||
|
||||
The device support in the 'rtlwifi' driver got extended by additionally
|
||||
enabling support for RTL8192CE devices.
|
||||
|
||||
Furthermore, we updated the WPA supplicant to its latest v2.10 release and
|
||||
introduce preliminary support for joining networks secured by WPA3.
|
||||
|
||||
|
||||
Base framework and OS-level infrastructure
|
||||
##########################################
|
||||
|
||||
New tool chain based on GCC 12.3, C++20 enabled by default
|
||||
==========================================================
|
||||
|
||||
Following a regular cycle of two years, we updated our tool chain to recent
|
||||
versions again, this time in particular to GCC 12.3.0, binutils 2.40, and GDB
|
||||
13.1 while taking the opportunity to enable C++20 by default.
|
||||
|
||||
A noticeable change with GCC 12 is that auto-vectorization with the
|
||||
'-ftree-vectorize' option is now enabled by default when building with the
|
||||
'-O2' optimization level. This has the effect that more SIMD instructions are
|
||||
generated, which required adaptations throughout our code base, for example by
|
||||
making sure that memory allocations in ported Linux drivers adhere a suitable
|
||||
address alignment and by saving and restoring ARMv8 FPU registers in the
|
||||
dynamic linker.
|
||||
|
||||
In addition to that, GCC 12 reports new warnings and errors, which we had to
|
||||
rectify at various places, the most common ones being:
|
||||
|
||||
* Deprecated arithmetics between different enumeration types,
|
||||
|
||||
* Deprecated use of '++' and '--' operators with volatile variables, and
|
||||
|
||||
* Undefined references to 'strlen' inside custom implementations
|
||||
of 'strlen'-like functions, related to the
|
||||
'-ftree-loop-distribute-patterns' option.
|
||||
|
||||
As an extra feature, we added Genode's library name patterns to the linker so
|
||||
that the '-l' option has become able to find the corresponding libraries.
|
||||
This is useful while porting 3rd-party software based on Autoconf, whenever a
|
||||
'configure' script checks for a library dependency by linking a test program
|
||||
with this option. This change thereby removes the need for dummy libraries
|
||||
that were formerly used to satisfy the probing.
|
||||
|
||||
|
||||
API changes
|
||||
===========
|
||||
|
||||
As part of Genode's
|
||||
[https://genode.org/documentation/release-notes/16.08#Cultivation_of_the_new_text-output_API - great API revision]
|
||||
in 2016, we largely *abolished* the use of *format strings* throughout the
|
||||
framework. This is desirable because a code base without format strings cannot
|
||||
have format-string vulnerabilities. Still, a few occurrences, specifically the
|
||||
interface for passing session-construction arguments, remained untouched since
|
||||
then. With version 23.05, we finally attained our initial goal by wrapping up
|
||||
the transition.
|
||||
|
||||
In particular, we revised 'Genode::Connection', which now accepts the session
|
||||
label, affinity, and session-specific parameters as constructor arguments,
|
||||
whereas the parameters are passed as a 'Genode::String'. This eliminates the
|
||||
need for rendering a format string. Given this new interface, we were able to
|
||||
remove format strings from all connection types, updated all components that
|
||||
still happened to rely on format strings, and ultimately removed format
|
||||
strings from Genode's base API.
|
||||
|
||||
Format strings still play a role to accommodate 3rd-party code ported
|
||||
to Genode. Whenever the 3rd-party code targets the C runtime, format
|
||||
strings are readily available via the libc. For free-standing ports that
|
||||
avoid the dependency from the full C runtime, e.g., ported device drivers,
|
||||
a new 'format' library based on Genode's former _base/snprintf.h_ and
|
||||
_base/console.h_ provides rudimentary format-string support. The library
|
||||
is hosted in the libports repository.
|
||||
|
||||
As another matter of housekeeping, we removed the _util/avl_string.h_ utility.
|
||||
The use case of organizing objects by using strings as keys is covered by the
|
||||
_util/dictionary.h_ now.
|
||||
|
||||
|
||||
Towards kernel-agnostic DMA protection
|
||||
======================================
|
||||
|
||||
As sketched in our [https://genode.org/about/road-map - road map], we plan
|
||||
having a feature-complete PC version of Sculpt OS based on base-hw by the end
|
||||
of this year. One of the reasons why we are still sticking to base-nova for
|
||||
the PC version is the fact that we are relying on NOVA's IOMMU support. One
|
||||
necessary step to decouple Sculpt OS from base-nova is to integrate the IOMMU
|
||||
handling into the platform driver.
|
||||
|
||||
Motivated by our
|
||||
[https://genode.org/documentation/release-notes/23.02#Custom_IP_block_for_DMA_protection_on_AMD_Xilinx_Zynq - custom IP block for DMA protection on AMD/Xilinx Zynq],
|
||||
we integrated the notion of IOMMU-like devices into the platform driver with
|
||||
this release as a preparatory step. The platform driver automatically acquires
|
||||
known IOMMU-like devices for itself by looking at the device types. Other
|
||||
devices can then reference these devices by using '<io_mmu>' nodes. This is
|
||||
best illustrated by looking at the devices ROM for the Zynq's dma_guard IP
|
||||
block:
|
||||
|
||||
! <devices>
|
||||
!
|
||||
! <device type="dma_guard" name="dma_guard_0">
|
||||
! <!-- [...] -->
|
||||
! </device>
|
||||
!
|
||||
! <device type="axi_dma" name="axi_dma_0">
|
||||
! <io_mmu name="dma_guard_0"/>
|
||||
! <!-- [...] -->
|
||||
! </device>
|
||||
!
|
||||
! </devices>
|
||||
|
||||
This tells the platform driver that, whenever a DMA buffer is allocated/freed
|
||||
for the session owning the 'axi_dma_0' device, the 'dma_guard_0' must be
|
||||
configured accordingly in order to allow/deny access to the corresponding
|
||||
memory ranges. With the structural changes to the platform driver, the support
|
||||
for dma_guard devices is simply added by implementing specific 'Io_mmu' and
|
||||
'Io_mmu_factory' objects. You can find the code in the _dma_guard.h_ within
|
||||
the
|
||||
[https://github.com/genodelabs/genode-zynq/blob/master/src/drivers/platform/zynq/dma_guard.h - genode-zynq repo].
|
||||
|
||||
For the PC version of the platform driver, we implemented a _kernel_iommu_
|
||||
device that still uses device PDs to pass IOMMU configuration to the NOVA
|
||||
kernel. The _kernel_iommu_ is automatically instantiated and used as a default
|
||||
for each device until we replaced this by a kernel-agnostic implementation in
|
||||
a future release.
|
||||
|
||||
With these preparations, we paved the way for implementing configuration logic
|
||||
for arbitrary IOMMU-like devices within the platform driver. In particular,
|
||||
the platform driver has been made capable of managing multiple IOMMU-like
|
||||
devices at the same time. However, there is one limitation that comes from the
|
||||
fact that DMA buffers are not device-specific but allocated per session: All
|
||||
IOMMU-like devices must either operate as MMU (virtual addressing) or as MPU
|
||||
(physical addressing).
|
||||
|
||||
|
||||
Revision of Genode's custom block-encryption infrastructure
|
||||
===========================================================
|
||||
|
||||
Tresor library
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
For about two years, our Ada/SPARK-based CBE block encryption and its GUI
|
||||
front-end, the file vault, served us well with rather manageable workloads
|
||||
such as configuration and credential files in Sculpt OS on the PC. However,
|
||||
with the rise of mobile Sculpt on the PinePhone, the CBE ecosystem was
|
||||
suddenly confronted with new challenges and requirements.
|
||||
|
||||
First, mobile platforms are usually less forgiving when it comes to
|
||||
performance and the CBE still exhibited a lot of potential for optimization.
|
||||
Second, we envision encrypted storage to become an integral part of the base
|
||||
system - the "appliance role" of mobile Sculpt OS - which shifts the role of
|
||||
the component from an optional feature to a foundational mechanism. With this
|
||||
role shift, however, maintainability becomes increasingly important. Third,
|
||||
now that we decided to settle on this block-encryption approach and to
|
||||
increasingly expose it to real workloads, we can expect new requirements to
|
||||
pop up more frequently and with higher priority. Last but not least, our
|
||||
Ada/SPARK runtime, so far, lacks ARM support.
|
||||
|
||||
This prospect forced us to carefully reconsider our relation to the existing
|
||||
CBE approach, and especially to the fact that its core logic and crypto
|
||||
back-end were entirely written in Ada/SPARK. When we started developing the
|
||||
CBE in Ada/SPARK, we were positive that the language might become popular
|
||||
among the core developers of Genode and that, eventually, other, especially
|
||||
critical parts of the framework could benefit from it as well. But this idea
|
||||
didn't come to fruition. Only a few of us came in touch with the new language
|
||||
and, of those, even fewer acquired profound experience with it. We ultimately
|
||||
realized that the friction caused by the added language boundary that emerged
|
||||
with the CBE approach became a bottleneck, inhibiting the further evolution of
|
||||
our block-encryption stack with a strong sense of collective code ownership.
|
||||
|
||||
This observation in mind, and the above-mentioned challenges in sight, we
|
||||
decided to drop the CBE library and create a new implementation strongly
|
||||
inspired by the CBE design but in C++, our "mother tongue". The new library is
|
||||
called tresor, brings the same feature set as the CBE and is compatible with
|
||||
containers created with the CBE. The file vault has been adapted to run with
|
||||
the tresor library. So file-vault users can continue using their containers as
|
||||
usual without further ado. The entire tresor-based ecosystem is
|
||||
architecture-agnostic, which lifts the former restriction to x86.
|
||||
|
||||
|
||||
File Vault
|
||||
~~~~~~~~~~
|
||||
|
||||
Some new features have been added to the file vault. For instance, the
|
||||
component can now be driven with one of two available user interfaces: The
|
||||
usual graphical front-end or the new non-interactive interface that is driven
|
||||
by a textual configuration and provides feedback through a report. This allows
|
||||
for the integration of the file vault with automated controls respectively
|
||||
lower or higher-level UIs. The interactive interface remains the default, but
|
||||
one can replace it with the text-based variant using the new "user_interface"
|
||||
configuration attribute. An example of operating the text-based interface is
|
||||
provided by the new _file_vault_config_report.run_ script.
|
||||
|
||||
As another rather small but handy feature, a file vault can now be locked and
|
||||
unlocked without having to restart the component. In the locked state, all key
|
||||
material is removed from the cryptographic back end and the block-encryption
|
||||
driver is shut down. The user is then prompted to provide the correct
|
||||
credentials in order to re-establish access to the container.
|
||||
|
||||
|
||||
Custom virtual machine monitor on ARM
|
||||
=====================================
|
||||
|
||||
The
|
||||
[https://genode.org/documentation/release-notes/23.02#Interactive_graphical_VMs_on_ARM - previous release], introduced interactive graphical VMs on ARM systems.
|
||||
Genode's custom virtual machine monitor was enhanced by VirtIO device models
|
||||
for input events and GPU. However, dynamic changes of the virtual GPU's
|
||||
framebuffer resolution weren't yet handled by the initial version. With the
|
||||
current release, these restrictions got removed. Now, the user is able to
|
||||
resize the window of a virtual machine as expected.
|
||||
|
||||
|
||||
NetBSD rump kernel on RISC-V
|
||||
============================
|
||||
|
||||
We have added RISC-V to our port of the
|
||||
[https://wiki.netbsd.org/rumpkernel - rump kernel].
|
||||
This enables Genode to access commodity file-systems on RISC-V based devices.
|
||||
|
||||
|
||||
Strengthened fault tolerance of on-target package management
|
||||
============================================================
|
||||
|
||||
Genode's way of safely installing and deploying packages on-target - as
|
||||
introduced in
|
||||
[https://genode.org/documentation/release-notes/18.02#On-target_package_installation_and_deployment - version 18.02] -
|
||||
is a corner stone of Sculpt OS. The recent move of Sculpt OS to mobile
|
||||
devices, however, revealed a couple of limitations that we address with the
|
||||
current release.
|
||||
|
||||
First, in contrast to the PC version of Sculpt OS that allows for the
|
||||
straight-forward management and editing of files using a regular command-line
|
||||
interface, a touch-based user interface as present on the phone is far more
|
||||
constrained. Problems that can be solved by manual intervention on the PC
|
||||
without second thought can become insurmountable showstoppers on the phone.
|
||||
The most prominent problem is recovery from the situation where package
|
||||
dependencies remain incomplete due to an interruption of the installation
|
||||
process or due to packaging mistakes. On the PC, such a situation can be
|
||||
resolved by simply clearing the depot using a single terminal command,
|
||||
followed by a reinstall of the package. On the phone, the user was left out in
|
||||
the cold with the message "package installed but incomplete" but with no
|
||||
obvious or non-obvious way of recovery. The new version gracefully handles
|
||||
this failure state by offering the retry of the package installation.
|
||||
|
||||
Second, network connectivity is far more fluctuating on mobile devices, which
|
||||
increases the likelihood for download errors. The previous version that
|
||||
regarded download errors as rare and sporadic issues, responded to such errors
|
||||
by repeated and silent retries. We found that a mobile phone demands a more
|
||||
graceful way to reflect such failure situations to the user, and to limit the
|
||||
rate of futile download attempts. The new version preserves information about
|
||||
download failures for user inspection and re-issues new downloads only if not
|
||||
already flagged as unavailable.
|
||||
|
||||
Finally, we encountered the manual addition of software providers to the
|
||||
system as a hurdle on the phone. On the PC, a new software provider can be
|
||||
added by manually placing the provider's _download_ and _pubkey_ files in a
|
||||
local depot directory, which is straight-forward when using a shell. However,
|
||||
on a touch-screen device, there is no obvious and simple way to supplement the
|
||||
system with such information. To still accommodate the user's desire to
|
||||
download and install software from arbitrary providers, we added the option to
|
||||
explicitly skip the signature verification for downloads. This is useful in
|
||||
scenarios where the lack of integrity of downloaded content does not pose a
|
||||
risk, e.g., for untrusted applications that are rigidly sandboxed, or during
|
||||
development.
|
||||
|
||||
Whenever the depot-download subsystem encounters the attribute 'verify="no"'
|
||||
for an '<installation>' item, it accepts the installation even if no key is
|
||||
available. It still applies verification for dependencies whenever possible.
|
||||
E.g., if a package of the provider "john" gets installed via 'verify="no"' and
|
||||
the package depends on an archive by "genodelabs", for which the public key is
|
||||
known, the integrity of the content originating from "genodelabs" is verified.
|
||||
|
||||
|
||||
Libraries and applications
|
||||
##########################
|
||||
|
||||
Qt5 reorganization
|
||||
==================
|
||||
|
||||
When the Goa tool is used to build an application, all libraries of the used
|
||||
API packages get linked to the application and the single Qt5 API package with
|
||||
big libraries like QtWebEngine was a bit too much for simple Qt applications.
|
||||
For this reason, we split the Qt5 API into smaller packages according to the
|
||||
corresponding Qt modules.
|
||||
|
||||
As preparation for the release of a binary version of the Qt5 host tools, we
|
||||
also reduced the external dependencies of these tools for improved
|
||||
compatibility with different host systems and changed their install location
|
||||
to the location of the other Genode host tools.
|
||||
|
||||
And finally, we added a 'ubuntu-ui-toolkit' meta package in the genode-world
|
||||
repository which pulls in all dependencies for the Ubuntu UI toolkit,
|
||||
including a runtime with the required ROMs.
|
||||
|
||||
|
||||
WireGuard improvements
|
||||
======================
|
||||
|
||||
There are two smaller changes related to Genode's port of WireGuard. First,
|
||||
peers can now be removed from WireGuard at runtime by removing the
|
||||
corresponding '<peer>' tags from the component's configuration. This operation
|
||||
enforces the same assurances as removing a peer from a native WireGuard driver
|
||||
in Linux.
|
||||
|
||||
The second change has to do with the nature of the port. The WireGuard port is
|
||||
one of the rare examples where we use our Linux device driver environment
|
||||
(dde_linux) for porting software that is not exactly a driver. The component
|
||||
does not depend on a specific hardware configuration and therefore, the
|
||||
emulated Linux kernel can be platform-agnostic. Consequently, while porting,
|
||||
we created such a variant of the Linux emulation specifically for WireGuard.
|
||||
|
||||
However, we realized that this variant can come in handy for ports of other
|
||||
hardware-agnostic kernel parts (for instance, lxip) as well. Therefore, we now
|
||||
cut it out of the WireGuard port in order to make it a self-contained version
|
||||
of the 'lx_emul' library. The new library is called 'virt_lx_emul' and is
|
||||
accompanied by the 'virt_linux' target that can be used to build the
|
||||
corresponding Linux kernel and run it in Qemu.
|
||||
|
||||
|
||||
Updated or removed 3rd-party software
|
||||
=====================================
|
||||
|
||||
VirtualBox updated to version 6.1.44
|
||||
------------------------------------
|
||||
|
||||
Our port of VirtualBox underwent some maintenance work published in this
|
||||
release. With the tool chain updated to GCC 12, it became necessary to update
|
||||
VirtualBox to version 6.1.44 to keep up with the tool-chain changes and fix
|
||||
many upstream bugs alongside. Also, we improved several aspects of the port to
|
||||
improve robustness of networking, USB, multi-threading, and VM reboot. After
|
||||
thorough testing in every-day scenarios, we finally adopted the handling of
|
||||
the x86 time-stamp counter from version 5 and disabled the VM exit for the
|
||||
RDTSC instruction, which improves the performance of selected scenarios
|
||||
significantly. For Windows guests, it has become crucial to configure the
|
||||
paravirtualization provider like follows in the _machine.vbox6_ file.
|
||||
Otherwise, the guest's TSC calibration fails resulting in a bogus CPU
|
||||
frequency assumption.
|
||||
|
||||
! <Paravirt provider="HyperV"/>
|
||||
|
||||
|
||||
Removed ports of pcre16 and icu libraries
|
||||
-----------------------------------------
|
||||
|
||||
The pcre16 and icu libraries had been used by Qt5 in the past but were not
|
||||
used anymore since the last Qt updates. So we removed them from the _libports_
|
||||
repository.
|
||||
|
||||
|
||||
Device drivers
|
||||
##############
|
||||
|
||||
Linux device driver environment updated to Linux 6.1.20
|
||||
=======================================================
|
||||
|
||||
According to [https://genode.org/about/road-map - our roadmap], the update of
|
||||
Genode's Linux device driver environment (DDE) to a more recent 6.x Linux
|
||||
version was planned for release 23.08. Now, we decided to tackle this update
|
||||
with this version already.
|
||||
|
||||
Besides the Wireguard port to Genode, the following ported drivers use the
|
||||
latest Linux kernel 6.1.20 version now:
|
||||
|
||||
* Zynq SD-card driver
|
||||
* PCI Wifi driver for i.MX 8MQ
|
||||
* all PC drivers (USB host, Wifi, Intel display)
|
||||
|
||||
Note that a few drivers are not listed above. The existing drivers for the
|
||||
Allwinner and i.MX 8MQ SoC still use older 5.x Linux kernel versions as base.
|
||||
However, the Linux device driver environment has been tweaked carefully to
|
||||
support a range of Linux kernel versions from 5.11 till 6.1.20.
|
||||
|
||||
While doing the update work, we investigated a more sustainable link between
|
||||
the Linux kernel drivers for USB and display drivers (DRM/KMS) on the one
|
||||
hand, and the Genode API on the other. The outcome is explained in the next
|
||||
two sections.
|
||||
|
||||
|
||||
Intel display driver
|
||||
====================
|
||||
|
||||
During the update of DDE Linux to the Linux 6.1.20 version, the dependency on
|
||||
internal structures of the Intel framebuffer driver (intel_fbdev) became a
|
||||
hassle. Although the update was successful finally, we decided to remove the
|
||||
direct usage of intel_fbdev in our ported Intel display driver, in order to
|
||||
ease future updates. Nevertheless, the functionality of intel_fbdev is
|
||||
required to manage the framebuffer memory to provide a working Genode GUI
|
||||
interface by the driver. For that, we investigated the use of the
|
||||
[https://www.kernel.org/doc/html/v5.0/gpu/drm-kms.html - Linux DRM/KMS]
|
||||
interface, specifically to allocate and manage so called
|
||||
[https://www.kernel.org/doc/html/v5.0/gpu/drm-kms.html#dumb-buffer-objects - dumb buffer objects].
|
||||
As described in the linked article, the dumb buffers are a standardized and
|
||||
streamlined way to make early boot graphics possible driven by user-land
|
||||
tools. We adjusted our port along the ioctl's of the dumb buffer functionality
|
||||
to manage the framebuffer in our ported display driver.
|
||||
|
||||
|
||||
USB
|
||||
===
|
||||
|
||||
Connecting different USB clients to a USB host controller driver is a delicate
|
||||
task. When using a port of a Linux kernel driver, it can quickly become
|
||||
brittle because the USB driver API in the Linux kernel is complex and contains
|
||||
some semantic dependencies, for instance regarding synchronization, which are
|
||||
not always obvious. However, the Linux kernel offers a USB device I/O API to
|
||||
the user-land that is used for instance by libusb. This API has to guard the
|
||||
USB subsystem against wrong usage, and implements the necessary semantics
|
||||
regarding synchronization and dynamic changes of clients and devices. In the
|
||||
past, we repeatedly encountered corner-case issues, if clients or devices
|
||||
vanished and appeared at a high rate. For the sake of robustness, we decided
|
||||
to redesign our internal linking in between the Genode USB API and Linux to
|
||||
use the user-level device I/O API of the latter. Moreover, we extended the
|
||||
capacity of USB packets in-flight that can be handled by the controller in
|
||||
parallel to 32, to enhance the throughput for some USB devices.
|
||||
|
||||
|
||||
NVMe storage
|
||||
============
|
||||
|
||||
Our custom NVMe driver received the following improvements. First we added
|
||||
'host-memory-buffer' (HMB) support to the driver, which is a performance
|
||||
optimization for NVMe devices that do not make use of a DRAM cache for its
|
||||
operational data.
|
||||
|
||||
The amount of memory used for the HMB can be set by adding the 'max_hmb_size'
|
||||
attribute in the '<config>' node of the driver. This value is checked against
|
||||
the constraints imposed by the device. Should the value be less than the
|
||||
minimal required amount of memory, it will not be used and a warning is
|
||||
issued. On the other hand, if the specified value is larger than the preferred
|
||||
amount of memory as favored by the device, it will be capped to the useful
|
||||
amount instead.
|
||||
|
||||
Naturally, when using the HMB, the required RAM quota of the driver component
|
||||
increases by that amount.
|
||||
|
||||
Second, we fixed a problem detecting the block size (LBA format) of a given
|
||||
namespace. The lower 4 bits of the 'FLABS' register indicate which of the (up
|
||||
to) 16 supported LBA formats is used by the namespace. However, instead of
|
||||
only making use of those bits, the driver looked at the whole register that
|
||||
also includes other information. This led to using the wrong index for reading
|
||||
the LBA format and, on certain devices, rendered the driver unusable as the
|
||||
assumed block size was detected wrong.
|
||||
|
||||
|
||||
Audio-driver update
|
||||
===================
|
||||
|
||||
We updated the audio driver for HDA devices ported from OpenBSD to version 7.3.
|
||||
The functional changes are minimal, but the new version supports more recent
|
||||
PC platforms and recognizes more codecs.
|
||||
|
||||
|
||||
Platforms
|
||||
#########
|
||||
|
||||
Base-HW microkernel
|
||||
===================
|
||||
|
||||
Principle x86 virtualization support (on Qemu)
|
||||
----------------------------------------------
|
||||
|
||||
This release brings limited support for AMD's Secure Virtual Machine (SVM)
|
||||
vCPUs to Genode's custom base-hw microkernel. Supporting SVM is meant as an
|
||||
intermediate step towards enabling advanced virtualization workloads using
|
||||
VirtualBox on Intel VMX later this year. The approach allows us to craft the
|
||||
kernel's virtualization infrastructure using Qemu - which is able to emulate
|
||||
SVM in software - and cross-test our implementation against other hypervisors
|
||||
in a tightly controlled setting. For reference, we used the time-tested Qemu
|
||||
version 4.2 for this line of work.
|
||||
|
||||
Implementing principle vCPU support revealed a few points of friction between
|
||||
base-hw's kernel interface, which had been designed for the needs of our
|
||||
custom ARM VMM, and our kernel-agnostic VM interface on x86 that has been
|
||||
carefully crafted to support a range of 3rd party hypervisors, but relies on
|
||||
more logic in the kernel-specific VMM library to manage the vCPU state.
|
||||
|
||||
The current implementation is able to run several test VM workloads like the
|
||||
artificial 'vmm_x86' test, our seoul VMM run scripts with Linux, and - of
|
||||
course - Genode VMs on one vCPU. It has thereby reached an important stepping
|
||||
stone towards our actual goal of hosting VirtualBox on Intel hardware.
|
||||
|
||||
Having shown that base-hw can support the generic x86 VM interface, we will
|
||||
mature our implementation and may adapt our interface to make it a better fit
|
||||
to base-hw's vCPU execution model in the future.
|
||||
|
||||
|
||||
Boot-time RAM detection on the PinePhone
|
||||
----------------------------------------
|
||||
|
||||
For the PinePhone, we implemented dynamic detection of the system RAM size by
|
||||
parsing the values of the DRAM controller as programmed by U-Boot. This way, 2
|
||||
and 3 GB models of the PinePhone are supported by Genode.
|
||||
|
||||
|
||||
Updated seL4 microkernel
|
||||
========================
|
||||
|
||||
With this release, we updated the support of the seL4 kernel from 9.0.1 to
|
||||
12.1.0 for i.MX6 Sabrelite board and x86_64 PC. The support for 32-bit PC got
|
||||
removed since it is unused, and the i.MX7 Sabrelite support got removed since
|
||||
it is not supported by the new seL4 kernel anymore.
|
||||
|
||||
The updated seL4 kernel requires additional host tools installed, namely
|
||||
CMake, Ninja and additional Python3 modules, jinja2, jschonschema, and pyfdt.
|
||||
Depending on the distribution, the modules are available as distribution
|
||||
package or need to be installed with the python pip3 tool.
|
Loading…
Reference in New Issue
Block a user