misc: Misc EFI-related adjustments
This commit is contained in:
parent
40e65eddb1
commit
110d2dc7d4
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue