[lcrash] ADD: Finish off AcpiInitialize
This commit is contained in:
parent
d4bb65f49b
commit
76de467bdc
53
lcrash/acpi/acpi.c
Normal file
53
lcrash/acpi/acpi.c
Normal file
@ -0,0 +1,53 @@
|
||||
#include "acpi.h"
|
||||
|
||||
#include "../types.h"
|
||||
#include "../lnxboot.h"
|
||||
#include "../util.h"
|
||||
|
||||
#include "../efi/memmap.h"
|
||||
#include "../efi/guid.h"
|
||||
#include "../efi/efi.h"
|
||||
|
||||
bool AcpiIsPresent = false;
|
||||
|
||||
struct AcpiRSDP* AcpiTheRSDP = 0;
|
||||
|
||||
void AcpiInitialize() {
|
||||
// Check boot params
|
||||
if (BootBootParams->acpi_rsdp_addr) {
|
||||
AcpiTheRSDP = BootBootParams->acpi_rsdp_addr;
|
||||
goto found;
|
||||
}
|
||||
|
||||
// Check firmware
|
||||
if (EfiPresent()) {
|
||||
const struct EfiSystemTable* SystemTable = EfiGetSystemTable();
|
||||
const struct EfiConfigurationTable* ConfigurationTable = EfiTranslatePointer(SystemTable->ConfigurationTable);
|
||||
for (int i = 0; i < SystemTable->NumberOfTableEntries; i++) { // this used to break because the cckernel decided to give me one last fuck you
|
||||
// and corrupt random portions of code, i really really hate DEFLATE.
|
||||
if (CompareMemory(&ConfigurationTable[i].VendorGuid, &EFI_ACPI_20_TABLE_GUID, sizeof(EfiGuid))) {
|
||||
AcpiTheRSDP = ConfigurationTable[i].VendorTable;
|
||||
goto found;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
goto fail;
|
||||
|
||||
found: // Is this a valid ACPI table?
|
||||
if (!CompareMemory(AcpiTheRSDP->Signature, "RSD PTR ", 8)) goto fail;
|
||||
|
||||
// Check the sum
|
||||
u8 Sum = 0;
|
||||
for (int i = 0; i < sizeof(struct AcpiRSDP); i++) Sum += ((u8*)AcpiTheRSDP)[i];
|
||||
if (Sum != 0) goto fail;
|
||||
|
||||
AcpiIsPresent = true;
|
||||
return;
|
||||
|
||||
fail: AcpiIsPresent = false;
|
||||
return;
|
||||
}
|
||||
|
||||
bool AcpiPresent() { return AcpiIsPresent; }
|
||||
struct AcpiRSDP* AcpiGetRSDP() { return AcpiTheRSDP; }
|
45
lcrash/efi/efi.c
Normal file
45
lcrash/efi/efi.c
Normal file
@ -0,0 +1,45 @@
|
||||
#include "efi.h"
|
||||
|
||||
#include "../types.h"
|
||||
#include "../lnxboot.h"
|
||||
|
||||
#include "./memmap.h"
|
||||
|
||||
static bool IsPresent = false;
|
||||
|
||||
// XXX: This was static but something got fucked up when it was.
|
||||
// investigate later
|
||||
const struct EfiSystemTable* SystemTable = 0;
|
||||
|
||||
void EfiInitialize() {
|
||||
// Get the system table
|
||||
if ((BootBootParams->efi_info.EfiSystemTable | BootBootParams->efi_info.EfiSystemTableHigh) != 0) {
|
||||
SystemTable = (struct EfiSystemTable*)(
|
||||
(uptr)BootBootParams->efi_info.EfiSystemTable |
|
||||
((uptr)BootBootParams->efi_info.EfiSystemTableHigh << 32)
|
||||
);
|
||||
} else goto fail;
|
||||
|
||||
// Load the memory map
|
||||
if ((BootBootParams->efi_info.EfiMemoryMap | BootBootParams->efi_info.EfiMemoryMapHigh) != 0) {
|
||||
if (BootBootParams->efi_info.EfiMemoryDescriptionSize == 0) goto fail;
|
||||
|
||||
EfiLoadStoredMemoryMap(
|
||||
(struct EfiMemoryDescription*)(
|
||||
(u64)BootBootParams->efi_info.EfiMemoryMap |
|
||||
((u64)BootBootParams->efi_info.EfiMemoryMapHigh << 32)
|
||||
),
|
||||
BootBootParams->efi_info.EfiMemoryMapSize / BootBootParams->efi_info.EfiMemoryDescriptionSize,
|
||||
BootBootParams->efi_info.EfiMemoryDescriptionSize
|
||||
);
|
||||
} else goto fail;
|
||||
|
||||
IsPresent = true;
|
||||
return;
|
||||
|
||||
fail: IsPresent = false;
|
||||
return;
|
||||
}
|
||||
|
||||
bool EfiPresent() { return IsPresent; }
|
||||
const struct EfiSystemTable* EfiGetSystemTable() { return SystemTable; }
|
18
lcrash/efi/efi.h
Normal file
18
lcrash/efi/efi.h
Normal file
@ -0,0 +1,18 @@
|
||||
#pragma once
|
||||
|
||||
#include "../types.h"
|
||||
|
||||
/**
|
||||
* Initialize EFI code if EFI is present
|
||||
*/
|
||||
void EfiInitialize();
|
||||
|
||||
/**
|
||||
* Check if EFI is present
|
||||
*/
|
||||
bool EfiPresent();
|
||||
|
||||
/**
|
||||
* Get the EFI system table
|
||||
*/
|
||||
const struct EfiSystemTable* EfiGetSystemTable();
|
4
lcrash/lnxboot.c
Normal file
4
lcrash/lnxboot.c
Normal file
@ -0,0 +1,4 @@
|
||||
#include "lnxboot.h"
|
||||
|
||||
struct setup_info* BootSetupInfo = 0;
|
||||
struct boot_params* BootBootParams = 0;
|
22
lcrash/main.c
Normal file
22
lcrash/main.c
Normal file
@ -0,0 +1,22 @@
|
||||
/// lcrash entry point
|
||||
/// super awesome...
|
||||
|
||||
#include "types.h"
|
||||
#include "lnxboot.h"
|
||||
|
||||
#include "efi/efi.h"
|
||||
|
||||
[[noreturn]]
|
||||
void entry64(struct boot_params* BootParams) {
|
||||
BootBootParams = BootParams;
|
||||
BootSetupInfo = (void*)BootParams + 0x1f1;
|
||||
|
||||
// Initialize EFI code if we had EFI
|
||||
EfiInitialize();
|
||||
|
||||
// Initialize ACPI code if we have ACPI
|
||||
AcpiInitialize();
|
||||
|
||||
// Hang :)
|
||||
while (1) {}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user