X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/0a7de7458d150b5d4dffc935ba399be265ef0a1a..c3c9b80d004dbbfdf763edeb97968c6997e3b45b:/iokit/IOKit/IONVRAM.h?ds=sidebyside diff --git a/iokit/IOKit/IONVRAM.h b/iokit/IOKit/IONVRAM.h index a4da3d4fa..d556b9fab 100644 --- a/iokit/IOKit/IONVRAM.h +++ b/iokit/IOKit/IONVRAM.h @@ -31,33 +31,39 @@ #define _IOKIT_IONVRAM_H #ifdef __cplusplus +#include #include #include #include #include #endif /* __cplusplus */ +#include #define kIODTNVRAMOFPartitionName "common" #define kIODTNVRAMXPRAMPartitionName "APL,MacOS75" #define kIODTNVRAMPanicInfoPartitonName "APL,OSXPanic" #define kIODTNVRAMFreePartitionName "wwwwwwwwwwww" +#define kIODTNVRAMSystemPartitionName "secure" #define MIN_SYNC_NOW_INTERVAL 15*60 /* Minimum 15 Minutes interval mandated */ -enum { - kIODTNVRAMImageSize = 0x2000, - kIODTNVRAMXPRAMSize = 0x0100, - kIODTNVRAMNameRegistrySize = 0x0400 -}; - -enum { +enum IONVRAMVariableType { kOFVariableTypeBoolean = 1, kOFVariableTypeNumber, kOFVariableTypeString, kOFVariableTypeData }; +enum IONVRAMOperation { + kIONVRAMOperationRead, + kIONVRAMOperationWrite, + kIONVRAMOperationDelete, + kIONVRAMOperationObliterate, + kIONVRAMOperationReset +}; + enum { + // Deprecated but still used in AppleEFIRuntime for now kOFVariablePermRootOnly = 0, kOFVariablePermUserRead, kOFVariablePermUserWrite, @@ -66,49 +72,54 @@ enum { #ifdef __cplusplus +class IODTNVRAMVariables; + class IODTNVRAM : public IOService { OSDeclareDefaultStructors(IODTNVRAM); private: - IONVRAMController *_nvramController; - const OSSymbol *_registryPropertiesKey; - UInt8 *_nvramImage; - __unused bool _nvramImageDirty; - UInt32 _ofPartitionOffset; - UInt32 _ofPartitionSize; - UInt8 *_ofImage; - __unused bool _ofImageDirty; - OSDictionary *_ofDict; - OSDictionary *_nvramPartitionOffsets; - OSDictionary *_nvramPartitionLengths; - UInt32 _resv0 __unused; - UInt32 _resv1 __unused; - IOLock *_ofLock; - UInt32 _resv2 __unused; - UInt32 _resv3 __unused; - UInt8 *_resv4 __unused; - UInt32 _piPartitionOffset; - UInt32 _piPartitionSize; - UInt8 *_piImage; - bool _systemPaniced; - SInt32 _lastDeviceSync; - bool _freshInterval; - bool _isProxied; + friend class IODTNVRAMVariables; + + IONVRAMController *_nvramController; + OSPtr _registryPropertiesKey; + UInt8 *_nvramImage; + IORWLock *_variableLock; + IOLock *_controllerLock; + UInt32 _commonPartitionOffset; + UInt32 _commonPartitionSize; + UInt8 *_commonImage; + IODTNVRAMVariables *_commonService; + OSPtr _commonDict; + UInt32 _systemPartitionOffset; + UInt32 _systemPartitionSize; + UInt8 *_systemImage; + IODTNVRAMVariables *_systemService; + OSPtr _systemDict; + OSPtr _nvramPartitionOffsets; + OSPtr _nvramPartitionLengths; + bool _systemPanicked; + SInt32 _lastDeviceSync; + bool _freshInterval; + bool _isProxied; + UInt32 _nvramSize; virtual UInt8 calculatePartitionChecksum(UInt8 *partitionHeader); - virtual IOReturn initOFVariables(void); -public: - virtual IOReturn syncOFVariables(void); -private: + virtual IOReturn initVariables(void); + virtual UInt32 getOFVariableType(const char *propName) const; virtual UInt32 getOFVariableType(const OSSymbol *propSymbol) const; + virtual UInt32 getOFVariablePerm(const char *propName) const; virtual UInt32 getOFVariablePerm(const OSSymbol *propSymbol) const; virtual bool getOWVariableInfo(UInt32 variableNumber, const OSSymbol **propSymbol, UInt32 *propType, UInt32 *propOffset); virtual bool convertPropToObject(UInt8 *propName, UInt32 propNameLength, UInt8 *propData, UInt32 propDataLength, - const OSSymbol **propSymbol, - OSObject **propObject); + LIBKERN_RETURNS_RETAINED const OSSymbol **propSymbol, + LIBKERN_RETURNS_RETAINED OSObject **propObject); + bool convertPropToObject(UInt8 *propName, UInt32 propNameLength, + UInt8 *propData, UInt32 propDataLength, + OSSharedPtr& propSymbol, + OSSharedPtr& propObject); virtual bool convertObjectToProp(UInt8 *buffer, UInt32 *length, const OSSymbol *propSymbol, OSObject *propObject); virtual UInt16 generateOWChecksum(UInt8 *buffer); @@ -124,8 +135,8 @@ private: const OSSymbol *name, OSData * value); - virtual OSData *unescapeBytesToData(const UInt8 *bytes, UInt32 length); - virtual OSData *escapeDataToData(OSData * value); + virtual OSPtr unescapeBytesToData(const UInt8 *bytes, UInt32 length); + virtual OSPtr escapeDataToData(OSData * value); virtual IOReturn readNVRAMPropertyType1(IORegistryEntry *entry, const OSSymbol **name, @@ -134,9 +145,19 @@ private: const OSSymbol *name, OSData *value); + UInt32 getNVRAMSize(void); void initNVRAMImage(void); void initProxyData(void); - IOReturn syncVariables(void); + IOReturn serializeVariables(void); + IOReturn setPropertyInternal(const OSSymbol *aKey, OSObject *anObject); + IOReturn removePropertyInternal(const OSSymbol *aKey); + IOReturn chooseDictionary(IONVRAMOperation operation, const uuid_t *varGuid, + const char *variableName, OSDictionary **dict) const; + IOReturn flushDict(const uuid_t *guid, IONVRAMOperation op); + bool handleSpecialVariables(const char *name, const uuid_t *guid, const OSObject *obj, IOReturn *error); + OSSharedPtr copyPropertyWithGUIDAndName(const uuid_t *guid, const char *name) const; + IOReturn removePropertyWithGUIDAndName(const uuid_t *guid, const char *name); + IOReturn setPropertyWithGUIDAndName(const uuid_t *guid, const char *name, OSObject *anObject); public: virtual bool init(IORegistryEntry *old, const IORegistryPlane *plane) APPLE_KEXT_OVERRIDE; @@ -144,10 +165,11 @@ public: virtual void registerNVRAMController(IONVRAMController *nvram); virtual void sync(void); + virtual IOReturn syncOFVariables(void); virtual bool serializeProperties(OSSerialize *s) const APPLE_KEXT_OVERRIDE; - virtual OSObject *copyProperty(const OSSymbol *aKey) const APPLE_KEXT_OVERRIDE; - virtual OSObject *copyProperty(const char *aKey) const APPLE_KEXT_OVERRIDE; + virtual OSPtr copyProperty(const OSSymbol *aKey) const APPLE_KEXT_OVERRIDE; + virtual OSPtr copyProperty(const char *aKey) const APPLE_KEXT_OVERRIDE; virtual OSObject *getProperty(const OSSymbol *aKey) const APPLE_KEXT_OVERRIDE; virtual OSObject *getProperty(const char *aKey) const APPLE_KEXT_OVERRIDE; virtual bool setProperty(const OSSymbol *aKey, OSObject *anObject) APPLE_KEXT_OVERRIDE;