|
@@ -55,6 +55,7 @@ static int output_records(int outfd);
|
|
|
|
|
|
static int sort_records = 0;
|
|
|
static int wide_records = 0;
|
|
|
+static int include_jump = 0;
|
|
|
|
|
|
static int usage(void)
|
|
|
{
|
|
@@ -63,6 +64,7 @@ static int usage(void)
|
|
|
fprintf(stderr, "usage: ihex2fw [<options>] <src.HEX> <dst.fw>\n");
|
|
|
fprintf(stderr, " -w: wide records (16-bit length)\n");
|
|
|
fprintf(stderr, " -s: sort records by address\n");
|
|
|
+ fprintf(stderr, " -j: include records for CS:IP/EIP address\n");
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
@@ -73,7 +75,7 @@ int main(int argc, char **argv)
|
|
|
uint8_t *data;
|
|
|
int opt;
|
|
|
|
|
|
- while ((opt = getopt(argc, argv, "ws")) != -1) {
|
|
|
+ while ((opt = getopt(argc, argv, "wsj")) != -1) {
|
|
|
switch (opt) {
|
|
|
case 'w':
|
|
|
wide_records = 1;
|
|
@@ -81,7 +83,9 @@ int main(int argc, char **argv)
|
|
|
case 's':
|
|
|
sort_records = 1;
|
|
|
break;
|
|
|
- default:
|
|
|
+ case 'j':
|
|
|
+ include_jump = 1;
|
|
|
+ break;
|
|
|
return usage();
|
|
|
}
|
|
|
}
|
|
@@ -128,6 +132,7 @@ static int process_ihex(uint8_t *data, ssize_t size)
|
|
|
{
|
|
|
struct ihex_binrec *record;
|
|
|
uint32_t offset = 0;
|
|
|
+ uint32_t data32;
|
|
|
uint8_t type, crc = 0, crcbyte = 0;
|
|
|
int i, j;
|
|
|
int line = 1;
|
|
@@ -223,8 +228,14 @@ next_record:
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
+ memcpy(&data32, &record->data[0], sizeof(data32));
|
|
|
+ data32 = htonl(data32);
|
|
|
+ memcpy(&record->data[0], &data32, sizeof(data32));
|
|
|
+
|
|
|
/* These records contain the CS/IP or EIP where execution
|
|
|
- * starts. Don't really know what to do with them. */
|
|
|
+ * starts. If requested output this as a record. */
|
|
|
+ if (include_jump)
|
|
|
+ file_record(record);
|
|
|
goto next_record;
|
|
|
|
|
|
default:
|