El segfault-139 de kwin en QEMU NO era llvmpipe ni el composite: diagnóstico por core dump + gdb del host (backtrace #0 0x0 ← dri2_initialize_drm ← eglInitialize ← EglDisplay::create ← DrmBackend::initialize; call *0x30(vtable swkmsMesaCoreExtension) = queryCompatibleRenderOnlyDeviceFd = NULL en el driver software). virtio-gpu-pci sin 3D expone un nodo KMS-only (no render-capable). En mesa 24.0.9 gbm sólo pone software=true vía dri_screen_create_sw, al que sólo se llega con GBM_ALWAYS_SOFTWARE o si dri_screen_create falla. Con MESA_LOADER_DRIVER_OVERRIDE kms_swrast, dri_screen_create tiene éxito ⇒ software=false ⇒ dri2_initialize_drm llama el vtable NULL ⇒ SIGSEGV. Fix: GBM_ALWAYS_SOFTWARE=1 en plasma-start. - plasma-start-qemu.sh: + GBM_ALWAYS_SOFTWARE=1 (el fix); + andamiaje de diagnóstico gated por DIAG=1 (logging kwin/mesa/egl verboso, stream vivo del kwin.log al serial, core dumps a /core + sync, sleep 3600 para congelar el serial). - run-qemu-desktop.sh (nuevo): run reproducible (DISP=none/gtk, TIMEOUT, VARS OVMF rw). - qemu-desktop-image.sh: restaurado bit +x. Verificado: headless (139=0, sin queryCompatible) y ventana gtk en DISPLAY=:0 — kwin_wayland + plasmashell + KSplash + kioworker vivos. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
55 lines
2.2 KiB
Bash
Executable File
55 lines
2.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# run-qemu-desktop.sh — arranca la imagen KDE en QEMU (virtio-gpu + software GL) de forma REPRODUCIBLE.
|
|
# Antes era un comando ad-hoc. Por defecto headless (DISPLAY=none) para diagnóstico por serial sin
|
|
# interferir con la sesión mirada del laptop; DISP=gtk para ver la ventana (necesita DISPLAY=:0 Xwayland,
|
|
# y cada restart de mirada mata la ventana).
|
|
#
|
|
# scripts/kde/run-qemu-desktop.sh # headless, serial → work/qemu-desktop-serial.log
|
|
# DISP=gtk scripts/kde/run-qemu-desktop.sh # ventana gráfica (virtio-gpu por gtk)
|
|
# TIMEOUT=90 scripts/kde/run-qemu-desktop.sh # mata QEMU a los 90s (diagnóstico automático)
|
|
set -euo pipefail
|
|
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT"
|
|
|
|
IMG="${IMG:-work/hammer-kde-qemu.img}"
|
|
SERIAL="${SERIAL:-work/qemu-desktop-serial.log}"
|
|
OVMF_CODE="${OVMF_CODE:-/usr/share/edk2/x64/OVMF_CODE.4m.fd}"
|
|
OVMF_VARS_SRC="${OVMF_VARS_SRC:-/usr/share/edk2/x64/OVMF_VARS.4m.fd}"
|
|
VARS="${VARS:-work/qemu-desktop-OVMF_VARS.fd}"
|
|
DISP="${DISP:-none}"
|
|
MEM="${MEM:-4G}"
|
|
SMP="${SMP:-4}"
|
|
|
|
[ -r "$IMG" ] || { echo "falta $IMG — corré scripts/kde/qemu-desktop-image.sh" >&2; exit 1; }
|
|
[ -r "$OVMF_CODE" ] || { echo "falta OVMF_CODE ($OVMF_CODE)" >&2; exit 1; }
|
|
# copia escribible de las VARS (pflash necesita rw; la del sistema es read-only)
|
|
[ -r "$VARS" ] || cp "$OVMF_VARS_SRC" "$VARS"
|
|
|
|
case "$DISP" in
|
|
gtk) DISPLAY_ARGS=(-display gtk -device virtio-gpu-pci) ;;
|
|
none) DISPLAY_ARGS=(-display none -device virtio-gpu-pci) ;;
|
|
*) DISPLAY_ARGS=(-display "$DISP" -device virtio-gpu-pci) ;;
|
|
esac
|
|
|
|
# serial nuevo cada corrida (el diagnóstico depende de que no se mezcle con boots viejos)
|
|
: > "$SERIAL"
|
|
|
|
QEMU_ARGS=(
|
|
-machine q35 -accel kvm -cpu host
|
|
-m "$MEM" -smp "$SMP"
|
|
-drive if=pflash,format=raw,unit=0,file="$OVMF_CODE",readonly=on
|
|
-drive if=pflash,format=raw,unit=1,file="$VARS"
|
|
-drive file="$IMG",format=raw,if=virtio
|
|
"${DISPLAY_ARGS[@]}"
|
|
-serial "file:$SERIAL"
|
|
-no-reboot
|
|
)
|
|
|
|
echo "==> QEMU (DISP=$DISP, serial=$SERIAL)"
|
|
echo " imagen: $IMG"
|
|
if [ -n "${TIMEOUT:-}" ]; then
|
|
echo " TIMEOUT=${TIMEOUT}s (auto-kill)"
|
|
exec timeout --signal=KILL "${TIMEOUT}" qemu-system-x86_64 "${QEMU_ARGS[@]}"
|
|
else
|
|
exec qemu-system-x86_64 "${QEMU_ARGS[@]}"
|
|
fi
|