diff options
Diffstat (limited to 'firmware/ihex2fw.c')
-rw-r--r-- | firmware/ihex2fw.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/firmware/ihex2fw.c b/firmware/ihex2fw.c index 5a03ba8c8364..cf38e159131a 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 | } |
@@ -120,14 +124,14 @@ int main(int argc, char **argv) | |||
120 | if (process_ihex(data, st.st_size)) | 124 | if (process_ihex(data, st.st_size)) |
121 | return 1; | 125 | return 1; |
122 | 126 | ||
123 | output_records(outfd); | 127 | return output_records(outfd); |
124 | return 0; | ||
125 | } | 128 | } |
126 | 129 | ||
127 | static int process_ihex(uint8_t *data, ssize_t size) | 130 | static int process_ihex(uint8_t *data, ssize_t size) |
128 | { | 131 | { |
129 | struct ihex_binrec *record; | 132 | struct ihex_binrec *record; |
130 | uint32_t offset = 0; | 133 | uint32_t offset = 0; |
134 | uint32_t data32; | ||
131 | uint8_t type, crc = 0, crcbyte = 0; | 135 | uint8_t type, crc = 0, crcbyte = 0; |
132 | int i, j; | 136 | int i, j; |
133 | int line = 1; | 137 | int line = 1; |
@@ -223,8 +227,14 @@ next_record: | |||
223 | return -EINVAL; | 227 | return -EINVAL; |
224 | } | 228 | } |
225 | 229 | ||
230 | memcpy(&data32, &record->data[0], sizeof(data32)); | ||
231 | data32 = htonl(data32); | ||
232 | memcpy(&record->data[0], &data32, sizeof(data32)); | ||
233 | |||
226 | /* These records contain the CS/IP or EIP where execution | 234 | /* These records contain the CS/IP or EIP where execution |
227 | * starts. Don't really know what to do with them. */ | 235 | * starts. If requested output this as a record. */ |
236 | if (include_jump) | ||
237 | file_record(record); | ||
228 | goto next_record; | 238 | goto next_record; |
229 | 239 | ||
230 | default: | 240 | default: |
@@ -258,11 +268,13 @@ static int output_records(int outfd) | |||
258 | 268 | ||
259 | p->addr = htonl(p->addr); | 269 | p->addr = htonl(p->addr); |
260 | p->len = htons(p->len); | 270 | p->len = htons(p->len); |
261 | write(outfd, &p->addr, writelen); | 271 | if (write(outfd, &p->addr, writelen) != writelen) |
272 | return 1; | ||
262 | p = p->next; | 273 | p = p->next; |
263 | } | 274 | } |
264 | /* EOF record is zero length, since we don't bother to represent | 275 | /* EOF record is zero length, since we don't bother to represent |
265 | the type field in the binary version */ | 276 | the type field in the binary version */ |
266 | write(outfd, zeroes, 6); | 277 | if (write(outfd, zeroes, 6) != 6) |
278 | return 1; | ||
267 | return 0; | 279 | return 0; |
268 | } | 280 | } |