X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Fimage.c;h=3fac057182f266fd803df2974d88fa62e2d12828;hp=bdd89b1c9e508fa9ff6a96380a1d4c0845fb28f9;hb=e66f9aaba94e232f87c725f2fce98cfb3f92679f;hpb=55f2fe830a541a297d6bf3906c6a28df81acbf05 diff --git a/src/target/image.c b/src/target/image.c index bdd89b1c9e..3fac057182 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; @@ -402,16 +396,16 @@ 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].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); @@ -429,22 +423,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,15 +456,6 @@ int image_elf_read_section(image_t *image, int section, u32 offset, u32 size, u8 if (!size) return ERROR_OK; } - /* if there is remaining zeroed area in current segment */ - if (offset < field32(elf, segment->p_memsz)) - { - /* fill zeroed part (BSS) of the segment */ - read_size = MIN(size, field32(elf, segment->p_memsz) - offset); - DEBUG("zero fill: size = 0x%x", read_size); - memset(buffer, 0, read_size); - *size_read += read_size; - } return ERROR_OK; } @@ -561,6 +546,7 @@ int image_mot_buffer_complete(image_t *image) bytes_read += 8; count -=4; break; + } if (full_address != address) @@ -659,8 +645,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; } @@ -678,16 +662,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; } @@ -700,16 +680,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; } @@ -738,16 +713,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; } @@ -763,15 +734,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; @@ -800,14 +771,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; } } @@ -815,7 +784,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; } @@ -866,7 +834,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; } @@ -874,7 +841,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; } @@ -944,7 +910,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); @@ -1035,4 +1001,3 @@ int image_calculate_checksum(u8* buffer, u32 nbytes, u32* checksum) return ERROR_OK; } -