X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/f427ee49d309d8fc33ebf3042c3a775f2f530ded..refs/heads/master:/iokit/Kernel/i386/IOKeyStoreHelper.cpp?ds=sidebyside diff --git a/iokit/Kernel/i386/IOKeyStoreHelper.cpp b/iokit/Kernel/i386/IOKeyStoreHelper.cpp index ca0e3b895..8c71598d7 100644 --- a/iokit/Kernel/i386/IOKeyStoreHelper.cpp +++ b/iokit/Kernel/i386/IOKeyStoreHelper.cpp @@ -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; +}