get MCFG table
This commit is contained in:
Binary file not shown.
@@ -61,4 +61,4 @@ buildimg:
|
||||
mcopy -i $(BUILDDIR)/$(OSNAME).img $(BUILDDIR)/zap-light18.psf ::
|
||||
|
||||
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
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
BIN
kernel/lib/pci.o
Normal file
Binary file not shown.
20
kernel/src/acpi.cpp
Normal file
20
kernel/src/acpi.cpp
Normal 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;
|
||||
}
|
||||
};
|
||||
@@ -30,4 +30,6 @@ namespace ACPI {
|
||||
SDTHeader Header;
|
||||
uint64_t Reserved;
|
||||
}__attribute__((packed));
|
||||
|
||||
void* FindTable(SDTHeader* sdtHeader, char* signature);
|
||||
};
|
||||
@@ -4,9 +4,6 @@ extern "C" void _start(BootInfo* bootInfo) {
|
||||
KernelInfo kernelInfo = InitializeKernel(bootInfo);
|
||||
PageTableManager* pageTableManager = kernelInfo.pageTableManager;
|
||||
|
||||
GlobalRenderer->Print(to_hstring((uint64_t)bootInfo->rsdp));
|
||||
GlobalRenderer->Next();
|
||||
|
||||
while (true) {
|
||||
ProcessMousePacket();
|
||||
}
|
||||
|
||||
@@ -13,9 +13,8 @@ extern "C" void __stack_chk_fail(void) {
|
||||
KernelInfo kernelInfo;
|
||||
PageTableManager pageTableManager = NULL;
|
||||
void PrepareMemory(BootInfo* bootInfo){
|
||||
GlobalRenderer->Print(" - Locking kernel pages...");
|
||||
GlobalRenderer->Print("Preparing memory...");
|
||||
GlobalRenderer->Next();
|
||||
|
||||
uint64_t mMapEntries = bootInfo->mMapSize / bootInfo->mMapDescriptorSize;
|
||||
|
||||
GlobalAllocator = PageFrameAllocator();
|
||||
@@ -26,13 +25,13 @@ void PrepareMemory(BootInfo* bootInfo){
|
||||
|
||||
GlobalAllocator.LockPages(&_KernelStart, kernelPages);
|
||||
|
||||
GlobalRenderer->Print(" - Setting up page table manager...");
|
||||
/*GlobalRenderer->Print(" - Setting up page table manager...");
|
||||
GlobalRenderer->Next();
|
||||
|
||||
PageTable* PML4 = (PageTable*)GlobalAllocator.RequestPage();
|
||||
memset(PML4, 0, 0x1000);
|
||||
|
||||
pageTableManager = PageTableManager(PML4);
|
||||
pageTableManager = PageTableManager(PML4);
|
||||
|
||||
for (uint64_t t = 0; t < GetMemorySize(bootInfo->mMap, mMapEntries, bootInfo->mMapDescriptorSize); t+= 0x1000){
|
||||
pageTableManager.MapMemory((void*)t, (void*)t);
|
||||
@@ -47,7 +46,7 @@ void PrepareMemory(BootInfo* bootInfo){
|
||||
|
||||
asm ("mov %0, %%cr3" : : "r" (PML4));
|
||||
|
||||
kernelInfo.pageTableManager = &pageTableManager;
|
||||
kernelInfo.pageTableManager = &pageTableManager;*/
|
||||
}
|
||||
|
||||
IDTR idtr;
|
||||
@@ -62,6 +61,11 @@ void SetIDTGate(void* handler, uint8_t entryOffset, uint8_t type_attr, uint8_t s
|
||||
void PrepareACPI(BootInfo* bootInfo) {
|
||||
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;
|
||||
for (int t = 0; t < entries; t++) {
|
||||
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->Print("MCFG header location: 0x");
|
||||
GlobalRenderer->Print(to_hstring((uint64_t)mcfg));
|
||||
GlobalRenderer->Next();
|
||||
GlobalRenderer->Next();
|
||||
}
|
||||
|
||||
void PrepareInterrupts() {
|
||||
@@ -109,9 +118,6 @@ KernelInfo InitializeKernel(BootInfo* bootInfo){
|
||||
gdtDescriptor.Offset = (uint64_t)&DefaultGDT;
|
||||
LoadGDT(&gdtDescriptor);
|
||||
|
||||
GlobalRenderer->Print("Preparing memory...");
|
||||
GlobalRenderer->Next();
|
||||
|
||||
PrepareMemory(bootInfo);
|
||||
|
||||
GlobalRenderer->Print("Setting up interrupts...");
|
||||
|
||||
1
kernel/src/pci.cpp
Normal file
1
kernel/src/pci.cpp
Normal file
@@ -0,0 +1 @@
|
||||
#include "pci.h"
|
||||
1
kernel/src/pci.h
Normal file
1
kernel/src/pci.h
Normal file
@@ -0,0 +1 @@
|
||||
#pragma once
|
||||
Reference in New Issue
Block a user