123ba6841SJoseph Chen /* 223ba6841SJoseph Chen * Rockchip trust image generator 323ba6841SJoseph Chen * 423ba6841SJoseph Chen * (C) Copyright 2008-2015 Fuzhou Rockchip Electronics Co., Ltd 523ba6841SJoseph Chen * Peter, Software Engineering, <superpeter.cai@gmail.com>. 623ba6841SJoseph Chen * 723ba6841SJoseph Chen * SPDX-License-Identifier: GPL-2.0+ 823ba6841SJoseph Chen */ 923ba6841SJoseph Chen #ifndef TRUST_MERGER_H 1023ba6841SJoseph Chen #define TRUST_MERGER_H 1123ba6841SJoseph Chen 1223ba6841SJoseph Chen #include <stdint.h> 1323ba6841SJoseph Chen #include <stdio.h> 1423ba6841SJoseph Chen #include <stdlib.h> 1523ba6841SJoseph Chen #include <string.h> 1623ba6841SJoseph Chen #include <memory.h> 1723ba6841SJoseph Chen #include <stdbool.h> 1823ba6841SJoseph Chen 1923ba6841SJoseph Chen 2023ba6841SJoseph Chen #define VERSION "v1.0 (2015-06-15)" 2123ba6841SJoseph Chen #define DO_ALIGN(a, b) (((a) > 0) ? ((((a) - 1) / (b) + 1) * (b)) : (a)) 2223ba6841SJoseph Chen 2323ba6841SJoseph Chen 2423ba6841SJoseph Chen /* config file */ 2523ba6841SJoseph Chen #define SEC_VERSION "[VERSION]" 2623ba6841SJoseph Chen #define SEC_BL30 "[BL30_OPTION]" 2723ba6841SJoseph Chen #define SEC_BL31 "[BL31_OPTION]" 2823ba6841SJoseph Chen #define SEC_BL32 "[BL32_OPTION]" 2923ba6841SJoseph Chen #define SEC_BL33 "[BL33_OPTION]" 3023ba6841SJoseph Chen #define SEC_OUT "[OUTPUT]" 3123ba6841SJoseph Chen 3223ba6841SJoseph Chen #define OPT_MAJOR "MAJOR" 3323ba6841SJoseph Chen #define OPT_MINOR "MINOR" 3423ba6841SJoseph Chen #define OPT_SEC "SEC" 3523ba6841SJoseph Chen #define OPT_PATH "PATH" 3623ba6841SJoseph Chen #define OPT_ADDR "ADDR" 3723ba6841SJoseph Chen #define OPT_OUT_PATH "PATH" 3823ba6841SJoseph Chen 3923ba6841SJoseph Chen /* options */ 4023ba6841SJoseph Chen #define OPT_VERBOSE "--verbose" 4123ba6841SJoseph Chen #define OPT_HELP "--help" 4223ba6841SJoseph Chen #define OPT_VERSION "--version" 4323ba6841SJoseph Chen #define OPT_MERGE "--pack" 4423ba6841SJoseph Chen #define OPT_UNPACK "--unpack" 4523ba6841SJoseph Chen #define OPT_SUBFIX "--subfix" 4623ba6841SJoseph Chen #define OPT_REPLACE "--replace" 47e311da24SJoseph Chen #define OPT_PREPATH "--prepath" 4823ba6841SJoseph Chen #define OPT_RSA "--rsa" 4923ba6841SJoseph Chen #define OPT_SHA "--sha" 5023ba6841SJoseph Chen #define OPT_SIZE "--size" 5175828958SJoseph Chen #define OPT_IGNORE_BL32 "--ignore-bl32" 5223ba6841SJoseph Chen 5323ba6841SJoseph Chen #define DEF_MAJOR 0 5423ba6841SJoseph Chen #define DEF_MINOR 0 5523ba6841SJoseph Chen #define DEF_BL30_PATH "bl30.bin" 5623ba6841SJoseph Chen #define DEF_BL31_PATH "bl31.bin" 5723ba6841SJoseph Chen #define DEF_BL32_PATH "bl32.bin" 5823ba6841SJoseph Chen #define DEF_BL33_PATH "bl33.bin" 5923ba6841SJoseph Chen 6023ba6841SJoseph Chen #define DEF_OUT_PATH "trust.img" 6123ba6841SJoseph Chen 6223ba6841SJoseph Chen #define DEF_CONFIG_FILE "RKTRUST.ini" 6323ba6841SJoseph Chen 6423ba6841SJoseph Chen 6523ba6841SJoseph Chen #define MAX_LINE_LEN 256 6623ba6841SJoseph Chen #define SCANF_EAT(in) fscanf(in, "%*[ \r\n\t/]") 6723ba6841SJoseph Chen 6823ba6841SJoseph Chen #define ENTRY_ALIGN (2048) 6923ba6841SJoseph Chen 7023ba6841SJoseph Chen enum { 7123ba6841SJoseph Chen BL30_SEC = 0, 7223ba6841SJoseph Chen BL31_SEC, 7323ba6841SJoseph Chen BL32_SEC, 7423ba6841SJoseph Chen BL33_SEC, 7523ba6841SJoseph Chen BL_MAX_SEC 7623ba6841SJoseph Chen }; 7723ba6841SJoseph Chen 7823ba6841SJoseph Chen 7923ba6841SJoseph Chen 8023ba6841SJoseph Chen typedef struct { 8123ba6841SJoseph Chen bool sec; 8223ba6841SJoseph Chen uint32_t id; 8323ba6841SJoseph Chen char path[MAX_LINE_LEN]; 8423ba6841SJoseph Chen uint32_t addr; 8523ba6841SJoseph Chen uint32_t offset; 8623ba6841SJoseph Chen uint32_t size; 8723ba6841SJoseph Chen uint32_t align_size; 8823ba6841SJoseph Chen } bl_entry_t; 8923ba6841SJoseph Chen 9023ba6841SJoseph Chen typedef struct { 9123ba6841SJoseph Chen uint16_t major; 9223ba6841SJoseph Chen uint16_t minor; 9323ba6841SJoseph Chen bl_entry_t bl3x[BL_MAX_SEC]; 9423ba6841SJoseph Chen char outPath[MAX_LINE_LEN]; 9523ba6841SJoseph Chen } OPT_T; 9623ba6841SJoseph Chen 9723ba6841SJoseph Chen 9823ba6841SJoseph Chen #define TRUST_HEAD_TAG "BL3X" 9923ba6841SJoseph Chen #define SIGNATURE_SIZE 256 10023ba6841SJoseph Chen #define TRUST_HEADER_SIZE 2048 10123ba6841SJoseph Chen 10223ba6841SJoseph Chen typedef struct { 10323ba6841SJoseph Chen uint32_t tag; 10423ba6841SJoseph Chen uint32_t version; 10523ba6841SJoseph Chen uint32_t flags; 10623ba6841SJoseph Chen uint32_t size; 10723ba6841SJoseph Chen uint32_t reserved[4]; 10823ba6841SJoseph Chen uint32_t RSA_N[64]; 10923ba6841SJoseph Chen uint32_t RSA_E[64]; 11023ba6841SJoseph Chen uint32_t RSA_C[64]; 11123ba6841SJoseph Chen } TRUST_HEADER, *PTRUST_HEADER; 11223ba6841SJoseph Chen 11323ba6841SJoseph Chen 11423ba6841SJoseph Chen typedef struct { 11523ba6841SJoseph Chen uint32_t HashData[8]; 11623ba6841SJoseph Chen uint32_t LoadAddr; 117*4d06e4deSzain wang uint32_t LoadSize; 118*4d06e4deSzain wang uint32_t reserved[2]; 11923ba6841SJoseph Chen } COMPONENT_DATA, *PCOMPONENT_DATA; 12023ba6841SJoseph Chen 12123ba6841SJoseph Chen 12223ba6841SJoseph Chen typedef struct { 12323ba6841SJoseph Chen uint32_t ComponentID; 12423ba6841SJoseph Chen uint32_t StorageAddr; 12523ba6841SJoseph Chen uint32_t ImageSize; 12623ba6841SJoseph Chen uint32_t reserved; 12723ba6841SJoseph Chen } TRUST_COMPONENT, *PTRUST_COMPONENT; 12823ba6841SJoseph Chen 12923ba6841SJoseph Chen #define EI_NIDENT 16 13023ba6841SJoseph Chen #define ELF_MAGIC 0x464c457f 13123ba6841SJoseph Chen 13223ba6841SJoseph Chen typedef struct { 13323ba6841SJoseph Chen uint8_t e_ident[EI_NIDENT]; 13423ba6841SJoseph Chen uint16_t e_type; 13523ba6841SJoseph Chen uint16_t e_machine; 13623ba6841SJoseph Chen uint32_t e_version; 13723ba6841SJoseph Chen uint32_t e_entry; /* Entry point */ 13823ba6841SJoseph Chen uint32_t e_phoff; 13923ba6841SJoseph Chen uint32_t e_shoff; 14023ba6841SJoseph Chen uint32_t e_flags; 14123ba6841SJoseph Chen uint16_t e_ehsize; 14223ba6841SJoseph Chen uint16_t e_phentsize; 14323ba6841SJoseph Chen uint16_t e_phnum; 14423ba6841SJoseph Chen uint16_t e_shentsize; 14523ba6841SJoseph Chen uint16_t e_shnum; 14623ba6841SJoseph Chen uint16_t e_shstrndx; 14723ba6841SJoseph Chen } Elf32_Ehdr; 14823ba6841SJoseph Chen 14923ba6841SJoseph Chen typedef struct { 15023ba6841SJoseph Chen uint8_t e_ident[EI_NIDENT]; /* ELF "magic number" */ 15123ba6841SJoseph Chen uint16_t e_type; 15223ba6841SJoseph Chen uint16_t e_machine; 15323ba6841SJoseph Chen uint32_t e_version; 15423ba6841SJoseph Chen uint64_t e_entry; /* Entry point virtual address */ 15523ba6841SJoseph Chen uint64_t e_phoff; /* Program header table file offset */ 15623ba6841SJoseph Chen uint64_t e_shoff; /* Section header table file offset */ 15723ba6841SJoseph Chen uint32_t e_flags; 15823ba6841SJoseph Chen uint16_t e_ehsize; 15923ba6841SJoseph Chen uint16_t e_phentsize; 16023ba6841SJoseph Chen uint16_t e_phnum; 16123ba6841SJoseph Chen uint16_t e_shentsize; 16223ba6841SJoseph Chen uint16_t e_shnum; 16323ba6841SJoseph Chen uint16_t e_shstrndx; 16423ba6841SJoseph Chen } Elf64_Ehdr; 16523ba6841SJoseph Chen 16623ba6841SJoseph Chen typedef struct { 16723ba6841SJoseph Chen uint32_t p_type; 16823ba6841SJoseph Chen uint32_t p_offset; 16923ba6841SJoseph Chen uint32_t p_vaddr; 17023ba6841SJoseph Chen uint32_t p_paddr; 17123ba6841SJoseph Chen uint32_t p_filesz; 17223ba6841SJoseph Chen uint32_t p_memsz; 17323ba6841SJoseph Chen uint32_t p_flags; 17423ba6841SJoseph Chen uint32_t p_align; 17523ba6841SJoseph Chen } Elf32_Phdr; 17623ba6841SJoseph Chen 17723ba6841SJoseph Chen typedef struct { 17823ba6841SJoseph Chen uint32_t p_type; 17923ba6841SJoseph Chen uint32_t p_flags; 18023ba6841SJoseph Chen uint64_t p_offset; /* Segment file offset */ 18123ba6841SJoseph Chen uint64_t p_vaddr; /* Segment virtual address */ 18223ba6841SJoseph Chen uint64_t p_paddr; /* Segment physical address */ 18323ba6841SJoseph Chen uint64_t p_filesz; /* Segment size in file */ 18423ba6841SJoseph Chen uint64_t p_memsz; /* Segment size in memory */ 18523ba6841SJoseph Chen uint64_t p_align; /* Segment alignment, file & memory */ 18623ba6841SJoseph Chen } Elf64_Phdr; 18723ba6841SJoseph Chen 18823ba6841SJoseph Chen #endif /* TRUST_MERGER_H */ 189