diff options
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) |