117 lines
2.9 KiB
Markdown
117 lines
2.9 KiB
Markdown
# 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](#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.
|
|
|
|
```c
|
|
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.
|
|
|
|
```c
|
|
struct acpi_info {
|
|
uint8_t is_valid;
|
|
void *rsdp;
|
|
};
|
|
```
|
|
|
|
```c
|
|
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.
|
|
|
|
```c
|
|
#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
|
|
|
|
```c
|
|
struct framebuffer_info {
|
|
void *addr;
|
|
uint32_t width;
|
|
uint32_t height;
|
|
uint16_t bpp;
|
|
};
|
|
```
|