multiboot2: Add stub support for relocation header tag
This commit is contained in:
parent
df4c3d9f02
commit
e4d2be7a7a
@ -33,12 +33,13 @@ static size_t get_multiboot2_info_size(
|
|||||||
) {
|
) {
|
||||||
return ALIGN_UP(sizeof(struct multiboot2_start_tag), MULTIBOOT_TAG_ALIGN) + // start
|
return ALIGN_UP(sizeof(struct multiboot2_start_tag), MULTIBOOT_TAG_ALIGN) + // start
|
||||||
ALIGN_UP(sizeof(struct multiboot_tag_string) + strlen(cmdline) + 1, MULTIBOOT_TAG_ALIGN) + // cmdline
|
ALIGN_UP(sizeof(struct multiboot_tag_string) + strlen(cmdline) + 1, MULTIBOOT_TAG_ALIGN) + // cmdline
|
||||||
ALIGN_UP(sizeof(struct multiboot_tag_string) + sizeof(LIMINE_BRAND), MULTIBOOT_TAG_ALIGN) + // bootloader brand
|
ALIGN_UP(sizeof(struct multiboot_tag_string) + sizeof(LIMINE_BRAND), MULTIBOOT_TAG_ALIGN) + // bootloader brand
|
||||||
ALIGN_UP(sizeof(struct multiboot_tag_framebuffer), MULTIBOOT_TAG_ALIGN) + // framebuffer
|
ALIGN_UP(sizeof(struct multiboot_tag_framebuffer), MULTIBOOT_TAG_ALIGN) + // framebuffer
|
||||||
ALIGN_UP(sizeof(struct multiboot_tag_new_acpi) + sizeof(struct rsdp), MULTIBOOT_TAG_ALIGN) + // new ACPI info
|
ALIGN_UP(sizeof(struct multiboot_tag_new_acpi) + sizeof(struct rsdp), MULTIBOOT_TAG_ALIGN) + // new ACPI info
|
||||||
ALIGN_UP(sizeof(struct multiboot_tag_old_acpi) + 20, MULTIBOOT_TAG_ALIGN) + // old ACPI info
|
ALIGN_UP(sizeof(struct multiboot_tag_old_acpi) + 20, MULTIBOOT_TAG_ALIGN) + // old ACPI info
|
||||||
ALIGN_UP(sizeof(struct multiboot_tag_elf_sections) + section_entry_size * section_num, MULTIBOOT_TAG_ALIGN) + // ELF info
|
ALIGN_UP(sizeof(struct multiboot_tag_elf_sections) + section_entry_size * section_num, MULTIBOOT_TAG_ALIGN) + // ELF info
|
||||||
ALIGN_UP(modules_size, MULTIBOOT_TAG_ALIGN) + // modules
|
ALIGN_UP(modules_size, MULTIBOOT_TAG_ALIGN) + // modules
|
||||||
|
ALIGN_UP(sizeof(struct multiboot_tag_load_base_addr), MULTIBOOT_TAG_ALIGN) + // load base address
|
||||||
ALIGN_UP(smbios_tag_size, MULTIBOOT_TAG_ALIGN) + // SMBIOS
|
ALIGN_UP(smbios_tag_size, MULTIBOOT_TAG_ALIGN) + // SMBIOS
|
||||||
ALIGN_UP(sizeof(struct multiboot_tag_basic_meminfo), MULTIBOOT_TAG_ALIGN) + // basic memory info
|
ALIGN_UP(sizeof(struct multiboot_tag_basic_meminfo), MULTIBOOT_TAG_ALIGN) + // basic memory info
|
||||||
ALIGN_UP(sizeof(struct multiboot_tag_mmap) + sizeof(struct multiboot_mmap_entry) * 256, MULTIBOOT_TAG_ALIGN) + // MMAP
|
ALIGN_UP(sizeof(struct multiboot_tag_mmap) + sizeof(struct multiboot_mmap_entry) * 256, MULTIBOOT_TAG_ALIGN) + // MMAP
|
||||||
@ -97,6 +98,8 @@ bool multiboot2_load(char *config, char* cmdline) {
|
|||||||
struct multiboot_header_tag_address *addresstag = NULL;
|
struct multiboot_header_tag_address *addresstag = NULL;
|
||||||
struct multiboot_header_tag_framebuffer *fbtag = NULL;
|
struct multiboot_header_tag_framebuffer *fbtag = NULL;
|
||||||
|
|
||||||
|
bool has_reloc_header = false;
|
||||||
|
|
||||||
bool is_new_acpi_required = false;
|
bool is_new_acpi_required = false;
|
||||||
bool is_old_acpi_required = false;
|
bool is_old_acpi_required = false;
|
||||||
|
|
||||||
@ -173,7 +176,11 @@ bool multiboot2_load(char *config, char* cmdline) {
|
|||||||
case MULTIBOOT_HEADER_TAG_EFI_BS:
|
case MULTIBOOT_HEADER_TAG_EFI_BS:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: panic(true, "multiboot2: Unknown header tag type");
|
case MULTIBOOT_HEADER_TAG_RELOCATABLE:
|
||||||
|
has_reloc_header = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: panic(true, "multiboot2: Unknown header tag type: %u\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -247,6 +254,14 @@ bool multiboot2_load(char *config, char* cmdline) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get the load base address (AKA the lowest target in the ranges)
|
||||||
|
uint64_t load_base_addr = (uint64_t)-1;
|
||||||
|
for (size_t i = 0; i < ranges_count; i++) {
|
||||||
|
if (load_base_addr > ranges[i].target) {
|
||||||
|
load_base_addr = ranges[i].target;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
size_t modules_size = 0;
|
size_t modules_size = 0;
|
||||||
size_t n_modules;
|
size_t n_modules;
|
||||||
|
|
||||||
@ -348,6 +363,21 @@ bool multiboot2_load(char *config, char* cmdline) {
|
|||||||
append_tag(info_idx, tag);
|
append_tag(info_idx, tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////
|
||||||
|
// Create load base address tag
|
||||||
|
//////////////////////////////////////////////
|
||||||
|
if (has_reloc_header) {
|
||||||
|
uint32_t size = sizeof(struct multiboot_tag_load_base_addr);
|
||||||
|
struct multiboot_tag_load_base_addr *tag = (void *)(mb2_info + info_idx);
|
||||||
|
|
||||||
|
tag->type = MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR;
|
||||||
|
tag->size = size;
|
||||||
|
|
||||||
|
tag->load_base_addr = load_base_addr;
|
||||||
|
|
||||||
|
append_tag(info_idx, tag);
|
||||||
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////
|
//////////////////////////////////////////////
|
||||||
// Create modules tag
|
// Create modules tag
|
||||||
//////////////////////////////////////////////
|
//////////////////////////////////////////////
|
||||||
@ -463,7 +493,6 @@ bool multiboot2_load(char *config, char* cmdline) {
|
|||||||
if (resolution != NULL)
|
if (resolution != NULL)
|
||||||
parse_resolution(&req_width, &req_height, &req_bpp, resolution);
|
parse_resolution(&req_width, &req_height, &req_bpp, resolution);
|
||||||
|
|
||||||
|
|
||||||
struct fb_info fbinfo;
|
struct fb_info fbinfo;
|
||||||
if (!fb_init(&fbinfo, req_width, req_height, req_bpp)) {
|
if (!fb_init(&fbinfo, req_width, req_height, req_bpp)) {
|
||||||
#if bios == 1
|
#if bios == 1
|
||||||
|
Loading…
Reference in New Issue
Block a user