aboutsummaryrefslogtreecommitdiffstats
path: root/firmware/ihex2fw.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/ihex2fw.c')
-rw-r--r--firmware/ihex2fw.c26
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
56static int sort_records = 0; 56static int sort_records = 0;
57static int wide_records = 0; 57static int wide_records = 0;
58static int include_jump = 0;
58 59
59static int usage(void) 60static 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
127static int process_ihex(uint8_t *data, ssize_t size) 130static 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}