Skip to content
BootloaderCMIT · v0.1.0Critical — Foundation Layer

eBootloader — Multi-Architecture Bootloader

10 Architectures · 24 Reference Boards · A/B Update Slots

A portable, secure, fail-safe bootloader for 24 boards across 10 architectures. Supports A/B update slots, measured boot, TPM 2.0, and a unified board-support package model.

10
Architectures
24
Reference Boards
A/B
Update Slots
< 500 ms
Cold Boot (Cortex-M)

How It Works

Step-by-step flow — from initialization to output.

1

ROM Bootstrap

The chip's immutable ROM code runs first. It reads the eBoot primary image from flash, verifies its Ed25519 signature against the public key burned into OTP, and jumps to eBoot if the signature is valid.

# ROM verifies eBoot signature against OTP public key
# If valid: jump to eBoot primary slot
# If invalid: enter recovery mode (USB/UART DFU)
2

eBoot Initializes Hardware

eBoot initializes the minimum hardware needed for boot: clocks, DRAM controller, watchdog, and the storage interface (eMMC/QSPI/SD). It then reads the firmware slot manifest to decide which slot (A or B) to boot.

// eBoot hardware init sequence
eBoot_clocks_init();    // PLL, dividers
eBoot_dram_init();      // DDR4/LPDDR4 training
eBoot_storage_init();   // eMMC / QSPI
eBoot_wdt_arm(30000);   // 30 s watchdog
3

Verify Firmware Slot

eBoot reads the active firmware slot (A or B), verifies its ECDSA-256 signature, checks the anti-rollback counter in OTP, and optionally decrypts the payload with AES-256-GCM if the image is encrypted.

// Slot verification
if (eBoot_slot_verify(SLOT_A) == EBOOT_OK) {
    eBoot_slot_boot(SLOT_A);
} else if (eBoot_slot_verify(SLOT_B) == EBOOT_OK) {
    eBoot_slot_boot(SLOT_B);
} else {
    eBoot_recovery_enter();  // Both slots invalid
}
4

Hand Off to EoS Kernel

eBoot passes a boot descriptor (memory map, device tree, boot reason) to the EoS kernel entry point and jumps to it. The watchdog is armed — if EoS doesn't check in within 30 s, eBoot rolls back to the other slot.

// Hand-off structure
eBoot_descriptor_t desc = {
    .dtb_addr   = 0x80000000,
    .boot_reason = EBOOT_REASON_NORMAL,
    .slot        = SLOT_A,
};
eBoot_jump_to_kernel(&desc);
5

OTA Update Flow

When a new firmware image arrives (over HTTPS, MQTT, or USB), the application writes it to the inactive slot and marks it as pending. On next reboot, eBoot verifies and activates the new slot. If the new firmware fails to mark itself healthy, eBoot rolls back automatically.

// Application triggers OTA
ota_download_to_slot(SLOT_B, url, &progress_cb);
eBoot_slot_mark_pending(SLOT_B);
eos_reboot();  // eBoot will verify + activate SLOT_B

Usage Examples

Real-world scenarios showing eBootloader in action.

Secure OTA Update

A fleet of 10,000 industrial sensors receives a firmware update over MQTT with automatic rollback on failure.

// Application-side OTA trigger
#include <eboot/ota.h>

void ota_task(void *arg) {
    // Download signed firmware to inactive slot
    eboot_ota_result_t r = eboot_ota_download(
        SLOT_B,
        "https://updates.embeddedos.org/fw/v1.2.0.eos",
        &verify_cb
    );

    if (r == EBOOT_OTA_OK) {
        eboot_slot_mark_pending(SLOT_B);
        eos_reboot();  // eBoot activates SLOT_B on next boot
    }
}

// In EoS application — mark firmware healthy
void app_startup_check(void) {
    if (eboot_slot_is_pending()) {
        run_self_test();
        eboot_slot_mark_healthy();  // Prevent rollback
    }
}

Features

The shape of eBootloader at a glance.

10 Architectures

ARMv7-M, ARMv8-A, RISC-V (RV32, RV64), x86_64, AArch64, MIPS, PowerPC, Xtensa, AVR.

24 Reference Boards

STM32, NXP i.MX, Raspberry Pi, BeagleBone, ESP32, RISC-V SiFive, NVIDIA Jetson, and more.

A/B Update Slots

Two firmware slots with automatic fallback if a new image fails to mark itself healthy.

Signed Images

Ed25519 / ECDSA signature verification rooted in immutable boot ROM.

Encrypted Updates

Optional AES-GCM payload encryption for over-the-air delivery.

Recovery Mode

Standalone recovery slot with USB / UART / TFTP firmware upload.

Fast Boot

Sub-second cold boot on Cortex-M, sub-3-second on Cortex-A SoCs.

Watchdog Hand-Off

Hard watchdog armed before kernel runs; rolls back if kernel doesn't check in.

Role in the EoS Ecosystem

Why eBootloader matters — and what breaks without it.

eBootloader is the first piece of EmbeddedOS software that runs on every device. It establishes the chain of trust that every other component depends on. Without a verified boot chain, an attacker could replace the EoS kernel or any application with malicious code. eBoot's A/B update slots make zero-downtime OTA updates possible across the entire EoS fleet — from 256 KB microcontrollers to 64-core edge servers. Every EoS device ships with eBoot; it is non-optional.

Depends On

ROM bootloader — chip-level immutable code that verifies eBoot itself
OTP / eFuse — stores the root public key and anti-rollback counter
eBuild — signs firmware images with the Ed25519 key that eBoot verifies

Enables / Powers

EoS Kernel — eBoot hands off to EoS after signature verification
eDB — encryption keys are rooted in the eBoot chain of trust
OTA update system — A/B slots enable zero-downtime firmware updates
Remote attestation — TPM measurements prove firmware integrity

Open source on GitHub

MIT licensed and developed in the open. Issues, discussions, and pull requests welcome.

⌥ embeddedos-org/eboot
Multi-Architecture Bootloader
CMITv0.1.0
Open ↗

In the EoS stack

eBootloader is highlighted in the layer below.

App layer
UI / browser layer
Data layer
AI runtime
Neural interface
IPC fabric
EoS kernel + HAL
eos-platform profile
eBootloader
Build / IDE / Sim

Technical Specifications

Signature AlgorithmECDSA-256 (NIST P-256 curve)
Hash AlgorithmSHA-256
EncryptionAES-256-GCM for encrypted firmware images
Anti-RollbackMonotonic counter in OTP / eFuse; configurable policy
Update ProtocolOTA-ready; dual-bank A/B update with atomic swap
Debug SecurityJTAG/SWD lock-out in production mode; debug unlock via signed token
Boot Time (Cortex-M)< 500 ms cold boot to kernel handoff
Boot Time (Cortex-A)< 3 s cold boot to kernel handoff
Supported ArchitecturesARMv7-M, ARMv8-A/R, RISC-V RV32/RV64, x86_64, AArch64, MIPS, PowerPC, Xtensa, AVR
LicenseMIT