Skip to content

feat(genesis): hito G0 — workspace multi-arch + Cortex-M backend + STM32F7 HAL + blink#1

Merged
guillo93 merged 4 commits into
mainfrom
feat/genesis-g0-cortex-m-stm32f7
May 25, 2026
Merged

feat(genesis): hito G0 — workspace multi-arch + Cortex-M backend + STM32F7 HAL + blink#1
guillo93 merged 4 commits into
mainfrom
feat/genesis-g0-cortex-m-stm32f7

Conversation

@guillo93

Copy link
Copy Markdown
Owner

Summary

Primera entrega funcional de Rugus: kernel/OS Rust puro no_std multi-arquitectura. Este PR contiene el hito G0 (génesis) completo y deja el repo listo para que cualquier ingeniero o agente IA pueda continuar desde G1.

Visión

  • Rust puro no_std. Cero FFI a C en el núcleo.
  • Multi-arch por diseño. rugus-core no depende de PAC ni de cortex-m; todo pasa por el trait Arch. Empezamos con Cortex-M7 (STM32F7); la estructura admite Cortex-M0+/M4/M33, ARMv8-A, AVR, RISC-V sin reescribir el core.
  • HAL por traits. rugus-hal separado del kernel; cada chip-family implementa los traits en su crate.
  • Seguridad como pilar. MPU/MMU/PMP obligatorios donde el chip los tenga (post G2); apps #![forbid(unsafe_code)]; boot Ed25519 + OTA dual-bank (G6).
  • No promesa sin prueba. Una arch o un chip no se anuncia como soportado hasta que un examples/blink-<board> parpadea en HW real.

Qué entra

Workspace (5 crates)

Crate Rol Estado G0
rugus-core arch-agnostic: trait Arch, scheduler stub, syscall ABI v0.1, Errno escrito
rugus-arch-cortex-m impl Arch para ARMv7-M / v7E-M / v8-M stub (real en G1)
rugus-hal solo traits, #![forbid(unsafe_code)]: GpioPin, SerialPort escrito
rugus-hal-stm32f7 impl HAL STM32F7 (gpio mínimo); features f767/f769/f779 gpio listo
rugus-runtime panic-probe + defmt-rtt + entry para Cortex-M targets listo

Ejemplo

  • examples/blink-stm32f769-disco/ — binario standalone con su propio memory.x, .cargo/config.toml, README.md. Toggle LD1 (PJ13) usando rugus_hal_stm32f7::LedPin vía trait rugus_hal::GpioPin. Logs defmt por SWD/RTT.

Documentación (docs/)

  • ARCHITECTURE.md — capas, dependencias unidireccionales, trait Arch, política unsafe por crate, estrategia de testing host/QEMU/on-target.
  • ROADMAP.md — hitos G0..G7 + G∞, métricas objetivo por arch (Cortex-M7 y Cortex-A53).
  • PORTING.md — cómo añadir una arch nueva (Caso A), un chip nuevo (Caso B), un driver nuevo (Caso C); checklist pre-merge.
  • HAL_TRAITS.md — contrato público de los traits, plan de crecimiento, capacidades chip-specific (Chrom-ART, JPEG HW, PIO, etc.) fuera del trait genérico.
  • SECURITY_MODEL.md — amenazas, dominios MPU, boot Ed25519, OTA dual-bank, trait SecretStore sin get_key().
  • SYSCALL_ABI.md — convención por arch (SVC/ECALL/etc), tabla v0.1, validación de punteros user-space.
  • INVARIANTS.md — 7 invariantes con mecanismo de verificación.
  • agent-memory/ — README + project.md + preferences.md (P-1..P-7) para agentes IA que asistan.

Infra de repo

  • Dual licensing MIT OR Apache-2.0.
  • CONTRIBUTING.md con reglas duras (Rust puro, política unsafe por capa, deps unidireccionales).
  • rustfmt.toml, rust-toolchain.toml con targets futuros documentados.
  • .github/workflows/ci.yml con matrix por target — preparada para crecer cuando se añadan archs.
  • AGENT_LOG.md inicializado con entrada G0.

Arquitecturas planificadas

Arch Chip ejemplar Hito
Cortex-M7 (ARMv7E-M) STM32F769NIH6 G0 actual
Cortex-M4 / M0+ STM32F411 / RP2040 G3
Cortex-M33 (ARMv8-M Main) nRF5340 G4
RISC-V RV32IMAC ESP32-C3 G5
Cortex-A53 (ARMv8-A) Raspberry Pi 4 G5
AVR 8-bit ATmega328P exploratorio

