fix: comprehensive boot warnings and exceptions — fixable silenced, unfixable diagnosed

Build system (5 gaps hardened):
- COOKBOOK_OFFLINE defaults to true (fork-mode)
- normalize_patch handles diff -ruN format
- New 'repo validate-patches' command (25/25 relibc patches)
- 14 patched Qt/Wayland/display recipes added to protected list
- relibc archive regenerated with current patch chain

Boot fixes (fixable):
- Full ISO EFI partition: 16 MiB → 1 MiB (matches mini, BIOS hardcoded 2 MiB offset)
- D-Bus system bus: absolute /usr/bin/dbus-daemon path (was skipped)
- redbear-sessiond: absolute /usr/bin/redbear-sessiond path (was skipped)
- daemon framework: silenced spurious INIT_NOTIFY warnings for oneshot_async services (P0-daemon-silence-init-notify.patch)
- udev-shim: demoted INIT_NOTIFY warning to INFO (expected for oneshot_async)
- relibc: comprehensive named semaphores (sem_open/close/unlink) replacing upstream todo!() stubs
- greeterd: Wayland socket timeout 15s → 30s (compositor DRM wait)
- greeter-ui: built and linked (header guard unification, sem_compat stubs removed)
- mc: un-ignored in both configs, fixed glib/libiconv/pcre2 transitive deps
- greeter config: removed stale keymapd dependency from display/greeter services
- prefix toolchain: relibc headers synced, _RELIBC_STDLIB_H guard unified

Unfixable (diagnosed, upstream):
- i2c-hidd: abort on no-I2C-hardware (QEMU) — process::exit → relibc abort
- kded6/greeter-ui: page fault 0x8 — Qt library null deref
- Thread panics fd != -1 — Rust std library on Redox
- DHCP timeout / eth0 MAC — QEMU user-mode networking
- hwrngd/thermald — no hardware RNG/thermal in VM
- live preload allocation — BIOS memory fragmentation, continues on demand
This commit is contained in:
2026-05-05 20:20:37 +01:00
parent a5f97b6632
commit f31522130f
81834 changed files with 11051982 additions and 108 deletions
@@ -0,0 +1,48 @@
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
cmake_minimum_required(VERSION 3.16)
project(spanning-screens LANGUAGES CXX)
set(CMAKE_AUTOMOC ON)
if(NOT DEFINED INSTALL_EXAMPLESDIR)
set(INSTALL_EXAMPLESDIR "examples")
endif()
set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/wayland/spanning-screens")
find_package(Qt6 REQUIRED COMPONENTS Core Gui Qml)
qt_add_executable(spanning-screens
main.cpp
)
set_target_properties(spanning-screens PROPERTIES
WIN32_EXECUTABLE TRUE
MACOSX_BUNDLE TRUE
)
target_link_libraries(spanning-screens PUBLIC
Qt::Core
Qt::Gui
Qt::Qml
)
# Resources:
set(spanning-screens_resource_files
"main.qml"
)
qt6_add_resources(spanning-screens "spanning-screens"
PREFIX
"/"
FILES
${spanning-screens_resource_files}
)
install(TARGETS spanning-screens
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
)
Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

