- added manpage for OpenOCD (thanks to Uwe Hermann)

- fixed bug in ARM926EJ-S cache handling that caused cache linefills to be disabled after first debug entry
- added support for auto image type detection (thanks to Vincent Palatin)
- further work on ETM trace decoding (tested with a ETB interface using an ETM in normal 16-bit port mode, still experimental)



git-svn-id: svn://svn.berlios.de/openocd/trunk@169 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
drath
2007-06-14 09:47:00 +00:00
parent 7087b66f19
commit 53d1f9b2ca
16 changed files with 931 additions and 99 deletions

View File

@@ -43,6 +43,94 @@
((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)
{
int retval;
fileio_t fileio;
u32 read_bytes;
u8 buffer[9];
/* 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);
/* check header against known signatures */
if (strncmp((char*)buffer,ELFMAG,SELFMAG)==0)
{
DEBUG("ELF image detected.");
image->type = IMAGE_ELF;
}
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'))
{
DEBUG("IHEX image detected.");
image->type = IMAGE_IHEX;
}
else
{
image->type = IMAGE_BINARY;
}
return ERROR_OK;
}
int identify_image_type(image_t *image, char *type_string, char *url)
{
if (type_string)
{
if (!strcmp(type_string, "bin"))
{
image->type = IMAGE_BINARY;
}
else if (!strcmp(type_string, "ihex"))
{
image->type = IMAGE_IHEX;
}
else if (!strcmp(type_string, "elf"))
{
image->type = IMAGE_ELF;
}
else if (!strcmp(type_string, "mem"))
{
image->type = IMAGE_MEMORY;
}
else
{
return ERROR_IMAGE_TYPE_UNKNOWN;
}
}
else
{
return autodetect_image_type(image, url);
}
return ERROR_OK;
}
int image_ihex_buffer_complete(image_t *image)
{
image_ihex_t *ihex = image->type_private;
@@ -334,10 +422,15 @@ int image_elf_read_section(image_t *image, int section, u32 offset, u32 size, u8
return ERROR_OK;
}
int image_open(image_t *image, void *source, enum fileio_access access)
int image_open(image_t *image, void *source, char *type_string)
{
int retval = ERROR_OK;
if ((retval = identify_image_type(image, type_string, source)) != ERROR_OK)
{
return retval;
}
if (image->type == IMAGE_BINARY)
{
image_binary_t *image_binary;
@@ -345,7 +438,7 @@ int image_open(image_t *image, void *source, enum fileio_access access)
image_binary = image->type_private = malloc(sizeof(image_binary_t));
if ((retval = fileio_open(&image_binary->fileio, url, access, FILEIO_BINARY)) != ERROR_OK)
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);
@@ -368,14 +461,6 @@ int image_open(image_t *image, void *source, enum fileio_access access)
image_ihex_t *image_ihex;
char *url = source;
if (access != FILEIO_READ)
{
snprintf(image->error_str, IMAGE_MAX_ERROR_STRING,
"can't open IHEX file for writing");
ERROR(image->error_str);
return ERROR_FILEIO_ACCESS_NOT_SUPPORTED;
}
image_ihex = image->type_private = malloc(sizeof(image_ihex_t));
if ((retval = fileio_open(&image_ihex->fileio, url, FILEIO_READ, FILEIO_TEXT)) != ERROR_OK)
@@ -493,9 +578,6 @@ int image_close(image_t *image)
fileio_close(&image_ihex->fileio);
if (image_ihex->section_pointer)
free(image_ihex->section_pointer);
if (image_ihex->buffer)
free(image_ihex->buffer);
}
@@ -524,32 +606,3 @@ int image_close(image_t *image)
return ERROR_OK;
}
int identify_image_type(image_type_t *type, char *type_string)
{
if (type_string)
{
if (!strcmp(type_string, "bin"))
{
*type = IMAGE_BINARY;
}
else if (!strcmp(type_string, "ihex"))
{
*type = IMAGE_IHEX;
}
else if (!strcmp(type_string, "elf"))
{
*type = IMAGE_ELF;
}
else
{
return ERROR_IMAGE_TYPE_UNKNOWN;
}
}
else
{
*type = IMAGE_BINARY;
}
return ERROR_OK;
}