IOKeyStoreHelper.cpp [plain text]
#include <sys/cdefs.h>
#include <stdbool.h>
#include <IOKit/assert.h>
#include <IOKit/system.h>
#include <IOKit/IOLib.h>
#include <IOKit/IOMemoryDescriptor.h>
#include <IOKit/IOKitDebug.h>
__BEGIN_DECLS
#include <pexpert/pexpert.h>
static volatile UInt32 alreadyFetched = 0;
static IOMemoryDescriptor * newData;
IOMemoryDescriptor *
IOGetBootKeyStoreData(void);
void
IOSetKeyStoreData(IOMemoryDescriptor * data);
__END_DECLS
#if 1
#define DEBG(fmt, args...) { kprintf(fmt, ## args); }
#else
#define DEBG(fmt, args...) {}
#endif
void
IOSetKeyStoreData(IOMemoryDescriptor * data)
{
newData = data;
alreadyFetched = 0;
}
IOMemoryDescriptor *
IOGetBootKeyStoreData(void)
{
IOMemoryDescriptor *memoryDescriptor;
boot_args *args = (boot_args *)PE_state.bootArgs;
IOOptionBits options;
IOAddressRange ranges;
if (!OSCompareAndSwap(0, 1, &alreadyFetched))
return (NULL);
if (newData)
{
IOMemoryDescriptor * data = newData;
newData = NULL;
return (data);
}
DEBG("%s: data at address %u size %u\n", __func__,
args->keyStoreDataStart,
args->keyStoreDataSize);
if (args->keyStoreDataStart == 0)
return (NULL);
ranges.address = args->keyStoreDataStart;
ranges.length = args->keyStoreDataSize;
options = kIODirectionInOut | kIOMemoryTypePhysical64;
memoryDescriptor = IOMemoryDescriptor::withOptions(&ranges,
1,
0,
NULL,
options);
DEBG("%s: memory descriptor %p\n", __func__, memoryDescriptor);
return memoryDescriptor;
}