misc: Misc EFI-related adjustments

This commit is contained in:
mintsuki 2021-05-20 01:16:39 +02:00
parent 40e65eddb1
commit 110d2dc7d4
9 changed files with 38 additions and 39 deletions

View File

@ -23,19 +23,16 @@
void stage3_common(void); void stage3_common(void);
#if defined (uefi) #if defined (uefi)
EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) { __attribute__((naked))
EFI_STATUS efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
// Invalid return address of 0 to end stacktraces here // Invalid return address of 0 to end stacktraces here
asm volatile ( asm (
"push 0\n\t" "push 0\n\t"
"push 0\n\t" "push 0\n\t"
"xor eax, eax\n\t" "xor eax, eax\n\t"
"jmp uefi_entry\n\t" "jmp uefi_entry\n\t"
:
: "D" (ImageHandle), "S" (SystemTable)
: "memory"
); );
(void)ImageHandle; (void)SystemTable;
__builtin_unreachable();
} }
__attribute__((noreturn)) __attribute__((noreturn))
@ -66,7 +63,7 @@ void uefi_entry(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
&loaded_image); &loaded_image);
if (status) { if (status) {
panic("HandleProtocol failure (%x)\n", status); panic("HandleProtocol failure (%x)", status);
} }
boot_volume = disk_volume_from_efi_handle(loaded_image->DeviceHandle); boot_volume = disk_volume_from_efi_handle(loaded_image->DeviceHandle);

View File

@ -52,17 +52,15 @@ do_32:
bits 32 bits 32
.go_32: .go_32:
mov eax, cr0 mov eax, 0x00000011
btr eax, 31
mov cr0, eax mov cr0, eax
mov ecx, 0xc0000080 mov ecx, 0xc0000080
rdmsr xor eax, eax
btr eax, 8 xor edx, edx
wrmsr wrmsr
mov eax, cr4 xor eax, eax
btr eax, 5
mov cr4, eax mov cr4, eax
call edi call edi

View File

@ -10,8 +10,6 @@
#include <mm/pmm.h> #include <mm/pmm.h>
__attribute__((noreturn)) void panic(const char *fmt, ...) { __attribute__((noreturn)) void panic(const char *fmt, ...) {
asm volatile ("cli" ::: "memory");
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);

View File

@ -165,7 +165,7 @@ void chainload(char *config) {
efi_image_handle, &loaded_img_prot_guid, efi_image_handle, &loaded_img_prot_guid,
&loader_loaded_image); &loader_loaded_image);
if (status) { if (status) {
panic("HandleProtocol failure (%x)\n", status); panic("chainload: HandleProtocol failure (%x)", status);
} }
EFI_LOADED_IMAGE_PROTOCOL *new_handle_loaded_image = NULL; EFI_LOADED_IMAGE_PROTOCOL *new_handle_loaded_image = NULL;
@ -173,7 +173,7 @@ void chainload(char *config) {
new_handle, &loaded_img_prot_guid, new_handle, &loaded_img_prot_guid,
&new_handle_loaded_image); &new_handle_loaded_image);
if (status) { if (status) {
panic("HandleProtocol failure (%x)\n", status); panic("chainload: HandleProtocol failure (%x)", status);
} }
new_handle_loaded_image->DeviceHandle = loader_loaded_image->DeviceHandle; new_handle_loaded_image->DeviceHandle = loader_loaded_image->DeviceHandle;

View File

