X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Ftarget%2Fimage.c;h=df69f3a80a6397bd70f914a81b0b3d8ef41e855c;hb=ecb227f10cab328e264cf9a828f508fa395ade8c;hp=173fca564dd9cec06d7e16095004b6558eb57df8;hpb=6c9b804d6187edda4f46f8458deec0b17ec76bb9;p=openocd.git diff --git a/src/target/image.c b/src/target/image.c index 173fca564d..df69f3a80a 100644 --- a/src/target/image.c +++ b/src/target/image.c @@ -37,13 +37,13 @@ #include "target.h" /* convert ELF header field to host endianness */ -#define field16(elf, field)\ - ((elf->endianness == ELFDATA2LSB)? \ - le_to_h_u16((u8*)&field) : be_to_h_u16((u8*)&field)) +#define field16(elf,field)\ + ((elf->endianness==ELFDATA2LSB)? \ + le_to_h_u16((u8*)&field):be_to_h_u16((u8*)&field)) -#define field32(elf, field)\ - ((elf->endianness == ELFDATA2LSB)? \ - le_to_h_u32((u8*)&field) : be_to_h_u32((u8*)&field)) +#define field32(elf,field)\ + ((elf->endianness==ELFDATA2LSB)? \ + le_to_h_u32((u8*)&field):be_to_h_u32((u8*)&field)) static int autodetect_image_type(image_t *image, char *url) { @@ -55,20 +55,14 @@ static int autodetect_image_type(image_t *image, char *url) /* read the first 4 bytes of image */ if ((retval = fileio_open(&fileio, url, FILEIO_READ, FILEIO_BINARY)) != ERROR_OK) { - snprintf(image->error_str, IMAGE_MAX_ERROR_STRING, "cannot open image: %s", fileio.error_str); - ERROR(image->error_str); return retval; } if ((retval = fileio_read(&fileio, 9, buffer, &read_bytes)) != ERROR_OK) { - snprintf(image->error_str, IMAGE_MAX_ERROR_STRING, "cannot read image header: %s", fileio.error_str); - ERROR(image->error_str); return ERROR_FILEIO_OPERATION_FAILED; } if (read_bytes != 9) { - snprintf(image->error_str, IMAGE_MAX_ERROR_STRING, "cannot read image, only partially read"); - ERROR(image->error_str); return ERROR_FILEIO_OPERATION_FAILED; } fileio_close(&fileio); @@ -79,15 +73,15 @@ static int autodetect_image_type(image_t *image, char *url) DEBUG("ELF image detected."); image->type = IMAGE_ELF; } - else if ((buffer[0] == ':') /* record start byte */ + else if ((buffer[0]==':') /* record start byte */ &&(isxdigit(buffer[1])) &&(isxdigit(buffer[2])) &&(isxdigit(buffer[3])) &&(isxdigit(buffer[4])) &&(isxdigit(buffer[5])) &&(isxdigit(buffer[6])) - &&(buffer[7] == '0') /* record type : 00 -> 05 */ - &&(buffer[8] >= '0') && (buffer[8] < '6')) + &&(buffer[7]=='0') /* record type : 00 -> 05 */ + &&(buffer[8]>='0')&&(buffer[8]<'6')) { DEBUG("IHEX image detected."); image->type = IMAGE_IHEX; @@ -360,12 +354,12 @@ int image_elf_read_headers(image_t *image) return ERROR_FILEIO_OPERATION_FAILED; } - if (strncmp((char*)elf->header->e_ident,ELFMAG,SELFMAG) != 0) + if (strncmp((char*)elf->header->e_ident,ELFMAG,SELFMAG)!=0) { ERROR("invalid ELF file, bad magic number"); return ERROR_IMAGE_FORMAT_ERROR; } - if (elf->header->e_ident[EI_CLASS] != ELFCLASS32) + if (elf->header->e_ident[EI_CLASS]!=ELFCLASS32) { ERROR("invalid ELF file, only 32bits files are supported"); return ERROR_IMAGE_FORMAT_ERROR; @@ -373,28 +367,34 @@ int image_elf_read_headers(image_t *image) elf->endianness = elf->header->e_ident[EI_DATA]; - if ((elf->endianness != ELFDATA2LSB) - &&(elf->endianness != ELFDATA2MSB)) + if ((elf->endianness!=ELFDATA2LSB) + &&(elf->endianness!=ELFDATA2MSB)) { ERROR("invalid ELF file, unknown endianess setting"); return ERROR_IMAGE_FORMAT_ERROR; } - elf->segment_count = field16(elf, elf->header->e_phnum); - if (elf->segment_count == 0) + elf->segment_count = field16(elf,elf->header->e_phnum); + if (elf->segment_count==0) { ERROR("invalid ELF file, no program headers"); return ERROR_IMAGE_FORMAT_ERROR; } - elf->segments = malloc(elf->segment_count * sizeof(Elf32_Phdr)); + if ((retval = fileio_seek(&elf->fileio, field32(elf,elf->header->e_phoff))) != ERROR_OK) + { + ERROR("cannot seek to ELF program header table, read failed"); + return retval; + } - if ((retval = fileio_read(&elf->fileio, elf->segment_count * sizeof(Elf32_Phdr), (u8*)elf->segments, &read_bytes)) != ERROR_OK) + elf->segments = malloc(elf->segment_count*sizeof(Elf32_Phdr)); + + if ((retval = fileio_read(&elf->fileio, elf->segment_count*sizeof(Elf32_Phdr), (u8*)elf->segments, &read_bytes)) != ERROR_OK) { ERROR("cannot read ELF segment headers, read failed"); return retval; } - if (read_bytes != elf->segment_count * sizeof(Elf32_Phdr)) + if (read_bytes != elf->segment_count*sizeof(Elf32_Phdr)) { ERROR("cannot read ELF segment headers, only partially read"); return ERROR_FILEIO_OPERATION_FAILED; @@ -402,25 +402,25 @@ int image_elf_read_headers(image_t *image) /* count useful segments (loadable), ignore BSS section */ image->num_sections = 0; - for (i = 0; i < elf->segment_count; i++) + for (i=0;isegment_count;i++) if ((field32(elf, elf->segments[i].p_type) == PT_LOAD) && (field32(elf, elf->segments[i].p_filesz) != 0)) image->num_sections++; /* alloc and fill sections array with loadable segments */ image->sections = malloc(image->num_sections * sizeof(image_section_t)); - for (i = 0, j = 0; i < elf->segment_count; i++) + for (i=0,j=0;isegment_count;i++) { if ((field32(elf, elf->segments[i].p_type) == PT_LOAD) && (field32(elf, elf->segments[i].p_filesz) != 0)) { - image->sections[j].size = field32(elf, elf->segments[i].p_memsz); - image->sections[j].base_address = field32(elf, elf->segments[i].p_paddr); + image->sections[j].size = field32(elf,elf->segments[i].p_filesz); + image->sections[j].base_address = field32(elf,elf->segments[i].p_paddr); image->sections[j].private = &elf->segments[i]; - image->sections[j].flags = field32(elf, elf->segments[i].p_flags); + image->sections[j].flags = field32(elf,elf->segments[i].p_flags); j++; } } image->start_address_set = 1; - image->start_address = field32(elf, elf->header->e_entry); + image->start_address = field32(elf,elf->header->e_entry); return ERROR_OK; } @@ -429,22 +429,22 @@ int image_elf_read_section(image_t *image, int section, u32 offset, u32 size, u8 { image_elf_t *elf = image->type_private; Elf32_Phdr *segment = (Elf32_Phdr *)image->sections[section].private; - u32 read_size, really_read; + u32 read_size,really_read; int retval; *size_read = 0; - DEBUG("load segment %d at 0x%x (sz = 0x%x)", section, offset, size); + DEBUG("load segment %d at 0x%x (sz=0x%x)",section,offset,size); /* read initialized data in current segment if any */ - if (offset < field32(elf, segment->p_filesz)) + if (offsetp_filesz)) { /* maximal size present in file for the current segment */ - read_size = MIN(size, field32(elf, segment->p_filesz) - offset); - DEBUG("read elf: size = 0x%x at 0x%x", read_size, - field32(elf, segment->p_offset) + offset); + read_size = MIN(size, field32(elf,segment->p_filesz)-offset); + DEBUG("read elf: size = 0x%x at 0x%x",read_size, + field32(elf,segment->p_offset)+offset); /* read initialized area of the segment */ - if ((retval = fileio_seek(&elf->fileio, field32(elf, segment->p_offset) + offset)) != ERROR_OK) + if ((retval = fileio_seek(&elf->fileio, field32(elf,segment->p_offset)+offset)) != ERROR_OK) { ERROR("cannot find ELF segment content, seek failed"); return retval; @@ -462,7 +462,7 @@ int image_elf_read_section(image_t *image, int section, u32 offset, u32 size, u8 if (!size) return ERROR_OK; } - + return ERROR_OK; } @@ -552,6 +552,7 @@ int image_mot_buffer_complete(image_t *image) bytes_read += 8; count -=4; break; + } if (full_address != address) @@ -650,8 +651,6 @@ int image_open(image_t *image, char *url, char *type_string) if ((retval = fileio_open(&image_binary->fileio, url, FILEIO_READ, FILEIO_BINARY)) != ERROR_OK) { - strncpy(image->error_str, image_binary->fileio.error_str, IMAGE_MAX_ERROR_STRING); - ERROR(image->error_str); return retval; } @@ -669,16 +668,12 @@ int image_open(image_t *image, char *url, char *type_string) if ((retval = fileio_open(&image_ihex->fileio, url, FILEIO_READ, FILEIO_TEXT)) != ERROR_OK) { - strncpy(image->error_str, image_ihex->fileio.error_str, IMAGE_MAX_ERROR_STRING); - ERROR(image->error_str); return retval; } if ((retval = image_ihex_buffer_complete(image)) != ERROR_OK) { - snprintf(image->error_str, IMAGE_MAX_ERROR_STRING, - "failed buffering IHEX image, check daemon output for additional information"); - ERROR(image->error_str); + ERROR("failed buffering IHEX image, check daemon output for additional information"); fileio_close(&image_ihex->fileio); return retval; } @@ -691,16 +686,11 @@ int image_open(image_t *image, char *url, char *type_string) if ((retval = fileio_open(&image_elf->fileio, url, FILEIO_READ, FILEIO_BINARY)) != ERROR_OK) { - strncpy(image->error_str, image_elf->fileio.error_str, IMAGE_MAX_ERROR_STRING); - ERROR(image->error_str); return retval; } if ((retval = image_elf_read_headers(image)) != ERROR_OK) { - snprintf(image->error_str, IMAGE_MAX_ERROR_STRING, - "failed to read ELF headers, check daemon output for additional information"); - ERROR(image->error_str); fileio_close(&image_elf->fileio); return retval; } @@ -729,16 +719,12 @@ int image_open(image_t *image, char *url, char *type_string) if ((retval = fileio_open(&image_mot->fileio, url, FILEIO_READ, FILEIO_TEXT)) != ERROR_OK) { - strncpy(image->error_str, image_mot->fileio.error_str, IMAGE_MAX_ERROR_STRING); - ERROR(image->error_str); return retval; } if ((retval = image_mot_buffer_complete(image)) != ERROR_OK) { - snprintf(image->error_str, IMAGE_MAX_ERROR_STRING, - "failed buffering S19 image, check daemon output for additional information"); - ERROR(image->error_str); + ERROR("failed buffering S19 image, check daemon output for additional information"); fileio_close(&image_mot->fileio); return retval; } @@ -754,15 +740,15 @@ int image_open(image_t *image, char *url, char *type_string) { /* relocate */ int section; - for (section = 0; section < image->num_sections; section++) + for (section=0; section < image->num_sections; section++) { - image->sections[section].base_address += image->base_address; + image->sections[section].base_address+=image->base_address; } /* we're done relocating. The two statements below are mainly * for documenation purposes: stop anyone from empirically * thinking they should use these values henceforth. */ - image->base_address = 0; - image->base_address_set = 0; + image->base_address=0; + image->base_address_set=0; } return retval; @@ -791,14 +777,12 @@ int image_read_section(image_t *image, int section, u32 offset, u32 size, u8 *bu /* seek to offset */ if ((retval = fileio_seek(&image_binary->fileio, offset)) != ERROR_OK) { - strncpy(image->error_str, image_binary->fileio.error_str, IMAGE_MAX_ERROR_STRING); return retval; } /* return requested bytes */ if ((retval = fileio_read(&image_binary->fileio, size, buffer, size_read)) != ERROR_OK) { - strncpy(image->error_str, image_binary->fileio.error_str, IMAGE_MAX_ERROR_STRING); return retval; } } @@ -806,7 +790,6 @@ int image_read_section(image_t *image, int section, u32 offset, u32 size, u8 *bu { memcpy(buffer, (u8*)image->sections[section].private + offset, size); *size_read = size; - image->error_str[0] = '\0'; return ERROR_OK; } @@ -857,7 +840,6 @@ int image_read_section(image_t *image, int section, u32 offset, u32 size, u8 *bu { memcpy(buffer, (u8*)image->sections[section].private + offset, size); *size_read = size; - image->error_str[0] = '\0'; return ERROR_OK; } @@ -865,7 +847,6 @@ int image_read_section(image_t *image, int section, u32 offset, u32 size, u8 *bu { memcpy(buffer, (u8*)image->sections[section].private + offset, size); *size_read = size; - image->error_str[0] = '\0'; return ERROR_OK; } @@ -935,7 +916,7 @@ int image_close(image_t *image) image_elf_t *image_elf = image->type_private; fileio_close(&image_elf->fileio); - + if (image_elf->header) { free(image_elf->header);