1*9ace3fc8SSebastian Siewior /* 2*9ace3fc8SSebastian Siewior * This is from the Android Project, 3*9ace3fc8SSebastian Siewior * Repository: https://android.googlesource.com/platform/bootable/bootloader/legacy 4*9ace3fc8SSebastian Siewior * File: include/boot/bootimg.h 5*9ace3fc8SSebastian Siewior * Commit: 4205b865141ff2e255fe1d3bd16de18e217ef06a 6*9ace3fc8SSebastian Siewior * 7*9ace3fc8SSebastian Siewior * Copyright (C) 2008 The Android Open Source Project 8*9ace3fc8SSebastian Siewior * 9*9ace3fc8SSebastian Siewior * SPDX-License-Identifier: BSD-2-Clause 10*9ace3fc8SSebastian Siewior */ 11*9ace3fc8SSebastian Siewior 12*9ace3fc8SSebastian Siewior #ifndef _ANDROID_IMAGE_H_ 13*9ace3fc8SSebastian Siewior #define _ANDROID_IMAGE_H_ 14*9ace3fc8SSebastian Siewior 15*9ace3fc8SSebastian Siewior #define ANDR_BOOT_MAGIC "ANDROID!" 16*9ace3fc8SSebastian Siewior #define ANDR_BOOT_MAGIC_SIZE 8 17*9ace3fc8SSebastian Siewior #define ANDR_BOOT_NAME_SIZE 16 18*9ace3fc8SSebastian Siewior #define ANDR_BOOT_ARGS_SIZE 512 19*9ace3fc8SSebastian Siewior 20*9ace3fc8SSebastian Siewior struct andr_img_hdr { 21*9ace3fc8SSebastian Siewior char magic[ANDR_BOOT_MAGIC_SIZE]; 22*9ace3fc8SSebastian Siewior 23*9ace3fc8SSebastian Siewior u32 kernel_size; /* size in bytes */ 24*9ace3fc8SSebastian Siewior u32 kernel_addr; /* physical load addr */ 25*9ace3fc8SSebastian Siewior 26*9ace3fc8SSebastian Siewior u32 ramdisk_size; /* size in bytes */ 27*9ace3fc8SSebastian Siewior u32 ramdisk_addr; /* physical load addr */ 28*9ace3fc8SSebastian Siewior 29*9ace3fc8SSebastian Siewior u32 second_size; /* size in bytes */ 30*9ace3fc8SSebastian Siewior u32 second_addr; /* physical load addr */ 31*9ace3fc8SSebastian Siewior 32*9ace3fc8SSebastian Siewior u32 tags_addr; /* physical addr for kernel tags */ 33*9ace3fc8SSebastian Siewior u32 page_size; /* flash page size we assume */ 34*9ace3fc8SSebastian Siewior u32 unused[2]; /* future expansion: should be 0 */ 35*9ace3fc8SSebastian Siewior 36*9ace3fc8SSebastian Siewior char name[ANDR_BOOT_NAME_SIZE]; /* asciiz product name */ 37*9ace3fc8SSebastian Siewior 38*9ace3fc8SSebastian Siewior char cmdline[ANDR_BOOT_ARGS_SIZE]; 39*9ace3fc8SSebastian Siewior 40*9ace3fc8SSebastian Siewior u32 id[8]; /* timestamp / checksum / sha1 / etc */ 41*9ace3fc8SSebastian Siewior }; 42*9ace3fc8SSebastian Siewior 43*9ace3fc8SSebastian Siewior /* 44*9ace3fc8SSebastian Siewior * +-----------------+ 45*9ace3fc8SSebastian Siewior * | boot header | 1 page 46*9ace3fc8SSebastian Siewior * +-----------------+ 47*9ace3fc8SSebastian Siewior * | kernel | n pages 48*9ace3fc8SSebastian Siewior * +-----------------+ 49*9ace3fc8SSebastian Siewior * | ramdisk | m pages 50*9ace3fc8SSebastian Siewior * +-----------------+ 51*9ace3fc8SSebastian Siewior * | second stage | o pages 52*9ace3fc8SSebastian Siewior * +-----------------+ 53*9ace3fc8SSebastian Siewior * 54*9ace3fc8SSebastian Siewior * n = (kernel_size + page_size - 1) / page_size 55*9ace3fc8SSebastian Siewior * m = (ramdisk_size + page_size - 1) / page_size 56*9ace3fc8SSebastian Siewior * o = (second_size + page_size - 1) / page_size 57*9ace3fc8SSebastian Siewior * 58*9ace3fc8SSebastian Siewior * 0. all entities are page_size aligned in flash 59*9ace3fc8SSebastian Siewior * 1. kernel and ramdisk are required (size != 0) 60*9ace3fc8SSebastian Siewior * 2. second is optional (second_size == 0 -> no second) 61*9ace3fc8SSebastian Siewior * 3. load each element (kernel, ramdisk, second) at 62*9ace3fc8SSebastian Siewior * the specified physical address (kernel_addr, etc) 63*9ace3fc8SSebastian Siewior * 4. prepare tags at tag_addr. kernel_args[] is 64*9ace3fc8SSebastian Siewior * appended to the kernel commandline in the tags. 65*9ace3fc8SSebastian Siewior * 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr 66*9ace3fc8SSebastian Siewior * 6. if second_size != 0: jump to second_addr 67*9ace3fc8SSebastian Siewior * else: jump to kernel_addr 68*9ace3fc8SSebastian Siewior */ 69*9ace3fc8SSebastian Siewior #endif 70