static void omapimage_print_header(const void *ptr) { const struct ch_toc *toc = (struct ch_toc *)ptr; const struct gp_header *gph = (struct gp_header *)(ptr+OMAP_CH_HDR_SIZE); uint32_t offset, size, gph_size, gph_load_addr; while (toc->section_offset != 0xffffffff && toc->section_size != 0xffffffff) { if (do_swap32) { offset = omapimage_swap32(toc->section_offset); size = omapimage_swap32(toc->section_size); } else { offset = toc->section_offset; size = toc->section_size; } if (offset >= OMAP_CH_HDR_SIZE || offset+size >= OMAP_CH_HDR_SIZE) exit(EXIT_FAILURE); printf("Section %s offset %x length %x\n", toc->section_name, toc->section_offset, toc->section_size); omapimage_print_section((struct ch_settings *)(ptr+offset)); toc++; } if (do_swap32) { gph_size = omapimage_swap32(gph->size); gph_load_addr = omapimage_swap32(gph->load_addr); } else { gph_size = gph->size; gph_load_addr = gph->load_addr; } if (!valid_gph_size(gph_size)) { fprintf(stderr, "Error: invalid image size %x\n", gph_size); exit(EXIT_FAILURE); } if (!valid_gph_load_addr(gph_load_addr)) { fprintf(stderr, "Error: invalid image load address %x\n", gph_load_addr); exit(EXIT_FAILURE); } printf("GP Header: Size %x LoadAddr %x\n", gph_size, gph_load_addr); }
static int omapimage_verify_header(unsigned char *ptr, int image_size, struct mkimage_params *params) { struct ch_toc *toc = (struct ch_toc *)ptr; struct gp_header *gph = (struct gp_header *)(ptr+OMAP_CH_HDR_SIZE); uint32_t offset, size, gph_size, gph_load_addr; while (toc->section_offset != 0xffffffff && toc->section_size != 0xffffffff) { if (do_swap32) { offset = omapimage_swap32(toc->section_offset); size = omapimage_swap32(toc->section_size); } else { offset = toc->section_offset; size = toc->section_size; } if (!offset || !size) return -1; if (offset >= OMAP_CH_HDR_SIZE || offset+size >= OMAP_CH_HDR_SIZE) return -1; toc++; } if (do_swap32) { gph_size = omapimage_swap32(gph->size); gph_load_addr = omapimage_swap32(gph->load_addr); } else { gph_size = gph->size; gph_load_addr = gph->load_addr; } if (!valid_gph_size(gph_size)) return -1; if (!valid_gph_load_addr(gph_load_addr)) return -1; return 0; }
static void omapimage_set_header(void *ptr, struct stat *sbuf, int ifd, struct mkimage_params *params) { struct ch_toc *toc = (struct ch_toc *)ptr; struct ch_entry *entry = (struct ch_entry *) (ptr + 2 * sizeof(*toc)); struct gp_header *gph = (struct gp_header *)(ptr + OMAP_CH_HDR_SIZE); void *ch_src; uint32_t ch_data_size; toc->section_offset = toc_offset(ptr, entry); if (strncmp(params->imagename, "ch_qspi", 7) == 0) { strcpy((char *)toc->section_name, "CHQSPI"); entry->hdr.section_key = KEY_CHQSPI; entry->hdr.valid = 1; ch_src = (void *)&ch_qspi_48mhz_quad; ch_data_size = sizeof(struct ch_qspi); } else { strcpy((char *)toc->section_name, "CHSETTINGS"); entry->hdr.section_key = KEY_CHSETTINGS; entry->hdr.valid = 0; ch_src = (void *)&ch_settings_dummy; ch_data_size = sizeof(struct ch_settings); } memcpy(&entry->ch_data[0], ch_src, ch_data_size); entry->hdr.version = 1; entry->hdr.reserved = 0; toc->section_size = sizeof(struct ch_hdr) + ch_data_size; toc++; memset(toc, 0xff, sizeof(*toc)); gph->size = sbuf->st_size - OMAP_FILE_HDR_SIZE; gph->load_addr = params->addr; if (strncmp(params->imagename, "byteswap", 8) == 0) { do_swap32 = 1; int swapped = 0; uint32_t *data = (uint32_t *)ptr; while (swapped <= (sbuf->st_size / sizeof(uint32_t))) { *data = omapimage_swap32(*data); swapped++; data++; } } }
static void omapimage_set_header(void *ptr, struct stat *sbuf, int ifd, struct mkimage_params *params) { struct ch_toc *toc = (struct ch_toc *)ptr; struct ch_settings *chs = (struct ch_settings *) (ptr + 2 * sizeof(*toc)); struct gp_header *gph = (struct gp_header *)(ptr + OMAP_CH_HDR_SIZE); toc->section_offset = toc_offset(ptr, chs); toc->section_size = sizeof(struct ch_settings); strcpy((char *)toc->section_name, "CHSETTINGS"); chs->section_key = KEY_CHSETTINGS; chs->valid = 0; chs->version = 1; chs->reserved = 0; chs->flags = 0; toc++; memset(toc, 0xff, sizeof(*toc)); gph->size = sbuf->st_size - OMAP_FILE_HDR_SIZE; gph->load_addr = params->addr; if (strncmp(params->imagename, "byteswap", 8) == 0) { do_swap32 = 1; int swapped = 0; uint32_t *data = (uint32_t *)ptr; while (swapped <= (sbuf->st_size / sizeof(uint32_t))) { *data = omapimage_swap32(*data); swapped++; data++; } } }