220 lines
7.6 KiB
C
220 lines
7.6 KiB
C
/*
|
|
* Copyright (C) 2007-2013 Apple Inc. All rights reserved.
|
|
* Copyright (C) 2006 Apple Computer, 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 __LIB_IMAGE_H
|
|
#define __LIB_IMAGE_H
|
|
|
|
#include <sys/types.h>
|
|
#include <lib/blockdev.h>
|
|
#include <list.h>
|
|
|
|
__BEGIN_DECLS
|
|
|
|
struct image_info {
|
|
u_int32_t imageLength;
|
|
u_int32_t imageAllocation;
|
|
u_int32_t imageType;
|
|
u_int32_t imagePrivateMagic;
|
|
#define IMAGE_MEMORY_INFO_MAGIC 'Memz'
|
|
#define IMAGE2_IMAGE_INFO_MAGIC 'img2'
|
|
#define IMAGE3_IMAGE_INFO_MAGIC 'img3'
|
|
#define IMAGE4_IMAGE_INFO_MAGIC 'img4'
|
|
u_int32_t imageOptions;
|
|
void *imagePrivate;
|
|
};
|
|
|
|
// images we might be interested in
|
|
#define IMAGE_TYPE_ANY 0 // any image type
|
|
#define IMAGE_TYPE_DIAG 'diag' // diagnostics
|
|
#define IMAGE_TYPE_LLB 'illb' // iboot first-stage loader
|
|
#define IMAGE_TYPE_IBOOT 'ibot' // iboot second-stage loader
|
|
#define IMAGE_TYPE_IBSS 'ibss' // iboot single stage
|
|
#define IMAGE_TYPE_IBEC 'ibec' // iboot epoch change
|
|
#define IMAGE_TYPE_DALI 'dali' // dali
|
|
#define IMAGE_TYPE_DEVTREE 'dtre' // darwin device tree
|
|
#define IMAGE_TYPE_DEVTREE_RESTORE 'rdtr' // darwin device tree for restore
|
|
#define IMAGE_TYPE_RAMDISK 'rdsk' // darwin ram disk for restore
|
|
#define IMAGE_TYPE_KERNELCACHE 'krnl' // darwin kernel cache
|
|
#define IMAGE_TYPE_KERNELCACHE_RESTORE 'rkrn' // darwin kernel cache for restore
|
|
#define IMAGE_TYPE_LOGO 'logo' // boot logo image
|
|
#define IMAGE_TYPE_RECMODE 'recm' // recovery mode image
|
|
#define IMAGE_TYPE_NEEDSERVICE 'nsrv' // need service image
|
|
#define IMAGE_TYPE_GLYPHCHRG 'glyC' // glyph charge image
|
|
#define IMAGE_TYPE_GLYPHPLUGIN 'glyP' // glyph plug in image
|
|
#define IMAGE_TYPE_BATTERYCHARGING0 'chg0' // battery charging image - bright
|
|
#define IMAGE_TYPE_BATTERYCHARGING1 'chg1' // battery charging image - dim
|
|
#define IMAGE_TYPE_BATTERYLOW0 'bat0' // battery low image - empty
|
|
#define IMAGE_TYPE_BATTERYLOW1 'bat1' // battery low image - red (composed onto empty)
|
|
#define IMAGE_TYPE_BATTERYFULL 'batF' // battery full image list
|
|
#define IMAGE_TYPE_BATTERYFULL_N_TOTAL (18) // total number of images
|
|
#define IMAGE_TYPE_BATTERYFULL_N_START (2) // first image that's part of batF list (first two are bat0 and bat1)
|
|
#define IMAGE_TYPE_BATTERYFULL_N_RED (4) // last red battery image
|
|
#define IMAGE_TYPE_BATTERYFULL_N_FULL (IMAGE_TYPE_BATTERYFULL_N_TOTAL-1) // battery full image
|
|
#define IMAGE_TYPE_ENV 'ienv' // environment vars
|
|
#define IMAGE_TYPE_TSYS 'tsys' // tsys tester
|
|
#define IMAGE_TYPE_MONITOR 'hypr' // monitor/hypervisor
|
|
#define IMAGE_TYPE_OS_RESTORE 'rosi' // OS image for restore
|
|
#define IMAGE_TYPE_SEP_OS 'sepi' // SEP OS image
|
|
#define IMAGE_TYPE_SEP_OS_RESTORE 'rsep' // SEP OS image for restore
|
|
#define IMAGE_TYPE_CFE_LOADER 'cfel' // SiVal's CFE loader
|
|
#define IMAGE_TYPE_RBM 'rbmt' // SiVal's RBM test
|
|
#define IMAGE_TYPE_PHLEET 'phlt' // SiVal's PHLEET test
|
|
#define IMAGE_TYPE_PE_RTOS 'pert' // PE's RTOS environment
|
|
#define IMAGE_TYPE_HAMMER 'hmmr' // PE's Hammer test
|
|
#define IMAGE_TYPE_FDRT 'fdrt' // FDR Trust object for AP
|
|
#define IMAGE_TYPE_FDRS 'fdrs' // FDR Trust object for SEP
|
|
|
|
// image options
|
|
#define IMAGE_OPTION_GREATER_EPOCH (1 << 0) // Allow platform epoch or greater
|
|
#define IMAGE_OPTION_REQUIRE_TRUST (1 << 1) // Regardless of security, require image
|
|
// trust
|
|
#define IMAGE_OPTION_LOCAL_STORAGE (1 << 2) // Image came from local (personalised) storage
|
|
#define IMAGE_OPTION_NEW_TRUST_CHAIN (1 << 3) // New chain of trust. Image load library can use this information
|
|
// enforce various policies.
|
|
|
|
#define IMAGE_OPTION_JUST_LOAD (1 << 8) // Just load the whole image, don't validate or look for a payload
|
|
#define IMAGE_OPTION_MEMORY (1 << 9) // Image comes from a memory bdev, so its hash isn't personalized
|
|
|
|
// XXX backwards compatibility
|
|
#define IMAGE_OPTION_ANY_EPOCH IMAGE_OPTION_GREATER_EPOCH // Allow any epoch for this image
|
|
|
|
|
|
// image keybag selectors
|
|
#define IMAGE_KEYBAG_SELECTOR_PROD (1)
|
|
#define IMAGE_KEYBAG_SELECTOR_DEV (2)
|
|
|
|
|
|
/**
|
|
* Load an image from a file.
|
|
*
|
|
* \param[in] path Path including mountpoint from which to read.
|
|
* \param[inout] address Address for the buffer used both for file reading and into which
|
|
* the resulting image data will be placed. Referenced pointer will
|
|
* be zeroed on failure.
|
|
* \param[inout] length On input, the size of the buffer. The file must file entirely
|
|
* within this size. Updated on return to the size of the image
|
|
* data extracted from the image.
|
|
* \param[in] types An array of types that the image must conform to one of,
|
|
* or NULL if no type checking should be performed.
|
|
* \param[in] count The count of image types in the types array,
|
|
* or zero if NULL was passed.
|
|
* \param[out] actual A pointer to receive the actual type for given image.
|
|
* Optional if count is 0 or 1.
|
|
* \param[in] options Options to be passed when creating the image.
|
|
*
|
|
* \return 0 on success.
|
|
*/
|
|
int
|
|
image_load_file(
|
|
const char *path,
|
|
addr_t *address,
|
|
size_t *length,
|
|
const uint32_t *types,
|
|
uint32_t count,
|
|
uint32_t *actual,
|
|
uint32_t options);
|
|
|
|
/**
|
|
* Load an image from memory.
|
|
*
|
|
* \param[in] fromAddress Address of the buffer containing the image.
|
|
* \param[in] fromLength Size of the buffer containing the image.
|
|
* \param[inout] address Address for the buffer into which the resulting image data will
|
|
* be placed. Referenced pointer will be zeroed on failure.
|
|
* \param[inout] length On input, the size of the destination buffer. The image must file
|
|
* entirely within this size. Updated on return to the size of the image
|
|
* data extracted from the image.
|
|
* \param[in] types An array of types that the image must conform to one of,
|
|
* or NULL if no type checking should be performed.
|
|
* \param[in] count The count of image types in the types array,
|
|
* or zero if NULL was passed.
|
|
* \param[out] actual A pointer to receive the actual type for given image.
|
|
* Optional if count is 0 or 1.
|
|
* \param[in] options Options to be passed when creating the image.
|
|
*
|
|
* \return 0 on success.
|
|
*/
|
|
int
|
|
image_load_memory(
|
|
addr_t fromAddress,
|
|
size_t fromLength,
|
|
addr_t *address,
|
|
size_t *length,
|
|
const uint32_t *types,
|
|
uint32_t count,
|
|
uint32_t *actual,
|
|
uint32_t options);
|
|
|
|
|
|
/**
|
|
* Load an image of a given type from the set of known images.
|
|
*
|
|
* \param[inout] address Address for the buffer into which the resulting image data will
|
|
* be placed. Referenced pointer will be zeroed on failure.
|
|
* \param[inout] length On input, the size of the destination buffer. The image must file
|
|
* entirely within this size. Updated on return to the size of the image
|
|
* data extracted from the image.
|
|
* \param[in] type The image type to be looked up.
|
|
* \param[in] options Options to be passed when creating the image.
|
|
*
|
|
* \return 0 on success.
|
|
*/
|
|
int
|
|
image_load_type(
|
|
addr_t *address,
|
|
size_t *length,
|
|
uint32_t type,
|
|
uint32_t options);
|
|
|
|
/*
|
|
* Lower-level primitives - avoid when possible.
|
|
*/
|
|
int
|
|
image_search_bdev(
|
|
struct blockdev *bdev,
|
|
off_t map_offset,
|
|
uint32_t imageOptions);
|
|
|
|
void
|
|
image_free_bdev(
|
|
struct blockdev *bdev);
|
|
|
|
int
|
|
image_load(
|
|
struct image_info *image,
|
|
const uint32_t *types,
|
|
uint32_t count,
|
|
uint32_t *actual,
|
|
void **load_addr,
|
|
size_t *load_len);
|
|
|
|
struct image_info *
|
|
image_find(
|
|
u_int32_t type);
|
|
|
|
void
|
|
image_dump_list(
|
|
bool detailed);
|
|
|
|
struct image_info *
|
|
image_create_from_memory(
|
|
void *address,
|
|
size_t length,
|
|
uint32_t imageOptions);
|
|
|
|
void
|
|
image_free(
|
|
struct image_info *image);
|
|
|
|
__END_DECLS
|
|
|
|
#endif
|