diff options
Diffstat (limited to 'utils/imxtools/sbtools/rsrc.c')
-rw-r--r-- | utils/imxtools/sbtools/rsrc.c | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/utils/imxtools/sbtools/rsrc.c b/utils/imxtools/sbtools/rsrc.c index da3c418d2c..1d20c5fce8 100644 --- a/utils/imxtools/sbtools/rsrc.c +++ b/utils/imxtools/sbtools/rsrc.c | |||
@@ -103,7 +103,7 @@ static const char *rsrc_table_entry_type_str(int type) | |||
103 | } | 103 | } |
104 | } | 104 | } |
105 | 105 | ||
106 | static bool read_entries(void *buf, int filesize, void *u, | 106 | static bool read_entries(struct rsrc_file_t *f, void *u, |
107 | rsrc_color_printf cprintf, enum rsrc_error_t *err, | 107 | rsrc_color_printf cprintf, enum rsrc_error_t *err, |
108 | int offset, uint32_t base_index, int level, char *prefix) | 108 | int offset, uint32_t base_index, int level, char *prefix) |
109 | { | 109 | { |
@@ -113,24 +113,37 @@ static bool read_entries(void *buf, int filesize, void *u, | |||
113 | cprintf(u, true, GREY, __VA_ARGS__); \ | 113 | cprintf(u, true, GREY, __VA_ARGS__); \ |
114 | return e; } while(0) | 114 | return e; } while(0) |
115 | 115 | ||
116 | if(offset >= filesize) | 116 | if(offset >= f->size) |
117 | fatal(RSRC_FORMAT_ERROR, "Out of bounds at off=%x base=%x level=%d\n ouch\n"); | 117 | fatal(RSRC_FORMAT_ERROR, "Out of bounds at off=%x base=%x level=%d\n ouch\n"); |
118 | if(level < 0) | 118 | if(level < 0) |
119 | fatal(RSRC_FORMAT_ERROR, "Out of levels at off=%x base=%x level=%d\n aie\n"); | 119 | fatal(RSRC_FORMAT_ERROR, "Out of levels at off=%x base=%x level=%d\n aie\n"); |
120 | for(int i = 0; i < 256; i++) | 120 | for(int i = 0; i < 256; i++) |
121 | { | 121 | { |
122 | uint32_t te = *(uint32_t *)(buf + offset + 4 * i); | 122 | uint32_t te = *(uint32_t *)(f->data + offset + 4 * i); |
123 | if(RSRC_TABLE_ENTRY_TYPE(te) == RSRC_TYPE_NONE) | 123 | if(RSRC_TABLE_ENTRY_TYPE(te) == RSRC_TYPE_NONE) |
124 | continue; | 124 | continue; |
125 | uint32_t sz = 0; | 125 | uint32_t sz = 0; |
126 | uint32_t off_off = 0; | ||
126 | if(RSRC_TABLE_ENTRY_TYPE(te) == RSRC_TYPE_VALUE) | 127 | if(RSRC_TABLE_ENTRY_TYPE(te) == RSRC_TYPE_VALUE) |
127 | sz = 2; | 128 | sz = 2; |
128 | else if(RSRC_TABLE_ENTRY_TYPE(te) == RSRC_TYPE_NESTED) | 129 | else if(RSRC_TABLE_ENTRY_TYPE(te) == RSRC_TYPE_NESTED) |
129 | sz = 4 * 256; | 130 | sz = 4 * 256; |
130 | else | 131 | else |
131 | sz = *(uint32_t *)(buf + RSRC_TABLE_ENTRY_OFFSET(te)); | 132 | { |
133 | sz = *(uint32_t *)(f->data + RSRC_TABLE_ENTRY_OFFSET(te)); | ||
134 | off_off = 4; | ||
135 | } | ||
132 | 136 | ||
133 | uint32_t index = base_index | i << (level * 8); | 137 | uint32_t index = base_index | i << (level * 8); |
138 | |||
139 | struct rsrc_entry_t ent; | ||
140 | memset(&ent, 0, sizeof(ent)); | ||
141 | ent.id = index; | ||
142 | ent.offset = RSRC_TABLE_ENTRY_OFFSET(te) + off_off; | ||
143 | ent.size = sz; | ||
144 | |||
145 | augment_array_ex((void **)&f->entries, sizeof(ent), &f->nr_entries, &f->capacity, &ent, 1); | ||
146 | |||
134 | printf(OFF, "%s+-%s%#08x %s[%s]%s[size=%#x]\n", prefix, YELLOW, index, BLUE, | 147 | printf(OFF, "%s+-%s%#08x %s[%s]%s[size=%#x]\n", prefix, YELLOW, index, BLUE, |
135 | rsrc_table_entry_type_str(RSRC_TABLE_ENTRY_TYPE(te)), | 148 | rsrc_table_entry_type_str(RSRC_TABLE_ENTRY_TYPE(te)), |
136 | GREEN, sz); | 149 | GREEN, sz); |
@@ -140,7 +153,7 @@ static bool read_entries(void *buf, int filesize, void *u, | |||
140 | char *p = prefix + strlen(prefix); | 153 | char *p = prefix + strlen(prefix); |
141 | sprintf(p, "%s| ", RED); | 154 | sprintf(p, "%s| ", RED); |
142 | 155 | ||
143 | bool ok = read_entries(buf, filesize, u, cprintf, err, | 156 | bool ok = read_entries(f, u, cprintf, err, |
144 | RSRC_TABLE_ENTRY_OFFSET(te), index, | 157 | RSRC_TABLE_ENTRY_OFFSET(te), index, |
145 | level - 1, prefix); | 158 | level - 1, prefix); |
146 | if(!ok) | 159 | if(!ok) |
@@ -183,17 +196,16 @@ struct rsrc_file_t *rsrc_read_memory(void *_buf, size_t filesize, void *u, | |||
183 | fatal(RSRC_FORMAT_ERROR, "Missing RSRC signature\n"); | 196 | fatal(RSRC_FORMAT_ERROR, "Missing RSRC signature\n"); |
184 | } | 197 | } |
185 | 198 | ||
199 | rsrc_file->data = malloc(filesize); | ||
200 | memcpy(rsrc_file->data, _buf, filesize); | ||
201 | rsrc_file->size = filesize; | ||
202 | |||
186 | printf(BLUE, "Entries\n"); | 203 | printf(BLUE, "Entries\n"); |
187 | char prefix[1024]; | 204 | char prefix[1024]; |
188 | sprintf(prefix, "%s", RED); | 205 | sprintf(prefix, "%s", RED); |
189 | bool ok = read_entries(buf, filesize, u, cprintf, err, | 206 | bool ok = read_entries(rsrc_file, u, cprintf, err, RSRC_SECTOR_SIZE, 0, 3, prefix); |
190 | RSRC_SECTOR_SIZE, 0, 3, prefix); | ||
191 | if(!ok) | 207 | if(!ok) |
192 | fatal(*err, "Error while parsing rsrc table\n"); | 208 | fatal(*err, "Error while parsing rsrc table\n"); |
193 | |||
194 | rsrc_file->data = malloc(filesize); | ||
195 | memcpy(rsrc_file->data, _buf, filesize); | ||
196 | rsrc_file->size = filesize; | ||
197 | 209 | ||
198 | return rsrc_file; | 210 | return rsrc_file; |
199 | #undef printf | 211 | #undef printf |
@@ -204,6 +216,8 @@ struct rsrc_file_t *rsrc_read_memory(void *_buf, size_t filesize, void *u, | |||
204 | void rsrc_free(struct rsrc_file_t *file) | 216 | void rsrc_free(struct rsrc_file_t *file) |
205 | { | 217 | { |
206 | if(!file) return; | 218 | if(!file) return; |
219 | free(file->data); | ||
220 | free(file->entries); | ||
207 | free(file); | 221 | free(file); |
208 | } | 222 | } |
209 | 223 | ||