@@ -0,0 +1,60 @@
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
* \title Spanning Screens
* \example spanning-screens
* \examplecategory {Embedded}
* \brief Spanning Screens is an example that demonstrates how to let Wayland clients span multiple screens.
* \ingroup qtwaylandcompositor-examples
*
* \section1 Introduction
*
* Spanning screens is a Wayland compositor example that maximizes clients across a top and a bottom
* screen.
*
* \image spanning-screens.jpg
*
* For an introduction to the basic principles of creating a \l{Qt Wayland Compositor} with Qt,
* see the \l{Minimal QML}{Minimal QML example}.
*
* \section1 Supporting Multiple Screens
*
* In \l{Qt Wayland Compositor} a screen is represented by a \l{WaylandOutput}, and a \l Window is
* used to contain the \l{Qt Quick} scene representing both clients and the compositor's UI.
*
* In this example, a multi-screen setup is emulated by creating two windows on the primary screen,
* but the code can easily be modified to target multiple physical screens.
*
* \snippet spanning-screens/main.qml enable screens
*
* Since each \l Window represents an isolated \l{Qt Quick} scene, this means we need a trick to
* have the same client content display inside both windows. The way to do this in
* \l{Qt Wayland Compositor} is to create two views of the same client content: One for the "top"
* window and one for the "bottom". The views share a reference to the same underlying graphics buffer.
* This allows us to copy different areas of the client's surface onto each of the windows.
*
* \snippet spanning-screens/main.qml create items
*
* When the client connects to the \l{Shell Extensions - Qt Wayland Compositor}{shell extension}
* \l{XdgShell}, we create two references to the surface. One of them is added to the "top" output,
* and the second to the "bottom". The item on the bottom output also gets an offset corresponding
* to the height of the top output. This ensures that the part of the client surface showing on
* the bottom output starts where the top output ends.
*
* \snippet spanning-screens/main.qml size
*
* In addition, we tell the client to resize its surface so that it fills both the top and bottom
* window. The end result is a client that spans two windows, or "screens".
*
* Referencing the same client surface from multiple items is a tool which can be used for many
* things. For a demonstration of a desktop-style compositor where windows can be moved from screen
* to screen, take a look at the \l{Multi Screen}{Multi Screen example}.
*
* The \l{Multi Output}{Multi Output example} shows how client surfaces can be displayed on multiple
* outputs with different sizes and other properties.
*
* \note In order to support multiple Wayland outputs in the same compositor, the
* \l Qt::AA_ShareOpenGLContexts attribute must be set before the \l QGuiApplication
* object is constructed.
*/
@@ -0,0 +1,20 @@
// Copyright (C) 2017 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtCore/QUrl>
#include <QtCore/QDebug>
#include <QtGui/QGuiApplication>
#include <QtQml/QQmlApplicationEngine>
int main(int argc, char *argv[])
{
// AA_ShareOpenGLContexts is required for compositors with multiple outputs
QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true);
QGuiApplication app(argc, argv);
QQmlApplicationEngine appEngine(QUrl("qrc:///main.qml"));
return app.exec();
}
@@ -0,0 +1,90 @@
// Copyright (C) 2018 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtQuick
import QtQuick.Window
import QtWayland.Compositor
import QtWayland.Compositor.XdgShell
WaylandCompositor {
WaylandOutput {
sizeFollowsWindow: true
window: Window {
id: topSurfaceArea
property int pixelHeight: screen.devicePixelRatio * height
property int pixelWidth: screen.devicePixelRatio * width
width: 1024
height: 768
visible: true
color: "#1337af"
Text { text: "Top screen" }
// ![enable screens]
// Enable the following to make the output target an actual screen,
// for example when running on eglfs in a multi-display embedded system.
// screen: Qt.application.screens[0]
// ![enable screens]
}
}
WaylandOutput {
sizeFollowsWindow: true
window: Window {
id: bottomSurfaceArea
property int pixelHeight: screen.devicePixelRatio * height
property int pixelWidth: screen.devicePixelRatio * width
width: 1024
height: 768
visible: true
color: "#1abacc"
Text { text: "Bottom screen" }
// Enable the following to make the output target an actual screen,
// for example when running on eglfs in a multi-display embedded system.
// screen: Qt.application.screens[1]
}
}
Component {
id: chromeComponent
Item {
property alias shellSurface: ssi.shellSurface
ShellSurfaceItem {
id: ssi
onSurfaceDestroyed: destroy()
}
}
}
XdgShell {
onToplevelCreated: (toplevel, xdgSurface) => {
const shellSurface = xdgSurface;
// ![create items]
const topItem = chromeComponent.createObject(topSurfaceArea, {
shellSurface
});
const bottomItem = chromeComponent.createObject(bottomSurfaceArea, {
shellSurface,
y: Qt.binding(function() { return -topSurfaceArea.height;})
});
// ![create items]
// ![size]
const height = topSurfaceArea.pixelHeight + bottomSurfaceArea.pixelHeight;
const width = Math.max(bottomSurfaceArea.pixelWidth, topSurfaceArea.pixelWidth);
const size = Qt.size(width, height);
toplevel.sendFullscreen(size);
// ![size]
}
}
}
@@ -0,0 +1,14 @@
QT += gui qml
SOURCES += \
main.cpp
OTHER_FILES = \
main.qml
RESOURCES += spanning-screens.qrc
target.path = $$[QT_INSTALL_EXAMPLES]/wayland/spanning-screens
sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS spanning-screens.pro
sources.path = $$[QT_INSTALL_EXAMPLES]/wayland/spanning-screens
INSTALLS += target sources
@@ -0,0 +1,5 @@
<RCC>
<qresource prefix="/">
<file>main.qml</file>
</qresource>
</RCC>