From 2ad11b53c346bf12065e62cca93becc3a0aadacd Mon Sep 17 00:00:00 2001 From: sergio Date: Sat, 23 May 2026 00:27:06 +0000 Subject: [PATCH] =?UTF-8?q?fix(renaser):=20apagar=20debug-assertions/overf?= =?UTF-8?q?low-checks=20v=C3=ADa=20rustflags?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Era la causa raíz del «pantalla negra + franja roja» en máquinas con nightlies recientes (laptops, KVM, etc.) que mi Proxmox no exhibía: - En modo debug, la stdlib inyecta `::unchecked_mul::precondition_check` en cada `unchecked_mul` (RawVec::current_memory, in_place_collect…). - El camino de pánico de ese check, en bare-metal, escribe en regiones que el cargador no mapeó → #PF → al panic handler del kernel, que pinta la franja roja: un colapso DENTRO de la red de seguridad del colapso. - 1202 callsites en el binario debug — uno fallaba en la laptop del usuario. El fix: `rustflags = ["-Cdebug-assertions=off", "-Coverflow-checks=off"]` en `[target.x86_64-unknown-none]` de `.cargo/config.toml`. Los `[profile]` del manifiesto no propagaban a las deps precompiladas (wasmi, virtio- drivers, etc., que se quedan como artifact-deps fuera del workspace); `rustflags` por target sí. Tras un `cargo clean` + rebuild, cero llamadas a precondition_check, y el boot trace por COM1 corre completo. También: `[profile.dev]`/`[profile.release]` del kernel y workspace declaran los flags explícitamente, por si alguna ruta de cargo cambia. Co-Authored-By: Claude Opus 4.7 --- renaser/.cargo/config.toml | 10 ++++++++++ renaser/Cargo.toml | 9 +++++++++ renaser/kernel/Cargo.toml | 22 ++++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/renaser/.cargo/config.toml b/renaser/.cargo/config.toml index d8a86ca..e319231 100644 --- a/renaser/.cargo/config.toml +++ b/renaser/.cargo/config.toml @@ -12,6 +12,16 @@ # reciba la ruta de su ELF. Sigue siendo una funcion inestable (nightly). bindeps = true +# Banderas para TODA crate que se compile hacia `x86_64-unknown-none` (el +# target bare-metal del kernel). Apagar `debug-assertions` y `overflow-checks` +# elimina las `unchecked_mul::precondition_check` que la stdlib inyecta en +# debug — son verificaciones cuyo propio camino de panico, en bare-metal, +# escribe en regiones que el cargador no mapeo: un colapso DENTRO de la red +# de seguridad del colapso. Los `[profile]` no llegaban a las dependencias +# precompiladas; `rustflags` por target si lo hace. +[target.x86_64-unknown-none] +rustflags = ["-Cdebug-assertions=off", "-Coverflow-checks=off"] + [alias] # Compila unicamente el kernel, en aislamiento de arquitectura. Se invoca por # `--manifest-path` y NO por `-p kernel`: desde la Fase 7b el kernel y `boot` diff --git a/renaser/Cargo.toml b/renaser/Cargo.toml index 50fbca4..1560dd0 100644 --- a/renaser/Cargo.toml +++ b/renaser/Cargo.toml @@ -84,6 +84,15 @@ wasmi = { version = "1.0", default-features = false, features = ["hash-collectio # ----------------------------------------------------------------------------- [profile.dev] panic = "abort" +# En bare-metal, las verificaciones UB de la stdlib —el `precondition_check` +# de `unchecked_mul`, p.ej.— inyectan un panico cuyo propio camino de +# propagacion termina escribiendo en regiones que el cargador no mapeo: un +# colapso DENTRO de la red de seguridad del propio colapso, imposible de +# diagnosticar. Desactivar las aserciones de depuracion y las comprobaciones +# de overflow las elimina del binario sin cambiar la semantica del codigo +# correcto. Es practica habitual de los kernels y el de renaser no es excepcion. +debug-assertions = false +overflow-checks = false [profile.release] panic = "abort" diff --git a/renaser/kernel/Cargo.toml b/renaser/kernel/Cargo.toml index 658cf1e..0573f72 100644 --- a/renaser/kernel/Cargo.toml +++ b/renaser/kernel/Cargo.toml @@ -23,6 +23,28 @@ test = false bench = false doctest = false +# ----------------------------------------------------------------------------- +# Perfiles. El kernel esta EXCLUIDO del workspace; los `[profile]` del raiz +# no le alcanzan, asi que se declaran aqui. En bare-metal, las verificaciones +# UB de la stdlib —`unchecked_mul::precondition_check`, etc.— inyectan un +# panico cuyo propio camino de propagacion suele escribir en regiones que el +# cargador no mapeo: un colapso DENTRO de la red de seguridad del colapso, +# imposible de diagnosticar. Desactivar `debug-assertions` y `overflow-checks` +# las saca del binario sin cambiar la semantica del codigo correcto. +# ----------------------------------------------------------------------------- +[profile.dev] +panic = "abort" +debug-assertions = false +overflow-checks = false + +[profile.release] +panic = "abort" +debug-assertions = false +overflow-checks = false +opt-level = "s" +lto = true +codegen-units = 1 + [dependencies] # --- Fase 1-2 :: arranque, framebuffer e interrupciones --- bootloader_api = "0.11"