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 + -
显示快捷键?