diff options
Diffstat (limited to 'utils/imxtools/sbtools/sb.c')
-rw-r--r-- | utils/imxtools/sbtools/sb.c | 42 |
1 files changed, 32 insertions, 10 deletions
diff --git a/utils/imxtools/sbtools/sb.c b/utils/imxtools/sbtools/sb.c index d7d3734a91..bea0438cca 100644 --- a/utils/imxtools/sbtools/sb.c +++ b/utils/imxtools/sbtools/sb.c | |||
@@ -186,7 +186,7 @@ static void compute_sb_offsets(struct sb_file_t *sb, void *u, generic_printf_t c | |||
186 | #undef printf | 186 | #undef printf |
187 | } | 187 | } |
188 | 188 | ||
189 | static uint64_t generate_timestamp() | 189 | uint64_t sb_generate_timestamp(void) |
190 | { | 190 | { |
191 | struct tm tm_base; | 191 | struct tm tm_base; |
192 | memset(&tm_base, 0, sizeof(tm_base)); | 192 | memset(&tm_base, 0, sizeof(tm_base)); |
@@ -218,11 +218,11 @@ static void produce_sb_header(struct sb_file_t *sb, struct sb_header_t *sb_hdr) | |||
218 | sb_hdr->signature[2] = 'M'; | 218 | sb_hdr->signature[2] = 'M'; |
219 | sb_hdr->signature[3] = 'P'; | 219 | sb_hdr->signature[3] = 'P'; |
220 | sb_hdr->major_ver = IMAGE_MAJOR_VERSION; | 220 | sb_hdr->major_ver = IMAGE_MAJOR_VERSION; |
221 | sb_hdr->minor_ver = IMAGE_MINOR_VERSION; | 221 | sb_hdr->minor_ver = sb->minor_version; |
222 | sb_hdr->flags = 0; | 222 | sb_hdr->flags = sb->flags; |
223 | sb_hdr->image_size = sb->image_size; | 223 | sb_hdr->image_size = sb->image_size; |
224 | sb_hdr->header_size = sizeof(struct sb_header_t) / BLOCK_SIZE; | 224 | sb_hdr->header_size = sizeof(struct sb_header_t) / BLOCK_SIZE; |
225 | sb_hdr->first_boot_sec_id = sb->first_boot_sec_id; | 225 | sb_hdr->first_boot_sec_id = sb->sections[0].identifier; |
226 | sb_hdr->nr_keys = g_nr_keys; | 226 | sb_hdr->nr_keys = g_nr_keys; |
227 | sb_hdr->nr_sections = sb->nr_sections; | 227 | sb_hdr->nr_sections = sb->nr_sections; |
228 | sb_hdr->sec_hdr_size = sizeof(struct sb_section_header_t) / BLOCK_SIZE; | 228 | sb_hdr->sec_hdr_size = sizeof(struct sb_section_header_t) / BLOCK_SIZE; |
@@ -237,10 +237,7 @@ static void produce_sb_header(struct sb_file_t *sb, struct sb_header_t *sb_hdr) | |||
237 | if(sb->minor_version >= 1) | 237 | if(sb->minor_version >= 1) |
238 | memcpy(&sb_hdr->rand_pad0[2], "sgtl", 4); | 238 | memcpy(&sb_hdr->rand_pad0[2], "sgtl", 4); |
239 | 239 | ||
240 | if(sb->override_timestamp) | 240 | sb_hdr->timestamp = sb->timestamp; |
241 | sb_hdr->timestamp = sb->timestamp; | ||
242 | else | ||
243 | sb_hdr->timestamp = generate_timestamp(); | ||
244 | sb_hdr->product_ver = sb->product_ver; | 241 | sb_hdr->product_ver = sb->product_ver; |
245 | fix_version(&sb_hdr->product_ver); | 242 | fix_version(&sb_hdr->product_ver); |
246 | sb_hdr->component_ver = sb->component_ver; | 243 | sb_hdr->component_ver = sb->component_ver; |
@@ -261,7 +258,8 @@ static void produce_sb_section_header(struct sb_section_t *sec, | |||
261 | sec_hdr->offset = sec->file_offset; | 258 | sec_hdr->offset = sec->file_offset; |
262 | sec_hdr->size = sec->sec_size; | 259 | sec_hdr->size = sec->sec_size; |
263 | sec_hdr->flags = (sec->is_data ? 0 : SECTION_BOOTABLE) | 260 | sec_hdr->flags = (sec->is_data ? 0 : SECTION_BOOTABLE) |
264 | | (sec->is_cleartext ? SECTION_CLEARTEXT : 0); | 261 | | (sec->is_cleartext ? SECTION_CLEARTEXT : 0) |
262 | | sec->other_flags; | ||
265 | } | 263 | } |
266 | 264 | ||
267 | static uint8_t instruction_checksum(struct sb_instruction_header_t *hdr) | 265 | static uint8_t instruction_checksum(struct sb_instruction_header_t *hdr) |
@@ -281,7 +279,8 @@ static void produce_section_tag_cmd(struct sb_section_t *sec, | |||
281 | tag->identifier = sec->identifier; | 279 | tag->identifier = sec->identifier; |
282 | tag->len = sec->sec_size; | 280 | tag->len = sec->sec_size; |
283 | tag->flags = (sec->is_data ? 0 : SECTION_BOOTABLE) | 281 | tag->flags = (sec->is_data ? 0 : SECTION_BOOTABLE) |
284 | | (sec->is_cleartext ? SECTION_CLEARTEXT : 0); | 282 | | (sec->is_cleartext ? SECTION_CLEARTEXT : 0) |
283 | | sec->other_flags; | ||
285 | tag->hdr.checksum = instruction_checksum(&tag->hdr); | 284 | tag->hdr.checksum = instruction_checksum(&tag->hdr); |
286 | } | 285 | } |
287 | 286 | ||
@@ -333,6 +332,11 @@ enum sb_error_t sb_write_file(struct sb_file_t *sb, const char *filename, void * | |||
333 | memset(cbc_macs[i], 0, 16); | 332 | memset(cbc_macs[i], 0, 16); |
334 | 333 | ||
335 | fill_gaps(sb); | 334 | fill_gaps(sb); |
335 | if(sb->nr_sections == 0 || sb->sections[0].is_data) | ||
336 | { | ||
337 | cprintf(u, true, GREY, "First section of the image is not bootable, I cannot handle that.\n"); | ||
338 | return SB_ERROR; | ||
339 | } | ||
336 | compute_sb_offsets(sb, u, cprintf); | 340 | compute_sb_offsets(sb, u, cprintf); |
337 | 341 | ||
338 | generate_random_data(real_key.u.key, 16); | 342 | generate_random_data(real_key.u.key, 16); |
@@ -983,6 +987,7 @@ struct sb_file_t *sb_read_memory(void *_buf, size_t filesize, bool raw_mode, voi | |||
983 | sec, size, " ", u, cprintf, err); | 987 | sec, size, " ", u, cprintf, err); |
984 | if(s) | 988 | if(s) |
985 | { | 989 | { |
990 | s->other_flags = sec_hdr->flags & ~SECTION_STD_MASK; | ||
986 | s->is_cleartext = !encrypted; | 991 | s->is_cleartext = !encrypted; |
987 | s->alignment = guess_alignment(pos); | 992 | s->alignment = guess_alignment(pos); |
988 | memcpy(&sb_file->sections[i], s, sizeof(struct sb_section_t)); | 993 | memcpy(&sb_file->sections[i], s, sizeof(struct sb_section_t)); |
@@ -1073,6 +1078,7 @@ struct sb_file_t *sb_read_memory(void *_buf, size_t filesize, bool raw_mode, voi | |||
1073 | sec, size, " ", u, cprintf, err); | 1078 | sec, size, " ", u, cprintf, err); |
1074 | if(s) | 1079 | if(s) |
1075 | { | 1080 | { |
1081 | s->other_flags = tag->flags & ~SECTION_STD_MASK; | ||
1076 | s->is_cleartext = !encrypted; | 1082 | s->is_cleartext = !encrypted; |
1077 | s->alignment = guess_alignment(pos); | 1083 | s->alignment = guess_alignment(pos); |
1078 | sb_file->sections = augment_array(sb_file->sections, | 1084 | sb_file->sections = augment_array(sb_file->sections, |
@@ -1138,6 +1144,19 @@ struct sb_file_t *sb_read_memory(void *_buf, size_t filesize, bool raw_mode, voi | |||
1138 | #undef print_hex | 1144 | #undef print_hex |
1139 | } | 1145 | } |
1140 | 1146 | ||
1147 | void sb_generate_default_version(struct sb_version_t *ver) | ||
1148 | { | ||
1149 | ver->major = ver->minor = ver->revision = 0x999; | ||
1150 | } | ||
1151 | |||
1152 | void sb_build_default_image(struct sb_file_t *sb) | ||
1153 | { | ||
1154 | sb->minor_version = IMAGE_MINOR_VERSION; | ||
1155 | sb->timestamp = sb_generate_timestamp(); | ||
1156 | sb_generate_default_version(&sb->product_ver); | ||
1157 | sb_generate_default_version(&sb->component_ver); | ||
1158 | } | ||
1159 | |||
1141 | void sb_free_instruction(struct sb_inst_t inst) | 1160 | void sb_free_instruction(struct sb_inst_t inst) |
1142 | { | 1161 | { |
1143 | free(inst.padding); | 1162 | free(inst.padding); |
@@ -1246,6 +1265,9 @@ void sb_dump(struct sb_file_t *file, void *u, generic_printf_t cprintf) | |||
1246 | printf(HEADER, "Alignment: "); | 1265 | printf(HEADER, "Alignment: "); |
1247 | printf(TEXT, "%d (bytes)\n", sec->alignment); | 1266 | printf(TEXT, "%d (bytes)\n", sec->alignment); |
1248 | printf(TREE, "| +-"); | 1267 | printf(TREE, "| +-"); |
1268 | printf(HEADER, "Other Flags: "); | ||
1269 | printf(TEXT, "%#x\n", sec->other_flags); | ||
1270 | printf(TREE, "| +-"); | ||
1249 | printf(HEADER, "Instructions\n"); | 1271 | printf(HEADER, "Instructions\n"); |
1250 | for(int j = 0; j < sec->nr_insts; j++) | 1272 | for(int j = 0; j < sec->nr_insts; j++) |
1251 | { | 1273 | { |