fix(renaser): apagar debug-assertions/overflow-checks vía rustflags
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 `<usize>::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 <noreply@anthropic.com>
This commit is contained in:
@@ -12,6 +12,16 @@
|
|||||||
# reciba la ruta de su ELF. Sigue siendo una funcion inestable (nightly).
|
# reciba la ruta de su ELF. Sigue siendo una funcion inestable (nightly).
|
||||||
bindeps = true
|
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]
|
[alias]
|
||||||
# Compila unicamente el kernel, en aislamiento de arquitectura. Se invoca por
|
# 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`
|
# `--manifest-path` y NO por `-p kernel`: desde la Fase 7b el kernel y `boot`
|
||||||
|
|||||||
@@ -84,6 +84,15 @@ wasmi = { version = "1.0", default-features = false, features = ["hash-collectio
|
|||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
[profile.dev]
|
[profile.dev]
|
||||||
panic = "abort"
|
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]
|
[profile.release]
|
||||||
panic = "abort"
|
panic = "abort"
|
||||||
|
|||||||
@@ -23,6 +23,28 @@ test = false
|
|||||||
bench = false
|
bench = false
|
||||||
doctest = 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]
|
[dependencies]
|
||||||
# --- Fase 1-2 :: arranque, framebuffer e interrupciones ---
|
# --- Fase 1-2 :: arranque, framebuffer e interrupciones ---
|
||||||
bootloader_api = "0.11"
|
bootloader_api = "0.11"
|
||||||
|
|||||||
Reference in New Issue
Block a user