]> git.saurik.com Git - apple/xnu.git/blobdiff - iokit/Kernel/i386/IOKeyStoreHelper.cpp
xnu-7195.101.1.tar.gz
[apple/xnu.git] / iokit / Kernel / i386 / IOKeyStoreHelper.cpp
index ca0e3b8952fe30bab3f99b0492d9cbc6b67e3bef..8c71598d7517fffee543d71c689154f81be2890d 100644 (file)
@@ -54,24 +54,19 @@ static IOMemoryDescriptor* apfsKeyData = NULL;
 IOMemoryDescriptor* IOGetAPFSKeyStoreData();
 void IOSetAPFSKeyStoreData(IOMemoryDescriptor* data);
 
-static volatile UInt32 arvRootHashFetched = 0;
+static volatile UInt32 ARVRootHashFetched = 0;
 static volatile UInt32 bsARVRootHashFetched = 0;
-static IOMemoryDescriptor* arvRootHashData = NULL;
-static IOMemoryDescriptor* bsARVRootHashData = NULL;
 
 IOMemoryDescriptor* IOGetARVRootHashData(void);
-void IOSetARVRootHashData(IOMemoryDescriptor* arvData);
-
 IOMemoryDescriptor* IOGetBaseSystemARVRootHashData(void);
-bool IOBaseSystemARVRootHashAvailable(void);
-void IOSetBaseSystemARVRootHashData(IOMemoryDescriptor* arvData);
 
+bool IOBaseSystemARVRootHashAvailable(void);
 
-static volatile UInt32 arvManifestFetched = 0;
-static IOMemoryDescriptor* arvManifestData = NULL;
+static volatile UInt32 ARVManifestFetched = 0;
+static volatile UInt32 bsARVManifestFetched = 0;
 
 IOMemoryDescriptor* IOGetARVManifestData(void);
-void IOSetARVManifestData(IOMemoryDescriptor* arvData);
+IOMemoryDescriptor* IOGetBaseSystemARVManifestData(void);
 
 __END_DECLS
 
@@ -181,34 +176,15 @@ IOGetAPFSKeyStoreData()
 
 // ARV Root Hash fetcher
 
