iBoot/include/lib/Image2Format.h

112 lines
4.3 KiB
C

/*
* Image2 on-media format.
*
* The I2 layout is described by the I2 superblock, which is located at
* kI2SuperblockOffset from the top of the media. The superblock is a write-once
* item; it should only be updated when the bootblock code is rewritten, implying
* a complete re-initialisation of the media.
*
* Following the superblock there is a reserved area for boot code, after which
* image headers describe individual images.
*
* 0 --------------------
*
* kI2SuperblockOffset Image2Superblock
*
* isImageGranule --------------------
* bootcode
* + isBootBlockSize --------------------
* ...
* + isImageOffset Image2Header
* ...
*
*/
#if !defined (__LIB_IMAGE2FORMAT_H)
#define __LIB_IMAGE2FORMAT_H 1
#include <sys/types.h>
__BEGIN_DECLS
/*
* XXX 7561698 isImageOffset is documented inconsistently
* and not used as described above.
*/
typedef struct {
u_int32_t isMagic;
#define kImage2SuperMagic 0x494d4732 /* "IMG2" */
u_int32_t isImageGranule; /* fundamental block size (bytes) */
u_int32_t isImageOffset; /* image header offset within granule (image granules) */
u_int32_t isBootBlockSize; /* size of the bootblock (image granules) */
u_int32_t isImageAvail; /* total granules available for images. */
u_int32_t isNvramGranule; /* size of NVRAM blocks (bytes) */
u_int32_t isNvramOffset; /* offset to first NVRAM block (nvram granules) */
u_int32_t isFlags; /* flags field reserved for future use */
u_int32_t isRsvd1; /* reserved 1 for future use */
u_int32_t isRsvd2; /* reserved 2 for future use */
u_int32_t isRsvd3; /* reserved 3 for future use */
u_int32_t isRsvd4; /* reserved 4 for future use */
u_int32_t isCheck; /* CRC-32 of header fields preceding this one */
} Image2Superblock;
/*
* Image types
*/
typedef u_int32_t Image2ImageType;
#define kImage2ImageTypeWildcard 0x2a2a2a2a /* **** */
#define kImage2ImageTypeIdent 0x49646e74 /* Idnt - ASCII string identifying the image
* collection */
#define kImage2ImageTypeDTree 0x64747265 /* dtre */
#define kImage2ImageTypeDiag 0x64696167 /* diag */
#define kImage2ImageTypeLogo 0x6c6f676f /* logo */
#define kImage2ImageTypeiBoot 0x69626f74 /* "ibot" => iBoot */
#define kImage2ImageTypeLLB 0x6c6c627a /* "llbz" => LLB */
#define kImage2ImageTypeEOT 0x04040404 /* EOT */
/*
* On-media image header.
*/
typedef struct {
u_int32_t ihMagic;
#define kImage2ImageMagic 0x496d6732 /* "Img2" */
Image2ImageType ihType;
u_int16_t ihRevision;
u_int16_t ihSecurityEpoch; /* Image is from this security epoch */
u_int32_t ihLoadAddress; /* preferred load address */
u_int32_t ihDataSize; /* payload data size (bytes) */
u_int32_t ihEncryptedDataSize; /* payload data size after decryption (bytes) */
u_int32_t ihAllocationSize; /* allocation size including header (granules) */
u_int32_t ihOptions;
#define kImage2OptionSignatureTypeExternal (1<<0) /* signature present elsewhere */
#define kImage2OptionSignatureTypeInternalSHA1 (1<<1) /* SHA-1 hash in ihSignatureData */
#define kImage2OptionSignatureTypeInternalCRC (1<<2) /* CRC-32 in first word of ihSignatureData*/
#define kImage2OptionsTrustedImage (1<<8) /* Image was written down with trust */
#define kImage2OptionsEncryptedImage (1<<9) /* Image body is encrypted */
#define kImage2OptionsInstalledWithSB (1<<24) /* Image was written with secure boot support */
#define kImage2OptionsExtensionPresent (1<<30) /* Extension header follows this main */
#define kImage2OptionsImmutable (1<<31)
u_int32_t ihSignatureData[16];
u_int32_t ihNextSize; /* Size in bytes of the next extension */
#define kImage2HeaderExtensionMaxSize 128
u_int32_t ihCheck; /* CRC-32 of the preceeding fields */
} Image2Header;
#define kImage2HeaderReservation 1024
typedef u_int32_t Image2HeaderExtensionType;
#define kImage2HeaderExtensionVersionString 0x76657273 /* "vers" => version string */
typedef struct {
u_int32_t iheCheck; /* CRC-32 of the preceeding fields */
u_int32_t iheNextSize; /* Size in bytes of te next extension */
Image2HeaderExtensionType iheType;
u_int32_t ihOptions;
/* Extension prese*/
u_int32_t iheData; /* extension data. This field is not
written, instead the actual data is. */
} Image2HeaderExtension;
__END_DECLS
#endif /* __LIB_IMAGE2FORMAT_H*/