gioser

tawasuyu/brahman

Rust 533TOML 203Markdown 58JSON 197650 Definiciones

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>

2ad11b53c346bf12065e62cca93becc3a0aadacd · por sergio · (hace 5 meses) · padre 5edd8de91 · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

3 archivos · +41 −0

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"