summaryrefslogtreecommitdiff
path: root/utils/imxtools/sbtools/rsrc.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/imxtools/sbtools/rsrc.c')
-rw-r--r--utils/imxtools/sbtools/rsrc.c36
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
106static bool read_entries(void *buf, int filesize, void *u, 106static 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,
204void rsrc_free(struct rsrc_file_t *file) 216void 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