diff options
author | Amaury Pouly <amaury.pouly@gmail.com> | 2012-11-27 22:38:48 +0100 |
---|---|---|
committer | Amaury Pouly <amaury.pouly@gmail.com> | 2012-11-27 22:38:48 +0100 |
commit | 8189732e52080353dbf38933a8c71c6dc6811f2a (patch) | |
tree | 299a1b0ac3b40db750f45bc5d790cc9c8f80b63a /utils/imxtools/sbtools/sbtoelf.c | |
parent | 7dc3e939d2cd0a39035587f211587167eb6671de (diff) | |
download | rockbox-8189732e52080353dbf38933a8c71c6dc6811f2a.tar.gz rockbox-8189732e52080353dbf38933a8c71c6dc6811f2a.zip |
sbtoelf: implement sb extraction for sb1
Load, fill and call/jump instructions are extracted as elf files
like for sb2. Because of the size limitations of the sb1
instructions, the resulting elf files can easily have hundreds of
sections. The (currently) implemented elf simplification method
will hopefully reduce this to a few sections only
Change-Id: I8fd6ed935ac3128f244bbd71c782e2a0a1c6d44a
Diffstat (limited to 'utils/imxtools/sbtools/sbtoelf.c')
-rw-r--r-- | utils/imxtools/sbtools/sbtoelf.c | 52 |
1 files changed, 48 insertions, 4 deletions
diff --git a/utils/imxtools/sbtools/sbtoelf.c b/utils/imxtools/sbtools/sbtoelf.c index 01a51cae90..f86200f184 100644 --- a/utils/imxtools/sbtools/sbtoelf.c +++ b/utils/imxtools/sbtools/sbtoelf.c | |||
@@ -157,12 +157,56 @@ static void extract_sb_file(struct sb_file_t *file) | |||
157 | extract_sb_section(&file->sections[i]); | 157 | extract_sb_section(&file->sections[i]); |
158 | } | 158 | } |
159 | 159 | ||
160 | static void extract_elf(struct elf_params_t *elf, int count) | ||
161 | { | ||
162 | char *filename = xmalloc(strlen(g_out_prefix) + 32); | ||
163 | sprintf(filename, "%s.%d.elf", g_out_prefix, count); | ||
164 | if(g_debug) | ||
165 | printf("Write boot content to %s\n", filename); | ||
166 | |||
167 | FILE *fd = fopen(filename, "wb"); | ||
168 | free(filename); | ||
169 | |||
170 | if(fd == NULL) | ||
171 | return ; | ||
172 | elf_simplify(elf); | ||
173 | elf_write_file(elf, elf_write, elf_printf, fd); | ||
174 | fclose(fd); | ||
175 | } | ||
176 | |||
160 | static void extract_sb1_file(struct sb1_file_t *file) | 177 | static void extract_sb1_file(struct sb1_file_t *file) |
161 | { | 178 | { |
162 | FILE *f = fopen(g_out_prefix, "wb"); | 179 | int elf_count = 0; |
163 | if(f == NULL) | 180 | struct elf_params_t elf; |
164 | bugp("Cannot open %s for writing\n", g_out_prefix); | 181 | elf_init(&elf); |
165 | fclose(f); | 182 | |
183 | for(int i = 0; i < file->nr_insts; i++) | ||
184 | { | ||
185 | struct sb1_inst_t *inst = &file->insts[i]; | ||
186 | switch(inst->cmd) | ||
187 | { | ||
188 | case SB1_INST_LOAD: | ||
189 | elf_add_load_section(&elf, inst->addr, inst->size, inst->data); | ||
190 | break; | ||
191 | case SB1_INST_FILL: | ||
192 | elf_add_fill_section(&elf, inst->addr, inst->size, inst->pattern); | ||
193 | break; | ||
194 | case SB1_INST_CALL: | ||
195 | case SB1_INST_JUMP: | ||
196 | elf_set_start_addr(&elf, inst->addr); | ||
197 | extract_elf(&elf, elf_count++); | ||
198 | elf_release(&elf); | ||
199 | elf_init(&elf); | ||
200 | break; | ||
201 | default: | ||
202 | /* ignore mode and nop */ | ||
203 | break; | ||
204 | } | ||
205 | } | ||
206 | |||
207 | if(!elf_is_empty(&elf)) | ||
208 | extract_elf(&elf, elf_count); | ||
209 | elf_release(&elf); | ||
166 | } | 210 | } |
167 | 211 | ||
168 | static void usage(void) | 212 | static void usage(void) |