1*43d520f3SAlex Deymo /* SPDX-License-Identifier: BSD-3-Clause */ 29ace3fc8SSebastian Siewior /* 39ace3fc8SSebastian Siewior * This is from the Android Project, 4*43d520f3SAlex Deymo * Repository: https://android.googlesource.com/platform/system/tools/mkbootimg 5*43d520f3SAlex Deymo * File: include/bootimg/bootimg.h 6*43d520f3SAlex Deymo * Commit: e55998a0f2b61b685d5eb4a486ca3a0c680b1a2f 79ace3fc8SSebastian Siewior * 8*43d520f3SAlex Deymo * Copyright (C) 2007 The Android Open Source Project 99ace3fc8SSebastian Siewior */ 109ace3fc8SSebastian Siewior 119ace3fc8SSebastian Siewior #ifndef _ANDROID_IMAGE_H_ 129ace3fc8SSebastian Siewior #define _ANDROID_IMAGE_H_ 139ace3fc8SSebastian Siewior 149ace3fc8SSebastian Siewior #define ANDR_BOOT_MAGIC "ANDROID!" 159ace3fc8SSebastian Siewior #define ANDR_BOOT_MAGIC_SIZE 8 169ace3fc8SSebastian Siewior #define ANDR_BOOT_NAME_SIZE 16 179ace3fc8SSebastian Siewior #define ANDR_BOOT_ARGS_SIZE 512 18210a7176SAlex Deymo #define ANDR_BOOT_EXTRA_ARGS_SIZE 1024 199ace3fc8SSebastian Siewior 20*43d520f3SAlex Deymo /* 21*43d520f3SAlex Deymo * It is expected that callers would explicitly specify which version of the 22*43d520f3SAlex Deymo * boot image header they need to use. 23*43d520f3SAlex Deymo */ 24*43d520f3SAlex Deymo typedef struct andr_img_hdr andr_img_hdr; 25*43d520f3SAlex Deymo 26*43d520f3SAlex Deymo /* The bootloader expects the structure of andr_img_hdr with header 27*43d520f3SAlex Deymo * version 0 to be as follows: */ 289ace3fc8SSebastian Siewior struct andr_img_hdr { 29*43d520f3SAlex Deymo /* Must be ANDR_BOOT_MAGIC. */ 309ace3fc8SSebastian Siewior char magic[ANDR_BOOT_MAGIC_SIZE]; 319ace3fc8SSebastian Siewior 329ace3fc8SSebastian Siewior u32 kernel_size; /* size in bytes */ 339ace3fc8SSebastian Siewior u32 kernel_addr; /* physical load addr */ 349ace3fc8SSebastian Siewior 359ace3fc8SSebastian Siewior u32 ramdisk_size; /* size in bytes */ 369ace3fc8SSebastian Siewior u32 ramdisk_addr; /* physical load addr */ 379ace3fc8SSebastian Siewior 389ace3fc8SSebastian Siewior u32 second_size; /* size in bytes */ 399ace3fc8SSebastian Siewior u32 second_addr; /* physical load addr */ 409ace3fc8SSebastian Siewior 419ace3fc8SSebastian Siewior u32 tags_addr; /* physical addr for kernel tags */ 429ace3fc8SSebastian Siewior u32 page_size; /* flash page size we assume */ 4309f4e561SJoseph Chen 44*43d520f3SAlex Deymo /* Version of the boot image header. */ 4509f4e561SJoseph Chen u32 header_version; 46210a7176SAlex Deymo 47*43d520f3SAlex Deymo /* Operating system version and security patch level. 48*43d520f3SAlex Deymo * For version "A.B.C" and patch level "Y-M-D": 49*43d520f3SAlex Deymo * (7 bits for each of A, B, C; 7 bits for (Y-2000), 4 bits for M) 50*43d520f3SAlex Deymo * os_version = A[31:25] B[24:18] C[17:11] (Y-2000)[10:4] M[3:0] */ 51210a7176SAlex Deymo u32 os_version; 529ace3fc8SSebastian Siewior 539ace3fc8SSebastian Siewior char name[ANDR_BOOT_NAME_SIZE]; /* asciiz product name */ 549ace3fc8SSebastian Siewior 559ace3fc8SSebastian Siewior char cmdline[ANDR_BOOT_ARGS_SIZE]; 569ace3fc8SSebastian Siewior 579ace3fc8SSebastian Siewior u32 id[8]; /* timestamp / checksum / sha1 / etc */ 58210a7176SAlex Deymo 59210a7176SAlex Deymo /* Supplemental command line data; kept here to maintain 60*43d520f3SAlex Deymo * binary compatibility with older versions of mkbootimg. */ 61210a7176SAlex Deymo char extra_cmdline[ANDR_BOOT_EXTRA_ARGS_SIZE]; 6209f4e561SJoseph Chen 63*43d520f3SAlex Deymo /* Fields in boot_img_hdr_v1 and newer. */ 64*43d520f3SAlex Deymo u32 recovery_dtbo_size; /* size in bytes for recovery DTBO/ACPIO image */ 65*43d520f3SAlex Deymo u64 recovery_dtbo_offset; /* offset to recovery dtbo/acpio in boot image */ 66*43d520f3SAlex Deymo u32 header_size; 67*43d520f3SAlex Deymo 68*43d520f3SAlex Deymo /* Fields in boot_img_hdr_v2 and newer. */ 69*43d520f3SAlex Deymo u32 dtb_size; /* size in bytes for DTB image */ 70*43d520f3SAlex Deymo u64 dtb_addr; /* physical load address for DTB image */ 71210a7176SAlex Deymo } __attribute__((packed)); 729ace3fc8SSebastian Siewior 73*43d520f3SAlex Deymo /* When a boot header is of version 0, the structure of boot image is as 74*43d520f3SAlex Deymo * follows: 75*43d520f3SAlex Deymo * 769ace3fc8SSebastian Siewior * +-----------------+ 779ace3fc8SSebastian Siewior * | boot header | 1 page 789ace3fc8SSebastian Siewior * +-----------------+ 799ace3fc8SSebastian Siewior * | kernel | n pages 809ace3fc8SSebastian Siewior * +-----------------+ 819ace3fc8SSebastian Siewior * | ramdisk | m pages 829ace3fc8SSebastian Siewior * +-----------------+ 839ace3fc8SSebastian Siewior * | second stage | o pages 849ace3fc8SSebastian Siewior * +-----------------+ 859ace3fc8SSebastian Siewior * 869ace3fc8SSebastian Siewior * n = (kernel_size + page_size - 1) / page_size 879ace3fc8SSebastian Siewior * m = (ramdisk_size + page_size - 1) / page_size 889ace3fc8SSebastian Siewior * o = (second_size + page_size - 1) / page_size 899ace3fc8SSebastian Siewior * 909ace3fc8SSebastian Siewior * 0. all entities are page_size aligned in flash 919ace3fc8SSebastian Siewior * 1. kernel and ramdisk are required (size != 0) 929ace3fc8SSebastian Siewior * 2. second is optional (second_size == 0 -> no second) 939ace3fc8SSebastian Siewior * 3. load each element (kernel, ramdisk, second) at 949ace3fc8SSebastian Siewior * the specified physical address (kernel_addr, etc) 959ace3fc8SSebastian Siewior * 4. prepare tags at tag_addr. kernel_args[] is 969ace3fc8SSebastian Siewior * appended to the kernel commandline in the tags. 979ace3fc8SSebastian Siewior * 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 989ace3fc8SSebastian Siewior * 6. if second_size != 0: jump to second_addr 999ace3fc8SSebastian Siewior * else: jump to kernel_addr 1009ace3fc8SSebastian Siewior */ 101*43d520f3SAlex Deymo 102*43d520f3SAlex Deymo /* When the boot image header has a version of 2, the structure of the boot 103*43d520f3SAlex Deymo * image is as follows: 104*43d520f3SAlex Deymo * 105*43d520f3SAlex Deymo * +---------------------+ 106*43d520f3SAlex Deymo * | boot header | 1 page 107*43d520f3SAlex Deymo * +---------------------+ 108*43d520f3SAlex Deymo * | kernel | n pages 109*43d520f3SAlex Deymo * +---------------------+ 110*43d520f3SAlex Deymo * | ramdisk | m pages 111*43d520f3SAlex Deymo * +---------------------+ 112*43d520f3SAlex Deymo * | second stage | o pages 113*43d520f3SAlex Deymo * +---------------------+ 114*43d520f3SAlex Deymo * | recovery dtbo/acpio | p pages 115*43d520f3SAlex Deymo * +---------------------+ 116*43d520f3SAlex Deymo * | dtb | q pages 117*43d520f3SAlex Deymo * +---------------------+ 118*43d520f3SAlex Deymo 119*43d520f3SAlex Deymo * n = (kernel_size + page_size - 1) / page_size 120*43d520f3SAlex Deymo * m = (ramdisk_size + page_size - 1) / page_size 121*43d520f3SAlex Deymo * o = (second_size + page_size - 1) / page_size 122*43d520f3SAlex Deymo * p = (recovery_dtbo_size + page_size - 1) / page_size 123*43d520f3SAlex Deymo * q = (dtb_size + page_size - 1) / page_size 124*43d520f3SAlex Deymo * 125*43d520f3SAlex Deymo * 0. all entities are page_size aligned in flash 126*43d520f3SAlex Deymo * 1. kernel, ramdisk and DTB are required (size != 0) 127*43d520f3SAlex Deymo * 2. recovery_dtbo/recovery_acpio is required for recovery.img in non-A/B 128*43d520f3SAlex Deymo * devices(recovery_dtbo_size != 0) 129*43d520f3SAlex Deymo * 3. second is optional (second_size == 0 -> no second) 130*43d520f3SAlex Deymo * 4. load each element (kernel, ramdisk, second, dtb) at 131*43d520f3SAlex Deymo * the specified physical address (kernel_addr, etc) 132*43d520f3SAlex Deymo * 5. If booting to recovery mode in a non-A/B device, extract recovery 133*43d520f3SAlex Deymo * dtbo/acpio and apply the correct set of overlays on the base device tree 134*43d520f3SAlex Deymo * depending on the hardware/product revision. 135*43d520f3SAlex Deymo * 6. prepare tags at tag_addr. kernel_args[] is 136*43d520f3SAlex Deymo * appended to the kernel commandline in the tags. 137*43d520f3SAlex Deymo * 7. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 138*43d520f3SAlex Deymo * 8. if second_size != 0: jump to second_addr 139*43d520f3SAlex Deymo * else: jump to kernel_addr 140*43d520f3SAlex Deymo */ 141*43d520f3SAlex Deymo 1429ace3fc8SSebastian Siewior #endif 143