]> code.delx.au - refind/blobdiff - refind/main.c
Added summary of Apple System Integrity Protection (SIP) status to
[refind] / refind / main.c
index 2c39bae099836919e781eb5aa5f62d5475c684dd..690816996b2e4a93b0eb475225448710166a0dcb 100644 (file)
@@ -183,13 +183,26 @@ struct LOADER_LIST {
 // misc functions
 //
 
+static INTN GetCsrStatus(VOID) {
+    CHAR8 *CsrValues;
+    UINTN CsrLength;
+    EFI_GUID CsrGuid = CSR_GUID;
+    EFI_STATUS Status;
+
+    Status = EfivarGetRaw(&CsrGuid, L"csr-active-config", &CsrValues, &CsrLength);
+    if ((Status == EFI_SUCCESS) && (CsrLength == 4))
+        return CsrValues[0];
+    else
+        return -1;
+} // INTN GetCsrStatus()
+
 static VOID AboutrEFInd(VOID)
 {
     CHAR16 *FirmwareVendor;
 
     if (AboutMenu.EntryCount == 0) {
         AboutMenu.TitleImage = BuiltinIcon(BUILTIN_ICON_FUNC_ABOUT);
-        AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.9.2.2");
+        AddMenuInfoLine(&AboutMenu, L"rEFInd Version 0.9.2.5");
         AddMenuInfoLine(&AboutMenu, L"");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2006-2010 Christoph Pfisterer");
         AddMenuInfoLine(&AboutMenu, L"Copyright (c) 2012-2015 Roderick W. Smith");
@@ -207,6 +220,18 @@ static VOID AboutrEFInd(VOID)
 #else
         AddMenuInfoLine(&AboutMenu, L" Platform: unknown");
 #endif
+        if (StriSubCmp(L"Apple", ST->FirmwareVendor)) {
+            switch (GetCsrStatus()) {
+                case SIP_ENABLED:
+                    AddMenuInfoLine(&AboutMenu, L" System Integrity Protection is enabled");
+                    break;
+                case SIP_DISABLED:
+                    AddMenuInfoLine(&AboutMenu, L" System Integrity Protection is disabled");
+                    break;
+                default:
+                    AddMenuInfoLine(&AboutMenu, L" System Integrity Protection status is unrecognized");
+            } // switch
+        } // if
         FirmwareVendor = StrDuplicate(ST->FirmwareVendor);
         LimitStringLength(FirmwareVendor, MAX_LINE_LENGTH); // More than ~65 causes empty info page on 800x600 display
         AddMenuInfoLine(&AboutMenu, PoolPrint(L" Firmware: %s %d.%02d", FirmwareVendor, ST->FirmwareRevision >> 16,
@@ -2144,72 +2169,63 @@ static VOID SetConfigFilename(EFI_HANDLE ImageHandle) {
     } // if
 } // VOID SetConfigFilename()
 
+/*
+ * The below definitions and SetAppleOSInfo() function are based on a GRUB patch
+ * by Andreas Heider:
+ * https://lists.gnu.org/archive/html/grub-devel/2013-12/msg00442.html
+ */
 
 #define EFI_APPLE_SET_OS_PROTOCOL_GUID  \
   { 0xc5c5da95, 0x7d5c, 0x45e6, \
     { 0xb2, 0xf1, 0x3f, 0xd5, 0x2b, 0xb1, 0x00, 0x77 } \
   }
 
-typedef struct efi_apple_set_os_interface {
-    UINT64 version;
-    EFI_STATUS EFIAPI (*set_os_version) (IN CHAR8 *version);
-    EFI_STATUS EFIAPI (*set_os_vendor) (IN CHAR8 *vendor);
-} efi_apple_set_os_interface;
+typedef struct EfiAppleSetOsInterface {
+    UINT64 Version;
+    EFI_STATUS EFIAPI (*SetOsVersion) (IN CHAR8 *Version);
+    EFI_STATUS EFIAPI (*SetOsVendor) (IN CHAR8 *Vendor);
+} EfiAppleSetOsInterface;
 
 // Function to tell the firmware that OS X is being launched. This is
 // required to work around problems on some Macs that don't fully
 // initialize some hardware (especially video displays) when third-party
 // OSes are launched in EFI mode.
 static EFI_STATUS SetAppleOSInfo() {
-//    CHAR8 apple_os_version[] = "Mac OS X 10.9";
     CHAR16 *AppleOSVersion = NULL;
     CHAR8 *AppleOSVersion8 = NULL;
-//    CHAR8 apple_os_vendor[]  = "Apple Inc.";
     EFI_STATUS Status;
     EFI_GUID apple_set_os_guid = EFI_APPLE_SET_OS_PROTOCOL_GUID;
-    efi_apple_set_os_interface *set_os = NULL;
+    EfiAppleSetOsInterface *SetOs = NULL;
 
-    Status = refit_call3_wrapper(BS->LocateProtocol, &apple_set_os_guid, NULL, (VOID**) &set_os);
+    Status = refit_call3_wrapper(BS->LocateProtocol, &apple_set_os_guid, NULL, (VOID**) &SetOs);
 
     // Not a Mac, so ignore the call....
-    if ((Status != EFI_SUCCESS) || (!set_os)) {
-        Print(L"Not a Mac!\n");
-        PauseForKey();
+    if ((Status != EFI_SUCCESS) || (!SetOs))
         return EFI_SUCCESS;
-    }
 
-    if ((set_os->version != 0) && GlobalConfig.SpoofOSXVersion) {
+    if ((SetOs->Version != 0) && GlobalConfig.SpoofOSXVersion) {
         AppleOSVersion = StrDuplicate(L"Mac OS X");
         MergeStrings(&AppleOSVersion, GlobalConfig.SpoofOSXVersion, ' ');
-        Print(L"Setting OS version to '%s'\n", AppleOSVersion);
-        AppleOSVersion8 = AllocateZeroPool((StrLen(AppleOSVersion) + 1) * sizeof(CHAR8));
-        UnicodeStrToAsciiStr(AppleOSVersion, AppleOSVersion8);
-        if (AppleOSVersion8) {
-            Print(L"Calling set_os_version()\n");
-            Status = refit_call1_wrapper (set_os->set_os_version, AppleOSVersion8);
-            Print(L"Returned %lx\n", Status);
-            if (EFI_ERROR(Status))
-                Print(L"ERROR! Returned %x\n", Status);
-        } else {
-            Status = EFI_OUT_OF_RESOURCES;
-            Print(L"Out of resources!\n");
-        }
-    }
-
-    if (/* (Status == EFI_SUCCESS) && */ (set_os->version == 2)) {
-        Print(L"Setting OS vendor....");
-        Status = refit_call1_wrapper (set_os->set_os_vendor, "Apple Inc.");
-        Print(L"Returned %x\n", Status);
-    }
-
-    if (Status != EFI_SUCCESS) {
+        if (AppleOSVersion) {
+            AppleOSVersion8 = AllocateZeroPool((StrLen(AppleOSVersion) + 1) * sizeof(CHAR8));
+            UnicodeStrToAsciiStr(AppleOSVersion, AppleOSVersion8);
+            if (AppleOSVersion8) {
+                Status = refit_call1_wrapper (SetOs->SetOsVersion, AppleOSVersion8);
+                if (!EFI_ERROR(Status))
+                    Status = EFI_SUCCESS;
+                MyFreePool(AppleOSVersion8);
+            } else {
+                Status = EFI_OUT_OF_RESOURCES;
+                Print(L"Out of resources in SetAppleOSInfo!\n");
+            }
+            if ((Status == EFI_SUCCESS) && (SetOs->Version == 2))
+                Status = refit_call1_wrapper (SetOs->SetOsVendor, "Apple Inc.");
+            MyFreePool(AppleOSVersion);
+        } // if (AppleOSVersion)
+    } // if
+    if (Status != EFI_SUCCESS)
         Print(L"Unable to set firmware boot type!\n");
-    }
 
-    MyFreePool(AppleOSVersion);
-    MyFreePool(AppleOSVersion8);
-    Print(L"Returning %x\n", Status);
-    PauseForKey();
     return (Status);
 } // EFI_STATUS SetAppleOSInfo()
 
@@ -2242,9 +2258,8 @@ efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
     SetConfigFilename(ImageHandle);
     ReadConfig(GlobalConfig.ConfigFilename);
 
-    if (GlobalConfig.SpoofOSXVersion) {
+    if (GlobalConfig.SpoofOSXVersion && GlobalConfig.SpoofOSXVersion[0] != L'\0')
         SetAppleOSInfo();
-    }
 
     InitScreen();
     WarnIfLegacyProblems();