multiboot: Allow for headless boots
This commit is contained in:
parent
4b4f3c9d68
commit
a0810f9e13
|
@ -317,7 +317,7 @@ noreturn void multiboot1_load(char *config, char *cmdline) {
|
||||||
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 defined (UEFI)
|
#if defined (UEFI)
|
||||||
panic(true, "multiboot1: Failed to set video mode");
|
goto skip_modeset;
|
||||||
#elif defined (BIOS)
|
#elif defined (BIOS)
|
||||||
size_t rows, cols;
|
size_t rows, cols;
|
||||||
init_vga_textmode(&rows, &cols, false);
|
init_vga_textmode(&rows, &cols, false);
|
||||||
|
@ -348,7 +348,7 @@ noreturn void multiboot1_load(char *config, char *cmdline) {
|
||||||
print("multiboot1: Warning: Cannot use text mode with UEFI\n");
|
print("multiboot1: Warning: Cannot use text mode with UEFI\n");
|
||||||
struct fb_info fbinfo;
|
struct fb_info fbinfo;
|
||||||
if (!fb_init(&fbinfo, 0, 0, 0)) {
|
if (!fb_init(&fbinfo, 0, 0, 0)) {
|
||||||
panic(true, "multiboot1: Failed to set video mode");
|
goto skip_modeset;
|
||||||
}
|
}
|
||||||
multiboot1_info->fb_addr = (uint64_t)fbinfo.framebuffer_addr;
|
multiboot1_info->fb_addr = (uint64_t)fbinfo.framebuffer_addr;
|
||||||
multiboot1_info->fb_width = fbinfo.framebuffer_width;
|
multiboot1_info->fb_width = fbinfo.framebuffer_width;
|
||||||
|
@ -376,6 +376,8 @@ noreturn void multiboot1_load(char *config, char *cmdline) {
|
||||||
}
|
}
|
||||||
|
|
||||||
multiboot1_info->flags |= (1 << 12);
|
multiboot1_info->flags |= (1 << 12);
|
||||||
|
|
||||||
|
skip_modeset:;
|
||||||
} else {
|
} else {
|
||||||
#if defined (UEFI)
|
#if defined (UEFI)
|
||||||
panic(true, "multiboot1: Cannot use text mode with UEFI.");
|
panic(true, "multiboot1: Cannot use text mode with UEFI.");
|
||||||
|
|
|
@ -109,6 +109,8 @@ noreturn void multiboot2_load(char *config, char* cmdline) {
|
||||||
|
|
||||||
bool is_elf_info_requested = false;
|
bool is_elf_info_requested = false;
|
||||||
|
|
||||||
|
bool is_framebuffer_required = false;
|
||||||
|
|
||||||
uint64_t entry_point = 0xffffffff;
|
uint64_t entry_point = 0xffffffff;
|
||||||
|
|
||||||
// Iterate through the entries...
|
// Iterate through the entries...
|
||||||
|
@ -143,7 +145,9 @@ noreturn void multiboot2_load(char *config, char* cmdline) {
|
||||||
case MULTIBOOT_TAG_TYPE_EFI64_IH:
|
case MULTIBOOT_TAG_TYPE_EFI64_IH:
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
break;
|
||||||
case MULTIBOOT_TAG_TYPE_FRAMEBUFFER:
|
case MULTIBOOT_TAG_TYPE_FRAMEBUFFER:
|
||||||
|
is_framebuffer_required = is_required;
|
||||||
break;
|
break;
|
||||||
case MULTIBOOT_TAG_TYPE_ACPI_NEW:
|
case MULTIBOOT_TAG_TYPE_ACPI_NEW:
|
||||||
is_new_acpi_required = is_required;
|
is_new_acpi_required = is_required;
|
||||||
|
@ -521,7 +525,11 @@ noreturn void multiboot2_load(char *config, char* cmdline) {
|
||||||
tag->common.framebuffer_bpp = 16;
|
tag->common.framebuffer_bpp = 16;
|
||||||
tag->common.framebuffer_type = MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT;
|
tag->common.framebuffer_type = MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT;
|
||||||
#elif defined (UEFI)
|
#elif defined (UEFI)
|
||||||
panic(true, "multiboot2: Failed to set video mode");
|
if (is_framebuffer_required) {
|
||||||
|
panic(true, "multiboot2: Failed to set video mode");
|
||||||
|
} else {
|
||||||
|
goto skip_modeset;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
tag->common.framebuffer_addr = fbinfo.framebuffer_addr;
|
tag->common.framebuffer_addr = fbinfo.framebuffer_addr;
|
||||||
|
@ -543,8 +551,13 @@ noreturn void multiboot2_load(char *config, char* cmdline) {
|
||||||
print("multiboot2: Warning: Cannot use text mode with UEFI\n");
|
print("multiboot2: Warning: Cannot use text mode with UEFI\n");
|
||||||
struct fb_info fbinfo;
|
struct fb_info fbinfo;
|
||||||
if (!fb_init(&fbinfo, 0, 0, 0)) {
|
if (!fb_init(&fbinfo, 0, 0, 0)) {
|
||||||
panic(true, "multiboot2: Failed to set video mode");
|
if (is_framebuffer_required) {
|
||||||
|
panic(true, "multiboot2: Failed to set video mode");
|
||||||
|
} else {
|
||||||
|
goto skip_modeset;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tag->common.framebuffer_addr = fbinfo.framebuffer_addr;
|
tag->common.framebuffer_addr = fbinfo.framebuffer_addr;
|
||||||
tag->common.framebuffer_pitch = fbinfo.framebuffer_pitch;
|
tag->common.framebuffer_pitch = fbinfo.framebuffer_pitch;
|
||||||
tag->common.framebuffer_width = fbinfo.framebuffer_width;
|
tag->common.framebuffer_width = fbinfo.framebuffer_width;
|
||||||
|
@ -572,6 +585,8 @@ noreturn void multiboot2_load(char *config, char* cmdline) {
|
||||||
}
|
}
|
||||||
|
|
||||||
append_tag(info_idx, &tag->common);
|
append_tag(info_idx, &tag->common);
|
||||||
|
|
||||||
|
skip_modeset:;
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////
|
//////////////////////////////////////////////
|
||||||
|
|
|
@ -23,7 +23,7 @@ void multiboot_main(uint32_t magic, struct multiboot1_info *info) {
|
||||||
{
|
{
|
||||||
struct multiboot1_module *start = (struct multiboot1_module *)info->mods_addr;
|
struct multiboot1_module *start = (struct multiboot1_module *)info->mods_addr;
|
||||||
struct multiboot1_module *end = (struct multiboot1_module *)(info->mods_addr + info->mods_count);
|
struct multiboot1_module *end = (struct multiboot1_module *)(info->mods_addr + info->mods_count);
|
||||||
|
|
||||||
e9_printf("\t modules:");
|
e9_printf("\t modules:");
|
||||||
for (struct multiboot1_module* entry = start; entry < end; entry++) {
|
for (struct multiboot1_module* entry = start; entry < end; entry++) {
|
||||||
e9_printf("\t\t begin=%x", entry->begin);
|
e9_printf("\t\t begin=%x", entry->begin);
|
||||||
|
@ -32,29 +32,27 @@ void multiboot_main(uint32_t magic, struct multiboot1_info *info) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(Andy-Python-Programmer): ELF sections are unimplemented
|
|
||||||
|
|
||||||
{
|
{
|
||||||
struct multiboot1_mmap_entry *start = (struct multiboot1_mmap_entry *)info->mmap_addr;
|
struct multiboot1_mmap_entry *start = (struct multiboot1_mmap_entry *)info->mmap_addr;
|
||||||
struct multiboot1_mmap_entry *end = (struct multiboot1_mmap_entry *)(info->mmap_addr + info->mmap_length);
|
struct multiboot1_mmap_entry *end = (struct multiboot1_mmap_entry *)(info->mmap_addr + info->mmap_length);
|
||||||
|
|
||||||
e9_printf("\t useable_entries_mmap:");
|
e9_printf("\t usable_entries_mmap:");
|
||||||
|
|
||||||
size_t total_mem = 0;
|
size_t total_mem = 0;
|
||||||
|
|
||||||
// For now we only print the useable memory map entries since
|
// For now we only print the usable memory map entries since
|
||||||
// printing the whole memory map blows my terminal up. We also
|
// printing the whole memory map blows my terminal up. We also
|
||||||
// iterate through the avaliable memory map entries and add up
|
// iterate through the avaliable memory map entries and add up
|
||||||
// to find the total amount of useable memory.
|
// to find the total amount of usable memory.
|
||||||
for (struct multiboot1_mmap_entry* entry = start; entry < end; entry++) {
|
for (struct multiboot1_mmap_entry* entry = start; entry < end; entry++) {
|
||||||
// Check if the memory map entry is marked as useable!
|
// Check if the memory map entry is marked as usable!
|
||||||
if (entry->type != 1) {
|
if (entry->type != 1) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
e9_printf("\t\t addr=%x", entry->addr);
|
e9_printf("\t\t addr=%x", entry->addr);
|
||||||
e9_printf("\t\t length=%x", entry->len);
|
e9_printf("\t\t length=%x", entry->len);
|
||||||
e9_printf("\t\t type=Useable");
|
e9_printf("\t\t type=Usable");
|
||||||
|
|
||||||
// Now this might be a bit confusing since but `entry->size` represents the
|
// Now this might be a bit confusing since but `entry->size` represents the
|
||||||
// is the size of the associated structure in bytes and `entry->len` represents the
|
// is the size of the associated structure in bytes and `entry->len` represents the
|
||||||
|
@ -91,4 +89,4 @@ void multiboot_main(uint32_t magic, struct multiboot1_info *info) {
|
||||||
|
|
||||||
out:
|
out:
|
||||||
for (;;);
|
for (;;);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue