summaryrefslogtreecommitdiff
path: root/utils/imxtools/sbtools/sb.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/imxtools/sbtools/sb.c')
-rw-r--r--utils/imxtools/sbtools/sb.c42
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
189static uint64_t generate_timestamp() 189uint64_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
267static uint8_t instruction_checksum(struct sb_instruction_header_t *hdr) 265static 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
1147void sb_generate_default_version(struct sb_version_t *ver)
1148{
1149 ver->major = ver->minor = ver->revision = 0x999;
1150}
1151
1152void 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
1141void sb_free_instruction(struct sb_inst_t inst) 1160void 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 {