/** @file
AcpiVTD.h -- Header for AcpiVTD
Copyright (c) HR650X BIOS Decompilation Project
**/
#ifndef __ACPIVTD_H__
#define __ACPIVTD_H__
#include "../uefi_headers/Uefi.h"
//
// Function Prototypes
//
EFI_STATUS
EFIAPI
GetDxeServicesTable(
VOID
);
EFI_STATUS
EFIAPI
GetHobList(
VOID
);
EFI_STATUS
EFIAPI
CompareGuid(
VOID
);
EFI_STATUS
EFIAPI
DebugPrintErrorLevel(
VOID
);
EFI_STATUS
EFIAPI
LocateProtocol(
VOID
);
EFI_STATUS
EFIAPI
ParseDmarSubTableType(
VOID
);
EFI_STATUS
EFIAPI
InsertDmaRemap(
VOID
);
EFI_STATUS
EFIAPI
SortDmarSubTables(
VOID
);
EFI_STATUS
EFIAPI
GetDmarTable(
VOID
);
EFI_STATUS
EFIAPI
InstallDmarTable(
VOID
);
EFI_STATUS
EFIAPI
ReadSetupVariableByte(
VOID
);
EFI_STATUS
EFIAPI
AcpiVtdDriverEntryPoint(
VOID
);
EFI_STATUS
EFIAPI
UefiMain(
VOID
);
EFI_STATUS
EFIAPI
data (BSS, initialized at driver load)(
VOID
);
EFI_STATUS
EFIAPI
handle and table pointers(
VOID
);
EFI_STATUS
EFIAPI
gImageHandle = NULL; // 0x2450(
VOID
);
EFI_STATUS
EFIAPI
EFI_BOOT_SERVICES *gBootServices = NULL; // 0x2448(
VOID
);
EFI_STATUS
EFIAPI
VOID *gDsServicesTable = NULL; // 0x2478 (DXE Services Table)(
VOID
);
EFI_STATUS
EFIAPI
(HOB List)(
VOID
);
EFI_STATUS
EFIAPI
pointers (lazy-located)(
VOID
);
EFI_STATUS
EFIAPI
*gPcdProtocol = NULL; // 0x2460 (PCD protocol)(
VOID
);
EFI_STATUS
EFIAPI
(ACPI table protocol)(
VOID
);
EFI_STATUS
EFIAPI
VOID *gSetupProtocol = NULL; // 0x2480 (Setup protocol)(
VOID
);
EFI_STATUS
EFIAPI
table construction globals(
VOID
);
EFI_STATUS
EFIAPI
*mDmarContainer = NULL; // 0x24C8 (primary container pointer)(
VOID
);
EFI_STATUS
EFIAPI
(= mDmarContainer + 2048)(
VOID
);
EFI_STATUS
EFIAPI
= 'DMAR' (0x52414D44)(
VOID
);
EFI_STATUS
EFIAPI
configuration values (read from setup/PCD)(
VOID
);
EFI_STATUS
EFIAPI
mDmarFlags; // 0x24B0 (DMAR flags word: HAW + INTR_REMAP)(
VOID
);
EFI_STATUS
EFIAPI
//(
VOID
);
EFI_STATUS
EFIAPI
pointer table for DMAR sub-table construction callbacks(
VOID
);
EFI_STATUS
EFIAPI
entries come from the setup variable configuration describing(
VOID
);
EFI_STATUS
EFIAPI
struct {(
VOID
);
EFI_STATUS
EFIAPI
identifying the variable (or sub-table type)(
VOID
);
EFI_STATUS
EFIAPI
to platform data for this sub-table(
VOID
);
EFI_STATUS
EFIAPI
in bytes of the variable data(
VOID
);
EFI_STATUS
EFIAPI
0: DRHD hardware unit definitions(
VOID
);
EFI_STATUS
EFIAPI
1: RMRR region definitions(
VOID
);
EFI_STATUS
EFIAPI
2: ATSR device definitions(
VOID
);
EFI_STATUS
EFIAPI
};(
VOID
);
EFI_STATUS
EFIAPI
functions (library-level, inlined in original binary)(
VOID
);
EFI_STATUS
EFIAPI
copy (non-overlapping or src > dst)(
VOID
);
EFI_STATUS
EFIAPI
= Length >> 3;(
VOID
);
EFI_STATUS
EFIAPI
copy to handle overlapping regions(
VOID
);
EFI_STATUS
EFIAPI
= (UINT8 *)Destination + Length - 1;(
VOID
);
EFI_STATUS
EFIAPI
/ table location helpers(
VOID
);
EFI_STATUS
EFIAPI
setup variable reading(
VOID
);
EFI_STATUS
EFIAPI
CMOS register 0x4B to determine debug configuration(
VOID
);
EFI_STATUS
EFIAPI
= IoRead8 (0x70);(
VOID
);
EFI_STATUS
EFIAPI
if (CmosData == 1) {(
VOID
);
EFI_STATUS
EFIAPI
}(
VOID
);
EFI_STATUS
EFIAPI
to the debug protocol if installed(
VOID
);
EFI_STATUS
EFIAPI
= (BOOLEAN)DEBUG (ErrorLevel, Format);(
VOID
);
EFI_STATUS
EFIAPI
sub-table type parsing(
VOID
);
EFI_STATUS
EFIAPI
0 + No flag = DRHD entry(
VOID
);
EFI_STATUS
EFIAPI
is actually subtype 1 (RMRR) because SubType=0 but IsDmarUnit=TRUE(
VOID
);
EFI_STATUS
EFIAPI
the first byte was 0x00 and the second byte 0x01 = LE value 0x0100 = 256.(
VOID
);
EFI_STATUS
EFIAPI
DMAR sub-tables don't have type 256, this is RMRR.(
VOID
);
EFI_STATUS
EFIAPI
0: *(UINT32 *)v8 = 0x100000 -> bytes 00 00 10(
VOID
);
EFI_STATUS
EFIAPI
1: *(UINT32 *)v8 = 0x180001 -> byte 01 00 18(
VOID
);
EFI_STATUS
EFIAPI
for sorting: type 0 has WORD=0, type 1 has WORD=1 (but is checked(
VOID
);
EFI_STATUS
EFIAPI
the binary via the n2 flag, not the actual WORD).(
VOID
);
EFI_STATUS
EFIAPI
ReadDmarSubTableType function in the original checks:(
VOID
);
EFI_STATUS
EFIAPI
sub-table construction (InsertDmaRemap)(
VOID
);
EFI_STATUS
EFIAPI
container pointer(
VOID
);
EFI_STATUS
EFIAPI
(DmaRemap == NULL) {(
VOID
);
EFI_STATUS
EFIAPI
cursor: points to the current end of the container data(
VOID
);
EFI_STATUS
EFIAPI
= (UINT8 *)DmaRemap + DmaRemap->Length;(
VOID
);
EFI_STATUS
EFIAPI
- DMA-Remapping Hardware Unit Definition(
VOID
);
EFI_STATUS
EFIAPI
DRHD header: Type=0, Flags, Segment, BaseAddress(
VOID
);
EFI_STATUS
EFIAPI
flag(
VOID
);
EFI_STATUS
EFIAPI
device scope entries(
VOID
);
EFI_STATUS
EFIAPI
= *(UINT16 *)(WriteCursor + 2);(
VOID
);
EFI_STATUS
EFIAPI
device scope type and bus number(
VOID
);
EFI_STATUS
EFIAPI
type(
VOID
);
EFI_STATUS
EFIAPI
length (header)(
VOID
);
EFI_STATUS
EFIAPI
initial 2 bytes of PCI path data(
VOID
);
EFI_STATUS
EFIAPI
(Index = 0; Index < 2; Index++) {(
VOID
);
EFI_STATUS
EFIAPI
additional PCI path entries until terminator (0xFF)(
VOID
);
EFI_STATUS
EFIAPI
= (UINT8 *)SubTableData + *(UINT64 *)((UINT8 *)SubTableData + 24)(
VOID
);
EFI_STATUS
EFIAPI
- Reserved Memory Region Reporting(
VOID
);
EFI_STATUS
EFIAPI
RMRR header: Type=1, Segment, BaseAddress, EndAddress(
VOID
);
EFI_STATUS
EFIAPI
device scope header data(
VOID
);
EFI_STATUS
EFIAPI
ScopeEntry[5] = ScopeSource[2]; // Enumeration data(
VOID
);
EFI_STATUS
EFIAPI
length(
VOID
);
EFI_STATUS
EFIAPI
PCI path entries(
VOID
);
EFI_STATUS
EFIAPI
= (UINT8 *)SubTableData + *(UINT64 *)((UINT8 *)SubTableData + 32)(
VOID
);
EFI_STATUS
EFIAPI
- Address Translation Services Reporting(
VOID
);
EFI_STATUS
EFIAPI
ATSR header: Type=2, Flags, Segment(
VOID
);
EFI_STATUS
EFIAPI
WriteCursor[4] = Atsr->Flags;(
VOID
);
EFI_STATUS
EFIAPI
length of 8 bytes(
VOID
);
EFI_STATUS
EFIAPI
device scope entries (only for ATS-capable devices)(
VOID
);
EFI_STATUS
EFIAPI
(DeviceScopeIndex = 0, ScopeDataOffset = 0;(
VOID
);
EFI_STATUS
EFIAPI
ATS capability mask at SubTableData[16] (UINT32)(
VOID
);
EFI_STATUS
EFIAPI
(((*(UINT32 *)((UINT8 *)SubTableData + 16) >> DeviceScopeIndex) & 1) == 0) {(
VOID
);
EFI_STATUS
EFIAPI
device scope header(
VOID
);
EFI_STATUS
EFIAPI
+= 16;(
VOID
);
EFI_STATUS
EFIAPI
- Remapping Hardware Status Affinity(
VOID
);
EFI_STATUS
EFIAPI
RHSA header: Type=3, ProximityDomain, BaseAddress(
VOID
);
EFI_STATUS
EFIAPI
WriteCursor[16] = (UINT8)(Rhsa->ProximityDomain & 0xFF);(
VOID
);
EFI_STATUS
EFIAPI
length: 20 bytes(
VOID
);
EFI_STATUS
EFIAPI
DMAR table size does not exceed 2KB limit(
VOID
);
EFI_STATUS
EFIAPI
(DmaRemap->Length >= 2 * 1024) {(
VOID
);
EFI_STATUS
EFIAPI
sub-table sorting (SortDmarSubTables)(
VOID
);
EFI_STATUS
EFIAPI
DMAR header copy(
VOID
);
EFI_STATUS
EFIAPI
after header(
VOID
);
EFI_STATUS
EFIAPI
output area(
VOID
);
EFI_STATUS
EFIAPI
container length(
VOID
);
EFI_STATUS
EFIAPI
1: Copy DRHD entries (type 0 where IsDmarUnit is set)(
VOID
);
EFI_STATUS
EFIAPI
(SrcOffset < SrcLength) {(
VOID
);
EFI_STATUS
EFIAPI
2: Copy RMRR entries (type 0 where IsDmarUnit is NOT set)(
VOID
);
EFI_STATUS
EFIAPI
the binary, these are the "type 0 entries with !n2 && n21" flag(
VOID
);
EFI_STATUS
EFIAPI
= DMAR_HEADER_LENGTH;(
VOID
);
EFI_STATUS
EFIAPI
3: Copy RMRR entries (type 1 where IsDmarUnit is NOT set)(
VOID
);
EFI_STATUS
EFIAPI
handles the type-1 entries (actual RMRR)(
VOID
);
EFI_STATUS
EFIAPI
4: Copy ATSR entries (type 2 where IsDmarUnit is NOT set)(
VOID
);
EFI_STATUS
EFIAPI
5: Copy RHSA entries (type 3)(
VOID
);
EFI_STATUS
EFIAPI
DMAR Table (GetDmarTable)(
VOID
);
EFI_STATUS
EFIAPI
if container has sub-table data(
VOID
);
EFI_STATUS
EFIAPI
(*(UINT32 *)((UINT8 *)mDmarContainer + 4) <= DMAR_HEADER_LENGTH) {(
VOID
);
EFI_STATUS
EFIAPI
sub-tables and return pointer to sorted output(
VOID
);
EFI_STATUS
EFIAPI
();(
VOID
);
EFI_STATUS
EFIAPI
table installation (InstallDmarTable)(
VOID
);
EFI_STATUS
EFIAPI
DMAR table buffer (6 KB = 0x1800)(
VOID
);
EFI_STATUS
EFIAPI
= AllocateZeroPool (DMAR_TABLE_BUFFER_SIZE);(
VOID
);
EFI_STATUS
EFIAPI
the DMAR table header:(
VOID
);
EFI_STATUS
EFIAPI
= DMAR_SIGNATURE;(
VOID
);
EFI_STATUS
EFIAPI
at offset 4(
VOID
);
EFI_STATUS
EFIAPI
at offset 8(
VOID
);
EFI_STATUS
EFIAPI
at offset 24(
VOID
);
EFI_STATUS
EFIAPI
at offset 28(
VOID
);
EFI_STATUS
EFIAPI
scope count at offset 36(
VOID
);
EFI_STATUS
EFIAPI
host address width from PCD protocol(
VOID
);
EFI_STATUS
EFIAPI
(GetPcdProtocol () != NULL) {(
VOID
);
EFI_STATUS
EFIAPI
protocol offset +32 = Get32 method(
VOID
);
EFI_STATUS
EFIAPI
protocol offset +40 = GetN method (returns UINTN)(
VOID
);
EFI_STATUS
EFIAPI
are used to query platform VT-d capability:(
VOID
);
EFI_STATUS
EFIAPI
-> determines address width field in DMAR(
VOID
);
EFI_STATUS
EFIAPI
-> determines INTR_REMAP flag(
VOID
);
EFI_STATUS
EFIAPI
= ((PCD_PROTOCOL *)gPcdProtocol)->Get32 (PcdVTdHostAddressWidth);(
VOID
);
EFI_STATUS
EFIAPI
the address width and interrupt remap capability(
VOID
);
EFI_STATUS
EFIAPI
the DMAR table header fields at offset 10-24(
VOID
);
EFI_STATUS
EFIAPI
((
VOID
);
EFI_STATUS
EFIAPI
the DMAR ACPI table via gBS->InstallAcpiTable(
VOID
);
EFI_STATUS
EFIAPI
corresponds to BootServices[128] (InstallAcpiTable)(
VOID
);
EFI_STATUS
EFIAPI
the registered protocol handle via LocateProtocol(&gAcpiTableGuid)(
VOID
);
EFI_STATUS
EFIAPI
used for registration:(
VOID
);
EFI_STATUS
EFIAPI
= gBootServices->InstallAcpiTable ((
VOID
);
EFI_STATUS
EFIAPI
configuration reading (sub_1620 / variable read)(
VOID
);
EFI_STATUS
EFIAPI
the setup variable(
VOID
);
EFI_STATUS
EFIAPI
= ReadSetupVariable ((
VOID
);
EFI_STATUS
EFIAPI
one byte from the buffer(
VOID
);
EFI_STATUS
EFIAPI
(Variable, Buffer + Offset, 1);(
VOID
);
EFI_STATUS
EFIAPI
the variable buffer(
VOID
);
EFI_STATUS
EFIAPI
(gAcpiTableProtocolReady) {(
VOID
);
EFI_STATUS
EFIAPI
initialization (sub_398 / module entry prologue)(
VOID
);
EFI_STATUS
EFIAPI
ImageHandle, SystemTable, BootServices, RuntimeServices(
VOID
);
EFI_STATUS
EFIAPI
= ImageHandle;(
VOID
);
EFI_STATUS
EFIAPI
HOB list pointer (needed for DMAR table construction)(
VOID
);
EFI_STATUS
EFIAPI
= GetHobList (&gHobList);(
VOID
);
EFI_STATUS
EFIAPI
DXE Services Table pointer(
VOID
);
EFI_STATUS
EFIAPI
= GetDxeServicesTable (&gDsServicesTable);(
VOID
);
EFI_STATUS
EFIAPI
and install the DMAR table(
VOID
);
EFI_STATUS
EFIAPI
InstallDmarTable ();(
VOID
);
EFI_STATUS
EFIAPI
entry point (UefiMain)(
VOID
);
#endif /* __ACPIVTD_H__ */