Newer
Older
AMI-Aptio-BIOS-Reversed / PurleyPlatPkg / Acpi / Dxe / AcpiVTD / AcpiVTD.h
@Ajax Dong Ajax Dong 2 days ago 10 KB Full restructure
/** @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__ */