iBoot/lib/effaceable/iokit/AppleEffaceableStorage.h

133 lines
5.6 KiB
C++

/*
* Copyright (c) 2010-11 Apple Inc. All rights reserved.
*
* This document is the property of Apple Inc.
* It is considered confidential and proprietary.
*
* This document may not be reproduced or transmitted in any form,
* in whole or in part, without the express written permission of
* Apple Inc.
*/
#ifndef _APPLE_EFFACEABLE_STORAGE_H
#define _APPLE_EFFACEABLE_STORAGE_H
// =============================================================================
#include <IOKit/IOLib.h>
#include <IOKit/IOService.h>
#include <IOKit/IOCommandGate.h>
#include "AppleEffaceableStorageKeys.h"
#include "effaceable_contract.h"
// =============================================================================
class AppleEffaceableStorage : public IOService
{
OSDeclareAbstractStructors(AppleEffaceableStorage);
public:
/* client API */
IOReturn getLocker(UInt32 type_id, void *data, IOByteCount *data_size, bool untrusted = false);
IOReturn setLocker(UInt32 type_id, const void *data, IOByteCount data_size, bool untrusted = false);
IOReturn spaceForLocker(UInt32 type_id, IOByteCount *data_space);
IOReturn effaceLocker(UInt32 type_id, bool untrusted = false);
IOReturn generateNonce(void * hash);
/* additional public functions intended for manufacturing and/or diagnostics only */
IOReturn getBytes(void * client_buf, IOByteCount offset, IOByteCount count);
IOReturn wipeStorage(void);
IOByteCount getCapacity(void);
bool isFormatted(void);
IOReturn formatStorage(void);
protected:
/* subclass SPI */
effaceable_storage_t * storage(void);
effaceable_device_t * device(void);
effaceable_system_t * system(void);
EffaceableReturn efReturn(IOReturn ret);
IOReturn ioReturn(EffaceableReturn ret);
int logf(void * ignored, const char * fmt, ...);
virtual void setupDeviceContract(void) = 0;
public:
/* IOKit hooks */
virtual bool start(IOService * provider);
virtual void registerService(IOOptionBits options = 0);
virtual IOWorkLoop * getWorkLoop() const;
virtual IOReturn callPlatformFunction(const OSSymbol *functionSymbol, bool waitForFunction,
void *param1, void *param2, void *param3, void *param4);
private:
/* gated versions of public methods */
IOReturn wipeStorageGated(void * tmp_buf);
IOReturn formatStorageGated(void);
IOReturn getBytesGated(void * client_buf, IOByteCount offset, IOByteCount count);
IOReturn getLockerGated(UInt32 type_id, void *data, IOByteCount *data_size, bool untrusted);
IOReturn setLockerGated(UInt32 type_id, const void *data, IOByteCount data_size, bool untrusted);
IOReturn spaceForLockerGated(UInt32 type_id, IOByteCount *data_spage);
IOReturn effaceLockerGated(UInt32 type_id, bool untrusted);
IOReturn generateNonceGated(void * hash);
/* methods to help get portable core setup and configured */
void setupSystemContract(void);
void handleBootArgs(void);
/* implementation of portable core system services contract */
void * allocMemSys(uint32_t size);
void freeMemSys(void * buf, uint32_t size);
void * setMemSys(void * buf, uint8_t val, uint32_t size);
void * moveMemSys(void * dst, const void * src, uint32_t size);
int cmpMemSys(const void * lhs, const void * rhs, uint32_t size);
void readRandomSys(void * buf, uint32_t size);
void calcSHA1Sys(const void * buf, uint32_t size, void * hash);
uint32_t crc32Sys(uint32_t crc, const void * buf, uint32_t size);
bool setPropertySys(const char * key, uint32_t value);
void panicSys(const char * msg);
int vlogfSys(const char * fmt, va_list ap);
private:
/* friend C function hooks implementing trampoline back to C++ for portable core system contract */
friend void * allocMemHook(effaceable_system_t * system, uint32_t size);
friend void freeMemHook(effaceable_system_t * system, void * buf, uint32_t size);
friend void * setMemHook(effaceable_system_t * system, void * buf, uint8_t val, uint32_t size);
friend void * moveMemHook(effaceable_system_t * system, void * dst, const void * src, uint32_t size);
friend int cmpMemHook(effaceable_system_t * system, const void * lhs, const void * rhs, uint32_t size);
friend void readRandomHook(effaceable_system_t * system, void * buf, uint32_t size);
friend void calcSHA1Hook(effaceable_system_t * system, const void * buf, uint32_t size, void * hash);
friend uint32_t crc32Hook(effaceable_system_t * system, uint32_t crc, const void * buf, uint32_t size, bool ignored);
friend bool setPropertyHook(effaceable_system_t * system, const char * key, uint32_t value);
friend void panicHook(effaceable_system_t * system, const char * msg);
friend int vlogfHook(effaceable_system_t * system, const char * fmt, va_list ap);
private:
/* implementation data */
IOCommandGate * _command_gate;
IOWorkLoop * _work_loop;
const OSSymbol * _function_get;
const OSSymbol * _function_set;
const OSSymbol * _function_space;
const OSSymbol * _function_efface;
const OSSymbol * _function_gen_nonce;
IOCommandGate::Action _get_action;
IOCommandGate::Action _set_action;
IOCommandGate::Action _space_action;
IOCommandGate::Action _efface_action;
IOCommandGate::Action _gen_nonce_action;
IOCommandGate::Action _format_action;
IOCommandGate::Action _wipe_action;
IOCommandGate::Action _get_bytes_action;
effaceable_storage_t _storage;
effaceable_system_t _system;
effaceable_device_t _device;
};
// =============================================================================
#endif /* _APPLE_EFFACEABLE_STORAGE_H */