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;
};