diff options
| -rw-r--r-- | firmware/ihex2fw.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/firmware/ihex2fw.c b/firmware/ihex2fw.c index 5a03ba8c8364..ba0cf0b601bb 100644 --- a/firmware/ihex2fw.c +++ b/firmware/ihex2fw.c | |||
| @@ -55,6 +55,7 @@ static int output_records(int outfd); | |||
| 55 | 55 | ||
| 56 | static int sort_records = 0; | 56 | static int sort_records = 0; |
| 57 | static int wide_records = 0; | 57 | static int wide_records = 0; |
| 58 | static int include_jump = 0; | ||
| 58 | 59 | ||
| 59 | static int usage(void) | 60 | static int usage(void) |
| 60 | { | 61 | { |
| @@ -63,6 +64,7 @@ static int usage(void) | |||
| 63 | fprintf(stderr, "usage: ihex2fw [<options>] <src.HEX> <dst.fw>\n"); | 64 | fprintf(stderr, "usage: ihex2fw [<options>] <src.HEX> <dst.fw>\n"); |
| 64 | fprintf(stderr, " -w: wide records (16-bit length)\n"); | 65 | fprintf(stderr, " -w: wide records (16-bit length)\n"); |
| 65 | fprintf(stderr, " -s: sort records by address\n"); | 66 | fprintf(stderr, " -s: sort records by address\n"); |
| 67 | fprintf(stderr, " -j: include records for CS:IP/EIP address\n"); | ||
| 66 | return 1; | 68 | return 1; |
| 67 | } | 69 | } |
| 68 | 70 | ||
| @@ -73,7 +75,7 @@ int main(int argc, char **argv) | |||
| 73 | uint8_t *data; | 75 | uint8_t *data; |
| 74 | int opt; | 76 | int opt; |
| 75 | 77 | ||
| 76 | while ((opt = getopt(argc, argv, "ws")) != -1) { | 78 | while ((opt = getopt(argc, argv, "wsj")) != -1) { |
| 77 | switch (opt) { | 79 | switch (opt) { |
| 78 | case 'w': | 80 | case 'w': |
| 79 | wide_records = 1; | 81 | wide_records = 1; |
| @@ -81,7 +83,9 @@ int main(int argc, char **argv) | |||
| 81 | case 's': | 83 | case 's': |
| 82 | sort_records = 1; | 84 | sort_records = 1; |
| 83 | break; | 85 | break; |
| 84 | default: | 86 | case 'j': |
| 87 | include_jump = 1; | ||
| 88 | break; | ||
| 85 | return usage(); | 89 | return usage(); |
| 86 | } | 90 | } |
| 87 | } | 91 | } |
| @@ -128,6 +132,7 @@ static int process_ihex(uint8_t *data, ssize_t size) | |||
| 128 | { | 132 | { |
| 129 | struct ihex_binrec *record; | 133 | struct ihex_binrec *record; |
| 130 | uint32_t offset = 0; | 134 | uint32_t offset = 0; |
| 135 | uint32_t data32; | ||
| 131 | uint8_t type, crc = 0, crcbyte = 0; | 136 | uint8_t type, crc = 0, crcbyte = 0; |
| 132 | int i, j; | 137 | int i, j; |
| 133 | int line = 1; | 138 | int line = 1; |
| @@ -223,8 +228,14 @@ next_record: | |||
| 223 | return -EINVAL; | 228 | return -EINVAL; |
| 224 | } | 229 | } |
| 225 | 230 | ||
| 231 | memcpy(&data32, &record->data[0], sizeof(data32)); | ||
| 232 | data32 = htonl(data32); | ||
| 233 | memcpy(&record->data[0], &data32, sizeof(data32)); | ||
| 234 | |||
| 226 | /* These records contain the CS/IP or EIP where execution | 235 | /* These records contain the CS/IP or EIP where execution |
| 227 | * starts. Don't really know what to do with them. */ | 236 | * starts. If requested output this as a record. */ |
| 237 | if (include_jump) | ||
| 238 | file_record(record); | ||
| 228 | goto next_record; | 239 | goto next_record; |
| 229 | 240 | ||
| 230 | default: | 241 | default: |