@ -33,6 +33,15 @@ __attribute__((noreturn)) void linux_spinup(void *entry, void *boot_params) {
#endif #endif
}; };
// Load invalid IDT
uint64_t invalid_idt[2] = {0, 0};
asm volatile (
"lidt %0"
:
: "m" (invalid_idt)
: "memory"
);
asm volatile ( asm volatile (
"lgdt %0\n\t" "lgdt %0\n\t"

View File

@ -350,17 +350,17 @@ void linux_load(char *config, char *cmdline) {
char *kernel_path = config_get_value(config, 0, "KERNEL_PATH"); char *kernel_path = config_get_value(config, 0, "KERNEL_PATH");
if (kernel_path == NULL) if (kernel_path == NULL)
panic("KERNEL_PATH not specified"); panic("linux: KERNEL_PATH not specified");
if (!uri_open(kernel, kernel_path)) if (!uri_open(kernel, kernel_path))
panic("Could not open kernel resource"); panic("linux: Could not open kernel resource");
uint32_t signature; uint32_t signature;
fread(kernel, &signature, 0x202, sizeof(uint32_t)); fread(kernel, &signature, 0x202, sizeof(uint32_t));
// validate signature // validate signature
if (signature != 0x53726448) { if (signature != 0x53726448) {
panic("Invalid Linux kernel signature"); panic("linux: Invalid Linux kernel signature");
} }
size_t setup_code_size = 0; size_t setup_code_size = 0;
@ -389,7 +389,7 @@ void linux_load(char *config, char *cmdline) {
setup_header->version >> 8, setup_header->version & 0xff); setup_header->version >> 8, setup_header->version & 0xff);
if (setup_header->version < 0x203) { if (setup_header->version < 0x203) {
panic("Linux protocols < 2.03 are not supported"); panic("linux: Protocols < 2.03 are not supported");
} }
setup_header->cmd_line_ptr = (uint32_t)(uintptr_t)cmdline; setup_header->cmd_line_ptr = (uint32_t)(uintptr_t)cmdline;
@ -408,7 +408,7 @@ void linux_load(char *config, char *cmdline) {
setup_header->type_of_loader = 0xff; setup_header->type_of_loader = 0xff;
if (!(setup_header->loadflags & (1 << 0))) { if (!(setup_header->loadflags & (1 << 0))) {
panic("Linux kernels that load at 0x10000 are not supported"); panic("linux: Kernels that load at 0x10000 are not supported");
} }
setup_header->loadflags &= ~(1 << 5); // print early messages setup_header->loadflags &= ~(1 << 5); // print early messages
@ -443,7 +443,7 @@ void linux_load(char *config, char *cmdline) {
struct file_handle module; struct file_handle module;
if (!uri_open(&module, module_path)) if (!uri_open(&module, module_path))
panic("Could not open `%s`", module_path); panic("linux: Could not open `%s`", module_path);
size_of_all_modules += module.size; size_of_all_modules += module.size;
} }
@ -466,7 +466,7 @@ void linux_load(char *config, char *cmdline) {
struct file_handle module; struct file_handle module;
if (!uri_open(&module, module_path)) if (!uri_open(&module, module_path))
panic("Could not open `%s`", module_path); panic("linux: Could not open `%s`", module_path);
print("linux: Loading module `%s`...\n", module_path); print("linux: Loading module `%s`...\n", module_path);

View File

@ -41,12 +41,12 @@ void stivale_load(char *config, char *cmdline) {
char *kernel_path = config_get_value(config, 0, "KERNEL_PATH"); char *kernel_path = config_get_value(config, 0, "KERNEL_PATH");
if (kernel_path == NULL) if (kernel_path == NULL)
panic("KERNEL_PATH not specified"); panic("stivale: KERNEL_PATH not specified");
print("stivale: Loading kernel `%s`...\n", kernel_path); print("stivale: Loading kernel `%s`...\n", kernel_path);
if (!uri_open(kernel_file, kernel_path)) if (!uri_open(kernel_file, kernel_path))
panic("Could not open kernel resource"); panic("stivale: Could not open kernel resource");
struct stivale_header stivale_hdr; struct stivale_header stivale_hdr;
@ -153,7 +153,7 @@ void stivale_load(char *config, char *cmdline) {
struct file_handle f; struct file_handle f;
if (!uri_open(&f, module_path)) if (!uri_open(&f, module_path))
panic("Requested module with path \"%s\" not found!", module_path); panic("stivale: Requested module with path \"%s\" not found!", module_path);
m->begin = REPORTED_ADDR((uint64_t)(size_t)freadall(&f, STIVALE_MMAP_KERNEL_AND_MODULES)); m->begin = REPORTED_ADDR((uint64_t)(size_t)freadall(&f, STIVALE_MMAP_KERNEL_AND_MODULES));
m->end = m->begin + f.size; m->end = m->begin + f.size;

View File

@ -63,12 +63,12 @@ void stivale2_load(char *config, char *cmdline, bool pxe, void *efi_system_table
char *kernel_path = config_get_value(config, 0, "KERNEL_PATH"); char *kernel_path = config_get_value(config, 0, "KERNEL_PATH");
if (kernel_path == NULL) if (kernel_path == NULL)
panic("KERNEL_PATH not specified"); panic("stivale2: KERNEL_PATH not specified");
print("stivale2: Loading kernel `%s`...\n", kernel_path); print("stivale2: Loading kernel `%s`...\n", kernel_path);
if (!uri_open(kernel_file, kernel_path)) if (!uri_open(kernel_file, kernel_path))
panic("Could not open kernel resource"); panic("stivale2: Could not open kernel resource");
struct stivale2_header stivale2_hdr; struct stivale2_header stivale2_hdr;
@ -228,7 +228,7 @@ void stivale2_load(char *config, char *cmdline, bool pxe, void *efi_system_table
struct file_handle f; struct file_handle f;
if (!uri_open(&f, module_path)) if (!uri_open(&f, module_path))
panic("Requested module with path \"%s\" not found!", module_path); panic("stivale2: Requested module with path \"%s\" not found!", module_path);
m->begin = REPORTED_ADDR((uint64_t)(size_t)freadall(&f, STIVALE2_MMAP_KERNEL_AND_MODULES)); m->begin = REPORTED_ADDR((uint64_t)(size_t)freadall(&f, STIVALE2_MMAP_KERNEL_AND_MODULES));
m->end = m->begin + f.size; m->end = m->begin + f.size;

View File

@ -14,8 +14,7 @@ smp_trampoline:
lea eax, [ebx + .mode32] lea eax, [ebx + .mode32]
mov [cs:.farjmp_off], eax mov [cs:.farjmp_off], eax
mov eax, cr0 mov eax, 0x00000011
bts eax, 0
mov cr0, eax mov cr0, eax
o32 jmp far [cs:.farjmp] o32 jmp far [cs:.farjmp]
@ -32,10 +31,8 @@ smp_trampoline:
mov gs, ax mov gs, ax
mov ss, ax mov ss, ax
mov eax, cr0 xor eax, eax
btr eax, 29 mov cr4, eax
btr eax, 30
mov cr0, eax
test dword [ebx + passed_info.target_mode], (1 << 2) test dword [ebx + passed_info.target_mode], (1 << 2)
jz .nox2apic jz .nox2apic
@ -68,8 +65,8 @@ smp_trampoline:
mov cr3, eax mov cr3, eax
mov ecx, 0xc0000080 mov ecx, 0xc0000080
rdmsr mov eax, 0x100
bts eax, 8 xor edx, edx
wrmsr wrmsr
mov eax, cr0 mov eax, cr0