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
// 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);
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);
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;
+}