1 /* SPDX-License-Identifier: BSD-3-Clause */ 2 /* 3 * This is from the Android Project, 4 * Repository: https://android.googlesource.com/platform/system/tools/mkbootimg 5 * File: include/bootimg/bootimg.h 6 * Commit: e55998a0f2b61b685d5eb4a486ca3a0c680b1a2f 7 * 8 * Copyright (C) 2007 The Android Open Source Project 9 */ 10 11 #ifndef _ANDROID_IMAGE_H_ 12 #define _ANDROID_IMAGE_H_ 13 14 #include <linux/compiler.h> 15 #include <linux/types.h> 16 17 #define ANDR_BOOT_MAGIC "ANDROID!" 18 #define ANDR_BOOT_MAGIC_SIZE 8 19 #define ANDR_BOOT_NAME_SIZE 16 20 #define ANDR_BOOT_ARGS_SIZE 512 21 #define ANDR_BOOT_EXTRA_ARGS_SIZE 1024 22 23 /* The bootloader expects the structure of andr_img_hdr with header 24 * version 0 to be as follows: */ 25 struct andr_img_hdr { 26 /* Must be ANDR_BOOT_MAGIC. */ 27 char magic[ANDR_BOOT_MAGIC_SIZE]; 28 29 u32 kernel_size; /* size in bytes */ 30 u32 kernel_addr; /* physical load addr */ 31 32 u32 ramdisk_size; /* size in bytes */ 33 u32 ramdisk_addr; /* physical load addr */ 34 35 u32 second_size; /* size in bytes */ 36 u32 second_addr; /* physical load addr */ 37 38 u32 tags_addr; /* physical addr for kernel tags */ 39 u32 page_size; /* flash page size we assume */ 40 41 /* Version of the boot image header. */ 42 u32 header_version; 43 44 /* Operating system version and security patch level. 45 * For version "A.B.C" and patch level "Y-M-D": 46 * (7 bits for each of A, B, C; 7 bits for (Y-2000), 4 bits for M) 47 * os_version = A[31:25] B[24:18] C[17:11] (Y-2000)[10:4] M[3:0] */ 48 u32 os_version; 49 50 char name[ANDR_BOOT_NAME_SIZE]; /* asciiz product name */ 51 52 char cmdline[ANDR_BOOT_ARGS_SIZE]; 53 54 u32 id[8]; /* timestamp / checksum / sha1 / etc */ 55 56 /* Supplemental command line data; kept here to maintain 57 * binary compatibility with older versions of mkbootimg. */ 58 char extra_cmdline[ANDR_BOOT_EXTRA_ARGS_SIZE]; 59 60 /* Fields in boot_img_hdr_v1 and newer. */ 61 u32 recovery_dtbo_size; /* size in bytes for recovery DTBO/ACPIO image */ 62 u64 recovery_dtbo_offset; /* offset to recovery dtbo/acpio in boot image */ 63 u32 header_size; 64 65 /* Fields in boot_img_hdr_v2 and newer. */ 66 u32 dtb_size; /* size in bytes for DTB image */ 67 u64 dtb_addr; /* physical load address for DTB image */ 68 } __attribute__((packed)); 69 70 /* When a boot header is of version 0, the structure of boot image is as 71 * follows: 72 * 73 * +-----------------+ 74 * | boot header | 1 page 75 * +-----------------+ 76 * | kernel | n pages 77 * +-----------------+ 78 * | ramdisk | m pages 79 * +-----------------+ 80 * | second stage | o pages 81 * +-----------------+ 82 * 83 * n = (kernel_size + page_size - 1) / page_size 84 * m = (ramdisk_size + page_size - 1) / page_size 85 * o = (second_size + page_size - 1) / page_size 86 * 87 * 0. all entities are page_size aligned in flash 88 * 1. kernel and ramdisk are required (size != 0) 89 * 2. second is optional (second_size == 0 -> no second) 90 * 3. load each element (kernel, ramdisk, second) at 91 * the specified physical address (kernel_addr, etc) 92 * 4. prepare tags at tag_addr. kernel_args[] is 93 * appended to the kernel commandline in the tags. 94 * 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 95 * 6. if second_size != 0: jump to second_addr 96 * else: jump to kernel_addr 97 */ 98 99 /* When the boot image header has a version of 2, the structure of the boot 100 * image is as follows: 101 * 102 * +---------------------+ 103 * | boot header | 1 page 104 * +---------------------+ 105 * | kernel | n pages 106 * +---------------------+ 107 * | ramdisk | m pages 108 * +---------------------+ 109 * | second stage | o pages 110 * +---------------------+ 111 * | recovery dtbo/acpio | p pages 112 * +---------------------+ 113 * | dtb | q pages 114 * +---------------------+ 115 * 116 * n = (kernel_size + page_size - 1) / page_size 117 * m = (ramdisk_size + page_size - 1) / page_size 118 * o = (second_size + page_size - 1) / page_size 119 * p = (recovery_dtbo_size + page_size - 1) / page_size 120 * q = (dtb_size + page_size - 1) / page_size 121 * 122 * 0. all entities are page_size aligned in flash 123 * 1. kernel, ramdisk and DTB are required (size != 0) 124 * 2. recovery_dtbo/recovery_acpio is required for recovery.img in non-A/B 125 * devices(recovery_dtbo_size != 0) 126 * 3. second is optional (second_size == 0 -> no second) 127 * 4. load each element (kernel, ramdisk, second, dtb) at 128 * the specified physical address (kernel_addr, etc) 129 * 5. If booting to recovery mode in a non-A/B device, extract recovery 130 * dtbo/acpio and apply the correct set of overlays on the base device tree 131 * depending on the hardware/product revision. 132 * 6. prepare tags at tag_addr. kernel_args[] is 133 * appended to the kernel commandline in the tags. 134 * 7. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 135 * 8. if second_size != 0: jump to second_addr 136 * else: jump to kernel_addr 137 */ 138 139 #endif 140