get MCFG table

This commit is contained in:
2026-01-29 17:05:58 +11:00
parent fa9d74fb1c
commit 6c8c97a67a
14 changed files with 39 additions and 12 deletions

Binary file not shown.

View File

@@ -61,4 +61,4 @@ buildimg:
mcopy -i $(BUILDDIR)/$(OSNAME).img $(BUILDDIR)/zap-light18.psf :: mcopy -i $(BUILDDIR)/$(OSNAME).img $(BUILDDIR)/zap-light18.psf ::
run: run:
qemu-system-x86_64 -drive file=$(BUILDDIR)/$(OSNAME).img -m 256M -cpu qemu64 -drive if=pflash,format=raw,unit=0,file="$(OVMFDIR)/OVMF_CODE-pure-efi.fd",readonly=on -drive if=pflash,format=raw,unit=1,file="$(OVMFDIR)/OVMF_VARS-pure-efi.fd" -net none qemu-system-x86_64 -machine q35 -drive file=$(BUILDDIR)/$(OSNAME).img -m 256M -cpu qemu64 -drive if=pflash,format=raw,unit=0,file="$(OVMFDIR)/OVMF_CODE-pure-efi.fd",readonly=on -drive if=pflash,format=raw,unit=1,file="$(OVMFDIR)/OVMF_VARS-pure-efi.fd" -net none

Binary file not shown.

Binary file not shown.

BIN
kernel/lib/acpi.o Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
kernel/lib/pci.o Normal file

Binary file not shown.

20
kernel/src/acpi.cpp Normal file
View File

@@ -0,0 +1,20 @@
#include "acpi.h"
namespace ACPI {
void* FindTable(SDTHeader* sdtHeader, char* signature) {
int entries = (sdtHeader->Length - sizeof(ACPI::SDTHeader)) / 8;
for (int t = 0; t < entries; t++) {
ACPI::SDTHeader* newSDTHeader = (ACPI::SDTHeader*)*(uint64_t*)((uint64_t)sdtHeader + sizeof(ACPI::SDTHeader) + (t * 8));
for (int i = 0; i < 4; i++) {
if (newSDTHeader->Signature[i] != signature[i]) {
break;
}
if (i == 3) return newSDTHeader;
}
}
return 0;
}
};

View File

@@ -30,4 +30,6 @@ namespace ACPI {
SDTHeader Header; SDTHeader Header;
uint64_t Reserved; uint64_t Reserved;
}__attribute__((packed)); }__attribute__((packed));
void* FindTable(SDTHeader* sdtHeader, char* signature);
}; };

View File

@@ -4,9 +4,6 @@ extern "C" void _start(BootInfo* bootInfo) {
KernelInfo kernelInfo = InitializeKernel(bootInfo); KernelInfo kernelInfo = InitializeKernel(bootInfo);
PageTableManager* pageTableManager = kernelInfo.pageTableManager; PageTableManager* pageTableManager = kernelInfo.pageTableManager;
GlobalRenderer->Print(to_hstring((uint64_t)bootInfo->rsdp));
GlobalRenderer->Next();
while (true) { while (true) {
ProcessMousePacket(); ProcessMousePacket();
} }

View File

@@ -13,9 +13,8 @@ extern "C" void __stack_chk_fail(void) {
KernelInfo kernelInfo; KernelInfo kernelInfo;
PageTableManager pageTableManager = NULL; PageTableManager pageTableManager = NULL;
void PrepareMemory(BootInfo* bootInfo){ void PrepareMemory(BootInfo* bootInfo){
GlobalRenderer->Print(" - Locking kernel pages..."); GlobalRenderer->Print("Preparing memory...");
GlobalRenderer->Next(); GlobalRenderer->Next();
uint64_t mMapEntries = bootInfo->mMapSize / bootInfo->mMapDescriptorSize; uint64_t mMapEntries = bootInfo->mMapSize / bootInfo->mMapDescriptorSize;
GlobalAllocator = PageFrameAllocator(); GlobalAllocator = PageFrameAllocator();
@@ -26,7 +25,7 @@ void PrepareMemory(BootInfo* bootInfo){
GlobalAllocator.LockPages(&_KernelStart, kernelPages); GlobalAllocator.LockPages(&_KernelStart, kernelPages);
GlobalRenderer->Print(" - Setting up page table manager..."); /*GlobalRenderer->Print(" - Setting up page table manager...");
GlobalRenderer->Next(); GlobalRenderer->Next();
PageTable* PML4 = (PageTable*)GlobalAllocator.RequestPage(); PageTable* PML4 = (PageTable*)GlobalAllocator.RequestPage();
@@ -47,7 +46,7 @@ void PrepareMemory(BootInfo* bootInfo){
asm ("mov %0, %%cr3" : : "r" (PML4)); asm ("mov %0, %%cr3" : : "r" (PML4));
kernelInfo.pageTableManager = &pageTableManager; kernelInfo.pageTableManager = &pageTableManager;*/
} }
IDTR idtr; IDTR idtr;
@@ -62,6 +61,11 @@ void SetIDTGate(void* handler, uint8_t entryOffset, uint8_t type_attr, uint8_t s
void PrepareACPI(BootInfo* bootInfo) { void PrepareACPI(BootInfo* bootInfo) {
ACPI::SDTHeader* xsdt = (ACPI::SDTHeader*)(bootInfo->rsdp->XSDTAddress); ACPI::SDTHeader* xsdt = (ACPI::SDTHeader*)(bootInfo->rsdp->XSDTAddress);
ACPI::MCFGHeader* mcfg = (ACPI::MCFGHeader*)ACPI::FindTable(xsdt, (char*)"MCFG");
GlobalRenderer->Print("All ACPI tables:");
GlobalRenderer->Next();
int entries = (xsdt->Length - sizeof(ACPI::SDTHeader)) / 8; int entries = (xsdt->Length - sizeof(ACPI::SDTHeader)) / 8;
for (int t = 0; t < entries; t++) { for (int t = 0; t < entries; t++) {
ACPI::SDTHeader* newSDTHeader = (ACPI::SDTHeader*)*(uint64_t*)((uint64_t)xsdt + sizeof(ACPI::SDTHeader) + (t * 8)); ACPI::SDTHeader* newSDTHeader = (ACPI::SDTHeader*)*(uint64_t*)((uint64_t)xsdt + sizeof(ACPI::SDTHeader) + (t * 8));
@@ -72,6 +76,11 @@ void PrepareACPI(BootInfo* bootInfo) {
} }
GlobalRenderer->Next(); GlobalRenderer->Next();
GlobalRenderer->Print("MCFG header location: 0x");
GlobalRenderer->Print(to_hstring((uint64_t)mcfg));
GlobalRenderer->Next();
GlobalRenderer->Next();
} }
void PrepareInterrupts() { void PrepareInterrupts() {
@@ -109,9 +118,6 @@ KernelInfo InitializeKernel(BootInfo* bootInfo){
gdtDescriptor.Offset = (uint64_t)&DefaultGDT; gdtDescriptor.Offset = (uint64_t)&DefaultGDT;
LoadGDT(&gdtDescriptor); LoadGDT(&gdtDescriptor);
GlobalRenderer->Print("Preparing memory...");
GlobalRenderer->Next();
PrepareMemory(bootInfo); PrepareMemory(bootInfo);
GlobalRenderer->Print("Setting up interrupts..."); GlobalRenderer->Print("Setting up interrupts...");

1
kernel/src/pci.cpp Normal file
View File

@@ -0,0 +1 @@
#include "pci.h"

1
kernel/src/pci.h Normal file
View File

@@ -0,0 +1 @@
#pragma once