19ace3fc8SSebastian Siewior /* 29ace3fc8SSebastian Siewior * This is from the Android Project, 3*210a7176SAlex Deymo * Repository: https://android.googlesource.com/platform/system/core/ 4*210a7176SAlex Deymo * File: mkbootimg/bootimg.h 5*210a7176SAlex 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 15*210a7176SAlex Deymo typedef struct andr_img_hdr andr_img_hdr; 16*210a7176SAlex 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 21*210a7176SAlex 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*210a7176SAlex Deymo u32 unused; /* reserved for future expansion: MUST be 0 */ 38*210a7176SAlex Deymo 39*210a7176SAlex Deymo /* operating system version and security patch level; for 40*210a7176SAlex Deymo * version "A.B.C" and patch level "Y-M-D": 41*210a7176SAlex Deymo * ver = A << 14 | B << 7 | C (7 bits for each of A, B, C) 42*210a7176SAlex Deymo * lvl = ((Y - 2000) & 127) << 4 | M (7 bits for Y, 4 bits for M) 43*210a7176SAlex Deymo * os_version = ver << 11 | lvl */ 44*210a7176SAlex Deymo u32 os_version; 459ace3fc8SSebastian Siewior 469ace3fc8SSebastian Siewior char name[ANDR_BOOT_NAME_SIZE]; /* asciiz product name */ 479ace3fc8SSebastian Siewior 489ace3fc8SSebastian Siewior char cmdline[ANDR_BOOT_ARGS_SIZE]; 499ace3fc8SSebastian Siewior 509ace3fc8SSebastian Siewior u32 id[8]; /* timestamp / checksum / sha1 / etc */ 51*210a7176SAlex Deymo 52*210a7176SAlex Deymo /* Supplemental command line data; kept here to maintain 53*210a7176SAlex Deymo * binary compatibility with older versions of mkbootimg */ 54*210a7176SAlex Deymo char extra_cmdline[ANDR_BOOT_EXTRA_ARGS_SIZE]; 55*210a7176SAlex Deymo } __attribute__((packed)); 569ace3fc8SSebastian Siewior 579ace3fc8SSebastian Siewior /* 589ace3fc8SSebastian Siewior * +-----------------+ 599ace3fc8SSebastian Siewior * | boot header | 1 page 609ace3fc8SSebastian Siewior * +-----------------+ 619ace3fc8SSebastian Siewior * | kernel | n pages 629ace3fc8SSebastian Siewior * +-----------------+ 639ace3fc8SSebastian Siewior * | ramdisk | m pages 649ace3fc8SSebastian Siewior * +-----------------+ 659ace3fc8SSebastian Siewior * | second stage | o pages 669ace3fc8SSebastian Siewior * +-----------------+ 679ace3fc8SSebastian Siewior * 689ace3fc8SSebastian Siewior * n = (kernel_size + page_size - 1) / page_size 699ace3fc8SSebastian Siewior * m = (ramdisk_size + page_size - 1) / page_size 709ace3fc8SSebastian Siewior * o = (second_size + page_size - 1) / page_size 719ace3fc8SSebastian Siewior * 729ace3fc8SSebastian Siewior * 0. all entities are page_size aligned in flash 739ace3fc8SSebastian Siewior * 1. kernel and ramdisk are required (size != 0) 749ace3fc8SSebastian Siewior * 2. second is optional (second_size == 0 -> no second) 759ace3fc8SSebastian Siewior * 3. load each element (kernel, ramdisk, second) at 769ace3fc8SSebastian Siewior * the specified physical address (kernel_addr, etc) 779ace3fc8SSebastian Siewior * 4. prepare tags at tag_addr. kernel_args[] is 789ace3fc8SSebastian Siewior * appended to the kernel commandline in the tags. 799ace3fc8SSebastian Siewior * 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 809ace3fc8SSebastian Siewior * 6. if second_size != 0: jump to second_addr 819ace3fc8SSebastian Siewior * else: jump to kernel_addr 829ace3fc8SSebastian Siewior */ 839ace3fc8SSebastian Siewior #endif 84