19ace3fc8SSebastian Siewior /* 29ace3fc8SSebastian Siewior * This is from the Android Project, 3210a7176SAlex Deymo * Repository: https://android.googlesource.com/platform/system/core/ 4210a7176SAlex Deymo * File: mkbootimg/bootimg.h 5210a7176SAlex Deymo * Commit: d162828814b08ada310846a33205befb69ef5799 69ace3fc8SSebastian Siewior * 79ace3fc8SSebastian Siewior * Copyright (C) 2008 The Android Open Source Project 89ace3fc8SSebastian Siewior * 99ace3fc8SSebastian Siewior * SPDX-License-Identifier: BSD-2-Clause 109ace3fc8SSebastian Siewior */ 119ace3fc8SSebastian Siewior 129ace3fc8SSebastian Siewior #ifndef _ANDROID_IMAGE_H_ 139ace3fc8SSebastian Siewior #define _ANDROID_IMAGE_H_ 149ace3fc8SSebastian Siewior 15210a7176SAlex Deymo typedef struct andr_img_hdr andr_img_hdr; 16210a7176SAlex Deymo 179ace3fc8SSebastian Siewior #define ANDR_BOOT_MAGIC "ANDROID!" 189ace3fc8SSebastian Siewior #define ANDR_BOOT_MAGIC_SIZE 8 199ace3fc8SSebastian Siewior #define ANDR_BOOT_NAME_SIZE 16 209ace3fc8SSebastian Siewior #define ANDR_BOOT_ARGS_SIZE 512 21210a7176SAlex Deymo #define ANDR_BOOT_EXTRA_ARGS_SIZE 1024 229ace3fc8SSebastian Siewior 239ace3fc8SSebastian Siewior struct andr_img_hdr { 249ace3fc8SSebastian Siewior char magic[ANDR_BOOT_MAGIC_SIZE]; 259ace3fc8SSebastian Siewior 269ace3fc8SSebastian Siewior u32 kernel_size; /* size in bytes */ 279ace3fc8SSebastian Siewior u32 kernel_addr; /* physical load addr */ 289ace3fc8SSebastian Siewior 299ace3fc8SSebastian Siewior u32 ramdisk_size; /* size in bytes */ 309ace3fc8SSebastian Siewior u32 ramdisk_addr; /* physical load addr */ 319ace3fc8SSebastian Siewior 329ace3fc8SSebastian Siewior u32 second_size; /* size in bytes */ 339ace3fc8SSebastian Siewior u32 second_addr; /* physical load addr */ 349ace3fc8SSebastian Siewior 359ace3fc8SSebastian Siewior u32 tags_addr; /* physical addr for kernel tags */ 369ace3fc8SSebastian Siewior u32 page_size; /* flash page size we assume */ 37*09f4e561SJoseph Chen 38*09f4e561SJoseph Chen u32 header_version; 39210a7176SAlex Deymo 40210a7176SAlex Deymo /* operating system version and security patch level; for 41210a7176SAlex Deymo * version "A.B.C" and patch level "Y-M-D": 42210a7176SAlex Deymo * ver = A << 14 | B << 7 | C (7 bits for each of A, B, C) 43210a7176SAlex Deymo * lvl = ((Y - 2000) & 127) << 4 | M (7 bits for Y, 4 bits for M) 44210a7176SAlex Deymo * os_version = ver << 11 | lvl */ 45210a7176SAlex Deymo u32 os_version; 469ace3fc8SSebastian Siewior 479ace3fc8SSebastian Siewior char name[ANDR_BOOT_NAME_SIZE]; /* asciiz product name */ 489ace3fc8SSebastian Siewior 499ace3fc8SSebastian Siewior char cmdline[ANDR_BOOT_ARGS_SIZE]; 509ace3fc8SSebastian Siewior 519ace3fc8SSebastian Siewior u32 id[8]; /* timestamp / checksum / sha1 / etc */ 52210a7176SAlex Deymo 53210a7176SAlex Deymo /* Supplemental command line data; kept here to maintain 54210a7176SAlex Deymo * binary compatibility with older versions of mkbootimg */ 55210a7176SAlex Deymo char extra_cmdline[ANDR_BOOT_EXTRA_ARGS_SIZE]; 56*09f4e561SJoseph Chen 57*09f4e561SJoseph Chen uint32_t recovery_dtbo_size; /* size of recovery dtbo image */ 58*09f4e561SJoseph Chen uint64_t recovery_dtbo_offset; /* offset in boot image */ 59*09f4e561SJoseph Chen uint32_t header_size; /* size of boot image header in bytes */ 60210a7176SAlex Deymo } __attribute__((packed)); 619ace3fc8SSebastian Siewior 629ace3fc8SSebastian Siewior /* 639ace3fc8SSebastian Siewior * +-----------------+ 649ace3fc8SSebastian Siewior * | boot header | 1 page 659ace3fc8SSebastian Siewior * +-----------------+ 669ace3fc8SSebastian Siewior * | kernel | n pages 679ace3fc8SSebastian Siewior * +-----------------+ 689ace3fc8SSebastian Siewior * | ramdisk | m pages 699ace3fc8SSebastian Siewior * +-----------------+ 709ace3fc8SSebastian Siewior * | second stage | o pages 719ace3fc8SSebastian Siewior * +-----------------+ 729ace3fc8SSebastian Siewior * 739ace3fc8SSebastian Siewior * n = (kernel_size + page_size - 1) / page_size 749ace3fc8SSebastian Siewior * m = (ramdisk_size + page_size - 1) / page_size 759ace3fc8SSebastian Siewior * o = (second_size + page_size - 1) / page_size 769ace3fc8SSebastian Siewior * 779ace3fc8SSebastian Siewior * 0. all entities are page_size aligned in flash 789ace3fc8SSebastian Siewior * 1. kernel and ramdisk are required (size != 0) 799ace3fc8SSebastian Siewior * 2. second is optional (second_size == 0 -> no second) 809ace3fc8SSebastian Siewior * 3. load each element (kernel, ramdisk, second) at 819ace3fc8SSebastian Siewior * the specified physical address (kernel_addr, etc) 829ace3fc8SSebastian Siewior * 4. prepare tags at tag_addr. kernel_args[] is 839ace3fc8SSebastian Siewior * appended to the kernel commandline in the tags. 849ace3fc8SSebastian Siewior * 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 859ace3fc8SSebastian Siewior * 6. if second_size != 0: jump to second_addr 869ace3fc8SSebastian Siewior * else: jump to kernel_addr 879ace3fc8SSebastian Siewior */ 889ace3fc8SSebastian Siewior #endif 89