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 ::
|
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
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;
|
SDTHeader Header;
|
||||||
uint64_t Reserved;
|
uint64_t Reserved;
|
||||||
}__attribute__((packed));
|
}__attribute__((packed));
|
||||||
|
|
||||||
|
void* FindTable(SDTHeader* sdtHeader, char* signature);
|
||||||
};
|
};
|
||||||
@@ -3,9 +3,6 @@
|
|||||||
extern "C" void _start(BootInfo* bootInfo) {
|
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();
|
||||||
|
|||||||
@@ -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,13 +25,13 @@ 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();
|
||||||
memset(PML4, 0, 0x1000);
|
memset(PML4, 0, 0x1000);
|
||||||
|
|
||||||
pageTableManager = PageTableManager(PML4);
|
pageTableManager = PageTableManager(PML4);
|
||||||
|
|
||||||
for (uint64_t t = 0; t < GetMemorySize(bootInfo->mMap, mMapEntries, bootInfo->mMapDescriptorSize); t+= 0x1000){
|
for (uint64_t t = 0; t < GetMemorySize(bootInfo->mMap, mMapEntries, bootInfo->mMapDescriptorSize); t+= 0x1000){
|
||||||
pageTableManager.MapMemory((void*)t, (void*)t);
|
pageTableManager.MapMemory((void*)t, (void*)t);
|
||||||
@@ -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
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