aurix/docs/boot/BOOTPROTOCOL.md
2025-01-20 21:52:47 +01:00

2.9 KiB

Aurix Boot Protocol (revision 0.2)

The Aurix Boot Protocol presents a simple and minimal protocol for booting the AurixOS kernel.

Note

This document is still a work in progress and may contain incomplete information.

Machine state

  • All general purpose registers are zeroed out

  • Interrupts are disabled

  • Framebuffer is set to the best available video mode (graphics mode if available)

Architecture-specific

x86_64

  • Write Protection bit in CR0 is disabled

  • GDT is set up as follows:

Name Base Limit Flags
NULL Descriptor 0x00 0x0000 0x00
32-bit Code Descriptor 0x00 0xFFFFFFFF Read only
32-bit Data Descriptor 0x00 0xFFFFFFFF Read/Write
64-bit Code Descriptor 0x00 0x0000 Read only
64-bit Data Descriptor 0x00 0x0000 Read/Write

Paging

  • If available, 5-level paging is set up (see Kernel Parameters) 5-level paging is not yet supported in AxBoot
  • The memory map is identity mapped
  • Kernel is mapped to the higher half if desired

Kernel parameters

The bootloader passes abp_boot_info structure as a parameter to the kernel.

A non-zero value in lvl5_paging indicates that 5-level paging has been set up and is available.

struct abp_boot_info {
    // General
    char *bootloader_name;
    char *bootloader_version;
    char *protocol_version;

    // ACPI and SMBIOS
    struct acpi_info acpi;
    struct smbios_info smbios;

    // Memory
    struct memory_map *memmap;
    int lvl5_paging;

    // Framebuffer
    struct framebuffer_info framebuffer;
};

ACPI and SMBIOS

These structures contain pointers to the Root System Description Pointer (ACPI) and System Management BIOS Entry Point (SMBIOS). If is_valid is set to a non-zero value, the pointer is guaranteed to be valid. Otherwise, the pointer is set to NULL and should not be used.

struct acpi_info {
    uint8_t is_valid;
    void *rsdp;
};
struct smbios_info {
    uint8_t is_valid;
    void *entry_point;
};

Memory map

The memory map is a singly linked list containing the physical address of the entry, its length and type, as well as a pointer to the next entry.

Entries are guaranteed to not overlap with each other, and sorted by base address from low to high.

#define ABP_MEMORY_RESERVED 0xf0
#define ABP_MEMORY_USABLE 0xf1
#define ABP_MEMORY_BOOTLOADER_RECLAIMABLE 0xf2
#define ABP_MEMORY_MMIO 0xf3
#define ABP_MEMORY_ACPI_NVS 0xf4
#define ABP_MEMORY_ACPI_RECLAIMABLE 0xf5
#define ABP_MEMORY_KERNEL 0xf7
#define ABP_MEMORY_NOT_USABLE 0xff

struct memory_map {
    uint64_t base;
    uint64_t length;
    uint64_t type;

    struct memory_map *next;
};

Framebuffer

struct framebuffer_info {
    void *addr;
    uint32_t width;
    uint32_t height;
    uint16_t bpp;
};