image.c

来自「uboot详细解读可用启动引导LINUX2.6内核」· C语言 代码 · 共 2,365 行 · 第 1/5 页

C
2,365
字号
			printf ("unavailable\n");		else			printf ("0x%08lx\n", entry);	}	/* Process all hash subnodes of the component image node */	for (ndepth = 0, noffset = fdt_next_node (fit, image_noffset, &ndepth);	     (noffset >= 0) && (ndepth > 0);	     noffset = fdt_next_node (fit, noffset, &ndepth)) {		if (ndepth == 1) {			/* Direct child node of the component image node */			fit_image_print_hash (fit, noffset, p);		}	}}/** * fit_image_print_hash - prints out the hash node details * @fit: pointer to the FIT format image header * @noffset: offset of the hash node * @p: pointer to prefix string * * fit_image_print_hash() lists properies for the processed hash node * * returns: *     no returned results */void fit_image_print_hash (const void *fit, int noffset, const char *p){	char *algo;	uint8_t *value;	int value_len;	int i, ret;	/*	 * Check subnode name, must be equal to "hash".	 * Multiple hash nodes require unique unit node	 * names, e.g. hash@1, hash@2, etc.	 */	if (strncmp (fit_get_name(fit, noffset, NULL),			FIT_HASH_NODENAME,			strlen(FIT_HASH_NODENAME)) != 0)		return;	debug ("%s  Hash node:    '%s'\n", p,			fit_get_name (fit, noffset, NULL));	printf ("%s  Hash algo:    ", p);	if (fit_image_hash_get_algo (fit, noffset, &algo)) {		printf ("invalid/unsupported\n");		return;	}	printf ("%s\n", algo);	ret = fit_image_hash_get_value (fit, noffset, &value,					&value_len);	printf ("%s  Hash value:   ", p);	if (ret) {		printf ("unavailable\n");	} else {		for (i = 0; i < value_len; i++)			printf ("%02x", value[i]);		printf ("\n");	}	debug  ("%s  Hash len:     %d\n", p, value_len);}/** * fit_get_desc - get node description property * @fit: pointer to the FIT format image header * @noffset: node offset * @desc: double pointer to the char, will hold pointer to the descrption * * fit_get_desc() reads description property from a given node, if * description is found pointer to it is returened in third call argument. * * returns: *     0, on success *     -1, on failure */int fit_get_desc (const void *fit, int noffset, char **desc){	int len;	*desc = (char *)fdt_getprop (fit, noffset, FIT_DESC_PROP, &len);	if (*desc == NULL) {		fit_get_debug (fit, noffset, FIT_DESC_PROP, len);		return -1;	}	return 0;}/** * fit_get_timestamp - get node timestamp property * @fit: pointer to the FIT format image header * @noffset: node offset * @timestamp: pointer to the time_t, will hold read timestamp * * fit_get_timestamp() reads timestamp poperty from given node, if timestamp * is found and has a correct size its value is retured in third call * argument. * * returns: *     0, on success *     -1, on property read failure *     -2, on wrong timestamp size */int fit_get_timestamp (const void *fit, int noffset, time_t *timestamp){	int len;	const void *data;	data = fdt_getprop (fit, noffset, FIT_TIMESTAMP_PROP, &len);	if (data == NULL) {		fit_get_debug (fit, noffset, FIT_TIMESTAMP_PROP, len);		return -1;	}	if (len != sizeof (uint32_t)) {		debug ("FIT timestamp with incorrect size of (%u)\n", len);		return -2;	}	*timestamp = uimage_to_cpu (*((uint32_t *)data));	return 0;}/** * fit_image_get_node - get node offset for component image of a given unit name * @fit: pointer to the FIT format image header * @image_uname: component image node unit name * * fit_image_get_node() finds a component image (withing the '/images' * node) of a provided unit name. If image is found its node offset is * returned to the caller. * * returns: *     image node offset when found (>=0) *     negative number on failure (FDT_ERR_* code) */int fit_image_get_node (const void *fit, const char *image_uname){	int noffset, images_noffset;	images_noffset = fdt_path_offset (fit, FIT_IMAGES_PATH);	if (images_noffset < 0) {		debug ("Can't find images parent node '%s' (%s)\n",			FIT_IMAGES_PATH, fdt_strerror (images_noffset));		return images_noffset;	}	noffset = fdt_subnode_offset (fit, images_noffset, image_uname);	if (noffset < 0) {		debug ("Can't get node offset for image unit name: '%s' (%s)\n",			image_uname, fdt_strerror (noffset));	}	return noffset;}/** * fit_image_get_os - get os id for a given component image node * @fit: pointer to the FIT format image header * @noffset: component image node offset * @os: pointer to the uint8_t, will hold os numeric id * * fit_image_get_os() finds os property in a given component image node. * If the property is found, its (string) value is translated to the numeric * id which is returned to the caller. * * returns: *     0, on success *     -1, on failure */int fit_image_get_os (const void *fit, int noffset, uint8_t *os){	int len;	const void *data;	/* Get OS name from property data */	data = fdt_getprop (fit, noffset, FIT_OS_PROP, &len);	if (data == NULL) {		fit_get_debug (fit, noffset, FIT_OS_PROP, len);		*os = -1;		return -1;	}	/* Translate OS name to id */	*os = genimg_get_os_id (data);	return 0;}/** * fit_image_get_arch - get arch id for a given component image node * @fit: pointer to the FIT format image header * @noffset: component image node offset * @arch: pointer to the uint8_t, will hold arch numeric id * * fit_image_get_arch() finds arch property in a given component image node. * If the property is found, its (string) value is translated to the numeric * id which is returned to the caller. * * returns: *     0, on success *     -1, on failure */int fit_image_get_arch (const void *fit, int noffset, uint8_t *arch){	int len;	const void *data;	/* Get architecture name from property data */	data = fdt_getprop (fit, noffset, FIT_ARCH_PROP, &len);	if (data == NULL) {		fit_get_debug (fit, noffset, FIT_ARCH_PROP, len);		*arch = -1;		return -1;	}	/* Translate architecture name to id */	*arch = genimg_get_arch_id (data);	return 0;}/** * fit_image_get_type - get type id for a given component image node * @fit: pointer to the FIT format image header * @noffset: component image node offset * @type: pointer to the uint8_t, will hold type numeric id * * fit_image_get_type() finds type property in a given component image node. * If the property is found, its (string) value is translated to the numeric * id which is returned to the caller. * * returns: *     0, on success *     -1, on failure */int fit_image_get_type (const void *fit, int noffset, uint8_t *type){	int len;	const void *data;	/* Get image type name from property data */	data = fdt_getprop (fit, noffset, FIT_TYPE_PROP, &len);	if (data == NULL) {		fit_get_debug (fit, noffset, FIT_TYPE_PROP, len);		*type = -1;		return -1;	}	/* Translate image type name to id */	*type = genimg_get_type_id (data);	return 0;}/** * fit_image_get_comp - get comp id for a given component image node * @fit: pointer to the FIT format image header * @noffset: component image node offset * @comp: pointer to the uint8_t, will hold comp numeric id * * fit_image_get_comp() finds comp property in a given component image node. * If the property is found, its (string) value is translated to the numeric * id which is returned to the caller. * * returns: *     0, on success *     -1, on failure */int fit_image_get_comp (const void *fit, int noffset, uint8_t *comp){	int len;	const void *data;	/* Get compression name from property data */	data = fdt_getprop (fit, noffset, FIT_COMP_PROP, &len);	if (data == NULL) {		fit_get_debug (fit, noffset, FIT_COMP_PROP, len);		*comp = -1;		return -1;	}	/* Translate compression name to id */	*comp = genimg_get_comp_id (data);	return 0;}/** * fit_image_get_load - get load address property for a given component image node * @fit: pointer to the FIT format image header * @noffset: component image node offset * @load: pointer to the uint32_t, will hold load address * * fit_image_get_load() finds load address property in a given component image node. * If the property is found, its value is returned to the caller. * * returns: *     0, on success *     -1, on failure */int fit_image_get_load (const void *fit, int noffset, ulong *load){	int len;	const uint32_t *data;	data = fdt_getprop (fit, noffset, FIT_LOAD_PROP, &len);	if (data == NULL) {		fit_get_debug (fit, noffset, FIT_LOAD_PROP, len);		return -1;	}	*load = uimage_to_cpu (*data);	return 0;}/** * fit_image_get_entry - get entry point address property for a given component image node * @fit: pointer to the FIT format image header * @noffset: component image node offset * @entry: pointer to the uint32_t, will hold entry point address * * fit_image_get_entry() finds entry point address property in a given component image node. * If the property is found, its value is returned to the caller. * * returns: *     0, on success *     -1, on failure */int fit_image_get_entry (const void *fit, int noffset, ulong *entry){	int len;	const uint32_t *data;	data = fdt_getprop (fit, noffset, FIT_ENTRY_PROP, &len);	if (data == NULL) {		fit_get_debug (fit, noffset, FIT_ENTRY_PROP, len);		return -1;	}	*entry = uimage_to_cpu (*data);	return 0;}/** * fit_image_get_data - get data property and its size for a given component image node * @fit: pointer to the FIT format image header * @noffset: component image node offset * @data: double pointer to void, will hold data property's data address * @size: pointer to size_t, will hold data property's data size * * fit_image_get_data() finds data property in a given component image node. * If the property is found its data start address and size are returned to * the caller. * * returns: *     0, on success *     -1, on failure */int fit_image_get_data (const void *fit, int noffset,		const void **data, size_t *size){	int len;	*data = fdt_getprop (fit, noffset, FIT_DATA_PROP, &len);	if (*data == NULL) {		fit_get_debug (fit, noffset, FIT_DATA_PROP, len);		*size = 0;		return -1;	}	*size = len;	return 0;}/** * fit_image_hash_get_algo - get hash algorithm name * @fit: pointer to the FIT format image header * @noffset: hash node offset * @algo: double pointer to char, will hold pointer to the algorithm name * * fit_image_hash_get_algo() finds hash algorithm property in a given hash node. * If the property is found its data start address is returned to the caller. * * returns: *     0, on success *     -1, on failure */int fit_image_hash_get_algo (const void *fit, int noffset, char **algo){	int len;	*algo = (char *)fdt_getprop (fit, noffset, FIT_ALGO_PROP, &len);	if (*algo == NULL) {		fit_get_debug (fit, noffset, FIT_ALGO_PROP, len);		return -1;	}	return 0;}/** * fit_image_hash_get_value - get hash value and length * @fit: pointer to the FIT format image header * @noffset: hash node offset * @value: double pointer to uint8_t, will hold address of a hash value data * @value_len: pointer to an int, will hold hash data length * * fit_image_hash_get_value() finds hash value property in a given hash node. * If the property is found its data start address and size are returned to * the caller. * * returns: *     0, on success *     -1, on failure */int fit_image_hash_get_value (const void *fit, int noffset, uint8_t **value,				int *value_len){	int len;	*value = (uint8_t *)fdt_getprop (fit, noffset, FIT_VALUE_PROP, &len);	if (*value == NULL) {		fit_get_debug (fit, noffset, FIT_VALUE_PROP, len);		*value_len = 0;		return -1;	}	*value_len = len;	return 0;}/** * fit_set_timestamp - set node timestamp property * @fit: pointer to the FIT format image header * @noffset: node offset * @timestamp: timestamp value to be set * * fit_set_timestamp() attempts to set timestamp property in the requested * node and returns operation status to the caller. * * returns: *     0, on success *     -1, on property read failure */int fit_set_timestamp (void *fit, int noffset, time_t timestamp){	uint32_t t;	int ret;	t = cpu_to_uimage (timestamp);	ret = fdt_setprop (fit, noffset, FIT_TIMESTAMP_PROP, &t,				sizeof (uint32_t));	if (ret) {		printf ("Can't set '%s' property for '%s' node (%s)\n",			FIT_TIMESTAMP_PROP, fit_get_name (fit, noffset, NULL),			fdt_strerror (ret));		return -1;	}	return 0;}/** * calculate_hash - calculate and return hash for provided input data * @data: pointer to the input data * @data_len: data length * @algo: requested hash algorithm * @value: pointer to the char, will hold hash value data (caller must * allocate enough free space) * value_len: length of the calculated hash *

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?