iBoot/lib/image/debug.c

196 lines
5.2 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.
*/
#include <debug.h>
#include <sys/boot.h>
#include <sys/menu.h>
#include <lib/image.h>
#include <lib/env.h>
#include <lib/fs.h>
#include <platform/memmap.h>
#if defined(WITH_MENU) && WITH_MENU
static int do_image(int argc, struct cmd_arg *args)
{
bool detailed;
int ret_val;
if (argc < 2) {
printf("not enough arguments.\n");
usage:
printf("%s list [<detailed>]\n", args[0].str);
printf("%s load [<type>|memory] [<address>]\n", args[0].str);
return -1;
}
if (!strcmp("list", args[1].str)) {
if (argc > 2)
detailed = true;
else
detailed = false;
image_dump_list(detailed);
} else if (!strcmp("load", args[1].str)) {
struct image_info *image;
addr_t source_address;
size_t filesize;
void *addr;
size_t len = 0xFFFFFFFF;
u_int32_t type;
u_int32_t *types = NULL; /* default to any image type */
u_int32_t count = 0;
if (argc < 3) {
printf("not enough arguments.\n");
goto usage;
}
if (!strcmp(args[2].str, "memory")) {
/* load image from memory */
source_address = env_get_uint("loadaddr", DEFAULT_LOAD_ADDRESS);
filesize = env_get_uint("filesize", DEFAULT_KERNEL_SIZE);
if ((image = image_create_from_memory((void *)source_address, filesize, 0)) == NULL) {
printf("image creation failed\n");
return -1;
}
} else {
/* search for image */
type = htonl(*(uint32_t *)args[2].str);
image = image_find(type);
if (!image) {
printf("could not find image\n");
return -1;
}
/* use the image type since it is known */
types = &type;
count = 1;
}
if (argc < 4)
addr = (void *)DEFAULT_KERNEL_ADDRESS;
else
addr = (void *)args[3].u;
ret_val = image_load(image, types, count, NULL, &addr, &len);
if ( 0 <= ret_val )
printf("successfully loaded image\n");
else
printf("unable to load image\n");
} else {
printf("unrecognized command.\n");
goto usage;
}
return 0;
}
MENU_COMMAND_DEBUG(image, do_image, "flash image inspection", NULL);
#if WITH_IMAGE4
static int do_image4_test(int argc, struct cmd_arg *args)
{
int result = -1, i;
char file_path[FS_MAXPATHLEN];
bool file_option = false;
u_int32_t image_type;
u_int32_t *image_types = NULL;
u_int32_t image_types_count = 0;
u_int32_t options = 0;
addr_t from_address, to_address = DEFAULT_KERNEL_ADDRESS;
size_t from_size, to_size = DEFAULT_LOAD_SIZE;
bool load_image_type = false;
from_address = env_get_uint("loadaddr", DEFAULT_LOAD_ADDRESS);
from_size = env_get_uint("filesize", DEFAULT_LOAD_SIZE);
for (i = 1; i < argc; i++) {
if (strcmp(args[i].str, "-options") == 0) {
options = args[++i].u;
}
else if (strcmp(args[i].str, "-type") == 0) {
image_type = htonl(*(uint32_t *)args[++i].str);
image_types = &image_type;
image_types_count = 1;
}
else if (strcmp(args[i].str, "-file") == 0) {
snprintf(file_path, FS_MAXPATHLEN, "/boot%s", args[++i].str);
file_option = true;
}
else if (strcmp(args[i].str, "-addr") == 0) {
from_address = args[++i].u;
}
else if (strcmp(args[i].str, "-size") == 0) {
from_size = args[++i].u;
}
else if (strcmp(args[i].str, "-load-type") == 0) {
load_image_type = true;
}
else {
goto print_usage;
}
}
if (file_option) {
#if WITH_FS
result = mount_bootfs();
if (result == 0) {
result = image_load_file(file_path, &to_address, &to_size, image_types, image_types_count, NULL, options);
fs_unmount("/boot");
}
else {
dprintf(DEBUG_INFO, "root filesystem mount failed\n");
}
#else
dprintf(DEBUG_INFO, "file-system support not available\n");
#endif
}
else if (load_image_type) {
if (image_types_count != 0)
result = image_load_type(&to_address, &to_size, image_type, options);
else
dprintf(DEBUG_INFO, "image type not specified\n");
}
else {
result = image_load_memory(from_address, from_size, &to_address, &to_size, image_types, image_types_count, NULL, options);
}
if (result == 0)
dprintf(DEBUG_INFO, "image_load test succeed\n");
else
dprintf(DEBUG_INFO, "image_load test failed, result:%d\n", result);
security_restore_environment();
return result;
print_usage:
dprintf(DEBUG_INFO, "image4_test [-file <file_path>] [-options <options>] [-type <image_type>] [-load-type] [-addr <address>] [-size <size>] [-help]\n");
dprintf(DEBUG_INFO, "\t- address defaults to $loadadr and size defaults to $filesize\n");
dprintf(DEBUG_INFO, "\t- load-type option loads image of type specified with '-type' option from nand_firmare partition\n");
dprintf(DEBUG_INFO, "\t- list option list images stored in nand_firmare partition\n");
dprintf(DEBUG_INFO, "\t- various options -> require_trust:(1<<1), local_storage:(1<<3), new_trust_chain:(1<<4) \n");
dprintf(DEBUG_INFO, "\t- various types -> dtre, rdtr, krnl, rkrn, ibss, ibec, illb, ibot, rdsk, logo, rlgo, recm, diag, 0 (any) \n");
return -1;
}
MENU_COMMAND_DEBUG(image4_test, do_image4_test, "load and validate image4", NULL);
#endif
#endif