mirror of
https://github.com/mmueller41/genode.git
synced 2026-01-22 13:02:56 +01:00
Compare commits
213 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3fac8b106d | ||
|
|
5c27270b17 | ||
|
|
3f15d18392 | ||
|
|
f2e0c164c2 | ||
|
|
d672e95090 | ||
|
|
98211db63d | ||
|
|
722254f864 | ||
|
|
b907629341 | ||
|
|
22852f2e50 | ||
|
|
e22e2540ee | ||
|
|
78ab3c8db5 | ||
|
|
ffdd49f9ce | ||
|
|
0cbd1d1b7c | ||
|
|
f4ac642f64 | ||
|
|
955afd8837 | ||
|
|
9b544787bd | ||
|
|
774b1f4277 | ||
|
|
dbcb1ff480 | ||
|
|
551b17591c | ||
|
|
51a50ece60 | ||
|
|
0dcb526ae5 | ||
|
|
dc016cbd5c | ||
|
|
e5f442f2d3 | ||
|
|
5db2971903 | ||
|
|
aa7f5bc95f | ||
|
|
6872fdb0de | ||
|
|
48220dfd9b | ||
|
|
50ab86cd72 | ||
|
|
cc7de65c9e | ||
|
|
cc193a9155 | ||
|
|
c0309a634e | ||
|
|
30b8f4efc8 | ||
|
|
24181f2bf6 | ||
|
|
fae3c12366 | ||
|
|
4e90dc4512 | ||
|
|
a4c7837fb3 | ||
|
|
764ab3be20 | ||
|
|
c6a2e287d0 | ||
|
|
d16a1bd922 | ||
|
|
b7ba508110 | ||
|
|
d9cde328cb | ||
|
|
6b20a6bc7c | ||
|
|
95c2e5beb3 | ||
|
|
194305a8bb | ||
|
|
b6912a3d87 | ||
|
|
1b4444ce9e | ||
|
|
b9869b666a | ||
|
|
cd7c99afdc | ||
|
|
2ec398e550 | ||
|
|
bdb71d94c2 | ||
|
|
7193902cc0 | ||
|
|
3faf5c43a8 | ||
|
|
6c7f0cb7cc | ||
|
|
54d36a7d1b | ||
|
|
9b164d20fd | ||
|
|
cd8b436566 | ||
|
|
87e90d640f | ||
|
|
db71cb8c63 | ||
|
|
a892018926 | ||
|
|
1643d623e4 | ||
|
|
9b84a8a402 | ||
|
|
db17d51ff1 | ||
|
|
736b000c19 | ||
|
|
187b8ece27 | ||
|
|
93288bccb3 | ||
|
|
444bc18fcf | ||
|
|
18be6315cb | ||
|
|
9c3ce58e57 | ||
|
|
d4a3aa7eda | ||
|
|
8d6ca9556f | ||
|
|
81a49bffee | ||
|
|
53a990579b | ||
|
|
a8d3cd9b15 | ||
|
|
5dfca79bcc | ||
|
|
ff429a8056 | ||
|
|
eafbfb8edf | ||
|
|
b72503e581 | ||
|
|
429cd8d37a | ||
|
|
6be09a27ca | ||
|
|
7298b00013 | ||
|
|
1d826a2c48 | ||
|
|
40445d7011 | ||
|
|
11e261ada4 | ||
|
|
c93f3a1136 | ||
|
|
e339dd542c | ||
|
|
3d23c8c419 | ||
|
|
89d28c8222 | ||
|
|
dff3bac441 | ||
|
|
798beab30e | ||
|
|
50e0f3b977 | ||
|
|
f754e2a7d7 | ||
|
|
1dd1bfe692 | ||
|
|
a74b572e1f | ||
|
|
a24911296a | ||
|
|
563cc07cb0 | ||
|
|
59f562f627 | ||
|
|
4981eb425e | ||
|
|
de8411a5e1 | ||
|
|
5be1c793a5 | ||
|
|
b4076e762c | ||
|
|
6ea628195f | ||
|
|
64487ded7c | ||
|
|
405955eaef | ||
|
|
0aaed47652 | ||
|
|
20606bc6de | ||
|
|
9cd38a6846 | ||
|
|
bf4afefaa1 | ||
|
|
f09b0dc224 | ||
|
|
658030ef49 | ||
|
|
4e8bfed5b1 | ||
|
|
5c47fa0d41 | ||
|
|
058f2e687c | ||
|
|
7d21335ac9 | ||
|
|
3d2b0cab93 | ||
|
|
bcf1cc6397 | ||
|
|
bff624c75a | ||
|
|
512be0a52a | ||
|
|
91f8281618 | ||
|
|
0e01729d77 | ||
|
|
fe1ee05186 | ||
|
|
ec957739e9 | ||
|
|
8d5005e03a | ||
|
|
7fbb245710 | ||
|
|
9bd548c4bd | ||
|
|
fe0ad0addb | ||
|
|
aa2511e209 | ||
|
|
3cf3344fa3 | ||
|
|
c79687f5f4 | ||
|
|
b9bd179e54 | ||
|
|
6c6deb7e8b | ||
|
|
d387eba0ba | ||
|
|
96eb83f19a | ||
|
|
89972b11b7 | ||
|
|
664b861f9d | ||
|
|
27f705bc48 | ||
|
|
325e9cb9fa | ||
|
|
50b10ef4a5 | ||
|
|
c0f8022a78 | ||
|
|
5d808cdc01 | ||
|
|
abefca500b | ||
|
|
7feea78991 | ||
|
|
9e5d479d03 | ||
|
|
26011a7151 | ||
|
|
bbb017dc24 | ||
|
|
04d3c9e750 | ||
|
|
e5fe9c6fc7 | ||
|
|
04821b1abc | ||
|
|
afab15f1a4 | ||
|
|
e61f6cfd38 | ||
|
|
90bea1499e | ||
|
|
99fa203673 | ||
|
|
1b41d9db90 | ||
|
|
c1d0179194 | ||
|
|
04463806a8 | ||
|
|
af01370cc1 | ||
|
|
4eb4bd6f96 | ||
|
|
d2d74cc5fa | ||
|
|
f53df495db | ||
|
|
f3268cade6 | ||
|
|
1a54ee895e | ||
|
|
27d4cb871f | ||
|
|
2312ad35dd | ||
|
|
85a84f5042 | ||
|
|
0fd979b147 | ||
|
|
ad595d2701 | ||
|
|
f6337a6446 | ||
|
|
f1b3e826d5 | ||
|
|
2afba3c137 | ||
|
|
e0d9a04f67 | ||
|
|
274f306315 | ||
|
|
c59c266afc | ||
|
|
9aca1ac775 | ||
|
|
3e83b4b39e | ||
|
|
d7eb174c88 | ||
|
|
c48b3ca16f | ||
|
|
951409f14b | ||
|
|
2075b119ac | ||
|
|
0d61029d7e | ||
|
|
2eb8c5e21a | ||
|
|
c0f9f2c6d7 | ||
|
|
f0f8d0e0ca | ||
|
|
5dc8e330b6 | ||
|
|
c9f2847420 | ||
|
|
fcb0ca305c | ||
|
|
fd161cd814 | ||
|
|
5913cdae89 | ||
|
|
8dde14f93e | ||
|
|
f5dc71ed35 | ||
|
|
e0ca250232 | ||
|
|
75ba52a52b | ||
|
|
a0a112ffe7 | ||
|
|
a891b3832c | ||
|
|
d6f89b285d | ||
|
|
e9a3f0f095 | ||
|
|
52a6cf1412 | ||
|
|
aeeade53f9 | ||
|
|
c05f716478 | ||
|
|
4aca94b08b | ||
|
|
3031fd2a7d | ||
|
|
7de2b040f8 | ||
|
|
0af969543d | ||
|
|
9e97393e3a | ||
|
|
be14e68a83 | ||
|
|
c1d99630c2 | ||
|
|
328a4fa644 | ||
|
|
ff82dc1ad5 | ||
|
|
17a6318ad6 | ||
|
|
0605180a61 | ||
|
|
ab953a534c | ||
|
|
0977574372 | ||
|
|
99bdfbe36f | ||
|
|
f70b02ae3b | ||
|
|
574e41119a |
@@ -35,7 +35,7 @@ of them is briefly characterized as follows:
|
||||
one of Genode's device-independent session interfaces, which are
|
||||
'platform_session', 'capture_session', 'event_session', 'block_session',
|
||||
'audio_out_session', 'log_session', 'nic_session', and 'timer_session'
|
||||
(see 'os/include/' for the interface definitions). Those interfaces are
|
||||
(see _os/include/_ for the interface definitions). Those interfaces are
|
||||
uniform across hardware platforms and kernel base platforms. Usually,
|
||||
each device driver can accommodate only one client at a time.
|
||||
|
||||
@@ -64,7 +64,7 @@ of them is briefly characterized as follows:
|
||||
Device drivers
|
||||
##############
|
||||
|
||||
Device drivers usually reside in the 'src/drivers' subdirectory of source-code
|
||||
Device drivers usually reside in the _src/drivers/_ subdirectory of source-code
|
||||
repositories. The most predominant repositories hosting device drivers are
|
||||
'os', 'dde_ipxe', 'dde_linux'.
|
||||
|
||||
@@ -72,23 +72,23 @@ repositories. The most predominant repositories hosting device drivers are
|
||||
Platform devices
|
||||
================
|
||||
|
||||
:'os/src/drivers/platform/': Platform drivers for various platforms.
|
||||
:_os/src/drivers/platform/_: Platform drivers for various platforms.
|
||||
On x86, the platform driver uses the PCI controller as found on x86 PC
|
||||
hardware. A client can probe for a particular device and request information
|
||||
about physical device resources (using the 'platform_device' interface). I/O
|
||||
resources for MMIO regions, I/O ports, and interrupts can be requested by the
|
||||
provided device abstraction.
|
||||
|
||||
:'os/src/drivers/acpi':
|
||||
:_os/src/drivers/acpi/_:
|
||||
On x86 platforms that use the APIC (namely Fiasco.OC, NOVA, and hw_x86_64)
|
||||
this simple ACPI parser traverses the ACPI tables and reports device-resource
|
||||
information (e.g., interrupt lines of PCI devices).
|
||||
|
||||
:'os/src/app/smbios_decoder':
|
||||
:_os/src/app/smbios_decoder/_:
|
||||
A component that parses SMBIOS information on x86 platforms and makes the
|
||||
result available as a report.
|
||||
|
||||
:'libports/src/app/acpica':
|
||||
:_libports/src/app/acpica/_:
|
||||
In addition to our ACPI base driver, the acpica component uses the
|
||||
ACPICA library to provide access to dynamic functions like battery
|
||||
states, events (e.g., notebook lid close and power buttons), as well
|
||||
@@ -102,10 +102,10 @@ UART devices
|
||||
|
||||
The UART device drivers implement the UART-session interface.
|
||||
|
||||
:'os/src/drivers/uart/spec/pbxa9':
|
||||
:_os/src/drivers/uart/spec/pbxa9/_:
|
||||
Driver for the PL011 UART as found on many ARM-based platforms.
|
||||
|
||||
:'os/src/drivers/uart/spec/x86':
|
||||
:_os/src/drivers/uart/spec/x86/_:
|
||||
Driver for the i8250 UART as found on PC hardware.
|
||||
|
||||
|
||||
@@ -115,60 +115,62 @@ Framebuffer and input drivers
|
||||
Framebuffer and input drivers are implemented as clients of the
|
||||
capture-session and event-session interfaces respectively.
|
||||
|
||||
:'os/src/drivers/ps2/x86':
|
||||
:_os/src/drivers/ps2/x86/_:
|
||||
Driver for the 'i8042' PS/2 controller as found in x86 PCs. It supports both
|
||||
mouse (including ImPS/2, ExPS/2) and keyboard.
|
||||
|
||||
:'os/src/drivers/ps2/pl050':
|
||||
:_os/src/drivers/ps2/pl050/_:
|
||||
Driver for the PL050 PS/2 controller as found on ARM platforms such as
|
||||
VersatilePB. The physical base address used by the driver is obtained at
|
||||
compile time from a header file called 'pl050_defs.h'. The version of the
|
||||
VersatilePB platform can be found at 'os/include/platform/vpb926/' and
|
||||
compile time from a header file called _pl050_defs.h_. The version of the
|
||||
VersatilePB platform can be found at _os/include/platform/vpb926/_ and
|
||||
is made available to the driver via the SPECS machinery of the Genode build
|
||||
system.
|
||||
|
||||
:'libports/src/drivers/framebuffer/vesa':
|
||||
:_libports/src/drivers/framebuffer/vesa/_:
|
||||
Driver using VESA mode setting on x86 PCs. For more information, please refer
|
||||
to the README file in the driver directory.
|
||||
|
||||
:'libports/src/drivers/framebuffer/boot':
|
||||
:_libports/src/drivers/framebuffer/boot/_:
|
||||
Driver for boot-time initialized framebuffers (e.g., UEFI GOP)
|
||||
discovered from the 'platform_info' ROM
|
||||
|
||||
:'os/src/drivers/framebuffer/pl11x':
|
||||
:_os/src/drivers/framebuffer/pl11x/_:
|
||||
Driver for the PL110/PL111 LCD display.
|
||||
|
||||
:'os/src/drivers/framebuffer/imx53':
|
||||
:_os/src/drivers/framebuffer/imx53/_:
|
||||
Driver for LCD output on i.MX53 SoCs.
|
||||
|
||||
:'os/src/drivers/framebuffer/rpi':
|
||||
:_os/src/drivers/framebuffer/rpi/_:
|
||||
Driver for the HDMI output of the Raspberry Pi.
|
||||
|
||||
:'os/src/drivers/framebuffer/sdl':
|
||||
:_os/src/drivers/framebuffer/sdl/_:
|
||||
Serves as both framebuffer and input driver on Linux using libSDL. This
|
||||
driver is only usable on the Linux base platform.
|
||||
|
||||
:'os/src/drivers/gpu/intel':
|
||||
:_os/src/drivers/gpu/intel/_:
|
||||
An experimental Intel Graphics GPU multiplexer for Broadwell and newer.
|
||||
|
||||
:'dde_linux/src/drivers/framebuffer/intel':
|
||||
:_dde_linux/src/drivers/framebuffer/intel/_:
|
||||
Framebuffer driver for Intel i915 compatible graphic cards based on
|
||||
the Linux Intel KMS driver.
|
||||
|
||||
:'dde_linux/src/drivers/usb':
|
||||
USB driver that makes USB HID and USB storage devices available as an input
|
||||
event stream and a block session respectively. For examples of using this
|
||||
driver, refer to the run scripts at 'dde_linux/run/usb_hid' and
|
||||
'dde_linux/run/usb_storage'.
|
||||
:_dde_linux/src/drivers/usb_host/_:
|
||||
USB host-controller driver that provides an USB session interface to
|
||||
USB drivers.
|
||||
|
||||
:'dde_linux/src/drivers/usb_hid':
|
||||
:_dde_linux/src/drivers/usb_hid/_:
|
||||
USB Human Interface Device driver using the USB session interface.
|
||||
|
||||
:_os/src/drivers/usb_block/_:
|
||||
USB storage driver that uses the USB session interface and provides
|
||||
a block-session interface.
|
||||
|
||||
|
||||
Timer drivers
|
||||
=============
|
||||
|
||||
The timer driver located at 'os/src/drivers/timer' implements the timer-session
|
||||
The timer driver located at _base/src/timer/_ implements the timer-session
|
||||
interface. Technically, it is both a device driver (accessing a timer
|
||||
device) and a resource multiplexer (supporting multiple timer-session clients
|
||||
at the same time). Depending on the base platform, the implementation uses
|
||||
@@ -189,13 +191,13 @@ Audio drivers
|
||||
=============
|
||||
|
||||
Audio drivers implement the Audio_out session interface defined at
|
||||
'os/include/audio_out_session/' for playback and optionally the audio_in
|
||||
_os/include/audio_out_session/_ for playback and optionally the audio_in
|
||||
interface for recording.
|
||||
|
||||
:'os/src/drivers/audio/spec/linux':
|
||||
:_os/src/drivers/audio/spec/linux/_:
|
||||
Uses ALSA as back-end on the Linux base platform and supports only playback.
|
||||
|
||||
:'dde_bsd/src/drivers/audio':
|
||||
:_dde_bsd/src/drivers/audio/_:
|
||||
Sound drivers ported from OpenBSD. Currently, the repository
|
||||
includes support for Intel HD Audio as well as for Ensoniq AudioPCI
|
||||
(ES1370) compatible sound cards.
|
||||
@@ -205,31 +207,31 @@ Block drivers
|
||||
=============
|
||||
|
||||
All block drivers implement the block-session interface defined at
|
||||
'os/include/block_session/'.
|
||||
_os/include/block_session/_.
|
||||
|
||||
:'os/src/drivers/sd_card/spec/pl180':
|
||||
:_os/src/drivers/sd_card/spec/pl180/_:
|
||||
Driver for SD-cards connected via the PL180 device as found on the PBX-A9
|
||||
platform.
|
||||
|
||||
:'os/src/drivers/sd_card/spec/imx53':
|
||||
:_os/src/drivers/sd_card/spec/imx53/_:
|
||||
Driver for SD-cards connected to the Freescale i.MX53 platform like the
|
||||
Quick Start Board or the USB armory device.
|
||||
|
||||
:'os/src/drivers/sd_card/spec/rpi':
|
||||
:_os/src/drivers/sd_card/spec/rpi/_:
|
||||
Driver for SD-cards connected to the Raspberry Pi.
|
||||
|
||||
:'dde_linux/src/drivers/usb':
|
||||
:_dde_linux/src/drivers/usb/_:
|
||||
USB driver that makes USB storage devices available as block sessions.
|
||||
For an example of using this driver, refer to the run script at
|
||||
'dde_linux/run/usb_storage'.
|
||||
_dde_linux/run/usb_storage.run_.
|
||||
|
||||
:'os/src/drivers/ahci':
|
||||
:_os/src/drivers/ahci/_:
|
||||
Driver for SATA disks and CD-ROMs on x86 PCs.
|
||||
|
||||
:'os/src/drivers/nvme':
|
||||
:_os/src/drivers/nvme/_:
|
||||
Driver for NVMe block devices on x86 PCs.
|
||||
|
||||
:'os/src/drivers/usb_block':
|
||||
:_os/src/drivers/usb_block/_:
|
||||
USB Mass Storage Bulk-Only driver using the USB session interface.
|
||||
|
||||
|
||||
@@ -237,45 +239,45 @@ Network interface drivers
|
||||
=========================
|
||||
|
||||
All network interface drivers implement the NIC session interface
|
||||
defined at 'os/include/nic_session'.
|
||||
defined at _os/include/nic_session/_.
|
||||
|
||||
:'os/src/drivers/nic/spec/linux':
|
||||
:_os/src/drivers/nic/spec/linux/_:
|
||||
Driver that uses a Linux tap device as back end. It is only useful on the
|
||||
Linux base platform.
|
||||
|
||||
:'os/src/drivers/nic/spec/lan9118':
|
||||
:_os/src/drivers/nic/spec/lan9118/_:
|
||||
Native device driver for the LAN9118 network adaptor as featured on the
|
||||
PBX-A9 platform.
|
||||
|
||||
:'dde_ipxe/src/drivers/nic':
|
||||
:_dde_ipxe/src/drivers/nic/_:
|
||||
Device drivers ported from the iPXE project. Supported devices are Intel
|
||||
E1000 and pcnet32.
|
||||
|
||||
:'dde_linux/src/drivers/wifi':
|
||||
:_dde_linux/src/drivers/wifi/_:
|
||||
The wifi_drv component is a port of the Linux mac802.11 stack, including the
|
||||
iwlwifi driver. It enables the use of Intel Wireless 6xxx and 7xxx cards.
|
||||
|
||||
:'dde_linux/src/drivers/usb':
|
||||
:_dde_linux/src/drivers/usb/_:
|
||||
For the OMAP4 platform, the USB driver contains the networking driver.
|
||||
|
||||
:'dde_linux/src/drivers/nic/fec':
|
||||
:_dde_linux/src/drivers/nic/fec/_:
|
||||
Driver for ethernet NICs of the i.MX SoC family.
|
||||
|
||||
|
||||
General-purpose I/O drivers
|
||||
===========================
|
||||
|
||||
:'os/src/drivers/gpio/spec/imx53':
|
||||
:_os/src/drivers/gpio/spec/imx53/_:
|
||||
Driver for accessing the GPIO pins of i.MX53 platforms.
|
||||
|
||||
:'os/src/drivers/gpio/spec/rpi':
|
||||
:_os/src/drivers/gpio/spec/rpi/_:
|
||||
Driver for accessing the GPIO pins of Raspberry Pi platforms.
|
||||
|
||||
|
||||
Resource multiplexers
|
||||
#####################
|
||||
|
||||
By convention, resource multiplexers are located at the 'src/server'
|
||||
By convention, resource multiplexers are located at the _src/server/_
|
||||
subdirectory of a source repository.
|
||||
|
||||
:Framebuffer and input: Framebuffer and input devices can be multiplexed using
|
||||
@@ -285,35 +287,35 @@ subdirectory of a source repository.
|
||||
service for input drivers, a capture service for output drivers, and a GUI
|
||||
service for the applications. Each GUI session contains a virtual
|
||||
framebuffer and a virtual input interface. Nitpicker (including a README
|
||||
file) is located at 'os/src/server/nitpicker'.
|
||||
file) is located at _os/src/server/nitpicker/_.
|
||||
|
||||
:Audio output: The audio mixer located at 'os/src/server/mixer' enables
|
||||
:Audio output: The audio mixer located at _os/src/server/mixer/_ enables
|
||||
multiple clients to use the audio-out interface. The mixing is done by simply
|
||||
adding and clamping the signals of all present clients.
|
||||
|
||||
:Networking: The NIC bridge located at 'os/src/server/nic_bridge' multiplexes
|
||||
:Networking: The NIC bridge located at _os/src/server/nic_bridge/_ multiplexes
|
||||
one NIC session to multiple virtual NIC sessions using a proxy-ARP
|
||||
implementation. Each client has to obtain a dedicated IP address visible to
|
||||
the physical network. DHCP requests originating from the virtual NIC sessions
|
||||
are delegated to the physical network.
|
||||
|
||||
The NIC router located at 'os/src/server/nic_router' multiplexes one NIC
|
||||
The NIC router located at _os/src/server/nic_router/_ multiplexes one NIC
|
||||
session to multiple virtual NIC sessions by applying network address
|
||||
translation (NAT).
|
||||
|
||||
:Block: The block-device partition server at 'os/src/server/part_block' reads
|
||||
:Block: The block-device partition server at _os/src/server/part_block/_ reads
|
||||
the partition table of a block session and exports each partition found as
|
||||
separate block session. For using this server, please refer to the run
|
||||
script at 'os/run/part_block'.
|
||||
script at _os/run/part_block.run_.
|
||||
|
||||
:File system: The VFS file-system server allows multiple clients to
|
||||
concurrently access the same virtual file system. It is located at
|
||||
'os/src/server/vfs'. The VFS can be assembled out of several builtin
|
||||
_os/src/server/vfs/_. The VFS can be assembled out of several builtin
|
||||
file-system types (like a RAM file system, or pseudo file systems for
|
||||
various Genode session interfaces) as well as external plugins such as rump
|
||||
(mounting file systems supported by the NetBSD kernel).
|
||||
|
||||
:Terminal: The terminal_mux service located at gems/src/server/terminal_mux
|
||||
:Terminal: The terminal_mux service located at _gems/src/server/terminal_mux/_
|
||||
is able to provide multiple terminal sessions over one terminal-client
|
||||
session. The user can switch between the different sessions using a keyboard
|
||||
shortcut, which brings up an ncurses-based menu.
|
||||
@@ -328,127 +330,123 @@ one session interface to another, or in the form of libraries.
|
||||
Separate components
|
||||
===================
|
||||
|
||||
:'os/src/server/gui_fb':
|
||||
:_os/src/server/gui_fb/_:
|
||||
Translates a GUI session to a pair of framebuffer and input sessions.
|
||||
Each 'gui_fb' instance is visible as a rectangular area on screen presenting
|
||||
a virtual frame buffer. The area is statically positioned. For more
|
||||
information, please refer to 'os/src/server/gui_fb/README'.
|
||||
information, please refer to _os/src/server/gui_fb/README_.
|
||||
|
||||
:'gems/src/server/wm':
|
||||
:_gems/src/server/wm/_:
|
||||
Window manager that implements the GUI session interface but manages
|
||||
each client view as a separate window. The window decorations are provided
|
||||
by a so-called decorator (e.g., 'gems/src/app/decorator'). The behaviour
|
||||
by a so-called decorator (e.g., _gems/src/app/decorator/_). The behaviour
|
||||
is defined by a so-called window layouter such as the floating window
|
||||
layouter located at 'gems/src/app/floating_window_layouter/'.
|
||||
layouter located at _gems/src/app/floating_window_layouter/_.
|
||||
|
||||
:'demo/src/server/liquid_framebuffer':
|
||||
:_demo/src/server/liquid_framebuffer/_:
|
||||
Implements the same translation as 'gui_fb' but by presenting an interactive
|
||||
window rather than a statically positioned screen area.
|
||||
|
||||
:'os/src/server/tar_rom':
|
||||
:_os/src/server/tar_rom/_:
|
||||
Provides each file contained in a tar file obtained via Genode's ROM session
|
||||
as separate ROM session.
|
||||
|
||||
:'os/src/server/iso9660':
|
||||
:_os/src/server/iso9660/_:
|
||||
Provides each file of an ISO9660 file system accessed via a block session as
|
||||
separate ROM session.
|
||||
|
||||
:'os/src/server/lx_fs':
|
||||
:_os/src/server/lx_fs/_:
|
||||
A file system server that makes the file system of a Linux base platform
|
||||
available to Genode.
|
||||
|
||||
:'os/src/server/rom_block':
|
||||
Provides the content of a ROM file as a block session, similar to the
|
||||
loop-mount mechanism on Linux
|
||||
:_os/src/server/vfs_block/_:
|
||||
Provides the content of a file obtained from a VFS as a block session,
|
||||
similar to the loop-mount mechanism on Linux
|
||||
|
||||
:'os/src/server/ram_block':
|
||||
Provides the content of a RAM dataspace as a block session. In contrast
|
||||
to 'rom_block', this server provides a writeable block device.
|
||||
|
||||
:'os/src/server/terminal_log':
|
||||
:_os/src/server/terminal_log/_:
|
||||
Adapter for forwarding LOG messages to a terminal session.
|
||||
|
||||
:'os/src/server/log_terminal':
|
||||
:_os/src/server/log_terminal/_:
|
||||
Adapter for forwarding terminal output to a LOG session.
|
||||
|
||||
:'os/src/server/fs_log':
|
||||
:_os/src/server/fs_log/_:
|
||||
Adapter that writes LOG messages to files on a file system.
|
||||
|
||||
:'demo/src/server/nitlog':
|
||||
:_demo/src/server/nitlog/_:
|
||||
Provides a LOG session, printing log output on screen via a GUI session.
|
||||
|
||||
:'os/src/app/rom_logger':
|
||||
:_os/src/app/rom_logger/_:
|
||||
The rom_logger component requests a ROM session and writes the
|
||||
content of the ROM dataspace to the LOG.
|
||||
|
||||
:'os/src/server/rom_filter':
|
||||
:_os/src/server/rom_filter/_:
|
||||
The ROM filter provides a ROM module that depends on the content of
|
||||
other ROM modules steered by the filter configuration, e.g., dynamic
|
||||
switching between configuration variants dependent on the state of
|
||||
the system.
|
||||
|
||||
:'os/src/server/log_terminal':
|
||||
:_os/src/server/log_terminal/_:
|
||||
Forwards terminal output to a LOG session.
|
||||
|
||||
:'gems/src/server/file_terminal':
|
||||
:_gems/src/server/file_terminal/_:
|
||||
Provides terminal sessions that target files on a file system.
|
||||
|
||||
:'gems/src/server/terminal':
|
||||
:_gems/src/server/terminal/_:
|
||||
Provides a terminal session via a graphical terminal using a framebuffer
|
||||
session and an input session.
|
||||
|
||||
:'gems/src/server/tcp_terminal':
|
||||
:_gems/src/server/tcp_terminal/_:
|
||||
Provides one or multiple terminal sessions over TCP connections.
|
||||
For further information, refer to 'gems/src/server/tcp_terminal/README'.
|
||||
For further information, refer to _gems/src/server/tcp_terminal/README_.
|
||||
|
||||
:'os/src/server/terminal_crosslink':
|
||||
:_os/src/server/terminal_crosslink/_:
|
||||
The terminal crosslink service allows to terminal clients to talk to each
|
||||
other.
|
||||
|
||||
:'gems/src/server/http_block':
|
||||
:_gems/src/server/http_block/_:
|
||||
A block service that fetches a virtual block device over the network from
|
||||
a HTTP server.
|
||||
|
||||
:'os/src/server/fs_rom':
|
||||
:_os/src/server/fs_rom/_:
|
||||
A ROM service that translates the 'File_system' session interface to the
|
||||
'ROM' session' interface. Each request for a ROM file is handled by looking
|
||||
up an equally named file on the file system.
|
||||
Please refer to 'os/src/server/fs_rom' for more information.
|
||||
Please refer to _os/src/server/fs_rom/_ for more information.
|
||||
|
||||
For use cases where ROMs are known to be static, the
|
||||
'os/src/server/cached_fs_rom' can be considered as a faster alternative to
|
||||
_os/src/server/cached_fs_rom/_ can be considered as a faster alternative to
|
||||
the regular 'fs_rom' server. Note that 'cached_fs_rom' is not supported
|
||||
in base-linux though.
|
||||
|
||||
:'os/src/server/chroot':
|
||||
:_os/src/server/chroot/_:
|
||||
An intermediate file-system server that makes a sub directory of a file
|
||||
system available as the root of a file system handed out to its client.
|
||||
|
||||
:'os/src/server/dynamic_rom':
|
||||
:_os/src/server/dynamic_rom/_:
|
||||
A simple ROM service that provides ROM modules that change in time according
|
||||
to a configured timeline.
|
||||
|
||||
:'os/src/server/report_rom':
|
||||
:_os/src/server/report_rom/_:
|
||||
A service that implements both the report session interface and the ROM
|
||||
session interface. It reflects incoming reports as ROM modules.
|
||||
|
||||
:'os/src/server/fs_report':
|
||||
:_os/src/server/fs_report/_:
|
||||
Report server that writes reports to file-systems
|
||||
|
||||
:'os/src/server/clipboard':
|
||||
:_os/src/server/clipboard/_:
|
||||
This component is both a report service and a ROM service. The
|
||||
clients of the report service can issue new clipboard content, which
|
||||
is then propagated to the clients of the ROM service according to a
|
||||
configurable information-flow policy.
|
||||
|
||||
:'os/src/server/event_filter':
|
||||
:_os/src/server/event_filter/_:
|
||||
A component that transforms and merges input events from multiple sources
|
||||
into a single event stream.
|
||||
|
||||
:'libports/src/app/acpi_event':
|
||||
:_libports/src/app/acpi_event/_:
|
||||
A component that transforms ACPI events into Genode input events.
|
||||
|
||||
:'gems/src/server/gui_fader':
|
||||
:_gems/src/server/gui_fader/_:
|
||||
A wrapper for nitpicker's GUI session interface that applies alpha-blending
|
||||
to the of views a GUI client.
|
||||
|
||||
@@ -461,37 +459,37 @@ implement the VFS-plugin interface. They can be combined with any application
|
||||
based on Genode's C runtime, with the VFS server, and with non-POSIX
|
||||
components that use the Genode's VFS library directly.
|
||||
|
||||
:'gems/src/lib/vfs/trace':
|
||||
:_gems/src/lib/vfs/trace/_:
|
||||
A VFS plugin that makes core's TRACE service accessible as a pseudo
|
||||
file system.
|
||||
|
||||
:'gems/src/lib/vfs/import':
|
||||
:_gems/src/lib/vfs/import/_:
|
||||
A VFS plugin that pre-populates a VFS with initial content.
|
||||
|
||||
:'gems/src/lib/vfs/pipe':
|
||||
:_gems/src/lib/vfs/pipe/_:
|
||||
A VFS plugin that provides bi-directional pipes for exchanging streamed
|
||||
data between components.
|
||||
|
||||
:'gems/src/lib/vfs/ttf':
|
||||
:_gems/src/lib/vfs/ttf/_:
|
||||
A VFS plugin that makes rendered pixel data of the glyphs of Truetype fonts
|
||||
available as a pseudo file system.
|
||||
|
||||
:'libports/src/lib/vfs/jitterentropy':
|
||||
:_libports/src/lib/vfs/jitterentropy/_:
|
||||
A VFS plugin that provides random numbers based on the jitter of executing
|
||||
CPU instructions.
|
||||
|
||||
:'libports/src/lib/vfs/lwip':
|
||||
:_libports/src/lib/vfs/lwip/_:
|
||||
A VFS plugin that uses the light-weight IP (lwIP) stack to provide a
|
||||
network socket interface as a pseudo file system.
|
||||
|
||||
:'dde_linux/src/lib/vfs/lxip':
|
||||
:_dde_linux/src/lib/vfs/lxip/_:
|
||||
A VFS plugin that uses the TCP/IP stack ported from the Linux kernel to
|
||||
provide a network socket interface as a pseudo file system.
|
||||
|
||||
:'libports/src/lib/vfs/fatfs':
|
||||
:_libports/src/lib/vfs/fatfs/_:
|
||||
A VFS plugin that allows for the mounting of FAT-formatted block devices.
|
||||
|
||||
:'dde_rump/src/lib/vfs/rump':
|
||||
:_dde_rump/src/lib/vfs/rump/_:
|
||||
A VFS plugin that enables the use of NetBSD's file-system drivers such
|
||||
as ext2 or msdos.
|
||||
|
||||
@@ -499,41 +497,41 @@ components that use the Genode's VFS library directly.
|
||||
Libraries
|
||||
=========
|
||||
|
||||
:'libports/lib/mk/libc':
|
||||
:_libports/lib/mk/libc/_:
|
||||
C runtime ported from FreeBSD.
|
||||
|
||||
:'libports/lib/mk/stdcxx':
|
||||
:_libports/lib/mk/stdcxx/_:
|
||||
Standard C++ library
|
||||
|
||||
:'libports/lib/mk/mesa_api':
|
||||
:_libports/lib/mk/mesa_api/_:
|
||||
Mesa OpenGL API with backends for software rasterization (egl_swrast)
|
||||
and Intel Graphics (egl_i965)
|
||||
|
||||
:'libports/lib/mk/mupdf':
|
||||
:_libports/lib/mk/mupdf/_:
|
||||
PDF rendering engine.
|
||||
|
||||
:'libports/lib/mk/ncurses':
|
||||
:_libports/lib/mk/ncurses/_:
|
||||
Library for implementing pseudo-graphical applications (i.e., VIM) that
|
||||
run on a text terminal.
|
||||
|
||||
:'libports/lib/mk/qt5_*':
|
||||
:_libports/lib/mk/qt5_*/_:
|
||||
Qt5 framework, using GUI session and NIC session as back end.
|
||||
|
||||
:'libports/lib/mk/vfs_jitterentropy.mk':
|
||||
:_libports/lib/mk/vfs_jitterentropy.mk_:
|
||||
A VFS plugin that makes a jitter-based random-number generator available
|
||||
as a file within the process-local VFS.
|
||||
|
||||
:'libports/lib/mk/libarchive.mk':
|
||||
:_libports/lib/mk/libarchive.mk_:
|
||||
Library providing a common interface to a variety of archive
|
||||
formats.
|
||||
|
||||
:'libports/lib/mk/lz4.mk':
|
||||
:_libports/lib/mk/lz4.mk_:
|
||||
Library for processing LZ4 lossless compression archives.
|
||||
|
||||
:'libports/lib/mk/liblzma.mk':
|
||||
:_libports/lib/mk/liblzma.mk_:
|
||||
Library for processing LZMA archives.
|
||||
|
||||
:'libports/lib/mk/libgcrypt.mk':
|
||||
:_libports/lib/mk/libgcrypt.mk_:
|
||||
GnuPG library for OpenPGP processing, e.g., signature verification.
|
||||
|
||||
|
||||
@@ -541,100 +539,96 @@ Applications
|
||||
############
|
||||
|
||||
Applications are Genode components that use other component's services but
|
||||
usually do not provide services. They are typically located in the 'src/app/'
|
||||
usually do not provide services. They are typically located in the _src/app/_
|
||||
subdirectory of a repository. Most applications come with README files
|
||||
located in their respective directory.
|
||||
|
||||
:'gems/src/app/backdrop':
|
||||
:_gems/src/app/backdrop/_:
|
||||
GUI client application that sets a composition of PNG images as desktop
|
||||
background.
|
||||
|
||||
:'demo/src/app/launchpad':
|
||||
:_demo/src/app/launchpad/_:
|
||||
Graphical application for interactively starting and killing subsystems.
|
||||
|
||||
:'gems/app/launcher': Graphical launcher of Genode subsystems.
|
||||
|
||||
:'demo/src/app/scout':
|
||||
:_demo/src/app/scout/_:
|
||||
Graphical hypertext browser used for Genode's default demonstration scenario.
|
||||
|
||||
:'libports/src/test/mesa_demo':
|
||||
Example programs for using the Mesa OpenGL graphics stack.
|
||||
|
||||
:'ports/src/app/arora':
|
||||
Arora is a Qt-based web browser using the Webkit engine.
|
||||
|
||||
:'ports/src/app/gdb_monitor':
|
||||
:_ports/src/app/gdb_monitor/_:
|
||||
Application that allows the debugging of a process via GDB over a remote
|
||||
connection.
|
||||
|
||||
:'libports/src/app/qt5/qt_launchpad':
|
||||
:_libports/src/app/qt5/qt_launchpad/_:
|
||||
Graphical application starter implemented using Qt.
|
||||
|
||||
:'libports/src/app/qt5/examples/':
|
||||
:_libports/src/app/qt5/examples/_:
|
||||
Several example applications that come with Qt.
|
||||
|
||||
:'os/src/app/sequence':
|
||||
:_os/src/app/sequence/_:
|
||||
Simple utility to serialize the execution of multiple components
|
||||
|
||||
:'ports/src/noux-pkg':
|
||||
:_ports/src/noux-pkg/_:
|
||||
Ports of popular commandline-based Unix software such as VIM, bash,
|
||||
coreutils, binutils, gcc, findutils, and netcat. The programs are supposed
|
||||
to be executed within the Noux runtime environment.
|
||||
|
||||
:'ports/src/app/lighttpd':
|
||||
:_ports/src/app/lighttpd/_:
|
||||
Lighttpd is a fast and feature-rich web server. The port of lighttpd uses
|
||||
a file-system session to access the website content and the web-server
|
||||
configuration.
|
||||
|
||||
:'os/src/app/trace_logger':
|
||||
:_os/src/app/trace_logger/_:
|
||||
Convenient, runtime-configurable frontend to the tracing facility.
|
||||
|
||||
:'os/src/app/rom_reporter':
|
||||
:_os/src/app/rom_reporter/_:
|
||||
The ROM-reporter component requests a ROM session and reports the
|
||||
content of the ROM dataspace to a report session with the same label
|
||||
as the ROM session.
|
||||
|
||||
:'os/src/app/log_core':
|
||||
:_os/src/app/log_core/_:
|
||||
Component transforming core and kernel output to Genode LOG output.
|
||||
|
||||
|
||||
Package-management components
|
||||
=============================
|
||||
|
||||
:'gems/src/app/depot_query':
|
||||
:_gems/src/app/depot_query/_:
|
||||
Tool for querying subsystem information from a depot.
|
||||
|
||||
:'gems/src/app/depot_download_manager':
|
||||
:_gems/src/app/depot_download_manager/_:
|
||||
Tool for managing the download of depot content.
|
||||
|
||||
:'gems/src/app/depot_deploy':
|
||||
:_gems/src/app/depot_deploy/_:
|
||||
Subsystem init configuration generator based on blueprints.
|
||||
|
||||
:'libports/src/app/fetchurl':
|
||||
:_libports/src/app/fetchurl/_:
|
||||
A runtime-configurable frontend to the libcURL library for
|
||||
downloading content.
|
||||
|
||||
:'libports/src/app/extract':
|
||||
:_libports/src/app/extract/_:
|
||||
Tool for extracting archives using libarchive.
|
||||
|
||||
:'ports/src/app/verify':
|
||||
:_ports/src/app/verify/_:
|
||||
This component verifies detached OpenPGP signatures using libgcrypt.
|
||||
|
||||
|
||||
Runtime environments
|
||||
####################
|
||||
|
||||
:'ports/src/app/seoul': Seoul is a virtual-machine monitor developed for
|
||||
:_ports/src/app/seoul/_: Seoul is a virtual-machine monitor developed for
|
||||
the use with the NOVA platform. It virtualizes 32bit x86 PC hardware
|
||||
including various peripherals.
|
||||
|
||||
:'os/src/server/loader': A service that allows the creation and destruction
|
||||
:_os/src/server/loader/_: A service that allows the creation and destruction
|
||||
of Genode subsystems via a session interface. For further information,
|
||||
refer to 'os/src/server/loader/README'.
|
||||
refer to _os/src/server/loader/README_.
|
||||
|
||||
:'ports/src/virtualbox': VirtualBox running on top of the NOVA hypervisor.
|
||||
:_ports/src/virtualbox5/_: VirtualBox running on top of the NOVA hypervisor.
|
||||
|
||||
:'os/src/server/vmm': A virtual machine monitor that is based on
|
||||
:_os/src/server/vmm/_: A virtual machine monitor that is based on
|
||||
hardware-assisted virtualization of ARM platforms. It is supported on
|
||||
the base-hw kernel only.
|
||||
|
||||
:_os/src/server/cpu_balancer/_: The CPU balancer intercepts the interaction
|
||||
of components with core's low-level services to migrate threads dynamically
|
||||
between CPU cores.
|
||||
|
||||
|
||||
@@ -50,9 +50,17 @@ This creates a new build directory for building x86_64 binaries in './build'.
|
||||
The build system creates unified binaries that work on the given
|
||||
architecture independent from the underlying base platform, in this case Linux.
|
||||
|
||||
To give Genode a try, build and execute a simple demo scenario via:
|
||||
Now change into the fresh build directory:
|
||||
|
||||
! cd build/x86_64
|
||||
|
||||
Please uncomment the following line in 'etc/build.conf' to make the
|
||||
build process as smooth as possible.
|
||||
|
||||
! RUN_OPT += --depot-auto-update
|
||||
|
||||
To give Genode a try, build and execute a simple demo scenario via:
|
||||
|
||||
! make KERNEL=linux BOARD=linux run/demo
|
||||
|
||||
By invoking 'make' with the 'run/demo' argument, all components needed by the
|
||||
|
||||
66
doc/news.txt
66
doc/news.txt
@@ -4,6 +4,72 @@
|
||||
===========
|
||||
|
||||
|
||||
Genode OS Framework release 20.11 | 2020-11-27
|
||||
##############################################
|
||||
|
||||
| Genode 20.11 brings Sculpt OS to 64-bit ARM hardware, introduces dynamic
|
||||
| CPU-load balancing, and enables multicore virtualization on ARM. Driver-wise,
|
||||
| the release improves audio on PC hardware, and adds VirtIO networking support.
|
||||
|
||||
ARM 64-bit has been a recurring theme of the Genode releases this year and the
|
||||
just released version 20.11 is no exception. We are proud to announce that our
|
||||
Genode-based custom general-purpose OS called Sculpt has come to life on
|
||||
64-bit ARM hardware, namely the NXP i.MX8 EVK board. This is the result of
|
||||
intensive work on the framework's driver architecture for ARM and several
|
||||
SoC-specific device drivers. Closely related to this line of work is the new
|
||||
ability to run multicore virtual machines on ARM.
|
||||
|
||||
Another highlight of version 20.11 is a new CPU balancing mechanism, which
|
||||
automates the dynamic assignment of threads to CPU cores for complex
|
||||
workloads. With traditional operating systems, such policies are normally part
|
||||
of the OS kernel. Thanks to Genode's component architecture, we are able to
|
||||
implement such potentially complex policies in the form of an optional
|
||||
component, which offers ultimate flexibility while keeping the kernel
|
||||
untainted by complex heuristics.
|
||||
|
||||
Further topics of the current release are improved power management and audio
|
||||
support on PC hardware, a new OSS API emulation that allows for the
|
||||
reuse of popular audio applications on Genode, and new support for VirtIO
|
||||
networking. The full picture is given by the
|
||||
[https:/documentation/release-notes/20.11 - release documentation of version 20.11...]
|
||||
|
||||
|
||||
Sculpt OS release 20.08 | 2020-09-17
|
||||
####################################
|
||||
|
||||
| Version 20.08 of the Sculpt operating system refines the user experience
|
||||
| and becomes able to host the Chromium-based Falkon web browser.
|
||||
|
||||
The new version of Sculpt OS is based on the latest Genode release
|
||||
[https://genode.org/documentation/release-notes/20.08 - 20.08].
|
||||
In particular, it incorporates the
|
||||
[https://genode.org/documentation/release-notes/20.08#The_GUI_stack__restacked - redesigned GUI stack]
|
||||
to the benefit of quicker boot times, improved interactive responsiveness, and
|
||||
better pixel output quality.
|
||||
It also removes the last traces of the
|
||||
[https://genode.org/documentation/release-notes/20.05#Retired_Noux_runtime_environment - noux runtime].
|
||||
Fortunately, these massive under-the-hood changes do not disrupt the
|
||||
user-visible surface of Sculpt. Most users will feel right at home.
|
||||
|
||||
Upon closer inspection, there are couple of new features to appreciate. The
|
||||
CPU-affinity of each component can now be restricted interactively by the user,
|
||||
components can be easily restarted via a click on a button, font-size changes
|
||||
have an immediate effect now, and the VESA driver (used when running Sculpt in
|
||||
a virtual machine) can dynamically change the screen resolution.
|
||||
|
||||
Thanks to our continuous efforts of strengthening of the base system, Sculpt
|
||||
OS has become able to host a first version of the Chromium-based Falkon web
|
||||
browser from an installable package. Even though this version is still rough
|
||||
around the edges and unoptimized, it already enables Sculpt users to casually
|
||||
browse the modern web without the need for a virtual machine.
|
||||
|
||||
The updated [https://genode.org/documentation/articles/sculpt-20-08 - manual]
|
||||
goes into detail about the use of the new system.
|
||||
|
||||
The ready-to-use system image for version 20.08 is available at the
|
||||
[https://genode.org/download/sculpt - Sculpt download page].
|
||||
|
||||
|
||||
Genode OS Framework release 20.08 | 2020-08-28
|
||||
##############################################
|
||||
|
||||
|
||||
@@ -34,10 +34,10 @@ like swapping out or updating drivers on the fly without reboot.
|
||||
Besides these main topics, the current release features the continuation of of
|
||||
two long-term projects, namely the CBE block encrypter and the profound
|
||||
support of 64-bit ARM devices.
|
||||
Section [Consistent Block Encrypter] describes the CBE's new *pluggable
|
||||
crypto* and trust anchor facilities.
|
||||
Section [Device drivers] goes into detail about the steadily emerging *driver
|
||||
landscape on 64-bit ARM*.
|
||||
Section [Consistent Block Encrypter] describes the CBE's new *pluggable crypto*
|
||||
and trust anchor facilities.
|
||||
Section [Device drivers] goes into detail about the steadily
|
||||
emerging *driver landscape on 64-bit ARM*.
|
||||
|
||||
|
||||
The GUI stack, restacked
|
||||
@@ -423,8 +423,8 @@ C runtime
|
||||
Serialized VFS access
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Unsurprisingly, the VFS is an integral part of the C runtime as _everything is
|
||||
a file_ in the UNIX philosophy. The basis for the libc VFS is the VFS library
|
||||
Unsurprisingly, the VFS is an integral part of the C runtime as _everything is_
|
||||
_a file_ in the UNIX philosophy. The basis for the libc VFS is the VFS library
|
||||
and its versatile plugin concept. As the libc (and other users of the library)
|
||||
may employ multiple threads, which could use the VFS, the integrity of data
|
||||
structures, esp. those of more complex plugins like the network stack in
|
||||
629
doc/release_notes/20-11.txt
Normal file
629
doc/release_notes/20-11.txt
Normal file
@@ -0,0 +1,629 @@
|
||||
|
||||
|
||||
===============================================
|
||||
Release notes for the Genode OS Framework 20.11
|
||||
===============================================
|
||||
|
||||
Genode Labs
|
||||
|
||||
|
||||
|
||||
With Genode 20.11, we focused on the scalability of real-world application
|
||||
workloads, and nurtured Genode's support for 64-bit ARM hardware. We thereby
|
||||
follow the overarching goal to run highly sophisticated Genode-based systems
|
||||
on devices of various form factors.
|
||||
|
||||
When speaking of real-world workloads, we acknowledge that we cannot always
|
||||
know the exact behavior of applications. The system must deal gracefully with
|
||||
many unknowns: The roles and CPU intensity of threads, the interplay of
|
||||
application code with I/O, memory-pressure situations, or the sudden fragility
|
||||
of otherwise very useful code. The worst case must always be anticipated. In
|
||||
traditional operating systems, this implies that the OS kernel needs to be
|
||||
aware of certain behavioral patterns of the applications, and has to take
|
||||
decisions based on heuristics. Think of CPU scheduling, load balancing among
|
||||
CPU cores, driving power-saving features of the hardware, memory swapping,
|
||||
caching, and responding to near-fatal situations like OOM.
|
||||
|
||||
Genode allows us to move such complex heuristics outside the kernel into
|
||||
dedicated components. Our new CPU balancer described in Section
|
||||
[CPU-load balancing] is a living poster child of our approach. With this
|
||||
optional component, a part of a Genode system can be subjected to a CPU-load
|
||||
balancing policy of arbitrary complexity without affecting the quality of
|
||||
service of unrelated components, and without polluting the OS kernel with
|
||||
complexity.
|
||||
|
||||
A second aspect of real-world workloads is that they are usually *not*
|
||||
designed for Genode. To accommodate the wealth of time tested applications, we
|
||||
need to bridge the massive gap between APIs of olde (think of POSIX) and
|
||||
Genode's clean-slate interfaces.
|
||||
Section [Streamlined ioctl handling in the C runtime / VFS] shows how the
|
||||
current release leverages our novel VFS concept for the emulation of
|
||||
traditional ioctl-based interfaces. So useful existing applications come to
|
||||
live without compromising the architectural benefits of Genode.
|
||||
|
||||
Platform-wise, the new release continues our mission to host Genode-based
|
||||
systems such as [https://genode.org/download/sculpt - Sculpt OS] on 64-bit
|
||||
ARM hardware. This work entails intensive development of device drivers and
|
||||
the overall driver architecture.
|
||||
Section [Sculpt OS on 64-bit ARM hardware (i.MX8 EVK)] reports on the
|
||||
achievement of bringing Sculpt to 64-bit i.MX8 hardware. This line of work
|
||||
goes almost hand in hand with the improvements of our custom virtual machine
|
||||
monitor for ARM as outlined in Section [Multicore virtualization on ARM].
|
||||
|
||||
|
||||
CPU-load balancing
|
||||
##################
|
||||
|
||||
Migrating load over CPUs may be desirable in dynamic scenarios, where the
|
||||
workload is not known in advance or too complex. For example, in case of POSIX
|
||||
software ported to Genode, amount and roles of threads and processes can
|
||||
generally not planned for. With the current release, we add an optional CPU
|
||||
service designated for such dynamic scenarios. The new component called
|
||||
[https://genodians.org/alex-ab/2020-11-16-cpu-balancer - CPU balancer] is able
|
||||
to monitor threads and their utilization behaviour. Depending on configured
|
||||
policies, the balancer can instruct Genode's core via the CPU session
|
||||
interface to migrate threads between CPUs.
|
||||
|
||||
[image cpu_balancer]
|
||||
The CPU balancer intercepts the interaction of a Genode subsystem
|
||||
(workload) with core's low-level CPU service.
|
||||
|
||||
This feature requires a kernel that supports thread migration, which are
|
||||
Fiasco.OC, seL4, and to some degree the NOVA kernel. For the NOVA kernel,
|
||||
solely threads with an attached scheduling context can be migrated, which are
|
||||
'Genode::Thread' and POSIX pthread instances. Genode's entrypoint and virtual
|
||||
CPU instances are not supported.
|
||||
|
||||
The feature can be tested by the scenario located at _repos/os/run/cpu_balancer.run_.
|
||||
Further information regarding policy configuration, a demo integration into
|
||||
Sculpt 20.08, and a screencast video are available as a dedicated
|
||||
[https://genodians.org/alex-ab/2020-11-16-cpu-balancer - CPU balancer]
|
||||
article.
|
||||
|
||||
|
||||
Sculpt OS on 64-bit ARM hardware (i.MX8 EVK)
|
||||
############################################
|
||||
|
||||
Within the last year, a lot of effort was put into Genode's support for ARM
|
||||
64-bit hardware. A consequent next step was to port Sculpt OS to the i.MX8 EVK
|
||||
board, which we have used so far as reference platform. With the current
|
||||
release, we proudly present the first incarnation of Sculpt OS for this board.
|
||||
|
||||
In contrast to the original x86 PC variant, this first ARM version ships with
|
||||
a static set of devices inside the drivers subsystem. No device manager
|
||||
component probes for the used hardware and starts drivers on demand. Instead,
|
||||
the set of drivers defined in the _drivers_managed-imx8q_evk_ package enables
|
||||
USB HID devices to make use of mouse and keyboard peripherals connected to the
|
||||
board. It drives the SD-card, which can be used as storage back end for
|
||||
Genode's depot package management. Finally, it contains drivers to manage the
|
||||
display engine and the platform's device resources.
|
||||
|
||||
With Sculpt OS for ARM 64-bit, we not only aim for classical desktop/notebook
|
||||
systems - like on x86 - but also for embedded consumer hardware like phones
|
||||
and tablets. In order to leverage this goal, we enabled support for
|
||||
[https://www.nxp.com/design/development-boards/i-mx-evaluation-and-development-boards/i-mx-8-series-accessory-boards:i.MX8-ACCESSORY-BOARDS - NXP's MX8_DSI_OLED1]
|
||||
display on the i.MX8 platform on Genode. The panel features an OLED display as
|
||||
well as a Synaptics RMI4 compliant touch screen.
|
||||
|
||||
Genode's i.MX8 display driver that we released with version
|
||||
[https://genode.org/documentation/release-notes/20.02#Display_engine - 20.02]
|
||||
supported HDMI devices only, whereas the OLED display is connected via
|
||||
[https://www.mipi.org/specifications/dsi - MIPI DSI] to the SoC. Therefore, we
|
||||
extended the display driver by the MIPI DSI infrastructure as well as the
|
||||
actual driver for the OLED display. This endeavor turned out to be a very
|
||||
rocky one, which we have documented in detail on our
|
||||
[https://genodians.org/ssumpf/2020-09-30-mipi_touch - Genodians] website.
|
||||
|
||||
[image imx8_oled]
|
||||
The administrative user interface of Sculpt OS responds to touch input.
|
||||
|
||||
In order to enable the touch screen device, we implemented a new Genode
|
||||
component from scratch. The touch screen is connected via an I2C bus to the
|
||||
SoC where data can be sent to and received from. At the moment, the I2C
|
||||
implementation is hidden within the driver but as more devices require I2C
|
||||
access, it will eventually become a standalone component. Interrupts are
|
||||
delivered via GPIO pins from the touch screen to the SoC, which made it
|
||||
necessary to enable i.MX8 support within Genode's generic i.MX GPIO driver. We
|
||||
took this as an opportunity to streamline, cleanup, and make the driver more
|
||||
robust. Additionally, all driver components now take advantage of the new
|
||||
platform driver API for ARM that has been introduced with release
|
||||
[https://genode.org/documentation/release-notes/20.05#New_platform_driver_for_the_ARM_universe - 20.05].
|
||||
|
||||
In its current incarnation, the driver for the display management is not able
|
||||
to switch in between HDMI or MIPI-DSI connected displays dynamically.
|
||||
Therefore, the display to be used in Sculpt has to be configured in the
|
||||
framebuffer configuration manually. By default the HDMI connector is used.
|
||||
|
||||
Beyond the driver subsystem, there are few components dependent on the actual
|
||||
hardware, which is why the look & feel of the Sculpt desktop does not actually
|
||||
differ from the x86 PC version, with the following exceptions:
|
||||
|
||||
When you select the network configuration dialog, you'll have no "Wifi" option
|
||||
because of the missing hardware. However, the "Wired" option allows you to
|
||||
start the corresponding driver for the i.MX FEC Ethernet device. The second
|
||||
difference to the Sculpt OS x86 PC variant is the absence of a virtual machine
|
||||
solution at the moment. Although Genode comprises a mature
|
||||
virtual-machine-monitor solution for ARM - see
|
||||
Section [Multicore virtualization on ARM] - it still lacks a reasonable
|
||||
storage back end. Therefore, we left virtualization out of the picture for
|
||||
now. Lastly, there is no possibility to use USB block devices, because the
|
||||
required management component - a driver manager for i.MX8 - does not exist
|
||||
yet. We plan to bridge these remaining few gaps compared to the x86 version
|
||||
with the upcoming Genode releases.
|
||||
|
||||
To give Sculpt a try on the i.MX8 EVK board, you have to start the well-known
|
||||
Sculpt run-script as usual, but for the base-hw kernel. For example:
|
||||
|
||||
! tool/create_builddir arm_v8a
|
||||
! cd build/arm_v8a
|
||||
! make run/sculpt KERNEL=hw BOARD=imx8q_evk
|
||||
|
||||
Under the hood, the run script requests a sculpt-<board> specific package from
|
||||
the depot package system. Currently, _sculpt-pc_ and _sculpt-imx8q_evk_ are
|
||||
available.
|
||||
|
||||
|
||||
Multicore virtualization on ARM
|
||||
###############################
|
||||
|
||||
The written-from-scratch virtualization solution for Genode on ARMv8 entered the
|
||||
picture exactly one year ago with
|
||||
[https://genode.org/documentation/release-notes/19.11#Virtualization_of_64-bit_ARM_platforms - release 19.11].
|
||||
Since then, a couple of improvements and validations have been incorporated
|
||||
into it. Support for VirtIO network and console models had been added.
|
||||
Moreover, it got streamlined with our prior existing ARMv7 hypervisor and
|
||||
virtual-machine monitor (VMM). But although the architecture of the VMM was
|
||||
designed from the very beginning with more than one virtual-CPU (VCPU) in
|
||||
mind, running a VM on multiple cores had not been addressed nor tested.
|
||||
|
||||
With this release, we enhance the virtualization support of the base-hw
|
||||
kernel, acting as the ARM hypervisor, to support multicore virtual machines.
|
||||
The VMM implementation got extended to start an entrypoint for each VCPU owned
|
||||
by a VM. The affinities of those entrypoints are configured to distribute over
|
||||
all physical CPUs available to the VMM. The affinity of an entrypoint that
|
||||
handles events of a VCPU is automatically used as the affinity of the VCPU
|
||||
itself. Whenever a VCPU exit needs to be handled, this is delegated to the VMM
|
||||
entrypoint running on the same CPU. Once the VMM's entrypoint successfully
|
||||
handled the exit reason, it resumes the VCPU.
|
||||
|
||||
Formerly, the control to start or stop a VCPU was implemented by core's VM
|
||||
service that runs on the first CPU. But that implied that all different VMM
|
||||
entrypoints running on distinct CPUs would have needed to frequently call
|
||||
core's service entrypoint on the first CPU, inducing costly cross-CPU
|
||||
communication. This is amplified by the fact that core's entrypoint uses a
|
||||
system call to instruct the kernel's internal scheduler of the corresponding
|
||||
target CPU, which again would potentially target a remote CPU. For simplifying
|
||||
the implementation and for improving performance, we slightly extended the
|
||||
VM-session interface to return a kernel-specific capability addressing a VCPU
|
||||
directly. With this capability, a VMM's entrypoint is able to directly call
|
||||
the kernel to start or stop a VCPU instead of using the indirection over core.
|
||||
However, the detail whether the kernel is called directly or not is hidden
|
||||
behind the VM session client API and transparent to the user.
|
||||
|
||||
|
||||
Base framework and OS-level infrastructure
|
||||
##########################################
|
||||
|
||||
C runtime
|
||||
=========
|
||||
|
||||
We improved the support for aligned memory allocations to fix sporadic memory
|
||||
leaks, which occurred with our port of the Falkon web browser. One relevant
|
||||
change is the implementation of the 'posix_memalign()' function, another
|
||||
change is that the address alignment of anonymous 'mmap()' allocations is now
|
||||
configurable like follows:
|
||||
|
||||
! <config>
|
||||
! <libc>
|
||||
! <mmap align_log2="21"/>
|
||||
! </libc>
|
||||
! </config>
|
||||
|
||||
|
||||
Standard C++ library
|
||||
====================
|
||||
|
||||
Even though Genode uses C++ as its primary programming language, we do not
|
||||
rely on or make use of any C++ standard library within the Genode OS
|
||||
framework. However, since a C++ STL is a vital part of application programming
|
||||
with C++, we provide one for applications built on top of the base framework;
|
||||
in particular the GNU C++ STL library (_libstdc++_). It is treated as a
|
||||
regular 3rd party library and its functionality is extended on demand. This
|
||||
approach worked well enough to even enable larger C++-based software like Qt5
|
||||
and Chromium's Blink engine (as part of QtWebEngine) to run on Genode. That
|
||||
being said, for developers using _libstdc++_ on Genode, it is not immediately
|
||||
clear, which features are supported and which are not.
|
||||
|
||||
Fortunately, _libstdc++_ includes a testsuite that - as the name suggests -
|
||||
allows for testing the range of functionality of the library on a given
|
||||
platform. So we turned to it to establish a base line of supported features.
|
||||
We were particularly interested in how our port behaves when C++17 is
|
||||
requested. It goes without saying that this only includes the aspects, which
|
||||
are specifically probed by the testsuite. Rather than adding thorough Genode
|
||||
support to the testsuite, we opted for providing an
|
||||
[https://github.com/cnuke/genode-libstdcxx-testsuite/ - environment] that
|
||||
mimics the common 'unix' target and allows us to execute the testsuite on
|
||||
the Linux version of Genode via a regular Linux host OS. It uses the Genode
|
||||
tool chain to compile the tests and spawns a Genode base-linux system to
|
||||
execute them.
|
||||
|
||||
Executing the testsuite was an iterative process because in the beginning, we
|
||||
encountered many falsely failed tests. On one hand, most of them were due to
|
||||
the way C++ is applied in Genode or rather how our build system works
|
||||
internally. For one, _libsupc++_ on Genode is part of the _cxx_ library. This
|
||||
library in turn is part of _ldso.lib.so_, the dynamic linker that provides
|
||||
the base API. As the build system uses stub libraries generated from 'symbol'
|
||||
files containing the ABI of a given shared object, each missing symbol must
|
||||
be made available. Otherwise the linking step is going to fail complaining
|
||||
about undefined references because components use these stub libraries
|
||||
during compilation. On the other hand, we had to get cozy with the testsuite's
|
||||
underlying test framework in order to get our test environment straight.
|
||||
|
||||
In case of the testsuite, there were a lot of symbols missing because we did
|
||||
not encounter them so far in our workloads, and thus, were not part of the
|
||||
symbols file. After all, templates will always generate specific symbols that
|
||||
are difficult to foresee. Besides that, we lacked support for aligned 'new'
|
||||
and 'delete' operators. With these adaptions in place, we were able to
|
||||
successfully execute the testsuite.
|
||||
|
||||
In the end, the results paint a good picture. The current short-comings boil
|
||||
down to
|
||||
|
||||
* Support for the *stdc++fs* library is not available as the library is
|
||||
not ported yet.
|
||||
* Proper *locale* support in the 'libc' as well as 'stdc++' is not available.
|
||||
* Support for parallel operations with *openmp* is not available.
|
||||
* Various subsystems ('std::thread', 'std::random_device', numerics library)
|
||||
need further attention for proper functionality. This is most prominent
|
||||
for the failing execution tests where sometimes the threads appear to
|
||||
get stuck.
|
||||
|
||||
These findings are documented at issue
|
||||
[https://github.com/genodelabs/genode/issues/3925 - 3925].
|
||||
|
||||
|
||||
Consistent Block Encrypter (CBE)
|
||||
================================
|
||||
|
||||
The CBE is a library for the management of encrypted block-devices that is
|
||||
entirely written in SPARK. It was first announced and integrated with
|
||||
[https://genode.org/documentation/release-notes/19.11#Preliminary_block-device_encrypter - Genode 19.11],
|
||||
reached feature-completeness with
|
||||
[https://genode.org/documentation/release-notes/20.05#Feature-completeness_of_the_consistent_block_encrypter - Genode 20.05],
|
||||
and has received a highly modular back-end system with version
|
||||
[https://genode.org/documentation/release-notes/20.08#Consistent_Block_Encrypter - 20.08].
|
||||
For this release, we thoroughly streamlined the CBE repository, added enhanced
|
||||
automated quality assurance, and switched to another default encryption
|
||||
back end.
|
||||
|
||||
|
||||
Repository restructuring
|
||||
------------------------
|
||||
|
||||
Generally speaking, the [https://github.com/m-stein/cbe - CBE repository] has
|
||||
been freed from everything that is not either part of the SPARK-based core
|
||||
logic (cbe, cbe_common, and the hashing algorithm), the essential SPARK-based
|
||||
tooling (initialization, checking), or the Ada-based C++ bindings (*_cxx
|
||||
libraries). The whole Genode-specific integration, testing, and packaging
|
||||
moved to Genode's 'gems' repository and the former Genode sub-repository 'cbe'
|
||||
was replaced by the new CBE port _gems/ports/cbe.port_. We also took the
|
||||
opportunity to remove many unused remnants of earlier development stages and
|
||||
to drastically simplify the ecosystem of CBE-related packages.
|
||||
|
||||
We hope that this allows for certain characteristics of the CBE project, like
|
||||
its strong OS-independence or a completely "flow-mode"-provable core logic to
|
||||
become more clear, while at the same time, the Genode-specific accessories can
|
||||
benefit from being part of Genode's mainline development.
|
||||
|
||||
|
||||
Automated testing, benchmarking, and proving
|
||||
--------------------------------------------
|
||||
|
||||
The CBE tester is a scriptable environment meant for testing all aspects of
|
||||
the CBE library and its basic tooling. Through its XML command interface, one
|
||||
can not only access and validate data of CBE devices but also initialize them,
|
||||
check their consistency, analyze their meta data, execute performance
|
||||
benchmarks, manage device snapshots, perform online re-keying or online
|
||||
re-dimensioning of devices, and, last but not least, manage the required Trust
|
||||
Anchors.
|
||||
|
||||
Before this release, the CBE tester was a mere patchwork solution and many of
|
||||
the above mentioned features were limited or even missing. For instance block
|
||||
access was issued only in a synchronous fashion, the Trust-Anchor was managed
|
||||
implicitly, and validating read data wasn't possible. Besides adding the
|
||||
missing features, we also reworked the component entirely to follow a clean
|
||||
and comprehensible implementation concept. The new CBE tester comes together
|
||||
with the run script _gems/run/cbe_tester.run_ that shall serve as both a
|
||||
demonstration how to use the tester and an extensive automated test and
|
||||
benchmark for the CBE.
|
||||
|
||||
Furthermore, we created the CBE-specific autopilot tool _tool/cbe_autopilot_
|
||||
that is meant to establish a common reference for the quality of CBE releases
|
||||
as well as for their integration in Genode. Running the tool without arguments
|
||||
will give instructions how to use it. In a nutshell, when running
|
||||
'tool/cbe_autopilot basics', the tool will GNAT-prove what is expected to be
|
||||
provable, run all CBE-related run scripts expected to work, and build all
|
||||
CBE-related packages (existing build and depot directories are not touched in
|
||||
this process). The idea is to make the successful execution of the test
|
||||
mandatory before advancing the master branch of the CBE repository or
|
||||
releasing a new version of the integration in Genode. A handy side-feature of
|
||||
the tool is that one can run 'tool/cbe_autopilot prove' to do only the
|
||||
GNAT-proving part. With 'tool/cbe_autopilot clean' finally, the tool cleans up
|
||||
all of its artifacts.
|
||||
|
||||
|
||||
Libcrypto back end for block encryption
|
||||
---------------------------------------
|
||||
|
||||
The introduction of VFS plugins for CBE back ends in the previous Genode
|
||||
release made it much easier to interchange concrete implementations. This
|
||||
motivated us to play around a bit in our endeavour of optimizing execution
|
||||
time. It turned out that especially the choice of the block-encryption back
|
||||
end has a significant impact on the overall performance of CBE block
|
||||
operations. It furthermore seemed that especially the 'libsparkcrypto'
|
||||
library, our former default for block encryption, prioritizes other qualities
|
||||
over performance.
|
||||
|
||||
That said, in general, we want to enable an informed user to decide for him-
|
||||
or herself which qualities one prefers in such an algorithm. The VFS plugin
|
||||
mechanism pays tribute to this. And it also seems very natural to us to
|
||||
combine a SPARK-based block-device management with a SPARK-based encryption
|
||||
back-end like 'libsparkcrypto'. But for our default use case, we came to the
|
||||
conclusion that the 'libcrypto' library might be a better choice.
|
||||
|
||||
|
||||
Streamlined ioctl handling in the C runtime / VFS
|
||||
=================================================
|
||||
|
||||
The Genode release
|
||||
[https://genode.org/documentation/release-notes/19.11#C_runtime_with_improved_POSIX_compatibility - 19.11]
|
||||
introduced the emulation of ioctl operations via pseudo files. This feature
|
||||
was first used by the Terminal. With the current release, we further employ
|
||||
this mechanism for additional ioctl operations, like the block-device related
|
||||
I/O controls, as the long-term plan is to remove the notion of ioctl's from
|
||||
the 'Vfs::File_io_services' API all-together.
|
||||
|
||||
We therefore equipped the block VFS-plugin with a compound directory hosting
|
||||
the pseudo files for triggering device operations:
|
||||
|
||||
:info: This file contains the device information structured as 'block'
|
||||
XML node having 'size' and 'count' attributes providing the used block size
|
||||
as well as the total number of blocks.
|
||||
|
||||
:block_count: contains the total number of blocks.
|
||||
|
||||
:block_size: contains the size of one block in bytes.
|
||||
|
||||
Furthermore, we split the existing 'ioctl' handling method in the libc into
|
||||
specific ones for dealing with terminals and block devices because at some
|
||||
point more different groups of I/O controls are to follow.
|
||||
|
||||
The first one to follow is the 'SNDCTL' group. This group deals with audio
|
||||
devices and corresponds to the standard set by the OpenSoundSystem (OSS)
|
||||
specification years ago. In the same vein as the terminal and block I/O
|
||||
controls, the sound controls are implemented via property files.
|
||||
|
||||
The controls currently implemented are the ones used by the OSS-output plugin
|
||||
of [https://cmus.github.io/ - cmus], the driving factor behind the
|
||||
implementation, which uses the (obsolete) version 3 API.
|
||||
|
||||
At the moment, it is not possible to set or rather change any parameters. In
|
||||
case the requested setting differs from the parameters of the underlying
|
||||
audio-out session - in contrast to the suggestion in the OSS manual - we do
|
||||
not silently adjust the parameters returned to the callee but let the I/O
|
||||
control operation fail.
|
||||
|
||||
The following list contains the currently handled SNDCTL I/O controls:
|
||||
|
||||
:SNDCTL_DSP_CHANNELS: sets the number of channels. We return the available
|
||||
channels here and return ENOTSUP if it differs from the requested number of
|
||||
channels.
|
||||
|
||||
:SNDCTL_DSP_GETOSPACE: returns the amount of playback data that can be written
|
||||
without blocking. For now it amounts the space left in the stream buffer of
|
||||
the audio-out session.
|
||||
|
||||
:SNDCTL_DSP_POST: forces playback to start. We do nothing and return success.
|
||||
|
||||
:SNDCTL_DSP_RESET: is supposed to reset the device when it is active before
|
||||
any parameters are changed. We do nothing and return success.
|
||||
|
||||
:SNDCTL_DSP_SAMPLESIZE: sets the sample size. We return the sample size of the
|
||||
underlying audio-out session and return ENOTSUP if it differs from the
|
||||
requested format.
|
||||
|
||||
:SNDCTL_DSP_SETFRAGMENT: sets the buffer size hint. We ignore the hint and
|
||||
return success.
|
||||
|
||||
:SNDCTL_DSP_SPEED: sets the sample rate. For now, we always return the rate of
|
||||
the underlying audio out session and return ENOTSUP if it differs from the
|
||||
requested one.
|
||||
|
||||
The libc extension is accompanied by an OSS VFS plugin that gives access to an
|
||||
audio-out session by roughly implementing an OSS pseudo-device. It merely
|
||||
wraps the session and does not provide any form of resampling or re-coding of
|
||||
the audio stream.
|
||||
|
||||
[image cmus]
|
||||
|
||||
Image [cmus] depicts how the various pieces work together in a real-world
|
||||
scenario. The interplay of the extended libc with the OSS VFS plugin allows
|
||||
for listening to MP3s - for the time being the format is restricted to
|
||||
44.1kHz/16bit - on Sculpt using the [https://cmus.github.io/ - cmus]
|
||||
audio player.
|
||||
|
||||
The current state serves as a starting point for further implementing the OSS
|
||||
API to cover more use cases, especially with ported POSIX software like
|
||||
VirtualBox and Qt5 or even as SDL2 audio back end. While showing its age, OSS
|
||||
is still supported by the majority of middle ware and makes for a decent
|
||||
experimentation target.
|
||||
|
||||
|
||||
Device drivers
|
||||
##############
|
||||
|
||||
VirtIO support
|
||||
==============
|
||||
|
||||
Thanks to the remarkable contribution by Piotr Tworek, the Genode OS framework
|
||||
has become able to drive VirtIO network devices.
|
||||
|
||||
He did not only provide a single VirtIO network driver but a framework to
|
||||
easily add more VirtIO driver classes in the future. Either the devices are
|
||||
connected as PCI devices or directly as platform devices with fixed
|
||||
memory-mapped I/O addresses. The framework supports both and abstracts away
|
||||
from the concrete connection type.
|
||||
|
||||
The VirtIO network driver enables networking for Genode when using the
|
||||
'virt_qemu' board on either the ARMv7a or ARMv8a architecture. However, the
|
||||
VirtIO device configuration on Qemu is dynamic. The order and presence of
|
||||
different command line switches affect the bus address and interrupt
|
||||
assignment of each device. To make the use of Genode with Qemu robust in
|
||||
changing environments, a tiny helper component was supplemented. This
|
||||
component named 'virtdev_rom' probes the memory-mapped I/O areas of the system
|
||||
bus and detects available and known VirtIO devices. The results are provided
|
||||
in the form of a configuration that can be consumed by the platform driver to
|
||||
assign the correct device resources to the corresponding VirtIO driver.
|
||||
|
||||
The VirtIO network driver in action, as well as the interplay of the platform
|
||||
driver and the 'virtdev_rom' component can be observed when using the
|
||||
'drivers_nic-virt_qemu' package.
|
||||
|
||||
|
||||
Improved support for OpenBSD audio drivers
|
||||
==========================================
|
||||
|
||||
So far, the supported drivers exclusively used PCI as transport bus and for
|
||||
practical reasons, the emulation environment was tied to it. The bus handling
|
||||
has now moved into its own compilation unit to make future addition of drivers
|
||||
that employ other transport buses easier. On the same account, the component
|
||||
got renamed to 'pci_audio_drv' to reflect its bus connection.
|
||||
|
||||
While at it, the execution flow of the component got adapted. The kernel code
|
||||
should have been executed within the context of the main task like it is done
|
||||
in the DDE Linux drivers. The initial port of the HDA driver, however, called
|
||||
the code directly from within the session as there was no immediate reason to
|
||||
use a task context because suspending the execution was not needed. When using
|
||||
USB devices, that is no longer possible as we have to suspend the execution
|
||||
during the execution of the kernel code. So we pass in the audio data and
|
||||
schedule the emulated BSD kernel code.
|
||||
|
||||
The above mentioned changes are mostly preliminary clean-up work for the
|
||||
upcoming support of USB audio devices.
|
||||
|
||||
Furthermore, we implemented timeout handling in the driver and use Genode's
|
||||
timeout framework API to schedule timeouts and for providing the current time.
|
||||
For now there is only one timeout - the unsolicited Azalia codec event - and
|
||||
therefore the timeout queue consists of solely one timeout object. Those
|
||||
events are important for detecting plugged in headphones.
|
||||
|
||||
Supporting headphones was further refined by accounting for the situation
|
||||
where the driver is started while headphones are already plugged in and the
|
||||
mixer needs to be configured accordingly. In particular, on the Fujitsu S938
|
||||
the driver lacked the proper quirk for switching between the internal and
|
||||
external microphone.
|
||||
|
||||
In addition to the changes made to the audio driver component, the behaviour
|
||||
of the audio mixer was adjusted with regard to handling the configuration
|
||||
of a new session. The mixer now applies the settings already stored in its
|
||||
configuration to new sessions instead of only reporting them. In case of
|
||||
Sculpt, where an existing launcher already contains a valid configuration,
|
||||
that allows for setting the volume levels appropriately for known sessions
|
||||
prior to establishing the connection.
|
||||
|
||||
|
||||
Retiring the monolithic USB driver
|
||||
==================================
|
||||
|
||||
With [https://genode.org/documentation/release-notes/18.08#Decomposed_USB_stack - release 18.08],
|
||||
a componentized USB stack got introduced next to our time-tested monolithic
|
||||
USB driver. With the current release, the driver manager as used by Sculpt OS
|
||||
switched to use the new USB stack in order to benefit from the de-composition
|
||||
and from more supported USB devices. The monolithic driver was still based on
|
||||
an older DDE-Linux revision compared to the componentized version. This step
|
||||
paves the ground to retire the monolithic USB driver with the next Genode
|
||||
release and will improve the number of supported USB devices with the upcoming
|
||||
Sculpt OS release.
|
||||
|
||||
|
||||
Platforms
|
||||
#########
|
||||
|
||||
Hardware P-State support on PC hardware
|
||||
=======================================
|
||||
|
||||
Intel CPUs feature Speed Shift respectively Hardware P-State (HWP)
|
||||
functionality in order to balance CPU frequency and voltage for performance
|
||||
and power efficiency. Up to now, the UEFI firmware of the notebooks we worked
|
||||
with selected or made an option selectable in the UEFI configuration to
|
||||
specify the desired behaviour, e.g. optimize for performance or power
|
||||
efficiency.
|
||||
|
||||
With a recent Lenovo notebook, however, we faced the issue that either the fan
|
||||
would run for too long after some load and/or the performance of the CPUs
|
||||
regressed. Finding a well working sweet spot
|
||||
[https://github.com/genodelabs/genode/issues/3871 - seems hard].
|
||||
This experience prompted us to investigate how the Intel HWP feature can be
|
||||
set and configured. After some experiments, we achieved to reduce the fan
|
||||
noise and received better performance by tweaking the Intel HWP settings.
|
||||
|
||||
However, changing the Intel HWP settings requires access to the privileged
|
||||
mode on all available CPUs. Since Genode supports several kernels, a solution
|
||||
would require us to modify all kernels or the feature would remain solely
|
||||
available to one kernel. We went for a different approach.
|
||||
|
||||
On x86, we use the tools from the
|
||||
[https://genode.org/documentation/release-notes/18.08#New_Intel_Microcode_update_mechanism - Morbo project],
|
||||
e.g., bender and microcode, to run code before the kernels are booted. The
|
||||
jobs of the tools are to scan, enable, or apply changes to the CPUs and
|
||||
chipset, which are not required to change during runtime. We came to the
|
||||
conclusion that the named bootstrap tools are good places to apply such
|
||||
one-time Intel HWP settings for the moment.
|
||||
|
||||
During the course of adding the Intel HWP functionality, we merged the
|
||||
microcode functionality into the bender tool and made it configurable via the
|
||||
boot options 'microcode' and 'intel_hwp'. A typical generated grub2
|
||||
configuration by using both options would look like this:
|
||||
|
||||
| insmod multiboot2
|
||||
| insmod gzio
|
||||
| multiboot2 /boot/bender bender microcode intel_hwp
|
||||
| module2 /boot/micro.code micro.code
|
||||
| module2 /boot/hypervisor hypervisor ...
|
||||
| module2 /boot/image.elf.gz image.elf ...
|
||||
|
||||
When using the NOVA kernel and Genode's _run_ tool for booting respectively
|
||||
disk-image creation, one may use the existing 'options_bender' variable in
|
||||
_tool/run/boot/nova_. The microcode option is added by setting the
|
||||
'apply_microcode' flag in the same file. The 'intel_hwp' option, at the other
|
||||
hand, can simply be appended to 'options_bender'. On startup, bender will print
|
||||
the applied HWP settings for each core to the serial output if the
|
||||
'intel_hwp' option was set. The new feature will try to set Intel HWP to
|
||||
'PERFORMANCE' mode, the mode for which we observed the best results.
|
||||
|
||||
|
||||
NOVA microhypervisor
|
||||
====================
|
||||
|
||||
The IO-MMU is a hardware feature to protect operating systems, e.g., Genode,
|
||||
against misbehaving devices and/or corresponding device drivers. The feature
|
||||
is supported on x86 since the
|
||||
[https://genode.org/documentation/release-notes/13.02#DMA_protection_via_IOMMU - 13.02 release]
|
||||
and described in the release notes. Up to now, this feature is solely
|
||||
supported for Intel hardware, in particular CPUs and chipsets supporting Intel
|
||||
VT-d.
|
||||
|
||||
With the current release, we add support for AMD's IO-MMU variant to the
|
||||
Genode framework for the NOVA kernel - being the first one out of the
|
||||
supported microkernels. Being conceptionally equivalent, the actual
|
||||
implementation for AMD differs from Intel unsurprisingly. In order to add the
|
||||
support, a new IO-MMU interface abstraction for accommodating both versions -
|
||||
Intel and AMD - has been added to the NOVA kernel. Further, the discovery of
|
||||
the available AMD IO-MMUs required the traversal of different ACPI tables than
|
||||
for Intel and another page table format for the IO-MMU had to be added. On the
|
||||
Genode framework side, only very few changes were necessary, namely the
|
||||
detection of the IO-MMU feature by parsing the ACPI tables in Genode's ACPI
|
||||
driver as well as the ported Intel ACPICA component.
|
||||
|
||||
The change has been already successfully tested on various Ryzen desktops and
|
||||
notebooks on a backported Sculpt 20.08 branch.
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 b77ed0937d21da6a407cb5fd9738055dfaf68507
|
||||
2020-11-26 054bb0a83a4a6b5bec210f87a20359f6dceba4ad
|
||||
|
||||
@@ -115,7 +115,7 @@ void Irq_object::entry()
|
||||
|
||||
Irq_object::Irq_object(unsigned irq)
|
||||
:
|
||||
Thread_deprecated<4096>("irq"),
|
||||
Thread(Weight::DEFAULT_WEIGHT, "irq", 4096 /* stack */, Type::NORMAL),
|
||||
_irq(irq)
|
||||
{ }
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
ce2d3e9f54b383ef2368e4cd285b0b48b0424f63
|
||||
2e8cbb44d4c009238d96b66a9fc085e038f22e61
|
||||
|
||||
@@ -37,3 +37,5 @@ PATCH_OPT(patches/0014-Always-enable-user-mode-access-for-performance-monit.patc
|
||||
PATCH_OPT(patches/0015-VMX-disable-event-injection-if-requested-by-VMM.patch) := -p3 -d${DIR(foc)}
|
||||
PATCH_OPT(patches/0016-svm-provide-cr0-to-guest-if-np-enabled.patch) := -p3 -d${DIR(foc)}
|
||||
PATCH_OPT(patches/0017-svm-avoid-forceful-exit-on-task-switch.patch) := -p3 -d${DIR(foc)}
|
||||
|
||||
$(call check_tool,gawk)
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 5f44c34120046861ee02a488b0e34c859cc7f2ec
|
||||
2020-11-26 a5a99e7f402100f62864609115b680b83099dbbe
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 c1913f289544881002ba648e34b076f39b6cfd90
|
||||
2020-11-26 32bf527cace92c460fa986ccccbaf79caa2e77cd
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 e73882245d240ad99888c6887525fed6b2085d5e
|
||||
2020-11-26 841b52ee26b3bdfec31947392906db31e9a9d1c5
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 40f98e27ab53cc631e951a745b292a6f722bbfce
|
||||
2020-11-26 f6c4252ce98073b3db64e89b9bab0093ee7cd7eb
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 9499c9b32821d0b483e00dab5321dc28acc59c09
|
||||
2020-11-26 ec14f348095651f4cfe30a37a32d1162a73a3a06
|
||||
|
||||
@@ -108,6 +108,8 @@ class Genode::Vm_session_component
|
||||
void attach_pic(addr_t) override { }
|
||||
void detach(addr_t, size_t) override;
|
||||
Vcpu_id _create_vcpu(Thread_capability);
|
||||
Capability<Native_vcpu> _native_vcpu(Vcpu_id) {
|
||||
return Capability<Native_vcpu>(); }
|
||||
};
|
||||
|
||||
#endif /* _CORE__VM_SESSION_COMPONENT_H_ */
|
||||
|
||||
@@ -44,11 +44,15 @@ using namespace Genode;
|
||||
/**
|
||||
* Dispatches interrupts from kernel
|
||||
*/
|
||||
class Genode::Interrupt_handler : public Thread_deprecated<2048*sizeof(long)>
|
||||
class Genode::Interrupt_handler : public Thread
|
||||
{
|
||||
private:
|
||||
|
||||
Interrupt_handler() : Thread_deprecated("irq_handler") { start(); }
|
||||
Interrupt_handler()
|
||||
:
|
||||
Thread(Weight::DEFAULT_WEIGHT, "irq_handler",
|
||||
2048 * sizeof(long) /* stack */, Type::NORMAL)
|
||||
{ start(); }
|
||||
|
||||
public:
|
||||
|
||||
|
||||
@@ -221,19 +221,16 @@ Foc_thread_state Platform_thread::state()
|
||||
}
|
||||
|
||||
|
||||
void Platform_thread::affinity(Affinity::Location location)
|
||||
void Platform_thread::affinity(Affinity::Location const location)
|
||||
{
|
||||
_location = location;
|
||||
|
||||
int const cpu = location.xpos();
|
||||
|
||||
l4_sched_param_t params = l4_sched_param(_prio);
|
||||
params.affinity = l4_sched_cpu_set(cpu, 0, 1);
|
||||
l4_msgtag_t tag = l4_scheduler_run_thread(L4_BASE_SCHEDULER_CAP,
|
||||
_thread.local.data()->kcap(), ¶ms);
|
||||
if (l4_error(tag))
|
||||
warning("setting affinity of ", Hex(_thread.local.data()->kcap()),
|
||||
" to ", cpu, " failed!");
|
||||
if (!l4_error(tag))
|
||||
_location = location;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -208,7 +208,9 @@ struct Vcpu : Genode::Thread
|
||||
uint64_t _tsc_offset { 0 };
|
||||
bool _show_error_unsupported_pdpte { true };
|
||||
bool _show_error_unsupported_tpr { true };
|
||||
bool _show_error_unsupported_fpu { true };
|
||||
|
||||
uint8_t _fpu_ep[512] __attribute__((aligned(0x10)));
|
||||
uint8_t _fpu_vcpu[512] __attribute__((aligned(0x10)));
|
||||
|
||||
enum
|
||||
{
|
||||
@@ -340,10 +342,27 @@ struct Vcpu : Genode::Thread
|
||||
if (_vm_type == Virt::VMX)
|
||||
_write_intel_state(state, vmcs, vcpu);
|
||||
|
||||
/* save FPU state of this thread and restore state of vCPU */
|
||||
asm volatile ("fxsave %0" : "=m" (*_fpu_ep));
|
||||
if (state.fpu.valid()) {
|
||||
state.fpu.value([&] (uint8_t *fpu, size_t const) {
|
||||
asm volatile ("fxrstor %0" : : "m" (*fpu) : "memory");
|
||||
});
|
||||
} else
|
||||
asm volatile ("fxrstor %0" : : "m" (*_fpu_vcpu) : "memory");
|
||||
|
||||
/* tell Fiasco.OC to run the vCPU */
|
||||
l4_msgtag_t tag = l4_thread_vcpu_resume_start();
|
||||
tag = l4_thread_vcpu_resume_commit(L4_INVALID_CAP, tag);
|
||||
|
||||
/* save FPU state of vCPU and restore state of this thread */
|
||||
state.fpu.value([&] (uint8_t *fpu, size_t const) {
|
||||
asm volatile ("fxsave %0" : "=m" (*fpu) :: "memory");
|
||||
asm volatile ("fxsave %0" : "=m" (*_fpu_vcpu) :: "memory");
|
||||
});
|
||||
asm volatile ("fxrstor %0" : : "m" (*_fpu_ep) : "memory");
|
||||
|
||||
|
||||
/* got VM exit or interrupted by asynchronous signal */
|
||||
uint64_t reason = 0;
|
||||
|
||||
@@ -966,13 +985,6 @@ struct Vcpu : Genode::Thread
|
||||
if (state.sysenter_ip.valid())
|
||||
l4_vm_vmx_write(vmcs, Vmcs::SYSENTER_IP,
|
||||
state.sysenter_ip.value());
|
||||
|
||||
if (state.fpu.valid()) {
|
||||
if (_show_error_unsupported_fpu) {
|
||||
_show_error_unsupported_fpu = false;
|
||||
Genode::error("FPU guest state not supported on Fiasco.OC");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _write_amd_state(Vm_state &state, Fiasco::l4_vm_svm_vmcb_t *vmcb,
|
||||
@@ -1171,13 +1183,6 @@ struct Vcpu : Genode::Thread
|
||||
vmcb->state_save_area.sysenter_esp = state.sysenter_sp.value();
|
||||
if (state.sysenter_ip.valid())
|
||||
vmcb->state_save_area.sysenter_eip = state.sysenter_ip.value();
|
||||
|
||||
if (state.fpu.valid()) {
|
||||
if (_show_error_unsupported_fpu) {
|
||||
_show_error_unsupported_fpu = false;
|
||||
Genode::error("FPU guest state not supported on Fiasco.OC");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
@@ -42,6 +42,8 @@ namespace Kernel
|
||||
constexpr Call_arg call_id_timeout() { return 16; }
|
||||
constexpr Call_arg call_id_timeout_max_us() { return 17; }
|
||||
constexpr Call_arg call_id_time() { return 18; }
|
||||
constexpr Call_arg call_id_run_vm() { return 19; }
|
||||
constexpr Call_arg call_id_pause_vm() { return 20; }
|
||||
|
||||
|
||||
/*****************************************************************
|
||||
@@ -369,6 +371,28 @@ namespace Kernel
|
||||
{
|
||||
call(call_id_delete_cap(), cap);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Execute a virtual-machine (again)
|
||||
*
|
||||
* \param vm pointer to vm kernel object
|
||||
*/
|
||||
inline void run_vm(capid_t const cap)
|
||||
{
|
||||
call(call_id_run_vm(), cap);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Stop execution of a virtual-machine
|
||||
*
|
||||
* \param vm pointer to vm kernel object
|
||||
*/
|
||||
inline void pause_vm(capid_t const cap)
|
||||
{
|
||||
call(call_id_pause_vm(), cap);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* _INCLUDE__KERNEL__INTERFACE_H_ */
|
||||
|
||||
@@ -50,6 +50,7 @@ struct Genode::Vm_state : Genode::Cpu_state_modes
|
||||
Genode::uint32_t tls2 { 0 };
|
||||
Genode::uint32_t tls3 { 0 };
|
||||
Genode::uint32_t cpacr { 0 };
|
||||
Genode::uint32_t vmpidr { 0 };
|
||||
|
||||
/**
|
||||
* Fpu registers
|
||||
|
||||
@@ -4,8 +4,6 @@ SRC_CC += timer_connection_time.cc
|
||||
SRC_CC += hw/timer_connection_timestamp.cc
|
||||
SRC_CC += duration.cc
|
||||
|
||||
LIBS += alarm
|
||||
|
||||
INC_DIR += $(BASE_DIR)/src/include
|
||||
|
||||
vpath % $(BASE_DIR)/src/lib/timeout
|
||||
|
||||
29
repos/base-hw/patches/muen_ada-bfd.patch
Normal file
29
repos/base-hw/patches/muen_ada-bfd.patch
Normal file
@@ -0,0 +1,29 @@
|
||||
diff --git a/contrib/ada-bfd/Makefile b/contrib/ada-bfd/Makefile
|
||||
index cd776781e..36c87b126 100644
|
||||
--- a/contrib/ada-bfd/Makefile
|
||||
+++ b/contrib/ada-bfd/Makefile
|
||||
@@ -1,6 +1,6 @@
|
||||
-REV = 235a23452f7c5104ce6270a84f9794f497d496aa
|
||||
+REV = 1ee4c51befbda90360e519f5b76c17db124e2973
|
||||
PKG = ada-bfd
|
||||
-SRC = https://github.com/stcarrez/ada-bfd.git
|
||||
+SRC = https://github.com/skalk/ada-bfd.git
|
||||
|
||||
define CMD_CONFIGURE
|
||||
cd $(WRK) && ./configure --prefix=$(BUILDDIR)
|
||||
diff --git a/contrib/projects/bfdada.gpr b/contrib/projects/bfdada.gpr
|
||||
index 8a9cd711a..6cbe14152 100644
|
||||
--- a/contrib/projects/bfdada.gpr
|
||||
+++ b/contrib/projects/bfdada.gpr
|
||||
@@ -1,8 +1,8 @@
|
||||
library project Bfdada is
|
||||
- for Source_Dirs use ("../build/share/ada/adainclude/bfdada");
|
||||
+ for Source_Dirs use ("../build/include/bfdada.static");
|
||||
for Library_Name use "ada-bfd";
|
||||
- for Library_Dir use "../build/lib";
|
||||
- for Library_ALI_Dir use "../build/lib/ada/adalib/bfdada";
|
||||
+ for Library_Dir use "../build/lib/bfdada.static";
|
||||
+ for Library_ALI_Dir use "../build/lib/bfdada.static";
|
||||
for Library_Kind use "static";
|
||||
for Externally_Built use "true";
|
||||
end Bfdada;
|
||||
31
repos/base-hw/patches/muen_python2.patch
Normal file
31
repos/base-hw/patches/muen_python2.patch
Normal file
@@ -0,0 +1,31 @@
|
||||
diff --git a/projects/execute b/projects/execute
|
||||
index 43820f0ed..e2dbda43c 100755
|
||||
--- a/projects/execute
|
||||
+++ b/projects/execute
|
||||
@@ -1,4 +1,4 @@
|
||||
-#!/usr/bin/python
|
||||
+#!/usr/bin/python2
|
||||
#
|
||||
# Build system execution wrapper.
|
||||
#
|
||||
diff --git a/tools/scripts/mulog-subject.py b/tools/scripts/mulog-subject.py
|
||||
index cb6e355dd..51965a797 100755
|
||||
--- a/tools/scripts/mulog-subject.py
|
||||
+++ b/tools/scripts/mulog-subject.py
|
||||
@@ -1,4 +1,4 @@
|
||||
-#!/usr/bin/python
|
||||
+#!/usr/bin/python2
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
diff --git a/tools/scripts/mulog.py b/tools/scripts/mulog.py
|
||||
index 6d7fe8bb2..671913441 100755
|
||||
--- a/tools/scripts/mulog.py
|
||||
+++ b/tools/scripts/mulog.py
|
||||
@@ -1,4 +1,4 @@
|
||||
-#!/usr/bin/python
|
||||
+#!/usr/bin/python2
|
||||
|
||||
import sys
|
||||
import re
|
||||
|
||||
@@ -1 +1 @@
|
||||
6ee7754cd5edecc78df38a1d42dc2855ea3fcc0f
|
||||
11b5bd32a0234b9f7279d82487eb3d0d0eaee4db
|
||||
|
||||
@@ -3,16 +3,19 @@ VERSION := git
|
||||
DOWNLOADS := muen.git
|
||||
|
||||
URL(muen) := https://git.codelabs.ch/git/muen.git
|
||||
REV(muen) := 76b75b5f859f14397d146c16e5411142a6af11d0
|
||||
REV(muen) := 7f41b2748e0ed6aadc3e43426390ae4efc3c5e65
|
||||
DIR(muen) := src/kernel/muen
|
||||
|
||||
PATCHES := $(sort $(wildcard $(REP_DIR)/patches/muen_*.patch))
|
||||
PATCH_OPT := -p1 -d src/kernel/muen
|
||||
|
||||
$(call check_tool,git)
|
||||
$(call check_tool,iasl)
|
||||
$(call check_tool,tidy)
|
||||
$(call check_tool,xsltproc)
|
||||
|
||||
default : additional_steps
|
||||
additional_steps : $(DOWNLOADS)
|
||||
additional_steps : $(DOWNLOADS) _patch
|
||||
$(VERBOSE)git -C src/kernel/muen submodule update --init tools/mugenschedcfg > /dev/null
|
||||
$(VERBOSE)git -C src/kernel/muen submodule update --init components/libxhcidbg > /dev/null
|
||||
$(VERBOSE)$(MAKE) -C src/kernel/muen/contrib QUIET=true download
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-04-23 a17c0cc96393cdfbc883e24bd7ec245a9f0e2145
|
||||
2020-11-26 204050f2b660a28c256d45a3392819f567fc7ec1
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 6ecb2cfd14c70ae61cfa19b88d7c54e3fedc1891
|
||||
2020-11-26 229ad800dbd8f9a706252068549d8f9b77bf383d
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 6b1d2b7cd8528da7d41fc67ea0e6e4582a31f733
|
||||
2020-11-26 9b463d77311424263b92a200bc255208204426da
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 2c087fc74853bf34d922183b1389de285ee639c4
|
||||
2020-11-26 62a5572890b40bfa802d95bce8f5da043a6d17b8
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 4cc0aa32af24a6442aff9392a04e021441d3c6bd
|
||||
2020-11-26 6a6c9b43ca5475d1e8132109d97721ad4774eeb4
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 9901df07c863acf255813d7a52716615e6ca20d7
|
||||
2020-11-26 4cda45d0fb9ce8c4533324e8582f112735d35917
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 55519e0b080ced494049d3b08b382bb09624a162
|
||||
2020-11-26 35a689f0f1c84fd92a69a926635f52f7f7b8cc6a
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 0bd3fdff00c07aeb805468adabb215ec5a4078ca
|
||||
2020-11-26 9e0d694be4defc9d31b85505deb0e62520a54a82
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 850472062a2942adaa849eef5294f4ac58f4fd47
|
||||
2020-11-26 3e9153bac43a688cec79a26fbd4759b94e025f81
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 6b5459dc428c2a68082db740cacdbd75f98a55ec
|
||||
2020-11-26 a2f8a51651aa0ea33aa14fa29fceb95cd6dd0e16
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 a92a3496cf9e1a8167a307b2620612d1581e465a
|
||||
2020-11-26 75aa0f4eddd9ab01fe0a969c929fa9e2726881d6
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 41fbf758fbd27c093d41e2230914529dcd6a1da8
|
||||
2020-11-26 dabe6d3d96c3000c43afd48b231abb9250370747
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 5a1e60456696346d25d1efa15dca0543bec8044c
|
||||
2020-11-26 d4ccaf3329c22b2ab63fd86f591ca23f37a7037e
|
||||
|
||||
@@ -1 +1 @@
|
||||
2020-08-27 7d3b349f032944c948b3659f238f1e56c343099c
|
||||
2020-11-26 70211e7adb0aeb84e36b1ca660a9d0a7340e4ec9
|
||||
|
||||
@@ -150,9 +150,8 @@ Mapping Platform::_load_elf()
|
||||
|
||||
void Platform::start_core(unsigned cpu_id)
|
||||
{
|
||||
typedef void (* Entry)(unsigned);
|
||||
Entry __attribute__((noreturn)) const entry
|
||||
= reinterpret_cast<Entry>(core_elf.entry());
|
||||
typedef void (* Entry)(unsigned) __attribute__((noreturn));
|
||||
Entry const entry = reinterpret_cast<Entry>(core_elf.entry());
|
||||
entry(cpu_id);
|
||||
}
|
||||
|
||||
|
||||
@@ -58,7 +58,8 @@ static inline void prepare_non_secure_world()
|
||||
}
|
||||
|
||||
|
||||
static inline void prepare_hypervisor(Cpu::Ttbr::access_t const ttbr)
|
||||
static inline void prepare_hypervisor(Cpu::Ttbr::access_t const ttbr,
|
||||
unsigned cpu_id)
|
||||
{
|
||||
using namespace Hw::Mm;
|
||||
|
||||
@@ -80,7 +81,7 @@ static inline void prepare_hypervisor(Cpu::Ttbr::access_t const ttbr)
|
||||
/* set hypervisor exception vector */
|
||||
Cpu::Vbar_el2::write(el2_addr(hypervisor_exception_vector().base));
|
||||
Genode::addr_t const stack_el2 = el2_addr(hypervisor_stack().base +
|
||||
hypervisor_stack().size);
|
||||
(cpu_id+1) * 0x1000);
|
||||
|
||||
/* set hypervisor's translation table */
|
||||
Cpu::Ttbr0_el2::write(ttbr);
|
||||
@@ -89,7 +90,7 @@ static inline void prepare_hypervisor(Cpu::Ttbr::access_t const ttbr)
|
||||
Cpu::Tcr_el2::T0sz::set(tcr_el2, 25);
|
||||
Cpu::Tcr_el2::Irgn0::set(tcr_el2, 1);
|
||||
Cpu::Tcr_el2::Orgn0::set(tcr_el2, 1);
|
||||
Cpu::Tcr_el2::Sh0::set(tcr_el2, 0b10);
|
||||
Cpu::Tcr_el2::Sh0::set(tcr_el2, 0b11);
|
||||
|
||||
/* prepare MMU usage by hypervisor code */
|
||||
Cpu::Tcr_el2::write(tcr_el2);
|
||||
@@ -141,6 +142,8 @@ unsigned Bootstrap::Platform::enable_mmu()
|
||||
bool primary = primary_cpu;
|
||||
if (primary) primary_cpu = false;
|
||||
|
||||
unsigned cpu_id = (Cpu::Mpidr::read() & 0xff);
|
||||
|
||||
Cpu::Ttbr::access_t ttbr =
|
||||
Cpu::Ttbr::Baddr::masked((Genode::addr_t)core_pd->table_base);
|
||||
|
||||
@@ -152,7 +155,7 @@ unsigned Bootstrap::Platform::enable_mmu()
|
||||
prepare_non_secure_world();
|
||||
} else {
|
||||
::Board::Pic pic __attribute__((unused)) {};
|
||||
prepare_hypervisor(ttbr);
|
||||
prepare_hypervisor(ttbr, cpu_id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,5 +204,5 @@ unsigned Bootstrap::Platform::enable_mmu()
|
||||
Cpu::Sctlr::Uct::set(sctlr, 1);
|
||||
Cpu::Sctlr_el1::write(sctlr);
|
||||
|
||||
return (Cpu::Mpidr::read() & 0xff);
|
||||
return cpu_id;
|
||||
}
|
||||
|
||||
@@ -12,11 +12,11 @@
|
||||
*/
|
||||
|
||||
#include <platform.h>
|
||||
#include <hw/memory_map.h>
|
||||
#include <spec/arm/imx_aipstz.h>
|
||||
#include <spec/arm/cortex_a7_a15_virtualization.h>
|
||||
|
||||
extern "C" void * _start_setup_stack; /* entrypoint for non-boot CPUs */
|
||||
static unsigned char hyp_mode_stack[1024]; /* hypervisor mode's kernel stack */
|
||||
extern "C" void * _start_setup_stack; /* entrypoint for non-boot CPUs */
|
||||
|
||||
using namespace Board;
|
||||
|
||||
@@ -161,7 +161,7 @@ Bootstrap::Platform::Board::Board()
|
||||
}
|
||||
|
||||
|
||||
static inline void switch_to_supervisor_mode()
|
||||
static inline void switch_to_supervisor_mode(unsigned cpu_id)
|
||||
{
|
||||
using Cpsr = Hw::Arm_cpu::Psr;
|
||||
|
||||
@@ -170,6 +170,9 @@ static inline void switch_to_supervisor_mode()
|
||||
Cpsr::F::set(cpsr, 1);
|
||||
Cpsr::I::set(cpsr, 1);
|
||||
|
||||
Genode::addr_t const stack = Hw::Mm::hypervisor_stack().base +
|
||||
(cpu_id+1) * 0x1000;
|
||||
|
||||
asm volatile (
|
||||
"msr sp_svc, sp \n" /* copy current mode's sp */
|
||||
"msr lr_svc, lr \n" /* copy current mode's lr */
|
||||
@@ -178,7 +181,7 @@ static inline void switch_to_supervisor_mode()
|
||||
"msr spsr_cxfs, %[cpsr] \n" /* set psr for supervisor mode */
|
||||
"adr lr, 1f \n" /* load exception return address */
|
||||
"eret \n" /* exception return */
|
||||
"1:":: [cpsr] "r" (cpsr), [stack] "r" (&hyp_mode_stack));
|
||||
"1:":: [cpsr] "r" (cpsr), [stack] "r" (stack));
|
||||
}
|
||||
|
||||
|
||||
@@ -186,13 +189,14 @@ unsigned Bootstrap::Platform::enable_mmu()
|
||||
{
|
||||
static volatile bool primary_cpu = true;
|
||||
static unsigned long timer_freq = Cpu::Cntfrq::read();
|
||||
unsigned cpu = Cpu::Mpidr::Aff_0::get(Cpu::Mpidr::read());
|
||||
|
||||
/* locally initialize interrupt controller */
|
||||
::Board::Pic pic { };
|
||||
|
||||
prepare_nonsecure_world(timer_freq);
|
||||
prepare_hypervisor((addr_t)core_pd->table_base);
|
||||
switch_to_supervisor_mode();
|
||||
switch_to_supervisor_mode(cpu);
|
||||
|
||||
Cpu::Sctlr::init();
|
||||
Cpu::Cpsr::init();
|
||||
@@ -206,7 +210,7 @@ unsigned Bootstrap::Platform::enable_mmu()
|
||||
|
||||
Cpu::enable_mmu_and_caches((Genode::addr_t)core_pd->table_base);
|
||||
|
||||
return Cpu::Mpidr::Aff_0::get(Cpu::Mpidr::read());
|
||||
return cpu;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -59,8 +59,8 @@ Bootstrap::Platform::Board::Board()
|
||||
{ 0x303301EC, 0x0 },
|
||||
{ 0x303301FC, 0x1 },
|
||||
{ 0x30330200, 0x1 },
|
||||
{ 0x3033021C, 0x10 },
|
||||
{ 0x30330220, 0x10 },
|
||||
{ 0x3033021C, 0x5 },
|
||||
{ 0x30330220, 0x5 },
|
||||
{ 0x30330224, 0x10 },
|
||||
{ 0x30330228, 0x10 },
|
||||
{ 0x3033022C, 0x12 },
|
||||
@@ -74,12 +74,23 @@ Bootstrap::Platform::Board::Board()
|
||||
{ 0x303302C0, 0x4F },
|
||||
{ 0x303302C4, 0x16 },
|
||||
{ 0x303302CC, 0x59 },
|
||||
{ 0x3033033C, 0x9F },
|
||||
{ 0x30330340, 0xDF },
|
||||
{ 0x30330344, 0xDF },
|
||||
{ 0x30330348, 0xDF },
|
||||
{ 0x3033034C, 0xDF },
|
||||
{ 0x30330350, 0xDF },
|
||||
{ 0x30330308, 0x9F },
|
||||
{ 0x3033030C, 0xDF },
|
||||
{ 0x30330310, 0xDF },
|
||||
{ 0x30330314, 0xDF },
|
||||
{ 0x30330318, 0xDF },
|
||||
{ 0x3033031C, 0xDF },
|
||||
{ 0x30330320, 0xDF },
|
||||
{ 0x30330324, 0xDF },
|
||||
{ 0x30330328, 0xDF },
|
||||
{ 0x3033032C, 0xDF },
|
||||
{ 0x30330334, 0x9f },
|
||||
{ 0x3033033C, 0x83 },
|
||||
{ 0x30330340, 0xC3 },
|
||||
{ 0x30330344, 0xC3 },
|
||||
{ 0x30330348, 0xC3 },
|
||||
{ 0x3033034C, 0xC3 },
|
||||
{ 0x30330350, 0xC3 },
|
||||
{ 0x30330368, 0x59 },
|
||||
{ 0x30330370, 0x19 },
|
||||
{ 0x3033039C, 0x19 },
|
||||
@@ -110,15 +121,18 @@ Bootstrap::Platform::Board::Board()
|
||||
{ 0x30330430, 0xD6 },
|
||||
{ 0x30330450, 0xD6 },
|
||||
{ 0x30330454, 0xD6 },
|
||||
{ 0x30330460, 0x19 },
|
||||
{ 0x30330464, 0x49 },
|
||||
{ 0x30330468, 0x49 },
|
||||
{ 0x3033046C, 0x16 },
|
||||
{ 0x30330484, 0x67 },
|
||||
{ 0x30330488, 0x67 },
|
||||
{ 0x30330484, 0x16 },
|
||||
{ 0x30330488, 0x16 },
|
||||
{ 0x3033048C, 0x67 },
|
||||
{ 0x30330490, 0x67 },
|
||||
{ 0x30330494, 0x76 },
|
||||
{ 0x30330498, 0x76 },
|
||||
{ 0x3033049C, 0x49 },
|
||||
{ 0x303304A0, 0x49 },
|
||||
{ 0x303304AC, 0x49 },
|
||||
{ 0x303304B0, 0x49 },
|
||||
{ 0x303304C8, 0x1 },
|
||||
@@ -126,7 +140,12 @@ Bootstrap::Platform::Board::Board()
|
||||
{ 0x30330500, 0x1 },
|
||||
{ 0x30330504, 0x2 },
|
||||
{ 0x30340038, 0x49409600 },
|
||||
{ 0x30340040, 0x49409200 }
|
||||
{ 0x30340040, 0x49409200 },
|
||||
{ 0x30340034, 0x4 }, /* MIPI mux selector */
|
||||
/*
|
||||
{ 0x30340060, 0x180800 },
|
||||
{ 0x30340064, 0x6400520 },
|
||||
{ 0x30340068, 0x0A }, */
|
||||
};
|
||||
|
||||
struct Gpio_reg : Genode::Mmio
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
#include <spec/arm/cortex_a7_a15_virtualization.h>
|
||||
|
||||
extern "C" void * _start_setup_stack; /* entrypoint for non-boot CPUs */
|
||||
static unsigned char hyp_mode_stack[1024]; /* hypervisor mode's kernel stack */
|
||||
|
||||
using namespace Board;
|
||||
|
||||
@@ -31,7 +30,7 @@ Bootstrap::Platform::Board::Board()
|
||||
Cpu_mmio::IRQ_CONTROLLER_VT_CTRL_SIZE }) {}
|
||||
|
||||
|
||||
static inline void switch_to_supervisor_mode()
|
||||
static inline void switch_to_supervisor_mode(unsigned cpu_id)
|
||||
{
|
||||
using Cpsr = Hw::Arm_cpu::Psr;
|
||||
|
||||
@@ -40,6 +39,9 @@ static inline void switch_to_supervisor_mode()
|
||||
Cpsr::F::set(cpsr, 1);
|
||||
Cpsr::I::set(cpsr, 1);
|
||||
|
||||
Genode::addr_t const stack = Hw::Mm::hypervisor_stack().base +
|
||||
(cpu_id+1) * 0x1000;
|
||||
|
||||
asm volatile (
|
||||
"msr sp_svc, sp \n" /* copy current mode's sp */
|
||||
"msr lr_svc, lr \n" /* copy current mode's lr */
|
||||
@@ -48,13 +50,14 @@ static inline void switch_to_supervisor_mode()
|
||||
"mov sp, %[stack] \n" /* copy to hyp stack pointer */
|
||||
"msr spsr_cxfs, %[cpsr] \n" /* set psr for supervisor mode */
|
||||
"eret \n" /* exception return */
|
||||
"1:":: [cpsr] "r" (cpsr), [stack] "r" (&hyp_mode_stack));
|
||||
"1:":: [cpsr] "r" (cpsr), [stack] "r" (stack));
|
||||
}
|
||||
|
||||
|
||||
unsigned Bootstrap::Platform::enable_mmu()
|
||||
{
|
||||
static volatile bool primary_cpu = true;
|
||||
unsigned cpu = Cpu::Mpidr::Aff_0::get(Cpu::Mpidr::read());
|
||||
|
||||
/* locally initialize interrupt controller */
|
||||
::Board::Pic pic { };
|
||||
@@ -67,14 +70,14 @@ unsigned Bootstrap::Platform::enable_mmu()
|
||||
}
|
||||
|
||||
prepare_hypervisor((addr_t)core_pd->table_base);
|
||||
switch_to_supervisor_mode();
|
||||
switch_to_supervisor_mode(cpu);
|
||||
|
||||
Cpu::Sctlr::init();
|
||||
Cpu::Cpsr::init();
|
||||
|
||||
Cpu::enable_mmu_and_caches((Genode::addr_t)core_pd->table_base);
|
||||
|
||||
return Cpu::Mpidr::Aff_0::get(Cpu::Mpidr::read());
|
||||
return cpu;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -246,13 +246,6 @@ struct Lapic : Mmio
|
||||
Lapic(addr_t const addr) : Mmio(addr) { }
|
||||
};
|
||||
|
||||
static inline Genode::uint64_t rdtsc()
|
||||
{
|
||||
Genode::uint32_t lo, hi;
|
||||
asm volatile("rdtsc" : "=a" (lo), "=d" (hi));
|
||||
return (Genode::uint64_t)hi << 32 | lo;
|
||||
}
|
||||
|
||||
static inline void ipi_to_all(Lapic &lapic, unsigned const boot_frame,
|
||||
Lapic::Icr_low::Delivery_mode::Mode const mode)
|
||||
{
|
||||
|
||||
@@ -51,8 +51,6 @@ namespace Kernel
|
||||
constexpr Call_arg call_id_delete_signal_context() { return 112; }
|
||||
constexpr Call_arg call_id_delete_signal_receiver() { return 113; }
|
||||
constexpr Call_arg call_id_new_vm() { return 114; }
|
||||
constexpr Call_arg call_id_run_vm() { return 115; }
|
||||
constexpr Call_arg call_id_pause_vm() { return 116; }
|
||||
constexpr Call_arg call_id_delete_vm() { return 117; }
|
||||
constexpr Call_arg call_id_new_irq() { return 118; }
|
||||
constexpr Call_arg call_id_delete_irq() { return 119; }
|
||||
@@ -152,27 +150,6 @@ namespace Kernel
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Execute a virtual-machine (again)
|
||||
*
|
||||
* \param vm pointer to vm kernel object
|
||||
*/
|
||||
inline void run_vm(Vm & vm)
|
||||
{
|
||||
call(call_id_run_vm(), (Call_arg) &vm);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Stop execution of a virtual-machine
|
||||
*
|
||||
* \param vm pointer to vm kernel object
|
||||
*/
|
||||
inline void pause_vm(Vm & vm)
|
||||
{
|
||||
call(call_id_pause_vm(), (Call_arg) &vm);
|
||||
}
|
||||
|
||||
/**
|
||||
* Acknowledge interrupt
|
||||
*
|
||||
|
||||
@@ -740,6 +740,8 @@ void Thread::_call()
|
||||
case call_id_timeout(): _call_timeout(); return;
|
||||
case call_id_timeout_max_us(): _call_timeout_max_us(); return;
|
||||
case call_id_time(): _call_time(); return;
|
||||
case call_id_run_vm(): _call_run_vm(); return;
|
||||
case call_id_pause_vm(): _call_pause_vm(); return;
|
||||
default:
|
||||
/* check wether this is a core thread */
|
||||
if (!_core) {
|
||||
@@ -777,8 +779,6 @@ void Thread::_call()
|
||||
case call_id_delete_signal_receiver(): _call_delete<Signal_receiver>(); return;
|
||||
case call_id_new_vm(): _call_new_vm(); return;
|
||||
case call_id_delete_vm(): _call_delete_vm(); return;
|
||||
case call_id_run_vm(): _call_run_vm(); return;
|
||||
case call_id_pause_vm(): _call_pause_vm(); return;
|
||||
case call_id_pause_thread(): _call_pause_thread(); return;
|
||||
case call_id_new_irq(): _call_new_irq(); return;
|
||||
case call_id_delete_irq(): _call_delete<User_irq>(); return;
|
||||
|
||||
@@ -33,8 +33,16 @@ namespace Kernel
|
||||
}
|
||||
|
||||
|
||||
class Kernel::Vm : public Cpu_job
|
||||
class Kernel::Vm : private Kernel::Object, public Cpu_job
|
||||
{
|
||||
public:
|
||||
|
||||
struct Identity
|
||||
{
|
||||
unsigned const id;
|
||||
void * const table;
|
||||
};
|
||||
|
||||
private:
|
||||
|
||||
using State = Board::Vm_state;
|
||||
@@ -48,10 +56,9 @@ class Kernel::Vm : public Cpu_job
|
||||
enum Scheduler_state { ACTIVE, INACTIVE };
|
||||
|
||||
Object _kernel_object { *this };
|
||||
unsigned _id = 0;
|
||||
State & _state;
|
||||
Signal_context & _context;
|
||||
void * const _table;
|
||||
Identity const _id;
|
||||
Scheduler_state _scheduled = INACTIVE;
|
||||
Board::Vcpu_context _vcpu_context;
|
||||
|
||||
@@ -60,16 +67,14 @@ class Kernel::Vm : public Cpu_job
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* \param cpu cpu affinity
|
||||
* \param state initial CPU state
|
||||
* \param context signal for VM exceptions other than interrupts
|
||||
* \param table translation table for guest to host physical memory
|
||||
*/
|
||||
Vm(unsigned cpu,
|
||||
State & state,
|
||||
Signal_context & context,
|
||||
void * const table);
|
||||
|
||||
~Vm();
|
||||
Identity & id);
|
||||
|
||||
/**
|
||||
* Inject an interrupt to this VM
|
||||
@@ -85,8 +90,7 @@ class Kernel::Vm : public Cpu_job
|
||||
* \param dst memory donation for the VM object
|
||||
* \param state location of the CPU state of the VM
|
||||
* \param signal_context_id kernel name of the signal context for VM events
|
||||
* \param table guest-physical to host-physical translation
|
||||
* table pointer
|
||||
* \param id VM identity
|
||||
*
|
||||
* \retval cap id when successful, otherwise invalid cap id
|
||||
*/
|
||||
@@ -94,10 +98,10 @@ class Kernel::Vm : public Cpu_job
|
||||
unsigned cpu,
|
||||
void * const state,
|
||||
capid_t const signal_context_id,
|
||||
void * const table)
|
||||
Identity & id)
|
||||
{
|
||||
return call(call_id_new_vm(), (Call_arg)&vm, (Call_arg)cpu,
|
||||
(Call_arg)state, (Call_arg)table, signal_context_id);
|
||||
(Call_arg)state, (Call_arg)&id, signal_context_id);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -25,7 +25,7 @@ void Kernel::Thread::_call_new_vm()
|
||||
}
|
||||
|
||||
_call_new<Vm>((unsigned)user_arg_2(), *(Board::Vm_state*)user_arg_3(),
|
||||
*context, (void*)user_arg_4());
|
||||
*context, *(Vm::Identity*)user_arg_4());
|
||||
}
|
||||
|
||||
|
||||
@@ -34,13 +34,31 @@ void Kernel::Thread::_call_delete_vm() { _call_delete<Vm>(); }
|
||||
|
||||
void Kernel::Thread::_call_run_vm()
|
||||
{
|
||||
reinterpret_cast<Vm*>(user_arg_1())->run();
|
||||
Object_identity_reference * ref = pd().cap_tree().find(user_arg_1());
|
||||
Vm * vm = ref ? ref->object<Vm>() : nullptr;
|
||||
|
||||
if (!vm) {
|
||||
Genode::raw("Invalid VM cap");
|
||||
user_arg_0(-1);
|
||||
return;
|
||||
}
|
||||
|
||||
vm->run();
|
||||
user_arg_0(0);
|
||||
}
|
||||
|
||||
|
||||
void Kernel::Thread::_call_pause_vm()
|
||||
{
|
||||
reinterpret_cast<Vm*>(user_arg_1())->pause();
|
||||
Object_identity_reference * ref = pd().cap_tree().find(user_arg_1());
|
||||
Vm * vm = ref ? ref->object<Vm>() : nullptr;
|
||||
|
||||
if (!vm) {
|
||||
Genode::raw("Invalid VM cap");
|
||||
user_arg_0(-1);
|
||||
return;
|
||||
}
|
||||
|
||||
vm->pause();
|
||||
user_arg_0(0);
|
||||
}
|
||||
|
||||
@@ -102,8 +102,10 @@ void Pager_entrypoint::dissolve(Pager_object &o)
|
||||
|
||||
|
||||
Pager_entrypoint::Pager_entrypoint(Rpc_cap_factory &)
|
||||
: Thread_deprecated<PAGER_EP_STACK_SIZE>("pager_ep"),
|
||||
_kobj(true)
|
||||
:
|
||||
Thread(Weight::DEFAULT_WEIGHT, "pager_ep", PAGER_EP_STACK_SIZE,
|
||||
Type::NORMAL),
|
||||
_kobj(true)
|
||||
{ start(); }
|
||||
|
||||
|
||||
|
||||
@@ -194,7 +194,7 @@ class Genode::Pager_object : private Object_pool<Pager_object>::Entry,
|
||||
|
||||
|
||||
class Genode::Pager_entrypoint : public Object_pool<Pager_object>,
|
||||
public Thread_deprecated<PAGER_EP_STACK_SIZE>,
|
||||
public Thread,
|
||||
private Ipc_pager
|
||||
{
|
||||
private:
|
||||
|
||||
@@ -66,6 +66,7 @@ Platform_thread::Platform_thread(Label const &label, Native_utcb &utcb)
|
||||
_utcb_core_addr(&utcb),
|
||||
_utcb_pd_addr(&utcb),
|
||||
_main_thread(false),
|
||||
_location(Affinity::Location()),
|
||||
_kobj(true, _label.string())
|
||||
{
|
||||
/* create UTCB for a core thread */
|
||||
@@ -92,6 +93,7 @@ Platform_thread::Platform_thread(size_t const quota,
|
||||
_priority(_scale_priority(virt_prio)),
|
||||
_quota(quota),
|
||||
_main_thread(false),
|
||||
_location(location),
|
||||
_kobj(true, _priority, _quota, _label.string())
|
||||
{
|
||||
try {
|
||||
@@ -101,7 +103,6 @@ Platform_thread::Platform_thread(size_t const quota,
|
||||
throw Out_of_ram();
|
||||
}
|
||||
_utcb_core_addr = (Native_utcb *)core_env().rm_session()->attach(_utcb);
|
||||
affinity(location);
|
||||
}
|
||||
|
||||
|
||||
@@ -121,9 +122,9 @@ void Platform_thread::join_pd(Platform_pd * pd, bool const main_thread,
|
||||
}
|
||||
|
||||
|
||||
void Platform_thread::affinity(Affinity::Location const & location)
|
||||
void Platform_thread::affinity(Affinity::Location const &)
|
||||
{
|
||||
_location = location;
|
||||
/* yet no migration support, don't claim wrong location, e.g. for tracing */
|
||||
}
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user