Blame view

include/android_image.h 9.38 KB
0b6febfdb   Alex Deymo   Update include/an...
1
  /* SPDX-License-Identifier: BSD-3-Clause */
9ace3fc81   Sebastian Siewior   image: add suppor...
2
3
  /*
   * This is from the Android Project,
0b6febfdb   Alex Deymo   Update include/an...
4
5
6
   * Repository: https://android.googlesource.com/platform/system/tools/mkbootimg
   * File: include/bootimg/bootimg.h
   * Commit: e55998a0f2b61b685d5eb4a486ca3a0c680b1a2f
9ace3fc81   Sebastian Siewior   image: add suppor...
7
   *
0b6febfdb   Alex Deymo   Update include/an...
8
   * Copyright (C) 2007 The Android Open Source Project
9ace3fc81   Sebastian Siewior   image: add suppor...
9
10
11
12
   */
  
  #ifndef _ANDROID_IMAGE_H_
  #define _ANDROID_IMAGE_H_
35e99836c   Sam Protsenko   image: android: F...
13
14
  #include <linux/compiler.h>
  #include <linux/types.h>
9ace3fc81   Sebastian Siewior   image: add suppor...
15
16
17
18
  #define ANDR_BOOT_MAGIC "ANDROID!"
  #define ANDR_BOOT_MAGIC_SIZE 8
  #define ANDR_BOOT_NAME_SIZE 16
  #define ANDR_BOOT_ARGS_SIZE 512
210a7176e   Alex Deymo   image: Update inc...
19
  #define ANDR_BOOT_EXTRA_ARGS_SIZE 1024
9ace3fc81   Sebastian Siewior   image: add suppor...
20

c3854f270   Ji Luo   MA-17260 Add vend...
21
22
23
24
  #define ANDR_VENDOR_BOOT_MAGIC "VNDRBOOT"
  #define ANDR_VENDOR_BOOT_MAGIC_SIZE 8
  #define ANDR_VENDOR_BOOT_ARGS_SIZE 2048
  #define ANDR_VENDOR_BOOT_NAME_SIZE 16
0b6febfdb   Alex Deymo   Update include/an...
25
26
  /* The bootloader expects the structure of andr_img_hdr with header
   * version 0 to be as follows: */
9f99e9de1   Ye Li   MLK-18591-3 andro...
27
28
29
30
31
32
33
34
35
36
37
38
  /* Boot metric variables (in millisecond) */
  struct boot_metric
  {
  	u32 bll_1;	/* 1th bootloader load duration */
  	u32 ble_1;	/* 1th bootloader exec duration */
  	u32 kl;		/* kernel image load duration */
  	u32 kd;		/* kernel image decompress duration */
  	u32 avb;	/* avb verify boot.img duration */
  	u32 odt;	/* overlay device tree duration */
  	u32 sw;		/* system wait for UI interaction duration*/
  };
  typedef struct boot_metric boot_metric;
9ace3fc81   Sebastian Siewior   image: add suppor...
39
  struct andr_img_hdr {
0b6febfdb   Alex Deymo   Update include/an...
40
41
      /* Must be ANDR_BOOT_MAGIC. */
      char magic[ANDR_BOOT_MAGIC_SIZE];
9ace3fc81   Sebastian Siewior   image: add suppor...
42

0b6febfdb   Alex Deymo   Update include/an...
43
44
      u32 kernel_size; /* size in bytes */
      u32 kernel_addr; /* physical load addr */
9ace3fc81   Sebastian Siewior   image: add suppor...
45

0b6febfdb   Alex Deymo   Update include/an...
46
47
      u32 ramdisk_size; /* size in bytes */
      u32 ramdisk_addr; /* physical load addr */
9ace3fc81   Sebastian Siewior   image: add suppor...
48

0b6febfdb   Alex Deymo   Update include/an...
49
50
      u32 second_size; /* size in bytes */
      u32 second_addr; /* physical load addr */
9ace3fc81   Sebastian Siewior   image: add suppor...
51

0b6febfdb   Alex Deymo   Update include/an...
52
53
      u32 tags_addr; /* physical addr for kernel tags */
      u32 page_size; /* flash page size we assume */
210a7176e   Alex Deymo   image: Update inc...
54

0b6febfdb   Alex Deymo   Update include/an...
55
56
      /* Version of the boot image header. */
      u32 header_version;
9ace3fc81   Sebastian Siewior   image: add suppor...
57

0b6febfdb   Alex Deymo   Update include/an...
58
59
60
61
62
      /* Operating system version and security patch level.
       * For version "A.B.C" and patch level "Y-M-D":
       *   (7 bits for each of A, B, C; 7 bits for (Y-2000), 4 bits for M)
       *   os_version = A[31:25] B[24:18] C[17:11] (Y-2000)[10:4] M[3:0] */
      u32 os_version;
9ace3fc81   Sebastian Siewior   image: add suppor...
63

0b6febfdb   Alex Deymo   Update include/an...
64
      char name[ANDR_BOOT_NAME_SIZE]; /* asciiz product name */
9ace3fc81   Sebastian Siewior   image: add suppor...
65

0b6febfdb   Alex Deymo   Update include/an...
66
      char cmdline[ANDR_BOOT_ARGS_SIZE];
210a7176e   Alex Deymo   image: Update inc...
67

0b6febfdb   Alex Deymo   Update include/an...
68
69
70
71
72
73
74
75
76
77
78
79
80
81
      u32 id[8]; /* timestamp / checksum / sha1 / etc */
  
      /* Supplemental command line data; kept here to maintain
       * binary compatibility with older versions of mkbootimg. */
      char extra_cmdline[ANDR_BOOT_EXTRA_ARGS_SIZE];
  
      /* Fields in boot_img_hdr_v1 and newer. */
      u32 recovery_dtbo_size;   /* size in bytes for recovery DTBO/ACPIO image */
      u64 recovery_dtbo_offset; /* offset to recovery dtbo/acpio in boot image */
      u32 header_size;
  
      /* Fields in boot_img_hdr_v2 and newer. */
      u32 dtb_size; /* size in bytes for DTB image */
      u64 dtb_addr; /* physical load address for DTB image */
210a7176e   Alex Deymo   image: Update inc...
82
  } __attribute__((packed));
9ace3fc81   Sebastian Siewior   image: add suppor...
83

c3854f270   Ji Luo   MA-17260 Add vend...
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
  struct boot_img_hdr_v3 {
      // Must be BOOT_MAGIC.
      uint8_t magic[ANDR_BOOT_MAGIC_SIZE];
  
      uint32_t kernel_size; /* size in bytes */
      uint32_t ramdisk_size; /* size in bytes */
  
      // Operating system version and security patch level.
      // For version "A.B.C" and patch level "Y-M-D":
      //   (7 bits for each of A, B, C; 7 bits for (Y-2000), 4 bits for M)
      //   os_version = A[31:25] B[24:18] C[17:11] (Y-2000)[10:4] M[3:0]
      uint32_t os_version;
  
  #if __cplusplus
      void SetOsVersion(unsigned major, unsigned minor, unsigned patch) {
          os_version &= ((1 << 11) - 1);
          os_version |= (((major & 0x7f) << 25) | ((minor & 0x7f) << 18) | ((patch & 0x7f) << 11));
      }
  
      void SetOsPatchLevel(unsigned year, unsigned month) {
          os_version &= ~((1 << 11) - 1);
          os_version |= (((year - 2000) & 0x7f) << 4) | ((month & 0xf) << 0);
      }
  #endif
  
      uint32_t header_size;
  
      uint32_t reserved[4];
  
      // Version of the boot image header.
      uint32_t header_version;
  
      uint8_t cmdline[ANDR_BOOT_ARGS_SIZE + ANDR_BOOT_EXTRA_ARGS_SIZE];
  } __attribute__((packed));
  
  struct vendor_boot_img_hdr_v3 {
      // Must be ANDR_VENDOR_BOOT_MAGIC.
      uint8_t magic[ANDR_VENDOR_BOOT_MAGIC_SIZE];
  
      // Version of the vendor boot image header.
      uint32_t header_version;
  
      uint32_t page_size; /* flash page size we assume */
  
      uint32_t kernel_addr; /* physical load addr */
      uint32_t ramdisk_addr; /* physical load addr */
  
      uint32_t vendor_ramdisk_size; /* size in bytes */
  
      uint8_t cmdline[ANDR_VENDOR_BOOT_ARGS_SIZE];
  
      uint32_t tags_addr; /* physical addr for kernel tags (if required) */
      uint8_t name[ANDR_VENDOR_BOOT_NAME_SIZE]; /* asciiz product name */
  
      uint32_t header_size;
  
      uint32_t dtb_size; /* size in bytes for DTB image */
      uint64_t dtb_addr; /* physical load address for DTB image */
  } __attribute__((packed));
0b6febfdb   Alex Deymo   Update include/an...
143
144
145
  /* When a boot header is of version 0, the structure of boot image is as
   * follows:
   *
9ace3fc81   Sebastian Siewior   image: add suppor...
146
147
148
   * +-----------------+
   * | boot header     | 1 page
   * +-----------------+
9f99e9de1   Ye Li   MLK-18591-3 andro...
149
   * | kernel          | i pages
9ace3fc81   Sebastian Siewior   image: add suppor...
150
151
152
   * +-----------------+
   * | ramdisk         | m pages
   * +-----------------+
9f99e9de1   Ye Li   MLK-18591-3 andro...
153
154
155
   * | second stage    | n pages
   * +-----------------+
   * | recovery dtbo   | o pages
9ace3fc81   Sebastian Siewior   image: add suppor...
156
157
   * +-----------------+
   *
9f99e9de1   Ye Li   MLK-18591-3 andro...
158
   * i = (kernel_size + page_size - 1) / page_size
9ace3fc81   Sebastian Siewior   image: add suppor...
159
   * m = (ramdisk_size + page_size - 1) / page_size
9f99e9de1   Ye Li   MLK-18591-3 andro...
160
161
   * n = (second_size + page_size - 1) / page_size
   * o = (recovery_dtbo_size + page_size - 1) / page_size
9ace3fc81   Sebastian Siewior   image: add suppor...
162
163
164
165
166
167
168
169
170
171
172
173
   *
   * 0. all entities are page_size aligned in flash
   * 1. kernel and ramdisk are required (size != 0)
   * 2. second is optional (second_size == 0 -> no second)
   * 3. load each element (kernel, ramdisk, second) at
   *    the specified physical address (kernel_addr, etc)
   * 4. prepare tags at tag_addr.  kernel_args[] is
   *    appended to the kernel commandline in the tags.
   * 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
   * 6. if second_size != 0: jump to second_addr
   *    else: jump to kernel_addr
   */
