Files
brahman/renaser/Cargo.toml
T
sergio 2ad11b53c3 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>
2026-05-23 00:27:06 +00:00

102 lines
5.5 KiB
TOML

# =============================================================================
# renaser :: manifiesto raíz del espacio de trabajo
# -----------------------------------------------------------------------------
# Un único espacio de direccionamiento, una única verdad de versiones.
# Las dependencias se declaran aqui una sola vez y persisten, coherentes,
# a traves de todos los miembros del sistema.
# =============================================================================
[workspace]
resolver = "2"
# Solo `boot` es miembro del espacio de trabajo: corre en el anfitrion. El
# kernel queda EXCLUIDO a proposito —es bare-metal puro y jamas debe compilarse
# para el anfitrion— y se construye unica y exclusivamente como dependencia de
# artefacto de `boot`, que le fija el target `x86_64-unknown-none`.
members = ["boot"]
# El kernel (bare-metal) y las apps WASM (target wasm32) se compilan aparte,
# cada cual con su propio target; quedan fuera del espacio de trabajo.
# `formato` —el formato del grafo en disco— tambien se excluye: es un nucleo
# `no_std` que enlaza el kernel bare-metal, asi que se compila como dependencia
# de cada lado (kernel y boot) y no como miembro del workspace anfitrion.
exclude = ["kernel", "apps", "formato"]
# -----------------------------------------------------------------------------
# Metadatos compartidos: cada miembro hereda esta identidad con `*.workspace`.
# -----------------------------------------------------------------------------
[workspace.package]
version = "0.1.0"
edition = "2021"
license = "MPL-2.0"
authors = ["JL Soltech <gerencia@jlsoltech.com>"]
description = "renaser :: kernel asincrono SASOS basado en aislamiento por software"
# -----------------------------------------------------------------------------
# Dependencias del ecosistema. Reutilizamos infraestructura madura en lugar
# de reinventar boilerplate. `default-features = false` se aplica con bisturi,
# unicamente alli donde las features por defecto arrastrarian `std`.
# -----------------------------------------------------------------------------
[workspace.dependencies]
# Constructor de la imagen de disco UEFI/BIOS. Es una herramienta de ANFITRION
# (usa std), la consume el miembro `boot` y NO debe enlazarse jamas en el kernel.
bootloader = "0.11"
# API `#![no_std]` que el kernel SI consume: expone `entry_point!`, `BootInfo`
# y la descripcion del framebuffer GOP. Su version debe acompasar a `bootloader`.
bootloader_api = "0.11"
# Abstraccion de la CPU x86_64: registros de control, GDT, IDT e instrucciones
# privilegiadas sin ensamblador inline. Es `#![no_std]` de nacimiento; su
# feature `instructions` (activa por defecto) nos da `hlt` y el control de IRQ.
x86_64 = "0.15"
# Rasterizacion de primitivas vectoriales sobre el framebuffer. `#![no_std]`,
# sin heap: en la Fase 1 solo aporta el rasgo `DrawTarget` del lienzo.
embedded-graphics = "0.8"
# Rasterizador de tipografias. REQUIERE `alloc`, de modo que solo se teje en el
# kernel una vez exista el asignador (Fase 2). `default-features = false`
# silencia su feature `std`. Se declara ya para congelar la version.
# `hashbrown` es lo que ACTIVA el modo `no_std` de fontdue; sin el, la crate
# recae en `std::collections` y no compila para bare-metal. `simd` queda fuera:
# nuestro target no tiene SSE.
fontdue = { version = "0.9", default-features = false, features = ["hashbrown"] }
# --- Fase 3 :: heap dinamico y reactor asincrono ---
# Asignador del heap del kernel — algoritmo probado, configurado `no_std`.
linked_list_allocator = "0.10"
# Exclusion mutua sin sistema operativo: `Mutex` e inicializacion unica `Once`.
spin = "0.9"
# Cola lock-free, segura frente a interrupciones, para el canal de scancodes.
crossbeam-queue = { version = "0.3", default-features = false, features = ["alloc"] }
# Combinadores `Future`/`Stream` y `AtomicWaker`. Sin ejecutor ni I/O: solo
# las piezas que renaser teje en su propio reactor.
futures-util = { version = "0.3", default-features = false, features = ["alloc"] }
# --- Fase 4 :: interprete WebAssembly para el userspace aislado ---
# `wasmi` en modo bare-metal: sin `std`, sin `wat`, sin `simd` (el target no
# tiene SSE). `hash-collections` le da mapas basados en hashbrown, `no_std`.
wasmi = { version = "1.0", default-features = false, features = ["hash-collections"] }
# -----------------------------------------------------------------------------
# Perfiles de compilacion. Cargo exige que los perfiles vivan en la RAIZ del
# espacio de trabajo. `panic = "abort"` es obligatorio: sin sistema operativo
# subyacente no hay desenrollado de pila (`unwinding`) posible.
# -----------------------------------------------------------------------------
[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"
opt-level = "s" # codigo compacto: cada byte cuenta en bare-metal
lto = true # el optimizador cruza fronteras de crate
codegen-units = 1 # una sola unidad => maxima oportunidad de optimizacion