diff options
Diffstat (limited to 'firmware')
-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: |