| 1670 | } |
| 1671 | |
| 1672 | EFI_STATUS PatchACPI(IN REFIT_VOLUME *Volume, const XString8& OSVersion) |
| 1673 | { |
| 1674 | EFI_STATUS Status = EFI_SUCCESS; |
| 1675 | UINTN Index; |
| 1676 | EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *RsdPointer = NULL; |
| 1677 | EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *FadtPointer = NULL; |
| 1678 | EFI_ACPI_4_0_FIXED_ACPI_DESCRIPTION_TABLE *newFadt = NULL; |
| 1679 | // EFI_ACPI_HIGH_PRECISION_EVENT_TIMER_TABLE_HEADER *Hpet = NULL; |
| 1680 | EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs = NULL; |
| 1681 | EFI_PHYSICAL_ADDRESS dsdt = EFI_SYSTEM_TABLE_MAX_ADDRESS; //0xFE000000; |
| 1682 | EFI_PHYSICAL_ADDRESS BufferPtr; |
| 1683 | SSDT_TABLE *Ssdt = NULL; |
| 1684 | UINT8 *buffer = NULL; |
| 1685 | UINTN bufferLen = 0; |
| 1686 | constexpr LStringW PathPatched = L"\\EFI\\CLOVER\\ACPI\\patched"; |
| 1687 | XStringW PathDsdt; // = L"\\DSDT.aml"; |
| 1688 | // CHAR16* PatchedAPIC = L"\\EFI\\CLOVER\\ACPI\\origin\\APIC-p.aml"; |
| 1689 | UINT32* rf = NULL; |
| 1690 | UINT64* xf = NULL; |
| 1691 | UINT64 XDsdt; //save values if present |
| 1692 | UINT64 XFirmwareCtrl; |
| 1693 | EFI_FILE *RootDir; |
| 1694 | UINT32 eCntR; //, eCntX; |
| 1695 | UINT32 *pEntryR; |
| 1696 | CHAR8 *pEntry; |
| 1697 | EFI_ACPI_DESCRIPTION_HEADER *TableHeader; |
| 1698 | // -===== APIC =====- |
| 1699 | EFI_ACPI_DESCRIPTION_HEADER *ApicTable; |
| 1700 | // EFI_ACPI_2_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *ApicHeader; |
| 1701 | EFI_ACPI_2_0_PROCESSOR_LOCAL_APIC_STRUCTURE *ProcLocalApic; |
| 1702 | EFI_ACPI_2_0_LOCAL_APIC_NMI_STRUCTURE *LocalApicNMI; |
| 1703 | // UINTN ApicLen; |
| 1704 | UINTN ApicCPUNum; |
| 1705 | UINT8 *SubTable; |
| 1706 | BOOLEAN DsdtLoaded = FALSE; |
| 1707 | BOOLEAN NeedUpdate = FALSE; |
| 1708 | OPER_REGION *tmpRegion; |
| 1709 | XStringW AcpiOemPath = SWPrintf("%ls\\ACPI\\patched", OEMPath.wc_str()); |
| 1710 | |
| 1711 | DbgHeader("PatchACPI"); |
| 1712 | |
| 1713 | PathDsdt = SWPrintf("\\%ls", gSettings.DsdtName.wc_str()); |
| 1714 | //try to find in SystemTable |
| 1715 | for(Index = 0; Index < gST->NumberOfTableEntries; Index++) { |
| 1716 | if(CompareGuid (&gST->ConfigurationTable[Index].VendorGuid, &gEfiAcpi20TableGuid)) { |
| 1717 | // Acpi 2.0 |
| 1718 | RsdPointer = (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER*)gST->ConfigurationTable[Index].VendorTable; |
| 1719 | break; |
| 1720 | } |
| 1721 | else if(CompareGuid (&gST->ConfigurationTable[Index].VendorGuid, &gEfiAcpi10TableGuid)) { |
| 1722 | // Acpi 1.0 - RSDT only |
| 1723 | RsdPointer = (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER*)gST->ConfigurationTable[Index].VendorTable; |
| 1724 | continue; |
| 1725 | } |
| 1726 | } |
| 1727 | |
| 1728 | if (!RsdPointer) { |
| 1729 | return EFI_UNSUPPORTED; |
no test coverage detected