aboutsummaryrefslogtreecommitdiffstats
path: root/firmware/ihex2fw.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/ihex2fw.c')
-rw-r--r--firmware/ihex2fw.c17
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
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 }
@@ -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: