1*83d290c5STom Rini /* SPDX-License-Identifier: BSD-2-Clause */ 29ace3fc8SSebastian Siewior /* 39ace3fc8SSebastian Siewior * This is from the Android Project, 4210a7176SAlex Deymo * Repository: https://android.googlesource.com/platform/system/core/ 5210a7176SAlex Deymo * File: mkbootimg/bootimg.h 6210a7176SAlex Deymo * Commit: d162828814b08ada310846a33205befb69ef5799 79ace3fc8SSebastian Siewior * 89ace3fc8SSebastian Siewior * Copyright (C) 2008 The Android Open Source Project 99ace3fc8SSebastian Siewior */ 109ace3fc8SSebastian Siewior 119ace3fc8SSebastian Siewior #ifndef _ANDROID_IMAGE_H_ 129ace3fc8SSebastian Siewior #define _ANDROID_IMAGE_H_ 139ace3fc8SSebastian Siewior 14210a7176SAlex Deymo typedef struct andr_img_hdr andr_img_hdr; 15210a7176SAlex Deymo 169ace3fc8SSebastian Siewior #define ANDR_BOOT_MAGIC "ANDROID!" 179ace3fc8SSebastian Siewior #define ANDR_BOOT_MAGIC_SIZE 8 189ace3fc8SSebastian Siewior #define ANDR_BOOT_NAME_SIZE 16 199ace3fc8SSebastian Siewior #define ANDR_BOOT_ARGS_SIZE 512 20210a7176SAlex Deymo #define ANDR_BOOT_EXTRA_ARGS_SIZE 1024 219ace3fc8SSebastian Siewior 229ace3fc8SSebastian Siewior struct andr_img_hdr { 239ace3fc8SSebastian Siewior char magic[ANDR_BOOT_MAGIC_SIZE]; 249ace3fc8SSebastian Siewior 259ace3fc8SSebastian Siewior u32 kernel_size; /* size in bytes */ 269ace3fc8SSebastian Siewior u32 kernel_addr; /* physical load addr */ 279ace3fc8SSebastian Siewior 289ace3fc8SSebastian Siewior u32 ramdisk_size; /* size in bytes */ 299ace3fc8SSebastian Siewior u32 ramdisk_addr; /* physical load addr */ 309ace3fc8SSebastian Siewior 319ace3fc8SSebastian Siewior u32 second_size; /* size in bytes */ 329ace3fc8SSebastian Siewior u32 second_addr; /* physical load addr */ 339ace3fc8SSebastian Siewior 349ace3fc8SSebastian Siewior u32 tags_addr; /* physical addr for kernel tags */ 359ace3fc8SSebastian Siewior u32 page_size; /* flash page size we assume */ 36210a7176SAlex Deymo u32 unused; /* reserved for future expansion: MUST be 0 */ 37210a7176SAlex Deymo 38210a7176SAlex Deymo /* operating system version and security patch level; for 39210a7176SAlex Deymo * version "A.B.C" and patch level "Y-M-D": 40210a7176SAlex Deymo * ver = A << 14 | B << 7 | C (7 bits for each of A, B, C) 41210a7176SAlex Deymo * lvl = ((Y - 2000) & 127) << 4 | M (7 bits for Y, 4 bits for M) 42210a7176SAlex Deymo * os_version = ver << 11 | lvl */ 43210a7176SAlex Deymo u32 os_version; 449ace3fc8SSebastian Siewior 459ace3fc8SSebastian Siewior char name[ANDR_BOOT_NAME_SIZE]; /* asciiz product name */ 469ace3fc8SSebastian Siewior 479ace3fc8SSebastian Siewior char cmdline[ANDR_BOOT_ARGS_SIZE]; 489ace3fc8SSebastian Siewior 499ace3fc8SSebastian Siewior u32 id[8]; /* timestamp / checksum / sha1 / etc */ 50210a7176SAlex Deymo 51210a7176SAlex Deymo /* Supplemental command line data; kept here to maintain 52210a7176SAlex Deymo * binary compatibility with older versions of mkbootimg */ 53210a7176SAlex Deymo char extra_cmdline[ANDR_BOOT_EXTRA_ARGS_SIZE]; 54210a7176SAlex Deymo } __attribute__((packed)); 559ace3fc8SSebastian Siewior 569ace3fc8SSebastian Siewior /* 579ace3fc8SSebastian Siewior * +-----------------+ 589ace3fc8SSebastian Siewior * | boot header | 1 page 599ace3fc8SSebastian Siewior * +-----------------+ 609ace3fc8SSebastian Siewior * | kernel | n pages 619ace3fc8SSebastian Siewior * +-----------------+ 629ace3fc8SSebastian Siewior * | ramdisk | m pages 639ace3fc8SSebastian Siewior * +-----------------+ 649ace3fc8SSebastian Siewior * | second stage | o pages 659ace3fc8SSebastian Siewior * +-----------------+ 669ace3fc8SSebastian Siewior * 679ace3fc8SSebastian Siewior * n = (kernel_size + page_size - 1) / page_size 689ace3fc8SSebastian Siewior * m = (ramdisk_size + page_size - 1) / page_size 699ace3fc8SSebastian Siewior * o = (second_size + page_size - 1) / page_size 709ace3fc8SSebastian Siewior * 719ace3fc8SSebastian Siewior * 0. all entities are page_size aligned in flash 729ace3fc8SSebastian Siewior * 1. kernel and ramdisk are required (size != 0) 739ace3fc8SSebastian Siewior * 2. second is optional (second_size == 0 -> no second) 749ace3fc8SSebastian Siewior * 3. load each element (kernel, ramdisk, second) at 759ace3fc8SSebastian Siewior * the specified physical address (kernel_addr, etc) 769ace3fc8SSebastian Siewior * 4. prepare tags at tag_addr. kernel_args[] is 779ace3fc8SSebastian Siewior * appended to the kernel commandline in the tags. 789ace3fc8SSebastian Siewior * 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 799ace3fc8SSebastian Siewior * 6. if second_size != 0: jump to second_addr 809ace3fc8SSebastian Siewior * else: jump to kernel_addr 819ace3fc8SSebastian Siewior */ 829ace3fc8SSebastian Siewior #endif 83