Test plan

  • rustup target add thumbv7em-none-eabihf instalado.
  • cargo install probe-rs-tools --locked instalado.
  • cargo build --workspace pasa sin errores.
  • cargo build --workspace --release pasa sin errores.
  • cargo fmt --all -- --check pasa.
  • cargo clippy --workspace --all-targets -- -D warnings pasa (probable que falle inicialmente por stubs no usados — iterar).
  • STM32F769I-DISCO conectada por USB ST-LINK → cd examples/blink-stm32f769-disco && cargo run flashea.
  • LD1 (PJ13) parpadea a ~1 Hz.
  • Consola RTT muestra INFO rugus blink @ STM32F769I-DISCO, HSI 16 MHz default y INFO LD1 (PJ13) configured; toggling at ~1 Hz.
  • CI GitHub Actions verde (jobs: fmt, clippy, build dev/release, doc).

Próximos pasos (G1)

Ver docs/ROADMAP.md § G1: HSE 25 MHz → PLL 216 MHz + AHB/APB, activar I/D-Cache del M7, FMC init SDRAM 16 MB, allocator simple en SDRAM, scheduler cooperativo round-robin, context switch real en rugus-arch-cortex-m con PendSV + naked ASM en .itcm.

Relación con otros repos

  • Primer consumidor: guillo93/Panel-smartH — panel smart-home. Será refactorizado en PR aparte como consumidor delgado de Rugus.

🤖 Este PR fue preparado por Claude Opus 4.7 (agente IA) en sesión asistida. Ver AGENT_LOG.md para contexto completo, decisiones no obvias y sugerencias para el próximo agente que toque el código.

guillo93 and others added 4 commits May 24, 2026 14:42
…M32F7 HAL + blink

Workspace Cargo con 5 crates y primer ejemplo en HW real.

Crates:
  - rugus-core            arch-agnostic; trait Arch + scheduler stub +
                          syscall ABI v0.1 + Errno
  - rugus-arch-cortex-m   impl Arch para ARMv7-M/v7E-M/v8-M (stub G0;
                          real en G1)
  - rugus-hal             solo traits, #![forbid(unsafe_code)]:
                          GpioPin, SerialPort
  - rugus-hal-stm32f7     impl HAL para familia STM32F7 (gpio mínimo,
                          features por variante f767/f769/f779)
  - rugus-runtime         panic-probe + defmt-rtt + entry macro para
                          targets Cortex-M

Ejemplo:
  - examples/blink-stm32f769-disco  binario standalone con su propio
    memory.x, .cargo/config.toml, README. Toggle LD1 (PJ13) usando
    rugus-hal-stm32f7::LedPin vía trait rugus-hal::GpioPin.

Docs (docs/):
  - ARCHITECTURE       capas, deps unidireccionales, trait Arch, política
                       unsafe por crate
  - ROADMAP            G0..G7 + G-infinito, métricas objetivo por arch
  - PORTING            cómo añadir nueva arch (Caso A), nuevo chip (B),
                       nuevo driver (C); checklist pre-merge
  - HAL_TRAITS         contrato público GpioPin/SerialPort, planeados
                       Timer/Rng/EthMac/Display/Crypto/BlockDev,
                       capacidades chip-specific
  - SECURITY_MODEL     modelo de amenazas, dominios MPU, boot Ed25519,
                       OTA dual-bank, trait SecretStore
  - SYSCALL_ABI        convención por arch (SVC/ECALL/etc), tabla v0.1,
                       validación de punteros user-space
  - INVARIANTS         7 invariantes con mecanismo de verificación
  - agent-memory/      project + preferences (P-1..P-7) + README