0b6febfdb   Alex Deymo   Update include/an...
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
  
  /* When the boot image header has a version of 2, the structure of the boot
   * image is as follows:
   *
   * +---------------------+
   * | boot header         | 1 page
   * +---------------------+
   * | kernel              | n pages
   * +---------------------+
   * | ramdisk             | m pages
   * +---------------------+
   * | second stage        | o pages
   * +---------------------+
   * | recovery dtbo/acpio | p pages
   * +---------------------+
   * | dtb                 | q pages
   * +---------------------+
35e99836c   Sam Protsenko   image: android: F...
191
   *
0b6febfdb   Alex Deymo   Update include/an...
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
   * n = (kernel_size + page_size - 1) / page_size
   * m = (ramdisk_size + page_size - 1) / page_size
   * o = (second_size + page_size - 1) / page_size
   * p = (recovery_dtbo_size + page_size - 1) / page_size
   * q = (dtb_size + page_size - 1) / page_size
   *
   * 0. all entities are page_size aligned in flash
   * 1. kernel, ramdisk and DTB are required (size != 0)
   * 2. recovery_dtbo/recovery_acpio is required for recovery.img in non-A/B
   *    devices(recovery_dtbo_size != 0)
   * 3. second is optional (second_size == 0 -> no second)
   * 4. load each element (kernel, ramdisk, second, dtb) at
   *    the specified physical address (kernel_addr, etc)
   * 5. If booting to recovery mode in a non-A/B device, extract recovery
   *    dtbo/acpio and apply the correct set of overlays on the base device tree
   *    depending on the hardware/product revision.
   * 6. prepare tags at tag_addr.  kernel_args[] is
   *    appended to the kernel commandline in the tags.
   * 7. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
   * 8. if second_size != 0: jump to second_addr
   *    else: jump to kernel_addr
   */
c3854f270   Ji Luo   MA-17260 Add vend...
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
  /* When the boot image header has a version of 3, the structure of the boot
   * image is as follows:
   *
   * +---------------------+
   * | boot header         | 4096 bytes
   * +---------------------+
   * | kernel              | m pages
   * +---------------------+
   * | ramdisk             | n pages
   * +---------------------+
   *
   * m = (kernel_size + 4096 - 1) / 4096
   * n = (ramdisk_size + 4096 - 1) / 4096
   *
   * Note that in version 3 of the boot image header, page size is fixed at 4096 bytes.
   *
   * The structure of the vendor boot image (introduced with version 3 and
   * required to be present when a v3 boot image is used) is as follows:
   *
   * +---------------------+
   * | vendor boot header  | o pages
   * +---------------------+
   * | vendor ramdisk      | p pages
   * +---------------------+
   * | dtb                 | q pages
   * +---------------------+
  
   * o = (2112 + page_size - 1) / page_size
   * p = (vendor_ramdisk_size + page_size - 1) / page_size
   * q = (dtb_size + page_size - 1) / page_size
   *
   * 0. all entities in the boot image are 4096-byte aligned in flash, all
   *    entities in the vendor boot image are page_size (determined by the vendor
   *    and specified in the vendor boot image header) aligned in flash
   * 1. kernel, ramdisk, vendor ramdisk, and DTB are required (size != 0)
   * 2. load the kernel and DTB at the specified physical address (kernel_addr,
   *    dtb_addr)
   * 3. load the vendor ramdisk at ramdisk_addr
   * 4. load the generic ramdisk immediately following the vendor ramdisk in
   *    memory
   * 5. set up registers for kernel entry as required by your architecture
   * 6. if the platform has a second stage bootloader jump to it (must be
   *    contained outside boot and vendor boot partitions), otherwise
   *    jump to kernel_addr
   */
9f99e9de1   Ye Li   MLK-18591-3 andro...
259
260
261
262
263
264
265
266
267
268
269
270
  struct header_image {
  	uint32_t	code0;		/* Executable code */
  	uint32_t	code1;		/* Executable code */
  	uint64_t	text_offset;	/* Image load offset, LE */
  	uint64_t	image_size;	/* Effective Image size, LE */
  	uint64_t	res1;		/* reserved */
  	uint64_t	res2;		/* reserved */
  	uint64_t	res3;		/* reserved */
  	uint64_t	res4;		/* reserved */
  	uint32_t	magic;		/* Magic number */
  	uint32_t	res5;
  };
9ace3fc81   Sebastian Siewior   image: add suppor...
271
  #endif