diff --git a/Include/Library/Common/CommonLib.h b/Include/Library/Common/CommonLib.h index f8b35a5..90dd892 100644 --- a/Include/Library/Common/CommonLib.h +++ b/Include/Library/Common/CommonLib.h @@ -245,6 +245,12 @@ AsciiStrToLower ( IN CHAR8 *Str ); +CHAR8 * +EFIAPI +AsciiStrToUpper ( + IN CHAR8 *Str +); + CHAR8 * EFIAPI AsciiStriStr ( diff --git a/Include/Library/Platform/AmlGenerator.h b/Include/Library/Platform/AmlGenerator.h index 7e653e1..4f12107 100644 --- a/Include/Library/Platform/AmlGenerator.h +++ b/Include/Library/Platform/AmlGenerator.h @@ -1,4 +1,4 @@ -/* + /* * aml_generator.h * Chameleon * @@ -12,6 +12,10 @@ #include +#define XXXX_SIGN SIGNATURE_32 ('X','X','X','X') +//#define APIC_SIGN SIGNATURE_32 ('A','P','I','C') +//#define SLIC_SIGN SIGNATURE_32 ('S','L','I','C') + BOOLEAN AmlAddToParent (AML_CHUNK *Parent, AML_CHUNK *Node); AML_CHUNK *AmlCreateNode (AML_CHUNK *Parent); VOID AmlDestroyNode (AML_CHUNK *Node); @@ -42,15 +46,13 @@ AML_CHUNK *AmlAddReturn (AML_CHUNK *Parent); UINT32 AcpiGetSize (UINT8 *Buffer, UINT32 Adr); -typedef EFI_ACPI_DESCRIPTION_HEADER SSDT_TABLE; - -SSDT_TABLE * +EFI_ACPI_DESCRIPTION_HEADER * GeneratePssSsdt ( UINT8 FirstID, UINTN Number ); -SSDT_TABLE * +EFI_ACPI_DESCRIPTION_HEADER * GenerateCstSsdt ( EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt, UINT8 FirstID, diff --git a/Include/Library/Platform/Platform.h b/Include/Library/Platform/Platform.h index 0b64c8f..eb320cf 100644 --- a/Include/Library/Platform/Platform.h +++ b/Include/Library/Platform/Platform.h @@ -602,16 +602,21 @@ typedef struct { #define AML_CHUNK_ARG2 0x6A #define AML_CHUNK_ARG3 0x6B -#define FIX_MCHC bit (0) -#define FIX_DISPLAY bit (1) -#define FIX_LAN bit (2) -#define FIX_WIFI bit (3) -#define FIX_HDA bit (4) -#define FIX_INTELGFX bit (5) -#define FIX_PNLF bit (6) -#define FIX_HDMI bit (7) -#define FIX_IMEI bit (8) -#define FIX_HEADER bit (9) +#define FIX_MCHC bit (0) +#define FIX_DISPLAY bit (1) +#define FIX_LAN bit (2) +#define FIX_WIFI bit (3) +#define FIX_HDA bit (4) +#define FIX_INTELGFX bit (5) +#define FIX_PNLF bit (6) +#define FIX_HDMI bit (7) +#define FIX_IMEI bit (8) +#define FIX_HEADER bit (9) + +#define ACPI_NAME_SIZE 4 +#define ACPI_OEM_ID_SIZE 6 +#define ACPI_OEM_TABLE_ID_SIZE 8 +#define ACPI_RSDP_SIG_SIZE 8 typedef struct ACPI_DROP_TABLE { UINT32 Signature; @@ -879,13 +884,7 @@ typedef enum { typedef struct { CHAR8 *Title; UINTN Bit; -} DEVICES_BIT_K; - -typedef struct { - CHAR8 *Title; - CHAR8 *OptLabel; - UINTN Bit; -} OPT_MENU_BIT_K; +} OPT_BITS; // Settings.c // Micky1979: Next five functions (+ needed struct) are to split a string like "10.10.5,10.7,10.11.6,10.8.x" @@ -1056,8 +1055,12 @@ typedef struct { INTN BlackListCount; CHAR16 **BlackList; + //Kexts + INTN BlockKextCachesCount; + CHAR8 **BlockKextCaches; + //BlackListed kexts - CHAR16 BlockKexts[64]; + CHAR16 BlockKexts[64]; // FSInject business //SMC keys CHAR8 RPlt[8]; @@ -1191,11 +1194,11 @@ extern CHAR16 *gToolPath; extern UINTN ACPIDropTablesNum; extern UINTN ACPIPatchedAMLNum; -extern DEVICES_BIT_K ADEVICES[]; +extern OPT_BITS ADEVICES[]; extern INTN OptDevicesBitNum; -extern OPT_MENU_BIT_K OPT_MENU_DSDTBIT[]; -extern INTN OptMenuDSDTBitNum; +extern OPT_BITS AFIXDSDT[]; +extern INTN OptFixDSDTBitNum; extern CONST CHAR16 *OsxPathLCaches[]; extern CONST UINTN OsxPathLCachesCount; @@ -1243,6 +1246,10 @@ FixBiosDsdt ( BOOLEAN Patched ); +VOID +FindCPU ( + UINT8 *Dsdt +); VOID DumpFixBiosDsdt (); @@ -1587,10 +1594,8 @@ SaveOemDsdt ( UINT8 OSType ); -#if DUMP_TABLE VOID SaveOemTables (); -#endif UINT32 FixAny ( diff --git a/Library/Platform/AcpiPatcher.c b/Library/Platform/AcpiPatcher.c index 7010195..7e771e2 100644 --- a/Library/Platform/AcpiPatcher.c +++ b/Library/Platform/AcpiPatcher.c @@ -32,15 +32,6 @@ Re-Work by Slice 2011. #define DBG(...) DebugLog (DEBUG_ACPI_PATCH, __VA_ARGS__) -#define XXXX_SIGN SIGNATURE_32 ('X','X','X','X') -#define APIC_SIGN SIGNATURE_32 ('A','P','I','C') -#define SLIC_SIGN SIGNATURE_32 ('S','L','I','C') - -#define ACPI_NAME_SIZE 4 -#define ACPI_OEM_ID_SIZE 6 -#define ACPI_OEM_TABLE_ID_SIZE 8 -#define ACPI_RSDP_SIG_SIZE 8 - // Global pointers XSDT_TABLE *Xsdt = NULL; @@ -62,57 +53,16 @@ UINT8 PmBlock[] = { /*00F0:*/ 0x00, 0x00, 0x00, 0x00 }; -#if 0 -// Slice: Signature compare function -BOOLEAN -TableSign ( - CHAR8 *Table, - CONST CHAR8 *Sign -) { - INTN i; - - for (i = 0; i < 4; i++) { - if ((Table[i] & ~0x20) != (Sign[i] & ~0x20)) { - return FALSE; - } - } - - return TRUE; -} -#endif - EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER * FindAcpiRsdPtr () { - UINTN Address, Index; + UINTN Index; for (Index = 0; Index < gST->NumberOfTableEntries; Index++) { - if ( - CompareGuid (&gST->ConfigurationTable[Index].VendorGuid, &gEfiAcpi20TableGuid) || - CompareGuid (&gST->ConfigurationTable[Index].VendorGuid, &gEfiAcpi10TableGuid) - ) { + if (CompareGuid (&gST->ConfigurationTable[Index].VendorGuid, &gEfiAcpi20TableGuid)) { return (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER*)gST->ConfigurationTable[Index].VendorTable; } } - // - // First Seach 0x0e0000 - 0x0fffff for RSD Ptr - // - for (Address = 0xe0000; Address < 0xfffff; Address += 0x10) { - if (*(UINT64 *)(Address) == EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE) { - return (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)Address; - } - } - - // - // Search EBDA - // - Address = (*(UINT16 *)(UINTN)(EBDA_BASE_ADDRESS)) << 4; - for (Index = 0; Index < 0x400 ; Index += 16) { - if (*(UINT64 *)(Address + Index) == EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE) { - return (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)Address; - } - } - return NULL; } @@ -155,70 +105,107 @@ GetFadt () { return FadtPointer; } -UINTN -FixAsciiTableHeader ( - CHAR8 *Str, - UINTN Len, - CHAR8 ReplaceWith +/* +BOOLEAN +CheckAsciiTableHeader ( + UINT8 *Str, + UINTN Len ) { - UINTN ReplaceCount = 0; + while (*Str && Len) { + if ((*Str < 0x20) || (*Str > 0x7E)) { + return TRUE; + } + Len--; + Str++; + } + + return FALSE; +} + +BOOLEAN +CheckTableHeader ( + EFI_ACPI_DESCRIPTION_HEADER *Header +) { + return ( + CheckAsciiTableHeader ((UINT8 *)&Header->OemId, ACPI_OEM_ID_SIZE) || + CheckAsciiTableHeader ((UINT8 *)&Header->OemTableId, ACPI_OEM_TABLE_ID_SIZE) || + CheckAsciiTableHeader ((UINT8 *)&Header->CreatorId, ACPI_NAME_SIZE) + ); +} +*/ + +VOID +FixAsciiTableHeader ( + UINT8 *Str, + UINTN Len +) { while (*Str && Len) { #if 0 *Str = 'X'; - ReplaceCount++; #else if ((*Str < 0x20) || (*Str > 0x7E)) { - *Str = ReplaceWith; - ReplaceCount++; + *Str = 0x3F; } #endif Len--; Str++; } +} - return ReplaceCount; +VOID +PatchTableHeader ( + EFI_ACPI_DESCRIPTION_HEADER *Header, + BOOLEAN IncludeSignature +) { + if (IncludeSignature) { + FixAsciiTableHeader ((UINT8 *)&Header->Signature, ACPI_NAME_SIZE); + } + + FixAsciiTableHeader ((UINT8 *)&Header->OemId, ACPI_OEM_ID_SIZE); + FixAsciiTableHeader ((UINT8 *)&Header->OemTableId, ACPI_OEM_TABLE_ID_SIZE); + FixAsciiTableHeader ((UINT8 *)&Header->CreatorId, ACPI_NAME_SIZE); } VOID PrintTableInfos ( - EFI_ACPI_DESCRIPTION_HEADER *TableEntry, - UINT64 *Address + EFI_ACPI_DESCRIPTION_HEADER *TableEntry ) { - CHAR8 Signature[ACPI_NAME_SIZE + 1], - OemId[ACPI_OEM_ID_SIZE + 1], - OemTableId[ACPI_OEM_TABLE_ID_SIZE + 1], - CreatorId[ACPI_NAME_SIZE + 1]; + EFI_ACPI_DESCRIPTION_HEADER *TmpTableEntry; + CHAR8 Signature[ACPI_NAME_SIZE + 1], + OemId[ACPI_OEM_ID_SIZE + 1], + OemTableId[ACPI_OEM_TABLE_ID_SIZE + 1], + CreatorId[ACPI_NAME_SIZE + 1]; + + TmpTableEntry = AllocateCopyPool (sizeof (EFI_ACPI_DESCRIPTION_HEADER), TableEntry); + + PatchTableHeader (TmpTableEntry, TRUE); Signature[ACPI_NAME_SIZE] = 0; OemId[ACPI_OEM_ID_SIZE] = 0; OemTableId[ACPI_OEM_TABLE_ID_SIZE] = 0; CreatorId[ACPI_NAME_SIZE] = 0; - CopyMem ((CHAR8 *)&Signature, (CHAR8 *)&TableEntry->Signature, ACPI_NAME_SIZE); - CopyMem ((CHAR8 *)&OemId, (CHAR8 *)&TableEntry->OemId, ACPI_OEM_ID_SIZE); - CopyMem ((CHAR8 *)&OemTableId, (CHAR8 *)&TableEntry->OemTableId, ACPI_OEM_TABLE_ID_SIZE); - CopyMem ((CHAR8 *)&CreatorId, (CHAR8 *)&TableEntry->CreatorId, ACPI_NAME_SIZE); - - FixAsciiTableHeader (Signature, ACPI_NAME_SIZE, 0x20); - FixAsciiTableHeader (OemId, ACPI_OEM_ID_SIZE, 0x20); - FixAsciiTableHeader (OemTableId, ACPI_OEM_TABLE_ID_SIZE, 0x20); - FixAsciiTableHeader (CreatorId, ACPI_NAME_SIZE, 0x20); + CopyMem (&Signature, &TmpTableEntry->Signature, ACPI_NAME_SIZE); + CopyMem (&OemId, &TmpTableEntry->OemId, ACPI_OEM_ID_SIZE); + CopyMem (&OemTableId, &TmpTableEntry->OemTableId, ACPI_OEM_TABLE_ID_SIZE); + CopyMem (&CreatorId, &TmpTableEntry->CreatorId, ACPI_NAME_SIZE); MsgLog ( - "%-4a: 0x%8X %06X (v%.2d '%-6a' '%-8a' %08X '%-4a' %08X)\n", - Signature, Address, - TableEntry->Length, TableEntry->Revision, OemId, - OemTableId, TableEntry->OemRevision, - CreatorId, TableEntry->CreatorRevision + "%-4a: 0x%p %06X (v%.2d '%-6a' '%-8a' %08X '%-4a' %08X)\n", + Signature, TableEntry, + TmpTableEntry->Length, TmpTableEntry->Revision, OemId, + OemTableId, TmpTableEntry->OemRevision, + CreatorId, TmpTableEntry->CreatorRevision ); + + FreePool (TmpTableEntry); } VOID UpdateDropTables ( - EFI_ACPI_DESCRIPTION_HEADER *TableEntry, - UINT64 *Address + EFI_ACPI_DESCRIPTION_HEADER *TableEntry ) { ACPI_DROP_TABLE *DropTable = AllocateZeroPool (sizeof (ACPI_DROP_TABLE)); @@ -231,7 +218,7 @@ UpdateDropTables ( ACPIDropTablesNum++; - PrintTableInfos (TableEntry, Address); + PrintTableInfos (TableEntry); } VOID @@ -247,7 +234,7 @@ GetAcpiTablesList () { GetFadt (); // this is a first call to acpi, we need it to make a pointer to Xsdt if (Xsdt) { - DBG ("From XSDT:\n"); + DBG ("From XSDT: %p\n", TableEntry); EntryCount = (Xsdt->Header.Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof (UINT64); BasePtr = (CHAR8 *)(&(Xsdt->Entry)); @@ -260,7 +247,7 @@ GetAcpiTablesList () { CopyMem (&Entry64, (VOID *)BasePtr, sizeof (UINT64)); // value from BasePtr-> TableEntry = (EFI_ACPI_DESCRIPTION_HEADER *)((UINTN)(Entry64)); - UpdateDropTables (TableEntry, &Entry64); + UpdateDropTables (TableEntry); } } else { DBG (" - [!] Error! ACPI not found:\n"); @@ -276,8 +263,8 @@ DropTableFromXSDT ( EFI_ACPI_DESCRIPTION_HEADER *TableEntry; UINTN Index, Index2; UINT32 EntryCount; - CHAR8 *BasePtr, *Ptr, *Ptr2, - Signature[ACPI_NAME_SIZE + 1], + UINT8 *BasePtr, *Ptr, *Ptr2; + CHAR8 Signature[ACPI_NAME_SIZE + 1], OemTableId[ACPI_OEM_TABLE_ID_SIZE + 1]; UINT64 Entry64; BOOLEAN DoubleZero = FALSE, Drop; @@ -300,7 +287,7 @@ DropTableFromXSDT ( CONSTRAIN_MAX (EntryCount, 50); - BasePtr = (CHAR8 *)(UINTN)(&(Xsdt->Entry)); + BasePtr = (VOID *)(UINTN)(&(Xsdt->Entry)); for (Index = 0; Index < EntryCount; Index++, BasePtr += sizeof (UINT64)) { if (ReadUnaligned64 ((CONST UINT64 *)BasePtr) == 0) { @@ -320,8 +307,6 @@ DropTableFromXSDT ( DoubleZero = FALSE; CopyMem (&Entry64, (VOID *)BasePtr, sizeof (UINT64)); // value from BasePtr-> TableEntry = (EFI_ACPI_DESCRIPTION_HEADER *)((UINTN)(Entry64)); - CopyMem ((CHAR8 *)&Signature, (CHAR8 *)&TableEntry->Signature, 4); - CopyMem ((CHAR8 *)&OemTableId, (CHAR8 *)&TableEntry->OemTableId, 8); Drop = ((ThisSignature && (TableEntry->Signature == ThisSignature)) && (!ThisTableId || (TableEntry->OemTableId == ThisTableId)) && @@ -331,6 +316,9 @@ DropTableFromXSDT ( continue; } + CopyMem ((CHAR8 *)&Signature, (CHAR8 *)&TableEntry->Signature, 4); + CopyMem ((CHAR8 *)&OemTableId, (CHAR8 *)&TableEntry->OemTableId, 8); + DBG (" Table: %a %a %d dropped\n", Signature, OemTableId, (INT32)TableEntry->Length); Ptr = BasePtr; Ptr2 = Ptr + sizeof (UINT64); @@ -349,15 +337,117 @@ DropTableFromXSDT ( DBG ("Corrected XSDT length=%d\n", Xsdt->Header.Length); } +VOID +PrintRSDPTableInfos ( + EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *RsdPtr +) { + if (RsdPtr != NULL) { + CHAR8 OemId[ACPI_OEM_ID_SIZE + 1]; + + OemId[ACPI_OEM_ID_SIZE] = 0; + + CopyMem (&OemId, &RsdPtr->OemId, ACPI_OEM_ID_SIZE); + + MsgLog ( + "RSDP: 0x%p %06X (v%.2d '%-6a')\n", + RsdPtr, RsdPtr->Length, RsdPtr->Revision, OemId + ); + } +} + +VOID +PrintFACSTableInfos ( + EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs +) { + if (Facs != NULL) { + CHAR8 Signature[ACPI_NAME_SIZE + 1]; + + Signature[ACPI_NAME_SIZE] = 0; + + CopyMem (&Signature, &Facs->Signature, ACPI_NAME_SIZE); + + MsgLog ( + "%-4a: 0x%p %06X (v%.2d)\n", + Signature, Facs, Facs->Length, Facs->Version + ); + } +} + +VOID +PrintXSDTTableInfos () { + EFI_ACPI_DESCRIPTION_HEADER *TableEntry; + UINT32 Index, EntryCount; + UINT8 *BasePtr; + UINT64 Entry64; + + EntryCount = (Xsdt->Header.Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof (UINT64); + BasePtr = (UINT8 *)(UINTN)(&(Xsdt->Entry)); + + for (Index = 0; Index < EntryCount; Index++, BasePtr += sizeof (UINT64)) { + if (ReadUnaligned64 ((CONST UINT64 *)BasePtr) == 0) { + continue; + } + + CopyMem (&Entry64, BasePtr, sizeof (UINT64)); // value from BasePtr-> + TableEntry = (EFI_ACPI_DESCRIPTION_HEADER *)((UINTN)(Entry64)); + PrintTableInfos (TableEntry); + } +} + +VOID +PatchAllTablesHeaders () { + EFI_STATUS Status = EFI_SUCCESS; + EFI_ACPI_DESCRIPTION_HEADER *TableEntry, *Ptr; + EFI_PHYSICAL_ADDRESS TableAddr; + UINT32 Index, EntryCount, Length; + UINT8 *BasePtr; + UINT64 Entry64; + + EntryCount = (Xsdt->Header.Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof (UINT64); + BasePtr = (UINT8 *)(UINTN)(&(Xsdt->Entry)); + + for (Index = 0; Index < EntryCount; Index++, BasePtr += sizeof (UINT64)) { + CopyMem (&Entry64, BasePtr, sizeof (UINT64)); // value from BasePtr-> + TableEntry = (EFI_ACPI_DESCRIPTION_HEADER *)((UINTN)(Entry64)); + //if ( + // (TableEntry->Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) || + // !CheckTableHeader (TableEntry) + //) { + if (TableEntry->Signature == EFI_ACPI_3_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) { + continue; //will be patched elsewhere + } + + Length = TableEntry->Length; + + TableAddr = EFI_SYSTEM_TABLE_MAX_ADDRESS; + Status = gBS->AllocatePages ( + AllocateMaxAddress, + EfiACPIReclaimMemory, + EFI_SIZE_TO_PAGES (Length /* + 4096 */), + &TableAddr + ); + if (EFI_ERROR (Status)) { + //DBG (" ... not patched\n"); + continue; + } + + Ptr = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)TableAddr; + CopyMem ((VOID *)Ptr, (VOID *)TableEntry, Length); + PatchTableHeader (Ptr, FALSE); + CopyMem ((VOID *)BasePtr, &TableAddr, sizeof(UINT64)); + Ptr->Checksum = 0; + Ptr->Checksum = (UINT8)(256 - Checksum8 (Ptr, Length)); + } +} + VOID PatchAllSSDT () { EFI_STATUS Status = EFI_SUCCESS; EFI_ACPI_DESCRIPTION_HEADER *TableEntry; - EFI_PHYSICAL_ADDRESS Ssdt = EFI_SYSTEM_TABLE_MAX_ADDRESS; - UINTN Index, FixedHeaderLen; - UINT32 EntryCount, SsdtLen; - CHAR8 *BasePtr, *Ptr, - Signature[ACPI_NAME_SIZE + 1], + EFI_PHYSICAL_ADDRESS Ssdt; + UINT32 Index, EntryCount, SsdtLen; + UINT8 *BasePtr, *Ptr; + CHAR8 Signature[ACPI_NAME_SIZE + 1], OemTableId[ACPI_OEM_TABLE_ID_SIZE + 1]; UINT64 Entry64; @@ -365,15 +455,16 @@ PatchAllSSDT () { OemTableId[ACPI_OEM_TABLE_ID_SIZE] = 0; EntryCount = (Xsdt->Header.Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof (UINT64); - BasePtr = (CHAR8 *)(UINTN)(&(Xsdt->Entry)); + BasePtr = (VOID *)(UINTN)(&(Xsdt->Entry)); for (Index = 0; Index < EntryCount; Index++, BasePtr += sizeof (UINT64)) { - CopyMem (&Entry64, (VOID *)BasePtr, sizeof (UINT64)); // value from BasePtr-> + CopyMem (&Entry64, BasePtr, sizeof (UINT64)); // value from BasePtr-> TableEntry = (EFI_ACPI_DESCRIPTION_HEADER *)((UINTN)(Entry64)); - //if (TableEntry->Signature == EFI_ACPI_4_0_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE) { - // will patch here - CopyMem ((CHAR8 *)&Signature, (CHAR8 *)&TableEntry->Signature, ACPI_NAME_SIZE); // must be SSDT + // Only patch SSDT + if (TableEntry->Signature == EFI_ACPI_4_0_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE) { + CopyMem ((CHAR8 *)&Signature, (CHAR8 *)&TableEntry->Signature, ACPI_NAME_SIZE); CopyMem ((CHAR8 *)&OemTableId, (CHAR8 *)&TableEntry->OemTableId, ACPI_OEM_TABLE_ID_SIZE); + SsdtLen = TableEntry->Length; DBG ("Patch table: %a %a | Len: 0x%x\n", Signature, OemTableId, SsdtLen); @@ -390,39 +481,29 @@ PatchAllSSDT () { continue; } - FixedHeaderLen = 0; - - if (BIT_ISSET (gSettings.FixDsdt, FIX_HEADER)) { - //FixedHeaderLen += FixAsciiTableHeader ((CHAR8 *)&TableEntry->Signature, ACPI_NAME_SIZE, 0x3F); - FixedHeaderLen += FixAsciiTableHeader ((CHAR8 *)&TableEntry->OemId, ACPI_OEM_ID_SIZE, 0x3F); - FixedHeaderLen += FixAsciiTableHeader ((CHAR8 *)&TableEntry->OemTableId, ACPI_OEM_TABLE_ID_SIZE, 0x3F); - FixedHeaderLen += FixAsciiTableHeader ((CHAR8 *)&TableEntry->CreatorId, ACPI_NAME_SIZE, 0x3F); - } - - // Only patch SSDT if ( - (TableEntry->Signature == EFI_ACPI_4_0_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE) && (gSettings.PatchDsdtNum > 0) && gSettings.PatchDsdt ) { MsgLog ("Patching SSDT:\n"); SsdtLen = PatchBinACPI ((UINT8 *)(UINTN)Ssdt, SsdtLen); - FixedHeaderLen++; - } - - if (!FixedHeaderLen) { - continue; } - Ptr = (CHAR8 *)(UINTN)Ssdt; + Ptr = (UINT8 *)(UINTN)Ssdt; CopyMem (Ptr, (VOID *)TableEntry, SsdtLen); - CopyMem ((VOID *)BasePtr, &Ssdt, sizeof (UINT64)); + //if (BIT_ISSET (gSettings.FixDsdt, FIX_HEADER)) { + // PatchTableHeader ((EFI_ACPI_DESCRIPTION_HEADER *)Ptr, FALSE); + //} + + CopyMem (BasePtr, &Ssdt, sizeof (UINT64)); + // Finish SSDT patch and resize SSDT Length - CopyMem (&Ptr[4], &SsdtLen, 4); + ((EFI_ACPI_DESCRIPTION_HEADER *)Ptr)->Length = SsdtLen; + ((EFI_ACPI_DESCRIPTION_HEADER *)Ptr)->Checksum = 0; ((EFI_ACPI_DESCRIPTION_HEADER *)Ptr)->Checksum = (UINT8)(256 - Checksum8 (Ptr, SsdtLen)); - //} + } } } @@ -463,8 +544,6 @@ InsertTable ( return Status; } -#if DUMP_TABLE - /** Saves Buffer of Length to disk as DirName\\FileName. */ EFI_STATUS SaveBufferToDisk ( @@ -1151,8 +1230,6 @@ SaveOemTables () { FreePool (mSavedTables); } -#endif // DUMP_TABLE - VOID SaveOemDsdt ( BOOLEAN FullPatch, @@ -1252,10 +1329,10 @@ PatchACPI ( EFI_ACPI_4_0_FIXED_ACPI_DESCRIPTION_TABLE *NewFadt = NULL; //EFI_ACPI_HIGH_PRECISION_EVENT_TIMER_TABLE_HEADER *Hpet = NULL; EFI_ACPI_4_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *Facs = NULL; + EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *RsdPtr; EFI_PHYSICAL_ADDRESS BufferPtr, Dsdt = EFI_SYSTEM_TABLE_MAX_ADDRESS; - SSDT_TABLE *Ssdt = NULL; UINT64 XFirmwareCtrl, XDsdt; // save values if present - EFI_ACPI_DESCRIPTION_HEADER *TableHeader; + EFI_ACPI_DESCRIPTION_HEADER *TableHeader, *Ssdt = NULL; UINTN Index, ApicCPUNum, BufferLen = 0; UINT8 CPUBase, *Buffer = NULL; BOOLEAN DsdtLoaded = FALSE, OSTypeDarwin = FALSE, @@ -1304,9 +1381,14 @@ PatchACPI ( DBG ("old FADT length=%x\n", oldLength); CopyMem ((UINT8 *)NewFadt, (UINT8 *)FadtPointer, oldLength); // old data NewFadt->Header.Length = 0xF4; - CopyMem ((UINT8 *)NewFadt->Header.OemId, (UINT8 *)BiosVendor, ACPI_OEM_ID_SIZE); + CopyMem ((UINT8 *)NewFadt->Header.OemId, (UINT8 *)AsciiStrToUpper(BiosVendor), ACPI_OEM_ID_SIZE); NewFadt->Header.Revision = EFI_ACPI_4_0_FIXED_ACPI_DESCRIPTION_TABLE_REVISION; NewFadt->Reserved0 = 0; // ACPIspec said it should be 0, while 1 is possible, but no more + + if (BIT_ISSET (gSettings.FixDsdt, FIX_HEADER)) { + PatchTableHeader (&NewFadt->Header, FALSE); + } + NewFadt->PreferredPmProfile = 3; if (!gSettings.SmartUPS) { NewFadt->PreferredPmProfile = gMobile ? 2 : 1; // as calculated before @@ -1412,7 +1494,6 @@ PatchACPI ( if (!EFI_ERROR (Status)) { // custom DSDT is loaded so not need to drop _DSM - NO! We need to drop them! // if we will apply fixes, allocate additional space - BufferLen = BufferLen + BufferLen / 8; Dsdt = EFI_SYSTEM_TABLE_MAX_ADDRESS; Status = gBS->AllocatePages ( AllocateMaxAddress, @@ -1424,48 +1505,46 @@ PatchACPI ( // if success insert dsdt pointer into ACPI tables if (!EFI_ERROR (Status)) { //DBG ("page is allocated, write DSDT into\n"); + CopyMem ((VOID *)(UINTN)Dsdt, Buffer, BufferLen); - FadtPointer->Dsdt = (UINT32)Dsdt; - FadtPointer->XDsdt = Dsdt; - // verify checksum - FadtPointer->Header.Checksum = 0; - FadtPointer->Header.Checksum = (UINT8)(256 - Checksum8 ((CHAR8 *)FadtPointer,FadtPointer->Header.Length)); DsdtLoaded = TRUE; - - goto DebugDSDT; } } } - // allocate space for fixes - TableHeader = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)FadtPointer->Dsdt; - BufferLen = TableHeader->Length; - //DBG ("DSDT len = 0x%x", BufferLen); - BufferLen = BufferLen + BufferLen / 8; - //DBG (" new len = 0x%x\n", BufferLen); + if (!DsdtLoaded) { + // allocate space for fixes + TableHeader = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)FadtPointer->Dsdt; + BufferLen = TableHeader->Length; + //DBG ("DSDT len = 0x%x", BufferLen); + BufferLen = BufferLen + BufferLen / 8; + //DBG (" new len = 0x%x\n", BufferLen); - Dsdt = EFI_SYSTEM_TABLE_MAX_ADDRESS; - Status = gBS->AllocatePages ( - AllocateMaxAddress, - EfiACPIReclaimMemory, - EFI_SIZE_TO_PAGES (BufferLen), - &Dsdt - ); + Dsdt = EFI_SYSTEM_TABLE_MAX_ADDRESS; + + Status = gBS->AllocatePages ( + AllocateMaxAddress, + EfiACPIReclaimMemory, + EFI_SIZE_TO_PAGES (BufferLen), + &Dsdt + ); + + if (!EFI_ERROR (Status)) { + CopyMem ((VOID *)(UINTN)Dsdt, (VOID *)TableHeader, BufferLen); + } + } // if success insert dsdt pointer into ACPI tables if (!EFI_ERROR (Status)) { - CopyMem ((VOID *)(UINTN)Dsdt, (VOID *)TableHeader, BufferLen); - FadtPointer->Dsdt = (UINT32)Dsdt; FadtPointer->XDsdt = Dsdt; + // verify checksum FadtPointer->Header.Checksum = 0; - FadtPointer->Header.Checksum = (UINT8)(256 - Checksum8 ((CHAR8 *)FadtPointer, FadtPointer->Header.Length)); + FadtPointer->Header.Checksum = (UINT8)(256 - Checksum8 ((CHAR8 *)FadtPointer, FadtPointer->Header.Length)); } - DebugDSDT: - if (PatchedDirExists && gSettings.DebugDSDT) { DBG ("Output DSDT before patch to %s\\%s\n", DIR_ACPI_ORIGIN, DSDT_ORIGIN_NAME); Status = SaveFile (SelfRootDir, PoolPrint (L"%s\\%s", DIR_ACPI_ORIGIN, DSDT_ORIGIN_NAME), (UINT8 *)(UINTN)FadtPointer->XDsdt, BufferLen); @@ -1648,12 +1727,15 @@ PatchACPI ( MsgLog ("End: Processing Patched AML (s)\n"); } - if (!OSTypeDarwin || !gSettings.GeneratePStates || !gSettings.GenerateCStates) { + if (!OSTypeDarwin || (!gSettings.GeneratePStates && !gSettings.GenerateCStates)) { goto SkipGenStates; } DbgHeader ("CPU States"); + // find ACPI CPU name and hardware address + FindCPU ((UINT8 *)(UINTN)FadtPointer->XDsdt); + //if (gCPUStructure.Vendor != CPU_VENDOR_INTEL) { // MsgLog ("Not an Intel platform: P-States will not be generated !!!\n"); // goto SkipGenStates; @@ -1716,7 +1798,35 @@ PatchACPI ( SkipGenStates: + RsdPtr = FindAcpiRsdPtr (); + + if (OSTypeDarwin && BIT_ISSET (gSettings.FixDsdt, FIX_HEADER)) { + if (RsdPtr != NULL) { + FixAsciiTableHeader ((UINT8 *)&RsdPtr->OemId, ACPI_OEM_ID_SIZE); + RsdPtr->Checksum = 0; + RsdPtr->Checksum = (UINT8)(256 - Checksum8 (RsdPtr, RsdPtr->Length)); + } + + TableHeader = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)FadtPointer->XDsdt; + PatchTableHeader (TableHeader, FALSE); + TableHeader->Checksum = 0; + TableHeader->Checksum = (UINT8)(256 - Checksum8 (TableHeader, TableHeader->Length)); + + PatchAllTablesHeaders (); + } + if (Xsdt) { + PrintRSDPTableInfos (RsdPtr); + PrintTableInfos (&Xsdt->Header); + PrintTableInfos (&FadtPointer->Header); + PrintTableInfos ((EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)FadtPointer->XDsdt); + PrintFACSTableInfos (Facs); + PrintXSDTTableInfos (); + + if (OSTypeDarwin && BIT_ISSET (gSettings.FixDsdt, FIX_HEADER)) { + PatchTableHeader (&Xsdt->Header, FALSE); + } + Xsdt->Header.Checksum = 0; Xsdt->Header.Checksum = (UINT8)(256 - Checksum8 ((CHAR8 *)Xsdt, Xsdt->Header.Length)); } diff --git a/Library/Platform/FixBiosDsdt.c b/Library/Platform/FixBiosDsdt.c index c79907f..32157ee 100644 --- a/Library/Platform/FixBiosDsdt.c +++ b/Library/Platform/FixBiosDsdt.c @@ -400,14 +400,13 @@ InsertScore ( AcpiCPUScore[Ind] = 0; } -STATIC +//STATIC VOID FindCPU ( - UINT8 *Dsdt, - UINT32 Length + UINT8 *Dsdt ) { UINT32 i, k, Size, SBSIZE = 0, SBADR = 0, - Off, j1; + Off, j1, Length = ((EFI_ACPI_DESCRIPTION_HEADER *)Dsdt)->Length; BOOLEAN SBFound = FALSE; if (AcpiCPUScore) { @@ -2716,9 +2715,9 @@ DumpFixBiosDsdt () { if (gSettings.FixDsdt != 0xFFFF) { MsgLog ("DsdtFixMask: 0x%08x:", gSettings.FixDsdt); - for (i = 0; i < OptMenuDSDTBitNum; i++) { - if (BIT_ISSET (gSettings.FixDsdt, OPT_MENU_DSDTBIT[i].Bit)) { - MsgLog (" %a%a", Count ? "| " : "", OPT_MENU_DSDTBIT[i].Title); + for (i = 0; i < OptFixDSDTBitNum; i++) { + if (BIT_ISSET (gSettings.FixDsdt, AFIXDSDT[i].Bit)) { + MsgLog (" %a%a", Count ? "| " : "", AFIXDSDT[i].Title); Count++; } } @@ -2734,7 +2733,7 @@ FixBiosDsdt ( ) { UINT32 DsdtLen; - if (!Temp) { + if (!Temp || Patched) { return; } @@ -2755,13 +2754,13 @@ FixBiosDsdt ( CheckHardware (); //arbitrary fixes - if (!Patched && (gSettings.PatchDsdtNum > 0) && gSettings.PatchDsdt) { + if (/*!Patched &&*/ (gSettings.PatchDsdtNum > 0) && gSettings.PatchDsdt) { MsgLog ("Patching DSDT:\n"); DsdtLen = PatchBinACPI (Temp, DsdtLen); } // find ACPI CPU name and hardware address - FindCPU (Temp, DsdtLen); + //FindCPU (Temp, DsdtLen); if (!gSettings.FixDsdt) { //return; @@ -2842,7 +2841,7 @@ FixBiosDsdt ( Temp[6] = (UINT8)((DsdtLen & 0x00FF0000) >> 16); Temp[7] = (UINT8)((DsdtLen & 0xFF000000) >> 24); - CopyMem ((UINT8 *)((EFI_ACPI_DESCRIPTION_HEADER *)Temp)->OemId, (UINT8 *)BiosVendor, 6); + CopyMem ((UINT8 *)((EFI_ACPI_DESCRIPTION_HEADER *)Temp)->OemId, (UINT8 *)AsciiStrToUpper(BiosVendor), ACPI_OEM_ID_SIZE); //DBG ("orgBiosDsdtLen = 0x%08x\n", orgBiosDsdtLen); ((EFI_ACPI_DESCRIPTION_HEADER *)Temp)->Checksum = 0; ((EFI_ACPI_DESCRIPTION_HEADER *)Temp)->Checksum = (UINT8)(256 - Checksum8 (Temp, DsdtLen)); diff --git a/Library/Platform/KextPatcher.c b/Library/Platform/KextPatcher.c index 7f7ac1a..3491d7f 100644 --- a/Library/Platform/KextPatcher.c +++ b/Library/Platform/KextPatcher.c @@ -829,6 +829,80 @@ ExtractKextPropString ( } } +// +// Prevent prelinked kext being loaded by kernel: +// +// [+] Kernel will refuse to load prelinked kext with invalid / inexistence "CFBundleIdentifier". +// By simply renaming "CFBundleIdentifier" key to something invalid (ex: "_FBundleIdentifier") +// will feed this purpose. +// [-] Zeroing prelinked kext size (in "_PrelinkExecutableSize") will also work, with some extra risks: +// Prelinked kext entry with ID / IDREF attribute will potentially screw up other entries +// refer to / by those ID, which totally bad / unnecessary. +// + +VOID +BlockListedKextCaches ( + CHAR8 *Plist +) { + CHAR8 *Value; + + Value = AsciiStrStr (Plist, PropCFBundleIdentifierKey); + if (Value == NULL) { + return; + } + + Value += 5; // skip "" + *(Value) = '_'; // apply prefix +} + +BOOLEAN +IsKextInBlockCachesList ( + CHAR8 *KextBundleIdentifier +) { + BOOLEAN Ret = FALSE; + + if (gSettings.BlockKextCachesCount) { + INT32 i, IsBundle = 0; + + for (i = 0; i < gSettings.BlockKextCachesCount; i++) { + if (IsPatchNameMatch (gSettings.BlockKextCaches[i], KextBundleIdentifier, KextBundleIdentifier, &IsBundle)) { + Ret = TRUE; + break; + } + } + } + + return Ret; +} + +// +// Iterates over kexts in kernelcache +// and calls PatchKext () for each. +// +// PrelinkInfo section contains following plist, without spaces: +// +// _PrelinkInfoDictionary +// +// +// +// CFBundleName +// MAC Framework Pseudoextension +// _PrelinkExecutableLoadAddr +// 0xffffff7f8072f000 +// +// _PrelinkExecutableSize +// 0x3d0 +// +// _PrelinkExecutableSourceAddr +// 0xffffff80009a3000 +// ... +// +// +// +// ... +// +// ... + #ifdef LAZY_PARSE_KEXT_PLIST EFI_STATUS @@ -919,19 +993,31 @@ ParsePrelinkKexts ( Prop = GetProperty (Dict, kPropCFBundleIdentifier); if ((Prop != NULL) && (Prop->type == kTagTypeString)) { - // To speed up process sure we can apply all patches here immediately. - // By saving all kexts data into list could be useful for other purposes, I hope. - PRELINKKEXTLIST *nKext = AllocateZeroPool (sizeof (PRELINKKEXTLIST)); - - if (nKext) { - nKext->Signature = PRELINKKEXTLIST_SIGNATURE; - nKext->BundleIdentifier = AllocateCopyPool (AsciiStrSize (Prop->string), Prop->string); - nKext->Address = iPrelinkExecutableSourceKey; - nKext->Size = iPrelinkExecutableSizeKey; - nKext->Offset = Dict->offset; - nKext->Taglen = Dict->taglen; - InsertTailList (&gPrelinkKextList, (LIST_ENTRY *)(((UINT8 *)nKext) + OFFSET_OF (PRELINKKEXTLIST, Link))); + CHAR8 *InfoPlist = WholePlist + Dict->offset, SavedValue; + + SavedValue = InfoPlist[Dict->taglen]; + InfoPlist[Dict->taglen] = '\0'; + + if (IsKextInBlockCachesList (Prop->string)) { + DBG ("Blocking KextCaches: %a\n", Prop->string); + BlockListedKextCaches (InfoPlist); + } else { + // To speed up process sure we can apply all patches here immediately. + // By saving all kexts data into list could be useful for other purposes, I hope. + PRELINKKEXTLIST *nKext = AllocateZeroPool (sizeof (PRELINKKEXTLIST)); + + if (nKext) { + nKext->Signature = PRELINKKEXTLIST_SIGNATURE; + nKext->BundleIdentifier = AllocateCopyPool (AsciiStrSize (Prop->string), Prop->string); + nKext->Address = iPrelinkExecutableSourceKey; + nKext->Size = iPrelinkExecutableSizeKey; + nKext->Offset = Dict->offset; + nKext->Taglen = Dict->taglen; + InsertTailList (&gPrelinkKextList, (LIST_ENTRY *)(((UINT8 *)nKext) + OFFSET_OF (PRELINKKEXTLIST, Link))); + } } + + InfoPlist[Dict->taglen] = SavedValue; } } @@ -944,33 +1030,6 @@ ParsePrelinkKexts ( return IsListEmpty (&gPrelinkKextList) ? EFI_UNSUPPORTED : EFI_SUCCESS; } -// -// Iterates over kexts in kernelcache -// and calls PatchKext () for each. -// -// PrelinkInfo section contains following plist, without spaces: -// -// _PrelinkInfoDictionary -// -// -// -// CFBundleName -// MAC Framework Pseudoextension -// _PrelinkExecutableLoadAddr -// 0xffffff7f8072f000 -// -// _PrelinkExecutableSize -// 0x3d0 -// -// _PrelinkExecutableSourceAddr -// 0xffffff80009a3000 -// ... -// -// -// -// ... -// -// ... VOID PatchPrelinkedKexts ( LOADER_ENTRY *Entry @@ -1034,6 +1093,7 @@ PatchPrelinkedKexts ( // This func is hard to read and debug and probably not reliable, // but it seems it works. // +STATIC UINT64 GetPlistHexValue ( CHAR8 *Plist, @@ -1155,6 +1215,14 @@ PatchPrelinkedKexts ( SavedValue = *InfoPlistEnd; *InfoPlistEnd = '\0'; + ExtractKextPropString (KextBundleIdentifier, ARRAY_SIZE (KextBundleIdentifier), PropCFBundleIdentifierKey, InfoPlistStart); + + if (IsKextInBlockCachesList (KextBundleIdentifier)) { + DBG ("Blocking KextCaches: %a\n", KextBundleIdentifier); + BlockListedKextCaches (InfoPlistStart); + goto Next; + } + // get kext address from _PrelinkExecutableSourceAddr // truncate to 32 bit to get physical addr KextAddr = (UINT32)GetPlistHexValue (InfoPlistStart, kPrelinkExecutableSourceKey, WholePlist); @@ -1164,8 +1232,6 @@ PatchPrelinkedKexts ( KextSize = (UINT32)GetPlistHexValue (InfoPlistStart, kPrelinkExecutableSizeKey, WholePlist); - ExtractKextPropString (KextBundleIdentifier, ARRAY_SIZE (KextBundleIdentifier), PropCFBundleIdentifierKey, InfoPlistStart); - // patch it PatchKext ( (UINT8 *)(UINTN)KextAddr, @@ -1176,6 +1242,8 @@ PatchPrelinkedKexts ( Entry ); + Next: + // return saved char *InfoPlistEnd = SavedValue; } @@ -1197,12 +1265,12 @@ VOID PatchLoadedKexts ( LOADER_ENTRY *Entry ) { - CHAR8 *PropName, SavedValue, *InfoPlist; - DTEntry MMEntry; - BooterKextFileInfo *KextFileInfo; - DeviceTreeBuffer *PropEntry; - struct OpaqueDTPropertyIterator OPropIter; - DTPropertyIterator PropIter = &OPropIter; + CHAR8 *PropName, SavedValue, *InfoPlist; + DTEntry MMEntry; + BooterKextFileInfo *KextFileInfo; + DeviceTreeBuffer *PropEntry; + struct OpaqueDTPropertyIterator OPropIter; + DTPropertyIterator PropIter = &OPropIter; if (!gDtRoot) { return; diff --git a/Library/Platform/Settings.c b/Library/Platform/Settings.c index ecc5493..bb830bf 100644 --- a/Library/Platform/Settings.c +++ b/Library/Platform/Settings.c @@ -98,7 +98,7 @@ REFIT_CONFIG DefaultConfig = { REFIT_CONFIG GlobalConfig; -DEVICES_BIT_K ADEVICES[] = { +OPT_BITS ADEVICES[] = { { "ATI", DEV_ATI }, { "NVidia", DEV_NVIDIA }, { "IntelGFX", DEV_INTEL }, @@ -116,20 +116,20 @@ DEVICES_BIT_K ADEVICES[] = { INTN OptDevicesBitNum = ARRAY_SIZE (ADEVICES); -OPT_MENU_BIT_K OPT_MENU_DSDTBIT[] = { - { "Add HDMI", "AddHDMI", FIX_HDMI }, - { "Add MCHC", "AddMCHC", FIX_MCHC }, - { "Add PNLF", "AddPNLF", FIX_PNLF }, - { "Fix Airport", "FixAirport", FIX_WIFI }, - { "Fix Display", "FixDisplay", FIX_DISPLAY }, - { "Fix IMEI", "AddIMEI", FIX_IMEI }, - { "Fix IntelGFX", "FixIntelGFX", FIX_INTELGFX }, - { "Fix LAN", "FixLAN", FIX_LAN }, - { "Fix Sound", "FixHDA", FIX_HDA }, - { "Fix Header", "FixHeader", FIX_HEADER }, +OPT_BITS AFIXDSDT[] = { + { "FIX_HDMI", FIX_HDMI }, + { "FIX_MCHC", FIX_MCHC }, + { "FIX_PNLF", FIX_PNLF }, + { "FIX_WIFI", FIX_WIFI }, + { "FIX_DISPLAY", FIX_DISPLAY }, + { "FIX_IMEI", FIX_IMEI }, + { "FIX_INTELGFX", FIX_INTELGFX }, + { "FIX_LAN", FIX_LAN }, + { "FIX_HDA", FIX_HDA }, + { "FIX_HEADER", FIX_HEADER } }; -INTN OptMenuDSDTBitNum = ARRAY_SIZE (OPT_MENU_DSDTBIT); +INTN OptFixDSDTBitNum = ARRAY_SIZE (AFIXDSDT); CHAR16 *InjectKextsDir[2] = { NULL/*, NULL*/, NULL }; @@ -3754,9 +3754,9 @@ ParseACPISettings ( gSettings.FixDsdt = 0; - for (i = 0; i < OptMenuDSDTBitNum; ++i) { - if (GetPropertyBool (GetProperty (Prop, OPT_MENU_DSDTBIT[i].OptLabel), FALSE)) { - gSettings.FixDsdt |= OPT_MENU_DSDTBIT[i].Bit; + for (i = 0; i < OptFixDSDTBitNum; ++i) { + if (GetPropertyBool (GetProperty (Prop, AFIXDSDT[i].Title), FALSE)) { + gSettings.FixDsdt |= AFIXDSDT[i].Bit; } } } @@ -4089,6 +4089,7 @@ ParseSystemParametersSettings ( goto SkipInitialBoot; } + // TODO: Will remove this prop soon. You don't have to install if you don't want to :((( Prop = GetProperty (DictPointer, "DisableDrivers"); if (Prop != NULL) { INTN i, Count = Prop->size; @@ -4115,6 +4116,30 @@ ParseSystemParametersSettings ( gSettings.NoCaches = GetPropertyBool (GetProperty (DictPointer, "NoCaches"), FALSE); gSettings.FakeSMCOverrides = GetPropertyBool (GetProperty (DictPointer, "FakeSMCOverrides"), TRUE); + Prop = GetProperty (DictPointer, "BlockKextCaches"); + if (Prop != NULL) { + INTN i, Count = Prop->size; + + if (Count > 0) { + while (gSettings.BlockKextCachesCount) { + FreePool (gSettings.BlockKextCaches[gSettings.BlockKextCachesCount--]); + } + + gSettings.BlockKextCachesCount = 0; + gSettings.BlockKextCaches = AllocateZeroPool (Count * sizeof (CHAR8 *)); + + for (i = 0; i < Count; i++) { + if ( + !EFI_ERROR (GetElement (Prop, i, Count, &Prop)) && + (Prop != NULL) && + (Prop->type == kTagTypeString) + ) { + gSettings.BlockKextCaches[gSettings.BlockKextCachesCount++] = AllocateCopyPool (AsciiStrSize (Prop->string), Prop->string); + } + } + } + } + if (GetLegacyLanAddress) { Prop = GetProperty (DictPointer, "MacAddress"); if ((Prop != NULL) && (Prop->type == kTagTypeString)) { diff --git a/Library/Platform/StateGenerator.c b/Library/Platform/StateGenerator.c index f6d738b..d3375a9 100644 --- a/Library/Platform/StateGenerator.c +++ b/Library/Platform/StateGenerator.c @@ -48,7 +48,7 @@ CHAR8 PluginType[] = { 0x65, 0x00, }; -SSDT_TABLE * +EFI_ACPI_DESCRIPTION_HEADER * GeneratePssSsdt ( UINT8 FirstID, UINTN Number @@ -150,9 +150,9 @@ GeneratePssSsdt ( // if (PStatesCount > 0) { - SSDT_TABLE *Ssdt; - AML_CHUNK *Scope, *Method, *Pack, *MetPSS, *MetPPC, - *NamePCT, *PackPCT, *MetPCT, *Root = AmlCreateNode (NULL); + EFI_ACPI_DESCRIPTION_HEADER *Ssdt; + AML_CHUNK *Scope, *Method, *Pack, *MetPSS, *MetPPC, + *NamePCT, *PackPCT, *MetPCT, *Root = AmlCreateNode (NULL); AmlAddBuffer (Root, (CHAR8 *)&PssSsdtHeader[0], sizeof (PssSsdtHeader)); // SSDT header @@ -227,7 +227,7 @@ GeneratePssSsdt ( AmlCalculateSize (Root); - Ssdt = (SSDT_TABLE *)AllocateZeroPool (Root->Size); + Ssdt = (EFI_ACPI_DESCRIPTION_HEADER *)AllocateZeroPool (Root->Size); AmlWriteNode (Root, (VOID *)Ssdt, 0); Ssdt->Length = Root->Size; Ssdt->Checksum = 0; @@ -246,19 +246,19 @@ GeneratePssSsdt ( return NULL; } -SSDT_TABLE * +EFI_ACPI_DESCRIPTION_HEADER * GenerateCstSsdt ( EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt, UINT8 FirstID, UINTN Number ) { - BOOLEAN C2Enabled, C3Enabled; - UINT8 CStatesCount; - UINT32 AcpiCPUPBlk; - CHAR8 Name2[31], Name0[31], Name1[31]; - AML_CHUNK *Root, *Scope, *Name, *Pack, *Tmpl, *Met; - UINTN i; - SSDT_TABLE *Ssdt; + BOOLEAN C2Enabled, C3Enabled; + UINT8 CStatesCount; + UINT32 AcpiCPUPBlk; + CHAR8 Name2[31], Name0[31], Name1[31]; + AML_CHUNK *Root, *Scope, *Name, *Pack, *Tmpl, *Met; + UINTN i; + EFI_ACPI_DESCRIPTION_HEADER *Ssdt; if (!Fadt) { return NULL; @@ -358,7 +358,7 @@ GenerateCstSsdt ( AmlCalculateSize (Root); - Ssdt = (SSDT_TABLE *)AllocateZeroPool (Root->Size); + Ssdt = (EFI_ACPI_DESCRIPTION_HEADER *)AllocateZeroPool (Root->Size); AmlWriteNode (Root, (VOID *)Ssdt, 0); diff --git a/Library/UI/Menu.c b/Library/UI/Menu.c index 8900c03..4911a8c 100644 --- a/Library/UI/Menu.c +++ b/Library/UI/Menu.c @@ -1724,12 +1724,9 @@ RunGenericMenu ( MenuExit = MENU_EXIT_HIDE_TOGGLE; break; - -#if DUMP_TABLE case SCAN_F4: SaveOemTables (); break; -#endif case SCAN_F5: SaveOemDsdt (TRUE, 0); //full patch @@ -3321,12 +3318,12 @@ REFIT_MENU_ENTRY * SubMenuAcpi () { REFIT_MENU_ENTRY *Entry = NULL; REFIT_MENU_SCREEN *SubScreen = NULL; - CHAR8 Sign[5], OTID[9]; + CHAR8 Signature[ACPI_NAME_SIZE + 1], OemTableId[ACPI_OEM_TABLE_ID_SIZE + 1]; INTN i = 0; S_FILES *aTmp = aDSDTs; - Sign[4] = 0; - OTID[8] = 0; + Signature[ACPI_NAME_SIZE] = 0; + OemTableId[ACPI_OEM_TABLE_ID_SIZE] = 0; CreateHeaderEntries (&Entry, &SubScreen, L"ACPI", SCREEN_TABLES, 'A'); @@ -3348,8 +3345,8 @@ SubMenuAcpi () { AddSeparator (SubScreen, "DSDT Fixes"); - for (i = 0; i < OptMenuDSDTBitNum; i++) { - AddMenuCheck (SubScreen, PoolPrint (L"%a", OPT_MENU_DSDTBIT[i].Title), OPT_MENU_DSDTBIT[i].Bit, mDSDTFix); + for (i = 0; i < OptFixDSDTBitNum; i++) { + AddMenuCheck (SubScreen, PoolPrint (L"%a", AFIXDSDT[i].Title), AFIXDSDT[i].Bit, mDSDTFix); } AddSeparator (SubScreen, "Drop Table"); @@ -3358,14 +3355,14 @@ SubMenuAcpi () { ACPI_DROP_TABLE *DropTable = gSettings.ACPIDropTables; while (DropTable) { - CopyMem ((CHAR8 *)&Sign, (CHAR8 *)&(DropTable->Signature), 4); - CopyMem ((CHAR8 *)&OTID, (CHAR8 *)&(DropTable->TableId), 8); + CopyMem ((CHAR8 *)&Signature, (CHAR8 *)&(DropTable->Signature), ACPI_NAME_SIZE); + CopyMem ((CHAR8 *)&OemTableId, (CHAR8 *)&(DropTable->TableId), ACPI_OEM_TABLE_ID_SIZE); //MsgLog ("adding to menu %a (%x) %a (%lx) L=%d (0x%x)\n", - // Sign, DropTable->Signature, - // OTID, DropTable->TableId, + // Signature, DropTable->Signature, + // OemTableId, DropTable->TableId, // DropTable->Length, DropTable->Length); - AddMenuBOOL (SubScreen, PoolPrint (L"Drop \"%4.4a\" \"%8.8a\" %d", Sign, OTID, DropTable->Length), &(DropTable->MenuItem), 0); + AddMenuBOOL (SubScreen, PoolPrint (L"Drop \"%-4a\" \"%-8a\" %d", Signature, OemTableId, DropTable->Length), &(DropTable->MenuItem), 0); DropTable = DropTable->Next; } } @@ -3662,9 +3659,7 @@ HelpRefit () { AddMenuInfo (&HelpMenu, L"F1 / H - This help"); AddMenuInfo (&HelpMenu, PoolPrint (L"F2 - Save '%s' into '%s'", Basename (PREBOOT_LOG), DIR_MISC)); AddMenuInfo (&HelpMenu, L"F3 - Show hidden entries"); -#if DUMP_TABLE AddMenuInfo (&HelpMenu, PoolPrint (L"F4 - Save oem DSDT into '%s'", DIR_ACPI_ORIGIN)); -#endif AddMenuInfo (&HelpMenu, PoolPrint (L"F5 - Save patched DSDT into '%s'", DIR_ACPI_PATCHED)); AddMenuInfo (&HelpMenu, PoolPrint (L"F6 - Save VideoBios into '%s'", DIR_MISC)); AddMenuInfo (&HelpMenu, L"F9 - Switch screen mode"); diff --git a/Module/CommonLib/CommonLib.c b/Module/CommonLib/CommonLib.c index de51d74..5182eb0 100644 --- a/Module/CommonLib/CommonLib.c +++ b/Module/CommonLib/CommonLib.c @@ -868,6 +868,21 @@ AsciiStrToLower ( return Tmp; } +CHAR8 * +EFIAPI +AsciiStrToUpper ( + IN CHAR8 *Str +) { + CHAR8 *Tmp = AllocateCopyPool (AsciiStrSize (Str), Str); + INTN i; + + for (i = 0; Tmp[i]; i++) { + Tmp[i] = TO_AUPPER (Tmp[i]); + } + + return Tmp; +} + CHAR8 * EFIAPI AsciiStriStr (