-// Store in-memory Root Hash
-void
-IOSetARVRootHashData(IOMemoryDescriptor* arvData)
-{
-       // Do not allow re-fetching of the boot_args root hash by passing NULL here.
-       if (arvData) {
-               arvRootHashData = arvData;
-               arvRootHashFetched = 0;
-       }
-}
-
-// Retrieve any root hash we may have (stored in boot_args or in-memory)
+// Retrieve any root hash we may have (stored in boot_args)
 IOMemoryDescriptor*
 IOGetARVRootHashData(void)
 {
        // Check if someone got the root hash before us
-       if (!OSCompareAndSwap(0, 1, &arvRootHashFetched)) {
+       if (!OSCompareAndSwap(0, 1, &ARVRootHashFetched)) {
                return NULL;
        }
 
-       // Do we have in-memory root hash?
-       if (arvRootHashData) {
-               IOMemoryDescriptor* arvData = arvRootHashData;
-               arvRootHashData = NULL;
-               return arvData;
-       }
-
-       // Looks like there was no in-memory root hash and it's the first call - try boot_args
        boot_args* args = (boot_args*)PE_state.bootArgs;
 
        DEBG("%s: data at address %llu size %llu\n", __func__, args->arvRootHashStart, args->arvRootHashSize);
@@ -228,68 +204,62 @@ IOGetARVRootHashData(void)
        return memoryDescriptor;
 }
 
-// Base System Analogues
+// Base System Analogue
 
 IOMemoryDescriptor*
 IOGetBaseSystemARVRootHashData(void)
 {
-       //TBD!
-       return NULL;
+       // Check if someone got the base system root hash before us
+       if (!OSCompareAndSwap(0, 1, &bsARVRootHashFetched)) {
+               return NULL;
+       }
+
+       boot_args* args = (boot_args*)PE_state.bootArgs;
+
+       DEBG("%s: data at address %llu size %llu\n", __func__, args->bsARVRootHashStart, args->bsARVRootHashSize);
+       if (args->bsARVRootHashStart == 0) {
+               return NULL;
+       }
+
+       // We have the base system root hash in the boot_args, create IOMemoryDescriptor for the blob
+       IOAddressRange ranges;
+       ranges.address = args->bsARVRootHashStart;
+       ranges.length = args->bsARVRootHashSize;
+
+       const IOOptionBits options = kIODirectionInOut | kIOMemoryTypePhysical64 | kIOMemoryMapperNone;
+
+       IOMemoryDescriptor* memoryDescriptor = IOMemoryDescriptor::withOptions(&ranges, 1, 0, NULL, options);
+       DEBG("%s: memory descriptor %p\n", __func__, memoryDescriptor);
+       return memoryDescriptor;
 }
 
 bool
 IOBaseSystemARVRootHashAvailable(void)
 {
-       // Check if someone got the root hash before us
-       if (!OSCompareAndSwap(0, 1, &bsARVRootHashFetched)) {
+       boot_args* args = (boot_args*)PE_state.bootArgs;
+
+       if (args->bsARVRootHashStart == 0 || args->bsARVRootHashSize == 0) {
                return false;
        }
 
-       // Do we have in-memory root hash?
-       if (bsARVRootHashData) {
-               return true;
+       if (args->bsARVManifestStart == 0 || args->bsARVManifestSize == 0) {
+               return false;
        }
-       return false;
-}
 
-
-void
-IOSetBaseSystemARVRootHashData(IOMemoryDescriptor* arvData)
-{
-       return;
+       return true;
 }
 
-
 // ARV Manifest fetcher
 
-// Store in-memory Manifest
-void
-IOSetARVManifestData(IOMemoryDescriptor* arvData)
-{
-       // Do not allow re-fetching of the boot_args manifest by passing NULL here.
-       if (arvData) {
-               arvManifestData = arvData;
-               arvManifestFetched = 0;
-       }
-}
-
-// Retrieve any manifest we may have (stored in boot_args or in-memory)
+// Retrieve any manifest we may have (stored in boot_args)
 IOMemoryDescriptor*
 IOGetARVManifestData(void)
 {
        // Check if someone got the manifest before us
-       if (!OSCompareAndSwap(0, 1, &arvManifestFetched)) {
+       if (!OSCompareAndSwap(0, 1, &ARVManifestFetched)) {
                return NULL;
        }
 
-       // Do we have in-memory manifest?
-       if (arvManifestData) {
-               IOMemoryDescriptor* arvData = arvManifestData;
-               arvManifestData = NULL;
-               return arvData;
-       }
-
-       // Looks like there was no in-memory manifest and it's the first call - try boot_args
        boot_args* args = (boot_args*)PE_state.bootArgs;
 
        DEBG("%s: data at address %llu size %llu\n", __func__, args->arvManifestStart, args->arvManifestSize);
@@ -308,3 +278,32 @@ IOGetARVManifestData(void)
        DEBG("%s: memory descriptor %p\n", __func__, memoryDescriptor);
        return memoryDescriptor;
 }
+
+// Base System Analogue
+
+IOMemoryDescriptor*
+IOGetBaseSystemARVManifestData(void)
+{
+       // Check if someone got the base system manifest before us
+       if (!OSCompareAndSwap(0, 1, &bsARVManifestFetched)) {
+               return NULL;
+       }
+
+       boot_args* args = (boot_args*)PE_state.bootArgs;
+
+       DEBG("%s: data at address %llu size %llu\n", __func__, args->bsARVManifestStart, args->bsARVManifestSize);
+       if (args->bsARVManifestStart == 0) {
+               return NULL;
+       }
+
+       // We have the manifest in the boot_args, create IOMemoryDescriptor for the blob
+       IOAddressRange ranges;
+       ranges.address = args->bsARVManifestStart;
+       ranges.length = args->bsARVManifestSize;
+
+       const IOOptionBits options = kIODirectionInOut | kIOMemoryTypePhysical64 | kIOMemoryMapperNone;
+
+       IOMemoryDescriptor* memoryDescriptor = IOMemoryDescriptor::withOptions(&ranges, 1, 0, NULL, options);
+       DEBG("%s: memory descriptor %p\n", __func__, memoryDescriptor);
+       return memoryDescriptor;
+}