Files
brahman/renaser/apps/discola/src/lib.rs
T
sergio e2272c0ed3 feat: integra renaser (kernel SASOS bare-metal) al monorepo
renaser —kernel asíncrono de espacio de direcciones único, no-POSIX,
`no_std` x86_64— entra al monorepo como su PROPIO workspace de Cargo,
no fusionado: usa toolchain nightly, target `x86_64-unknown-none` y
`panic = "abort"`, incompatibles con los perfiles globales de brahman.

- `renaser/` — copia del proyecto (sin su `.git`; el repo original
  conserva su historia standalone). Workspace propio con su
  `rust-toolchain.toml` y `.cargo/`.
- `exclude = ["renaser"]` en el workspace de brahman: Cargo lo trata
  como ajeno.
- El kernel de renaser path-depende `mirada-layout` cruzando la
  frontera de workspace — primer núcleo compartido. Semilla de la
  Fase 8 (compositor): geometría de teselado compartida, framebuffer
  nativo de renaser; smithay se queda en el lado Linux.

Verificado: `cargo build -p boot` compila kernel + imagen UEFI con
mirada-layout enlazado para bare-metal.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 14:37:14 +00:00

47 lines
2.0 KiB
Rust

// =============================================================================
// renaser :: apps/discola — Fase 5 :: el inquilino discolo del userspace
// -----------------------------------------------------------------------------
// Esta aplicacion esta MAL a proposito. Su `tick` no hace un fotograma de
// trabajo y retorna —como manda el ABI cooperativo—: cae en un bucle cerrado
// y jamas devuelve el control. En un sistema cooperativo ingenuo, eso colgaria
// la maquina entera.
//
// Pero renaser ejecuta cada `tick` con un presupuesto estricto de COMBUSTIBLE.
// Cuando este bucle lo agota, el runtime `wasmi` lanza una trampa, el kernel
// recupera el mando y desaloja a este modulo — tatuando su region de purpura.
// El resto del userspace ni se entera. Eso es lo que esta app demuestra.
// =============================================================================
#![no_std]
/// Sin sistema operativo bajo nosotros, un panico solo puede detenerse en seco.
#[panic_handler]
fn al_fallar(_: &core::panic::PanicInfo) -> ! {
loop {}
}
/// Sumidero de las escrituras del bucle: obliga al compilador a CONSERVAR cada
/// iteracion —y, con ella, su consumo de combustible— en lugar de elidirla.
static mut SUMIDERO: u64 = 0;
/// Preparacion. No hay nada honrado que preparar: el kernel la invoca, retorna
/// sin incidentes, y la app pasa por buena... hasta su primer `tick`.
#[no_mangle]
pub extern "C" fn init() {}
/// El fotograma que nunca termina. Un bucle cerrado, deliberado: jamas retorna.
/// El kernel `renaser` lo cortara por agotamiento de combustible y desalojara
/// esta aplicacion sin que el sistema sufra un solo sobresalto.
#[no_mangle]
pub extern "C" fn tick() {
let mut contador: u64 = 0;
loop {
contador = contador.wrapping_add(1);
// SEGURIDAD: escritura volatil a un escalar estatico; su unico fin es
// que el optimizador no pueda vaciar el bucle. No se crea referencia.
unsafe {
core::ptr::write_volatile(core::ptr::addr_of_mut!(SUMIDERO), contador);
}
}
}