mirror of
https://git.codelinaro.org/clo/qsdk/oss/boot/u-boot-2016.git
synced 2026-02-14 20:09:24 +01:00
sysupgrade: Add support to process SBL for ipq806x nand boot
This change adds the correct Sbl_Hdr instead of Mbn_Hdr, since sbl header is different than normal Mbn_Hdr, and adds the sbl header size as 80. SBL in nand starts with preamble before the sbl header, so here it adds the preamble for header start address as well as src, sig and cert offset values. Change-Id: I9a56d7b4a51890b74a5ee5fe3047a38801d23803 Signed-off-by: Ram Chandra Jangir <rjangir@codeaurora.org>
This commit is contained in:
parent
276a30716d
commit
f40cda9a42
2 changed files with 48 additions and 11 deletions
|
|
@ -34,6 +34,7 @@
|
|||
#define CERT_SIZE 2048
|
||||
#define PRESENT 1
|
||||
#define MBN_HDR_SIZE 40
|
||||
#define SBL_HDR_SIZE 80
|
||||
#define SIG_SIZE 256
|
||||
#define NOT_PRESENT 0
|
||||
#define SIG_CERT_2_SIZE 4352
|
||||
|
|
@ -452,16 +453,20 @@ int get_sw_id_from_component_bin(struct image_section *section)
|
|||
mbn_hdr = (Mbn_Hdr *)fp;
|
||||
if (strstr(section->file, sections[4].type)) {
|
||||
uint32_t preamble = sections[2].is_present ? SBL_NAND_PREAMBLE : 0;
|
||||
Sbl_Hdr *sbl_hdr = (Sbl_Hdr *)(fp + preamble);
|
||||
|
||||
mbn_hdr = (Mbn_Hdr *)(fp + preamble + SBL_HDR_RESERVED);
|
||||
sig_cert_size = sbl_hdr->image_size - sbl_hdr->code_size;
|
||||
cert_offset = preamble + sbl_hdr->cert_ptr - sbl_hdr->image_dest_ptr +
|
||||
SBL_HDR_SIZE;
|
||||
} else {
|
||||
sig_cert_size = mbn_hdr->image_size - mbn_hdr->code_size;
|
||||
cert_offset = mbn_hdr->cert_ptr - mbn_hdr->image_dest_ptr + 40;
|
||||
}
|
||||
sig_cert_size = mbn_hdr->image_size - mbn_hdr->code_size;
|
||||
if (sig_cert_size != SIG_CERT_2_SIZE && sig_cert_size != SIG_CERT_3_SIZE) {
|
||||
printf("WARNING: signature certificate size is different\n");
|
||||
// ipq807x has certificate size as dynamic, hence ignore this check
|
||||
}
|
||||
|
||||
cert_offset = mbn_hdr->cert_ptr - mbn_hdr->image_dest_ptr + 40;
|
||||
printf("Image with version information\n");
|
||||
sw_version = find_value((char *)(fp + cert_offset), "SW_ID", 17);
|
||||
if (sw_version != NULL) {
|
||||
|
|
@ -887,9 +892,11 @@ int split_code_signature_cert_from_component_bin(struct image_section *section,
|
|||
char **src, char **sig, char **cert)
|
||||
{
|
||||
Mbn_Hdr *mbn_hdr;
|
||||
Sbl_Hdr *sbl_hdr;
|
||||
int fd = open(section->file, O_RDONLY);
|
||||
uint8_t *fp;
|
||||
int sig_offset = 0;
|
||||
int src_offset = 0;
|
||||
int cert_offset = 0;
|
||||
struct stat sb;
|
||||
int sig_cert_size;
|
||||
|
|
@ -917,26 +924,34 @@ int split_code_signature_cert_from_component_bin(struct image_section *section,
|
|||
if (strstr(section->file, sections[4].type)) {
|
||||
uint32_t preamble = sections[2].is_present ? SBL_NAND_PREAMBLE : 0;
|
||||
|
||||
mbn_hdr = (Mbn_Hdr *)(fp + preamble + SBL_HDR_RESERVED);
|
||||
sig_offset = preamble + MBN_HDR_SIZE;
|
||||
cert_offset = preamble + MBN_HDR_SIZE;
|
||||
sbl_hdr = (Sbl_Hdr *)(fp + preamble);
|
||||
src_offset = preamble;
|
||||
sig_offset = preamble + sbl_hdr->sig_ptr - sbl_hdr->image_dest_ptr +
|
||||
SBL_HDR_SIZE;
|
||||
cert_offset = preamble + sbl_hdr->cert_ptr - sbl_hdr->image_dest_ptr +
|
||||
SBL_HDR_SIZE;
|
||||
sig_cert_size = sbl_hdr->image_size - sbl_hdr->code_size;
|
||||
src_size = sbl_hdr->sig_ptr - sbl_hdr->image_dest_ptr + SBL_HDR_SIZE;
|
||||
} else {
|
||||
sig_cert_size = mbn_hdr->image_size - mbn_hdr->code_size;
|
||||
src_size = mbn_hdr->sig_ptr - mbn_hdr->image_dest_ptr + MBN_HDR_SIZE;
|
||||
sig_offset += mbn_hdr->sig_ptr - mbn_hdr->image_dest_ptr + MBN_HDR_SIZE;
|
||||
cert_offset += mbn_hdr->cert_ptr - mbn_hdr->image_dest_ptr + MBN_HDR_SIZE;
|
||||
}
|
||||
sig_cert_size = mbn_hdr->image_size - mbn_hdr->code_size;
|
||||
|
||||
if (sig_cert_size != SIG_CERT_2_SIZE && sig_cert_size != SIG_CERT_3_SIZE) {
|
||||
printf("Error: Image without version information\n");
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
src_size = mbn_hdr->sig_ptr - mbn_hdr->image_dest_ptr + MBN_HDR_SIZE;
|
||||
*src = malloc(src_size + 1);
|
||||
if (*src == NULL) {
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
memcpy(*src, fp, src_size);
|
||||
memcpy(*src, fp + src_offset, src_size);
|
||||
(*src)[src_size] = '\0';
|
||||
|
||||
sig_offset += mbn_hdr->sig_ptr - mbn_hdr->image_dest_ptr + MBN_HDR_SIZE;
|
||||
*sig = malloc((SIG_SIZE + 1) * sizeof(char));
|
||||
if (*sig == NULL) {
|
||||
free(*src);
|
||||
|
|
@ -945,7 +960,6 @@ int split_code_signature_cert_from_component_bin(struct image_section *section,
|
|||
memcpy(*sig, fp + sig_offset, SIG_SIZE);
|
||||
(*sig)[SIG_SIZE] = '\0';
|
||||
|
||||
cert_offset += mbn_hdr->cert_ptr - mbn_hdr->image_dest_ptr + MBN_HDR_SIZE;
|
||||
*cert = malloc((CERT_SIZE + 1) * sizeof(char));
|
||||
if (*cert == NULL) {
|
||||
free(*src);
|
||||
|
|
|
|||
|
|
@ -82,6 +82,29 @@ struct ubi_vid_hdr {
|
|||
__be32 hdr_crc;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
uint32_t codeword;
|
||||
uint32_t magic;
|
||||
uint32_t RESERVED_0;
|
||||
uint32_t RESERVED_1;
|
||||
uint32_t RESERVED_2;
|
||||
uint32_t image_src;
|
||||
uint8_t *image_dest_ptr;
|
||||
uint32_t image_size;
|
||||
uint32_t code_size;
|
||||
uint8_t *sig_ptr;
|
||||
uint32_t sig_size;
|
||||
uint8_t *cert_ptr;
|
||||
uint32_t cert_size;
|
||||
uint32_t root_cert_sel;
|
||||
uint32_t num_root_certs;
|
||||
uint32_t RESERVED_5;
|
||||
uint32_t RESERVED_6;
|
||||
uint32_t RESERVED_7;
|
||||
uint32_t RESERVED_8;
|
||||
uint32_t RESERVED_9;
|
||||
} Sbl_Hdr;
|
||||
|
||||
int get_sections(void);
|
||||
int is_authentication_check_enabled(void);
|
||||
int get_local_image_version(struct image_section *);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue