static signed nvmimage2 (void const * memory, size_t extent, char const * filename, flag_t flags) { struct nvm_header1 * nvm_header; unsigned module = 0; uint32_t offset = 0; do { nvm_header = (struct nvm_header1 *)((char *)(memory) + offset); if (LE32TOH (nvm_header->HEADERVERSION) != 0x60000000) { if (_allclr (flags, NVM_SILENCE)) { error (0, errno, NVM_HDR_VERSION, filename, module); } return (-1); } if (checksum32 (nvm_header, sizeof (* nvm_header), 0)) { if (_allclr (flags, NVM_SILENCE)) { error (0, errno, NVM_HDR_CHECKSUM, filename, module); } return (-1); } offset += sizeof (* nvm_header); extent -= sizeof (* nvm_header); if (_anyset (flags, NVM_VERBOSE)) { printf ("------- %s (%d) -------\n", filename, module); nvmpeek1 (nvm_header); } if (LE32TOH (nvm_header->IMAGETYPE) == NVM_IMAGE_FIRMWARE) { firmware (filename, module, (char *)(memory) + offset, 0x70, flags); } if (checksum32 ((char *)(memory) + offset, LE32TOH (nvm_header->IMAGELENGTH), nvm_header->IMAGECHECKSUM)) { if (_allclr (flags, NVM_SILENCE)) { error (0, errno, NVM_IMG_CHECKSUM, filename, module); } return (-1); } offset += LE32TOH (nvm_header->IMAGELENGTH); extent -= LE32TOH (nvm_header->IMAGELENGTH); module++; } while (nvm_header->NEXTHEADER); if (extent) { if (_allclr (flags, NVM_SILENCE)) { error (0, errno, NVM_HDR_LINK, filename, module); } } return ((signed)(extent)); }
void nvmpeek (void const * memory) { if (LE32TOH (*(uint32_t *)(memory)) == 0x60000000) { nvmpeek1 (memory); return; } nvmpeek2 (memory); return; }