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(ivi-compositor LANGUAGES CXX)
set(CMAKE_AUTOMOC ON)
if(NOT DEFINED INSTALL_EXAMPLESDIR)
set(INSTALL_EXAMPLESDIR "examples")
endif()
set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/wayland/ivi-compositor")
find_package(Qt6 REQUIRED COMPONENTS Core Gui Qml)
qt_add_executable(ivi-compositor
main.cpp
)
set_target_properties(ivi-compositor PROPERTIES
WIN32_EXECUTABLE TRUE
MACOSX_BUNDLE TRUE
)
target_link_libraries(ivi-compositor PUBLIC
Qt::Core
Qt::Gui
Qt::Qml
)
# Resources:
set(ivi-compositor_resource_files
"main.qml"
)
qt6_add_resources(ivi-compositor "ivi-compositor"
PREFIX
"/"
FILES
${ivi-compositor_resource_files}
)
install(TARGETS ivi-compositor
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
)
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

@@ -0,0 +1,112 @@
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
* \title IVI Compositor
* \example ivi-compositor
* \examplecategory {Embedded}
* \brief IVI Compositor is an example that demonstrates how to use the IviApplication extension.
* \ingroup qtwaylandcompositor-examples
*
* \section1 Introduction
*
* This example demonstrates using the \l IviApplication shell extension in a Wayland display
* server (also known as a Wayland compositor).
*
* 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 The Protocol
*
* \l IviApplication is a \l{Shell Extensions - Qt Wayland Compositor}{shell extension} that was
* designed specifically for making In-vehice Infotainment systems.
*
* It is a minimalistic protocol, and only provides the following functionality:
*
* \list 1
* \li The client can identify itself with an \e{IVI-id}.
* \li The server can request that the client resizes itself.
* \endlist
*
* \section2 The Identification Numbers
*
* In a typical \l IviApplication setup, you will have a predefined set of applications that can
* connect to the server. Since these applications are already known when the system is designed,
* they can be assigned hardcoded numbers that identify them. Given that the client and server
* agree on these numbers ahead of time, semantics can be built into the ID numbers.
*
* For instance, if a client identifies itself as the navigation application, the server can
* recognize this and allocate a large, centered part of the screen for its window. An application
* identifying itself as a clock, on the other hand, might be delegated to a smaller area in the
* margins of the screen.
*
* By default, Qt applications will advertise their system PIDs ("process IDs") as the \e{IVI-id}.
* The client can override this by setting \c{QT_IVI_SURFACE_ID} in its environment before
* connecting to the server.
*
* \section1 The Example
*
* A Qt Wayland Compositor may support multiple shell extensions at once, but the
* \e{IVICompositor example} only supports the \l IviApplication protocol. This means that the
* clients have to also support this shell extension in order to connect to the server.
*
* The compositor window in the example is split into two horizontally: A left area which is
* designated for a specialized application with the id "1337", and a right area which is for all
* other applications.
*
* \image ivi-compositor-1.png
*
* \section2 Creating the Layout
*
* The layout of the window is created inside a \l WaylandOutput. This typically corresponds to
* a physical screen available to the compositor. If a single \l WaylandOutput is created, as in
* the \e{IVICompositor example}, it will usually correspond to the primary screen.
*
* \snippet ivi-compositor/main.qml wayland output
*
* The code creates a \l WaylandOutput for the screen and creates a \l Window on this as the top
* level container of all compositor contents. Inside this window, it creates two rectangles that
* will serve as containers for applications as they connect.
*
* \section2 Connecting Clients
*
* If no additional configuration has been done, a Qt application will connect with an \e{IVI-id}
* equal to its process ID. For instance, if we run another Qt example application with
* \c{-platform wayland}, it will be delegated to the right-hand side of the layout, granted that
* its ID is different from "1337".
*
* \image ivi-compositor-2.png
*
* However, if we set the \c{QT_IVI_SURFACE_ID} environment variable to "1337" before starting
* the example, it will be delegated to the left-hand side of the layout.
*
* \image ivi-compositor-3.png
*
* When a client connects to the \c IVIApplication interface, it will emit the \c{iviSurfaceCreated}
* signal. This is where the positioning of the application's surface is handled.
*
* \snippet ivi-compositor/main.qml connecting
*
* The \c{iviSurfaceCreated} signal receives an \l IviSurface argument which can be used to access
* the client's ID. The compositor then creates a \l ShellSurfaceItem for the surface (as defined by
* the \c chromeComponent). \c ShellSurfaceItem is the class used for placing shell surfaces into
* the Qt Quick scene, and you will see this same pattern in all the Qt Wayland Compositor examples.
*
* What makes the \e{IVICompositor example} special is that it checks the \c iviId property of the
* incoming shell surface and decides on a parent for the \l ShellSurfaceItem depending on what
* this is. If the ID is equal to "1337" it will be parented to the \c leftArea, and if not it will
* be in the \c rightArea.
*
* The implementation of the \l ShellSurfaceItem handles resizing by informing the client whenever
* the size changes (which can happen if the compositor is running inside a desktop-style windowing
* system and its window is resized).
*
* \snippet ivi-compositor/main.qml resizing
*
* The \c{sendConfigure()} method is defined in \l IviSurface and will send an event to the client.
* The client will receive a resize event with the new size, so it can relayout its contents.
*
* If multiple applications connect to the same area in the layout, they will simply be stacked
* according to normal Qt Quick ordering rules. There are no built-in mechanisms for closing
* applications or managing state, but this can easily be added as ordinary Qt Quick code.
*/
@@ -0,0 +1,14 @@
QT += gui qml
SOURCES += \
main.cpp
OTHER_FILES = \
main.qml
RESOURCES += ivi-compositor.qrc
target.path = $$[QT_INSTALL_EXAMPLES]/wayland/ivi-compositor
sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS ivi-compositor.pro
sources.path = $$[QT_INSTALL_EXAMPLES]/wayland/ivi-compositor
INSTALLS += target sources
@@ -0,0 +1,5 @@
<RCC>
<qresource prefix="/">
<file>main.qml</file>
</qresource>
</RCC>
@@ -0,0 +1,21 @@
// 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[])
{
// ShareOpenGLContexts is needed for using the threaded renderer
// on Nvidia EGLStreams
QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true);
QGuiApplication app(argc, argv);
QQmlApplicationEngine appEngine(QUrl("qrc:///main.qml"));
return app.exec();
}
@@ -0,0 +1,66 @@
// Copyright (C) 2017 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtQuick
import QtWayland.Compositor
import QtWayland.Compositor.IviApplication
import QtQuick.Window
WaylandCompositor {
//! [wayland output]
WaylandOutput {
sizeFollowsWindow: true
window: Window {
width: 1024
height: 768
visible: true
Rectangle {
id: leftArea
width: parent.width / 2
height: parent.height
anchors.left: parent.left
color: "cornflowerblue"
Text {
anchors.centerIn: parent
text: "Ivi surface with id 1337"
}
}
Rectangle {
id: rightArea
width: parent.width / 2
height: parent.height
anchors.right: parent.right
color: "burlywood"
Text {
anchors.centerIn: parent
text: "Other surfaces"
}
}
}
}
//! [wayland output]
Component {
id: chromeComponent
ShellSurfaceItem {
anchors.fill: parent
onSurfaceDestroyed: destroy()
//! [resizing]
onWidthChanged: handleResized()
onHeightChanged: handleResized()
function handleResized() {
if (width > 0 && height > 0)
shellSurface.sendConfigure(Qt.size(width, height));
}
//! [resizing]
}
}
//! [connecting]
IviApplication {
onIviSurfaceCreated: (iviSurface) => {
var surfaceArea = iviSurface.iviId === 1337 ? leftArea : rightArea;
var item = chromeComponent.createObject(surfaceArea, { "shellSurface": iviSurface } );
item.handleResized();
}
}
//! [connecting]
}