mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-28 15:34:33 +00:00
Mapping IO Base and Memory Base (TODO: Map all memory base length)
This commit is contained in:
parent
7b68099808
commit
d57d593829
@ -86,6 +86,7 @@ namespace Driver
|
|||||||
Fex *fex = (Fex *)KernelAllocator.RequestPages(TO_PAGES(Size));
|
Fex *fex = (Fex *)KernelAllocator.RequestPages(TO_PAGES(Size));
|
||||||
memcpy(fex, (void *)DriverAddress, Size);
|
memcpy(fex, (void *)DriverAddress, Size);
|
||||||
FexExtended *fexExtended = (FexExtended *)((uint64_t)fex + EXTENDED_SECTION_ADDRESS);
|
FexExtended *fexExtended = (FexExtended *)((uint64_t)fex + EXTENDED_SECTION_ADDRESS);
|
||||||
|
debug("Driver allocated at %#lx-%#lx", fex, (uint64_t)fex + Size);
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
uint8_t *result = md5File((uint8_t *)fex, Size);
|
uint8_t *result = md5File((uint8_t *)fex, Size);
|
||||||
debug("MD5: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
|
debug("MD5: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
|
||||||
@ -102,6 +103,32 @@ namespace Driver
|
|||||||
|
|
||||||
KernelCallback *KCallback = (KernelCallback *)KernelAllocator.RequestPages(TO_PAGES(sizeof(KernelCallback)));
|
KernelCallback *KCallback = (KernelCallback *)KernelAllocator.RequestPages(TO_PAGES(sizeof(KernelCallback)));
|
||||||
|
|
||||||
|
debug("Type: %d; IOBase: %#x; MemoryBase: %#x",
|
||||||
|
((PCI::PCIHeader0 *)PCIDevice)->BAR0 & 1,
|
||||||
|
((PCI::PCIHeader0 *)PCIDevice)->BAR1 & (~3),
|
||||||
|
((PCI::PCIHeader0 *)PCIDevice)->BAR0 & (~15));
|
||||||
|
|
||||||
|
if ((((PCI::PCIHeader0 *)PCIDevice)->BAR0 & 1) != 0)
|
||||||
|
if (!Memory::Virtual().Check((void *)(uint64_t)(((PCI::PCIHeader0 *)PCIDevice)->BAR1 & (~3))))
|
||||||
|
{
|
||||||
|
debug("IO base (BAR1 & ~3) is not mapped");
|
||||||
|
Memory::Virtual().Map((void *)(uint64_t)(((PCI::PCIHeader0 *)PCIDevice)->BAR1 & (~3)), (void *)(uint64_t)(((PCI::PCIHeader0 *)PCIDevice)->BAR1 & (~3)), Memory::PTFlag::RW);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((((PCI::PCIHeader0 *)PCIDevice)->BAR0 & 1) == 0)
|
||||||
|
if (!Memory::Virtual().Check((void *)(uint64_t)(((PCI::PCIHeader0 *)PCIDevice)->BAR0 & (~15))))
|
||||||
|
{
|
||||||
|
debug("Memory base (BAR0 & ~15) is not mapped");
|
||||||
|
Memory::Virtual().Map((void *)(uint64_t)(((PCI::PCIHeader0 *)PCIDevice)->BAR0 & (~15)), (void *)(uint64_t)(((PCI::PCIHeader0 *)PCIDevice)->BAR0 & (~15)), Memory::PTFlag::RW);
|
||||||
|
|
||||||
|
uint64_t original = ((PCI::PCIHeader0 *)PCIDevice)->BAR0;
|
||||||
|
((PCI::PCIHeader0 *)PCIDevice)->BAR0 = 0xFFFFFFFF;
|
||||||
|
uint64_t size = ((PCI::PCIHeader0 *)PCIDevice)->BAR0 & 0xFFFFFFF0;
|
||||||
|
((PCI::PCIHeader0 *)PCIDevice)->BAR0 = original;
|
||||||
|
debug("Size: %#lx (%ld pages)", size, TO_PAGES(size));
|
||||||
|
fixme("TODO: [BUG] Mapping is broken!!!!!!");
|
||||||
|
}
|
||||||
|
|
||||||
switch (fexExtended->Driver.Type)
|
switch (fexExtended->Driver.Type)
|
||||||
{
|
{
|
||||||
case FexDriverType::FexDriverType_Generic:
|
case FexDriverType::FexDriverType_Generic:
|
||||||
@ -122,8 +149,8 @@ namespace Driver
|
|||||||
|
|
||||||
KCallback->RawPtr = PCIDevice;
|
KCallback->RawPtr = PCIDevice;
|
||||||
KCallback->Reason = CallbackReason::ConfigurationReason;
|
KCallback->Reason = CallbackReason::ConfigurationReason;
|
||||||
int callbackret = ((int (*)(KernelCallback *))((uint64_t)fexExtended->Driver.Callback + (uint64_t)fex))(KCallback);
|
int CallbackRet = ((int (*)(KernelCallback *))((uint64_t)fexExtended->Driver.Callback + (uint64_t)fex))(KCallback);
|
||||||
if (callbackret == DriverReturnCode::NOT_IMPLEMENTED)
|
if (CallbackRet == DriverReturnCode::NOT_IMPLEMENTED)
|
||||||
{
|
{
|
||||||
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
||||||
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
||||||
@ -131,54 +158,54 @@ namespace Driver
|
|||||||
error("Driver %s does not implement the configuration callback", fexExtended->Driver.Name);
|
error("Driver %s does not implement the configuration callback", fexExtended->Driver.Name);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (callbackret == DriverReturnCode::OK)
|
else if (CallbackRet == DriverReturnCode::OK)
|
||||||
trace("Device found for driver: %s", fexExtended->Driver.Name);
|
trace("Device found for driver: %s", fexExtended->Driver.Name);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
||||||
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
||||||
delete InterruptHook;
|
delete InterruptHook;
|
||||||
error("Driver %s returned error %d", fexExtended->Driver.Name, callbackret);
|
error("Driver %s returned error %d", fexExtended->Driver.Name, CallbackRet);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(KCallback, 0, sizeof(KernelCallback));
|
memset(KCallback, 0, sizeof(KernelCallback));
|
||||||
KCallback->Reason = CallbackReason::InterruptReason;
|
KCallback->Reason = CallbackReason::InterruptReason;
|
||||||
|
|
||||||
DriverFile *drvfile = new DriverFile;
|
DriverFile *DrvFile = new DriverFile;
|
||||||
drvfile->DriverUID = KAPI.Info.DriverUID;
|
DrvFile->DriverUID = KAPI.Info.DriverUID;
|
||||||
drvfile->Address = (void *)fex;
|
DrvFile->Address = (void *)fex;
|
||||||
drvfile->InterruptHook[0] = InterruptHook;
|
DrvFile->InterruptHook[0] = InterruptHook;
|
||||||
Drivers.push_back(drvfile);
|
Drivers.push_back(DrvFile);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case FexDriverType::FexDriverType_Storage:
|
case FexDriverType::FexDriverType_Storage:
|
||||||
{
|
{
|
||||||
KCallback->RawPtr = PCIDevice;
|
KCallback->RawPtr = PCIDevice;
|
||||||
KCallback->Reason = CallbackReason::ConfigurationReason;
|
KCallback->Reason = CallbackReason::ConfigurationReason;
|
||||||
int callbackret = ((int (*)(KernelCallback *))((uint64_t)fexExtended->Driver.Callback + (uint64_t)fex))(KCallback);
|
int CallbackRet = ((int (*)(KernelCallback *))((uint64_t)fexExtended->Driver.Callback + (uint64_t)fex))(KCallback);
|
||||||
if (callbackret == DriverReturnCode::NOT_IMPLEMENTED)
|
if (CallbackRet == DriverReturnCode::NOT_IMPLEMENTED)
|
||||||
{
|
{
|
||||||
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
||||||
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
||||||
error("Driver %s does not implement the configuration callback", fexExtended->Driver.Name);
|
error("Driver %s does not implement the configuration callback", fexExtended->Driver.Name);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (callbackret == DriverReturnCode::OK)
|
else if (CallbackRet == DriverReturnCode::OK)
|
||||||
trace("Device found for driver: %s", fexExtended->Driver.Name);
|
trace("Device found for driver: %s", fexExtended->Driver.Name);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
||||||
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
||||||
error("Driver %s returned error %d", fexExtended->Driver.Name, callbackret);
|
error("Driver %s returned error %d", fexExtended->Driver.Name, CallbackRet);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
DriverFile *drvfile = new DriverFile;
|
DriverFile *DrvFile = new DriverFile;
|
||||||
drvfile->DriverUID = KAPI.Info.DriverUID;
|
DrvFile->DriverUID = KAPI.Info.DriverUID;
|
||||||
drvfile->Address = (void *)fex;
|
DrvFile->Address = (void *)fex;
|
||||||
drvfile->InterruptHook[0] = nullptr;
|
DrvFile->InterruptHook[0] = nullptr;
|
||||||
Drivers.push_back(drvfile);
|
Drivers.push_back(DrvFile);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case FexDriverType::FexDriverType_FileSystem:
|
case FexDriverType::FexDriverType_FileSystem:
|
||||||
@ -210,6 +237,7 @@ namespace Driver
|
|||||||
Fex *fex = (Fex *)KernelAllocator.RequestPages(TO_PAGES(Size));
|
Fex *fex = (Fex *)KernelAllocator.RequestPages(TO_PAGES(Size));
|
||||||
memcpy(fex, (void *)DriverAddress, Size);
|
memcpy(fex, (void *)DriverAddress, Size);
|
||||||
FexExtended *fexExtended = (FexExtended *)((uint64_t)fex + EXTENDED_SECTION_ADDRESS);
|
FexExtended *fexExtended = (FexExtended *)((uint64_t)fex + EXTENDED_SECTION_ADDRESS);
|
||||||
|
debug("Driver allocated at %#lx-%#lx", fex, (uint64_t)fex + Size);
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
uint8_t *result = md5File((uint8_t *)fex, Size);
|
uint8_t *result = md5File((uint8_t *)fex, Size);
|
||||||
debug("MD5: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
|
debug("MD5: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
|
||||||
@ -260,27 +288,27 @@ namespace Driver
|
|||||||
|
|
||||||
KCallback->RawPtr = nullptr;
|
KCallback->RawPtr = nullptr;
|
||||||
KCallback->Reason = CallbackReason::ConfigurationReason;
|
KCallback->Reason = CallbackReason::ConfigurationReason;
|
||||||
int callbackret = ((int (*)(KernelCallback *))((uint64_t)fexExtended->Driver.Callback + (uint64_t)fex))(KCallback);
|
int CallbackRet = ((int (*)(KernelCallback *))((uint64_t)fexExtended->Driver.Callback + (uint64_t)fex))(KCallback);
|
||||||
if (callbackret == DriverReturnCode::NOT_IMPLEMENTED)
|
if (CallbackRet == DriverReturnCode::NOT_IMPLEMENTED)
|
||||||
{
|
{
|
||||||
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
||||||
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
||||||
error("Driver %s does not implement the configuration callback", fexExtended->Driver.Name);
|
error("Driver %s does not implement the configuration callback", fexExtended->Driver.Name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (callbackret != DriverReturnCode::OK)
|
else if (CallbackRet != DriverReturnCode::OK)
|
||||||
{
|
{
|
||||||
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
||||||
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
||||||
error("Driver %s returned error %d", fexExtended->Driver.Name, callbackret);
|
error("Driver %s returned error %d", fexExtended->Driver.Name, CallbackRet);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
||||||
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
||||||
|
|
||||||
// DriverFile *drvfile = new DriverFile;
|
// DriverFile *DrvFile = new DriverFile;
|
||||||
// Drivers.push_back(drvfile);
|
// Drivers.push_back(DrvFile);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case FexDriverType::FexDriverType_FileSystem:
|
case FexDriverType::FexDriverType_FileSystem:
|
||||||
@ -308,30 +336,30 @@ namespace Driver
|
|||||||
|
|
||||||
KCallback->RawPtr = nullptr;
|
KCallback->RawPtr = nullptr;
|
||||||
KCallback->Reason = CallbackReason::ConfigurationReason;
|
KCallback->Reason = CallbackReason::ConfigurationReason;
|
||||||
int callbackret = ((int (*)(KernelCallback *))((uint64_t)fexExtended->Driver.Callback + (uint64_t)fex))(KCallback);
|
int CallbackRet = ((int (*)(KernelCallback *))((uint64_t)fexExtended->Driver.Callback + (uint64_t)fex))(KCallback);
|
||||||
if (callbackret == DriverReturnCode::NOT_IMPLEMENTED)
|
if (CallbackRet == DriverReturnCode::NOT_IMPLEMENTED)
|
||||||
{
|
{
|
||||||
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
||||||
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
||||||
error("Driver %s does not implement the configuration callback", fexExtended->Driver.Name);
|
error("Driver %s does not implement the configuration callback", fexExtended->Driver.Name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (callbackret != DriverReturnCode::OK)
|
else if (CallbackRet != DriverReturnCode::OK)
|
||||||
{
|
{
|
||||||
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
||||||
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
||||||
error("Driver %s returned error %d", fexExtended->Driver.Name, callbackret);
|
error("Driver %s returned error %d", fexExtended->Driver.Name, CallbackRet);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(KCallback, 0, sizeof(KernelCallback));
|
memset(KCallback, 0, sizeof(KernelCallback));
|
||||||
KCallback->Reason = CallbackReason::InterruptReason;
|
KCallback->Reason = CallbackReason::InterruptReason;
|
||||||
|
|
||||||
DriverFile *drvfile = new DriverFile;
|
DriverFile *DrvFile = new DriverFile;
|
||||||
drvfile->DriverUID = KAPI.Info.DriverUID;
|
DrvFile->DriverUID = KAPI.Info.DriverUID;
|
||||||
drvfile->Address = (void *)fex;
|
DrvFile->Address = (void *)fex;
|
||||||
drvfile->InterruptHook[0] = InterruptHook;
|
DrvFile->InterruptHook[0] = InterruptHook;
|
||||||
Drivers.push_back(drvfile);
|
Drivers.push_back(DrvFile);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case FexDriverType::FexDriverType_Audio:
|
case FexDriverType::FexDriverType_Audio:
|
||||||
@ -355,6 +383,7 @@ namespace Driver
|
|||||||
Fex *fex = (Fex *)KernelAllocator.RequestPages(TO_PAGES(Size));
|
Fex *fex = (Fex *)KernelAllocator.RequestPages(TO_PAGES(Size));
|
||||||
memcpy(fex, (void *)DriverAddress, Size);
|
memcpy(fex, (void *)DriverAddress, Size);
|
||||||
FexExtended *fexExtended = (FexExtended *)((uint64_t)fex + EXTENDED_SECTION_ADDRESS);
|
FexExtended *fexExtended = (FexExtended *)((uint64_t)fex + EXTENDED_SECTION_ADDRESS);
|
||||||
|
debug("Driver allocated at %#lx-%#lx", fex, (uint64_t)fex + Size);
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
uint8_t *result = md5File((uint8_t *)fex, Size);
|
uint8_t *result = md5File((uint8_t *)fex, Size);
|
||||||
debug("MD5: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
|
debug("MD5: %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
|
||||||
@ -379,30 +408,30 @@ namespace Driver
|
|||||||
KCallback->RawPtr = nullptr;
|
KCallback->RawPtr = nullptr;
|
||||||
break;
|
break;
|
||||||
KCallback->Reason = CallbackReason::ConfigurationReason;
|
KCallback->Reason = CallbackReason::ConfigurationReason;
|
||||||
int callbackret = ((int (*)(KernelCallback *))((uint64_t)fexExtended->Driver.Callback + (uint64_t)fex))(KCallback);
|
int CallbackRet = ((int (*)(KernelCallback *))((uint64_t)fexExtended->Driver.Callback + (uint64_t)fex))(KCallback);
|
||||||
if (callbackret == DriverReturnCode::NOT_IMPLEMENTED)
|
if (CallbackRet == DriverReturnCode::NOT_IMPLEMENTED)
|
||||||
{
|
{
|
||||||
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
||||||
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
||||||
error("Driver %s does not implement the configuration callback", fexExtended->Driver.Name);
|
error("Driver %s does not implement the configuration callback", fexExtended->Driver.Name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if (callbackret != DriverReturnCode::OK)
|
else if (CallbackRet != DriverReturnCode::OK)
|
||||||
{
|
{
|
||||||
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
||||||
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
||||||
error("Driver %s returned error %d", fexExtended->Driver.Name, callbackret);
|
error("Driver %s returned error %d", fexExtended->Driver.Name, CallbackRet);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
KernelAllocator.FreePages(fex, TO_PAGES(Size));
|
||||||
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
KernelAllocator.FreePages(KCallback, TO_PAGES(sizeof(KernelCallback)));
|
||||||
|
|
||||||
DriverFile *drvfile = new DriverFile;
|
DriverFile *DrvFile = new DriverFile;
|
||||||
drvfile->DriverUID = KAPI.Info.DriverUID;
|
DrvFile->DriverUID = KAPI.Info.DriverUID;
|
||||||
drvfile->Address = (void *)fex;
|
DrvFile->Address = (void *)fex;
|
||||||
drvfile->InterruptHook[0] = nullptr;
|
DrvFile->InterruptHook[0] = nullptr;
|
||||||
Drivers.push_back(drvfile);
|
Drivers.push_back(DrvFile);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user