summaryrefslogtreecommitdiff
path: root/utils/imxtools/sbtools/sbtoelf.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/imxtools/sbtools/sbtoelf.c')
-rw-r--r--utils/imxtools/sbtools/sbtoelf.c52
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
160static 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
160static void extract_sb1_file(struct sb1_file_t *file) 177static 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
168static void usage(void) 212static void usage(void)