Infra:
  - rustfmt.toml, rust-toolchain.toml con targets futuros documentados
  - .github/workflows/ci.yml con matrix por target (preparada para crecer)
  - AGENT_LOG.md inicializado con entrada G0

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
  - .gitattributes normaliza EOL a LF para fuentes; CRLF solo para
    *.ps1/*.bat/*.cmd. Elimina los warnings al hacer git add desde
    Windows/OneDrive.
  - tools/flash-stm32f769-disco.ps1 helper PowerShell para build + flash
    + RTT del ejemplo blink, análogo al que tenía Panel-smartH antes del
    refactor.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
  - README: nueva sección "Qué es Rugus (y qué no)" con tabla de
    personalidades por arch + tagline. Rugus es OS con dos personalidades
    según el chip (RTOS en MCUs sin MMU, OS general-purpose en SoCs con
    MMU), usando un solo codebase via trait Arch.
  - README: sección "Referencias canónicas" con xv6, Phil Opp, OSDev,
    OSTEP, Tock, Hubris, Embassy, seL4 + manuales ARM/RISC-V.
  - ARCHITECTURE: sección "Posicionamiento - RTOS y OS en un solo
    codebase" con diagrama de taxonomía y tabla por backend.
  - ARCHITECTURE: subsección "QEMU como red de seguridad" — cada arch
    backend incluirá un ejemplo qemu-<arch> para CI sin HW; QEMU no
    sustituye pruebas on-target pero caza el 80% de bugs de lógica.
  - AGENT_LOG: entrada documentando la clarificación.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Arregla las 5 checks rotas y añade los 3 archivos estándar de proyecto
open source que faltaban.

Bugs fixes:
  - stm32f7 0.15.1 no tiene feature `critical-section` (asumido por
    error). Removida del workspace y de rugus-arch-cortex-m.
  - `#[defmt::timestamp]` no es atributo en defmt 0.3+; es macro.
    Corregido en rugus-runtime.
  - Features per-part en rugus-hal-stm32f7 eran alias sin efecto; el
    PAC agrupa por die (stm32f7x9 cubre F769/F779). stm32f767 retirado
    (no encaja en ese die).
  - cargo fmt: tres líneas BSRR write en gpio.rs excedían 100 cols.

Validación local: build dev/release, fmt, clippy con -D warnings, y
cargo doc — todos verdes.

Higiene open source:
  - SECURITY.md         política de vulnerabilidades; canal preferido
                        GitHub Security Advisories, SLAs por severidad
  - CODE_OF_CONDUCT.md  Contributor Covenant 2.1
  - CHANGELOG.md        Keep a Changelog format, entrada [0.1.0] G0

AGENT_LOG actualizado con entrada del fix + decisión sobre licencia
(mantener dual MIT/Apache; no cambiar a GPL).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@guillo93 guillo93 merged commit da44bd1 into main May 25, 2026
5 checks passed
@guillo93 guillo93 deleted the feat/genesis-g0-cortex-m-stm32f7 branch May 25, 2026 00:22
guillo93 added a commit that referenced this pull request Jun 6, 2026
)

`TaskSlot.stack_base` pasa de `u32` a `usize`. En los targets Cortex-M
`usize == u32` (codegen y bits identicos; los cruces hacia el arch/MPU
castean explicitamente a u32), pero en el host de tests (64-bit) el campo
preserva el puntero completo sin truncar. Eso permite ejercer por primera
vez en host la RECONSTRUCCION COMPLETA de stack de `respawn` (repintar el
buffer real + rearmar el frame), antes solo validable en placa.

Test host nuevo: respawn_reconstructs_stack_and_resets_task. Ensucia una
tarea (hereda prioridad via PI + arma liveness), la mata y la respawnea;
verifica Killed->Ready, prioridad reseteada a base, liveness desarmado y
stack repintado por completo (high-water 0, prueba de que el fill recorrio
el buffer real). Se actualiza el comentario obsoleto del guard test.
host-tests 33->34.

Validado en placa (sin regresion del cambio usize): F407 selftests PASS +
W^X PASS + sandbox MPU contiene bad_app; F769 (telemetria fria) selftests
PASS + respawn de bad_app #1/#2/#3 vivo en HW.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
guillo93 added a commit that referenced this pull request Jun 6, 2026
…lar de faults (#97)

* F5.C.3: API de ficheros userland por syscall+IPC bajo MPU + log circular de faults

Cierra la línea F5.C exponiendo el almacén persistente rugus-fs a una tarea
userland (nPRIV, sandboxeada por MPU) con el mismo diseño híbrido que la red
(F5.B.2).

ABI (rugus-core):
- Syscalls fs_open/fs_read/fs_write/fs_close (SVC 0x50..0x53) con FsHooks +
  register_fs, dispatch fail-closed a Enosys, y trampolines userland — espejo
  exacto del patrón NetHooks. Nuevo Errno::Enoent (-10). Todo por valor en
  registros: el contenido viaja por un pool App-RW, ningún puntero cruza la
  frontera de confianza.

rugus-fs:
- Módulo faultlog: log circular de faults persistente sobre Rufs (anillo FIFO
  de CAP ranuras + contador seq persistido). Complementa la telemetría .uninit
  volátil; power-loss-safe por herencia de Rufs (append + CRC).

Ejemplo fs-userland-stm32f769-disco (F769-only):
- 2 tareas (kernel LED + app USER). La Rufs sobre QSPI la posee el kernel; los
  hooks privilegiados resuelven la E/S síncrona en contexto SVC (sin canal
  async: la flash es síncrona y el SVC corre a término). Arranque privilegiado:
  vuelca log de faults previos, registra evento de boot, incrementa boot_count.
- La app userland NO llama defmt (el bloque de control RTT vive en RAM
  priv-only); reporta resultados por contadores en el pool que loguea el kernel.

Tests host (rugus-host-tests): +7 (4 faultlog + 3 syscall_fs).
Docs: SYSCALL_ABI.md y docs/boards/stm32f769-disco.md actualizados.

Validado HW F769 (3 power-cycles): boot_count 3->4->5, log circular retiene
#0(arg3)+#1(arg4) y añade #2, 1024+ verificaciones userland OK / 0 MISMATCH /
cero faults.

* style(fs-userland): aplica rustfmt al ejemplo F5.C.3

Corrige los 3 diffs que detectaba `cargo fmt --check` en CI
(record multilínea, FileSlot shorthand, CFG_KEYS.get multilínea).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant