116 lines
2.7 KiB
C

#pragma once
#define MBOOT1_MAGIC 0x1BADB002
#define MBOOT1_MAGIC2 0x2BADB002
#define MBOOT1_FLAG_PAGE_ALIGN 0x01
#define MBOOT1_FLAG_MEM_INFO 0x02
#define MBOOT1_HEADER_FLAGS (MBOOT1_FLAG_PAGE_ALIGN | MBOOT1_FLAG_MEM_INFO)
#define MBOOT1_HEADER_CHECKSUM -(MBOOT1_HEADER_FLAGS + MBOOT1_MAGIC)
#define MBOOT2_MAGIC 0xE85250D6
#define MBOOT2_MAGIC2 0x36D76289
#define MBOOT2_ARCH 0
#define MBOOT2_LENGTH (MultiBootHeaderEnd - MultiBootHeader)
#define MBOOT2_CHECKSUM -(MBOOT2_MAGIC + MBOOT2_ARCH + MBOOT2_LENGTH)
#ifndef __ASSEMBLER__
#include <stdint.h>
// MULTIBOOT 1
typedef struct {
uint32_t flags;
uint32_t mem_lower;
uint32_t mem_upper;
uint32_t boot_device;
uint32_t cmdline;
uint32_t mods_count;
uint32_t mods_addr;
uint32_t symbol_num;
uint32_t symbol_size;
uint32_t symbol_addr;
uint32_t symbol_shndx;
uint32_t mmap_len;
uint32_t mmap_addr;
uint32_t drives_len;
uint32_t drives_addr;
uint32_t config_table;
uint32_t bootloader_name;
uint32_t apm_table;
uint32_t vbe_control_info;
uint32_t vbe_mode_info;
uint32_t vbe_mode;
uint32_t vbe_interface_seg;
uint32_t vbe_interface_off;
uint32_t vbe_interface_len;
} mboot1_info;
typedef struct {
uint32_t size;
uint32_t base_lo;
uint32_t base_hi;
uint32_t len_lo;
uint32_t len_hi;
uint32_t type;
} mboot1_mmap_entry;
typedef struct {
uint32_t mod_start;
uint32_t mod_end;
uint32_t str_ptr;
uint32_t reserved;
} mboot1_module_entry;
// MULTIBOOT 2
typedef struct {
uint32_t total_size;
uint32_t reserved;
} mboot2_tags_head;
typedef struct {
uint32_t type;
uint32_t size;
char data[];
} mboot2_tag_basic;
typedef struct {
uint64_t base_addr;
uint64_t length;
uint32_t type;
uint32_t reserved;
} mboot2_mmap_entry;
typedef struct {
uint32_t entry_size;
uint32_t entry_version;
mboot2_mmap_entry entries[];
} mboot2_memory_map;
#define MBOOT2_CMDLINE 1
#define MBOOT2_BOOTLOADER 2
#define MBOOT2_MMAP 6
#define MBOOT2_ACPI_V1 14
#define MBOOT2_ACPI_V2 15
// Multiboot tags are padded to a multiple of 8 bytes
#define next_tag(tag) ((void *)((((uintptr_t)tag) + tag->size + 7) & ~0x7))
extern char *mboot_tags_type[];
struct mboot_data_st{
int version;
void *data;
char *commandline;
char *bootloader;
void *mmap;
uint32_t mmap_size;
void *rsdp;
void *init;
uint64_t init_len;
};
extern struct mboot_data_st mboot_data;
#define MBOOT_MMAP_FREE 1
void multiboot_init(uint64_t magic, void *data);
int multiboot_page_used(uintptr_t addr);
int multiboot_get_memory_area(uintptr_t *start, uintptr_t *end, uint32_t *type);
#endif