Loading mkbootimg/include/bootimg/bootimg.h +11 −3 Original line number Original line Diff line number Diff line Loading @@ -115,7 +115,7 @@ struct boot_img_hdr_v1 : public boot_img_hdr_v0 { uint32_t header_size; uint32_t header_size; } __attribute__((packed)); } __attribute__((packed)); /* When the boot image header has a version of 1, the structure of the boot /* When the boot image header has a version of 2, the structure of the boot * image is as follows: * image is as follows: * * * +---------------------+ * +---------------------+ Loading @@ -129,17 +129,21 @@ struct boot_img_hdr_v1 : public boot_img_hdr_v0 { * +---------------------+ * +---------------------+ * | recovery dtbo/acpio | p pages * | recovery dtbo/acpio | p pages * +---------------------+ * +---------------------+ * | dtb | q pages * +---------------------+ * n = (kernel_size + page_size - 1) / page_size * n = (kernel_size + page_size - 1) / page_size * m = (ramdisk_size + page_size - 1) / page_size * m = (ramdisk_size + page_size - 1) / page_size * o = (second_size + page_size - 1) / page_size * o = (second_size + page_size - 1) / page_size * p = (recovery_dtbo_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 * 0. all entities are page_size aligned in flash * 1. kernel and ramdisk are required (size != 0) * 1. kernel, ramdisk and DTB are required (size != 0) * 2. recovery_dtbo/recovery_acpio is required for recovery.img in non-A/B * 2. recovery_dtbo/recovery_acpio is required for recovery.img in non-A/B * devices(recovery_dtbo_size != 0) * devices(recovery_dtbo_size != 0) * 3. second is optional (second_size == 0 -> no second) * 3. second is optional (second_size == 0 -> no second) * 4. load each element (kernel, ramdisk, second) at * 4. load each element (kernel, ramdisk, second, dtb) at * the specified physical address (kernel_addr, etc) * the specified physical address (kernel_addr, etc) * 5. If booting to recovery mode in a non-A/B device, extract recovery * 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 * dtbo/acpio and apply the correct set of overlays on the base device tree Loading @@ -150,3 +154,7 @@ struct boot_img_hdr_v1 : public boot_img_hdr_v0 { * 8. if second_size != 0: jump to second_addr * 8. if second_size != 0: jump to second_addr * else: jump to kernel_addr * else: jump to kernel_addr */ */ struct boot_img_hdr_v2 : public boot_img_hdr_v1 { uint32_t dtb_size; /* size in bytes for DTB image */ uint64_t dtb_addr; /* physical load address for DTB image */ } __attribute__((packed)); mkbootimg/mkbootimg.py +11 −0 Original line number Original line Diff line number Diff line Loading @@ -85,6 +85,8 @@ def write_header(args): if args.header_version > 0: if args.header_version > 0: update_sha(sha, args.recovery_dtbo) update_sha(sha, args.recovery_dtbo) if args.header_version > 1: update_sha(sha, args.dtb) img_id = pack('32s', sha.digest()) img_id = pack('32s', sha.digest()) Loading @@ -99,6 +101,10 @@ def write_header(args): args.output.write(pack('Q', 0)) # Will be set to 0 for devices without a recovery dtbo args.output.write(pack('Q', 0)) # Will be set to 0 for devices without a recovery dtbo args.output.write(pack('I', args.output.tell() + 4)) # size of boot header args.output.write(pack('I', args.output.tell() + 4)) # size of boot header if args.header_version > 1: args.output.write(pack('I', filesize(args.dtb))) # size in bytes args.output.write(pack('Q', args.base + args.dtb_offset)) # dtb physical load address pad_file(args.output, args.pagesize) pad_file(args.output, args.pagesize) return img_id return img_id Loading Loading @@ -161,6 +167,7 @@ def parse_cmdline(): required=True) required=True) parser.add_argument('--ramdisk', help='path to the ramdisk', type=FileType('rb')) parser.add_argument('--ramdisk', help='path to the ramdisk', type=FileType('rb')) parser.add_argument('--second', help='path to the 2nd bootloader', type=FileType('rb')) parser.add_argument('--second', help='path to the 2nd bootloader', type=FileType('rb')) parser.add_argument('--dtb', help='path to dtb', type=FileType('rb')) recovery_dtbo_group = parser.add_mutually_exclusive_group() recovery_dtbo_group = parser.add_mutually_exclusive_group() recovery_dtbo_group.add_argument('--recovery_dtbo', help='path to the recovery DTBO', type=FileType('rb')) recovery_dtbo_group.add_argument('--recovery_dtbo', help='path to the recovery DTBO', type=FileType('rb')) recovery_dtbo_group.add_argument('--recovery_acpio', help='path to the recovery ACPIO', recovery_dtbo_group.add_argument('--recovery_acpio', help='path to the recovery ACPIO', Loading @@ -172,6 +179,8 @@ def parse_cmdline(): parser.add_argument('--ramdisk_offset', help='ramdisk offset', type=parse_int, default=0x01000000) parser.add_argument('--ramdisk_offset', help='ramdisk offset', type=parse_int, default=0x01000000) parser.add_argument('--second_offset', help='2nd bootloader offset', type=parse_int, parser.add_argument('--second_offset', help='2nd bootloader offset', type=parse_int, default=0x00f00000) default=0x00f00000) parser.add_argument('--dtb_offset', help='dtb offset', type=parse_int, default=0x01f00000) parser.add_argument('--os_version', help='operating system version', type=parse_os_version, parser.add_argument('--os_version', help='operating system version', type=parse_os_version, default=0) default=0) parser.add_argument('--os_patch_level', help='operating system patch level', parser.add_argument('--os_patch_level', help='operating system patch level', Loading @@ -196,6 +205,8 @@ def write_data(args): if args.header_version > 0: if args.header_version > 0: write_padded_file(args.output, args.recovery_dtbo, args.pagesize) write_padded_file(args.output, args.recovery_dtbo, args.pagesize) if args.header_version > 1: write_padded_file(args.output, args.dtb, args.pagesize) def main(): def main(): args = parse_cmdline() args = parse_cmdline() Loading mkbootimg/unpack_bootimg.py 100644 → 100755 +19 −2 Original line number Original line Diff line number Diff line Loading @@ -15,7 +15,7 @@ """unpacks the bootimage. """unpacks the bootimage. Extracts the kernel, ramdisk, second bootloader and recovery dtbo images. Extracts the kernel, ramdisk, second bootloader, dtb and recovery dtbo images. """ """ from __future__ import print_function from __future__ import print_function Loading Loading @@ -82,6 +82,14 @@ def unpack_bootimage(args): print('boot header size: %s' % boot_header_size) print('boot header size: %s' % boot_header_size) else: else: recovery_dtbo_size = 0 recovery_dtbo_size = 0 if version > 1: dtb_size = unpack('I', args.boot_img.read(4))[0] print('dtb size: %s' % dtb_size) dtb_load_address = unpack('Q', args.boot_img.read(8))[0] print('dtb address: %s' % dtb_load_address) else: dtb_size = 0 # The first page contains the boot header # The first page contains the boot header num_header_pages = 1 num_header_pages = 1 Loading @@ -103,6 +111,15 @@ def unpack_bootimage(args): if recovery_dtbo_size > 0: if recovery_dtbo_size > 0: image_info_list.append((recovery_dtbo_offset, recovery_dtbo_size, image_info_list.append((recovery_dtbo_offset, recovery_dtbo_size, 'recovery_dtbo')) 'recovery_dtbo')) if dtb_size > 0: num_second_pages = get_number_of_pages(second_size, page_size) num_recovery_dtbo_pages = get_number_of_pages(recovery_dtbo_size, page_size) dtb_offset = page_size * ( num_header_pages + num_kernel_pages + num_ramdisk_pages + num_second_pages + num_recovery_dtbo_pages ) image_info_list.append((dtb_offset, dtb_size, 'dtb')) for image_info in image_info_list: for image_info in image_info_list: extract_image(image_info[0], image_info[1], args.boot_img, extract_image(image_info[0], image_info[1], args.boot_img, Loading @@ -113,7 +130,7 @@ def parse_cmdline(): """parse command line arguments""" """parse command line arguments""" parser = ArgumentParser( parser = ArgumentParser( description='Unpacks boot.img/recovery.img, extracts the kernel,' description='Unpacks boot.img/recovery.img, extracts the kernel,' 'ramdisk, second bootloader and recovery dtbo') 'ramdisk, second bootloader, recovery dtbo and dtb') parser.add_argument( parser.add_argument( '--boot_img', '--boot_img', help='path to boot image', help='path to boot image', Loading Loading
mkbootimg/include/bootimg/bootimg.h +11 −3 Original line number Original line Diff line number Diff line Loading @@ -115,7 +115,7 @@ struct boot_img_hdr_v1 : public boot_img_hdr_v0 { uint32_t header_size; uint32_t header_size; } __attribute__((packed)); } __attribute__((packed)); /* When the boot image header has a version of 1, the structure of the boot /* When the boot image header has a version of 2, the structure of the boot * image is as follows: * image is as follows: * * * +---------------------+ * +---------------------+ Loading @@ -129,17 +129,21 @@ struct boot_img_hdr_v1 : public boot_img_hdr_v0 { * +---------------------+ * +---------------------+ * | recovery dtbo/acpio | p pages * | recovery dtbo/acpio | p pages * +---------------------+ * +---------------------+ * | dtb | q pages * +---------------------+ * n = (kernel_size + page_size - 1) / page_size * n = (kernel_size + page_size - 1) / page_size * m = (ramdisk_size + page_size - 1) / page_size * m = (ramdisk_size + page_size - 1) / page_size * o = (second_size + page_size - 1) / page_size * o = (second_size + page_size - 1) / page_size * p = (recovery_dtbo_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 * 0. all entities are page_size aligned in flash * 1. kernel and ramdisk are required (size != 0) * 1. kernel, ramdisk and DTB are required (size != 0) * 2. recovery_dtbo/recovery_acpio is required for recovery.img in non-A/B * 2. recovery_dtbo/recovery_acpio is required for recovery.img in non-A/B * devices(recovery_dtbo_size != 0) * devices(recovery_dtbo_size != 0) * 3. second is optional (second_size == 0 -> no second) * 3. second is optional (second_size == 0 -> no second) * 4. load each element (kernel, ramdisk, second) at * 4. load each element (kernel, ramdisk, second, dtb) at * the specified physical address (kernel_addr, etc) * the specified physical address (kernel_addr, etc) * 5. If booting to recovery mode in a non-A/B device, extract recovery * 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 * dtbo/acpio and apply the correct set of overlays on the base device tree Loading @@ -150,3 +154,7 @@ struct boot_img_hdr_v1 : public boot_img_hdr_v0 { * 8. if second_size != 0: jump to second_addr * 8. if second_size != 0: jump to second_addr * else: jump to kernel_addr * else: jump to kernel_addr */ */ struct boot_img_hdr_v2 : public boot_img_hdr_v1 { uint32_t dtb_size; /* size in bytes for DTB image */ uint64_t dtb_addr; /* physical load address for DTB image */ } __attribute__((packed));
mkbootimg/mkbootimg.py +11 −0 Original line number Original line Diff line number Diff line Loading @@ -85,6 +85,8 @@ def write_header(args): if args.header_version > 0: if args.header_version > 0: update_sha(sha, args.recovery_dtbo) update_sha(sha, args.recovery_dtbo) if args.header_version > 1: update_sha(sha, args.dtb) img_id = pack('32s', sha.digest()) img_id = pack('32s', sha.digest()) Loading @@ -99,6 +101,10 @@ def write_header(args): args.output.write(pack('Q', 0)) # Will be set to 0 for devices without a recovery dtbo args.output.write(pack('Q', 0)) # Will be set to 0 for devices without a recovery dtbo args.output.write(pack('I', args.output.tell() + 4)) # size of boot header args.output.write(pack('I', args.output.tell() + 4)) # size of boot header if args.header_version > 1: args.output.write(pack('I', filesize(args.dtb))) # size in bytes args.output.write(pack('Q', args.base + args.dtb_offset)) # dtb physical load address pad_file(args.output, args.pagesize) pad_file(args.output, args.pagesize) return img_id return img_id Loading Loading @@ -161,6 +167,7 @@ def parse_cmdline(): required=True) required=True) parser.add_argument('--ramdisk', help='path to the ramdisk', type=FileType('rb')) parser.add_argument('--ramdisk', help='path to the ramdisk', type=FileType('rb')) parser.add_argument('--second', help='path to the 2nd bootloader', type=FileType('rb')) parser.add_argument('--second', help='path to the 2nd bootloader', type=FileType('rb')) parser.add_argument('--dtb', help='path to dtb', type=FileType('rb')) recovery_dtbo_group = parser.add_mutually_exclusive_group() recovery_dtbo_group = parser.add_mutually_exclusive_group() recovery_dtbo_group.add_argument('--recovery_dtbo', help='path to the recovery DTBO', type=FileType('rb')) recovery_dtbo_group.add_argument('--recovery_dtbo', help='path to the recovery DTBO', type=FileType('rb')) recovery_dtbo_group.add_argument('--recovery_acpio', help='path to the recovery ACPIO', recovery_dtbo_group.add_argument('--recovery_acpio', help='path to the recovery ACPIO', Loading @@ -172,6 +179,8 @@ def parse_cmdline(): parser.add_argument('--ramdisk_offset', help='ramdisk offset', type=parse_int, default=0x01000000) parser.add_argument('--ramdisk_offset', help='ramdisk offset', type=parse_int, default=0x01000000) parser.add_argument('--second_offset', help='2nd bootloader offset', type=parse_int, parser.add_argument('--second_offset', help='2nd bootloader offset', type=parse_int, default=0x00f00000) default=0x00f00000) parser.add_argument('--dtb_offset', help='dtb offset', type=parse_int, default=0x01f00000) parser.add_argument('--os_version', help='operating system version', type=parse_os_version, parser.add_argument('--os_version', help='operating system version', type=parse_os_version, default=0) default=0) parser.add_argument('--os_patch_level', help='operating system patch level', parser.add_argument('--os_patch_level', help='operating system patch level', Loading @@ -196,6 +205,8 @@ def write_data(args): if args.header_version > 0: if args.header_version > 0: write_padded_file(args.output, args.recovery_dtbo, args.pagesize) write_padded_file(args.output, args.recovery_dtbo, args.pagesize) if args.header_version > 1: write_padded_file(args.output, args.dtb, args.pagesize) def main(): def main(): args = parse_cmdline() args = parse_cmdline() Loading
mkbootimg/unpack_bootimg.py 100644 → 100755 +19 −2 Original line number Original line Diff line number Diff line Loading @@ -15,7 +15,7 @@ """unpacks the bootimage. """unpacks the bootimage. Extracts the kernel, ramdisk, second bootloader and recovery dtbo images. Extracts the kernel, ramdisk, second bootloader, dtb and recovery dtbo images. """ """ from __future__ import print_function from __future__ import print_function Loading Loading @@ -82,6 +82,14 @@ def unpack_bootimage(args): print('boot header size: %s' % boot_header_size) print('boot header size: %s' % boot_header_size) else: else: recovery_dtbo_size = 0 recovery_dtbo_size = 0 if version > 1: dtb_size = unpack('I', args.boot_img.read(4))[0] print('dtb size: %s' % dtb_size) dtb_load_address = unpack('Q', args.boot_img.read(8))[0] print('dtb address: %s' % dtb_load_address) else: dtb_size = 0 # The first page contains the boot header # The first page contains the boot header num_header_pages = 1 num_header_pages = 1 Loading @@ -103,6 +111,15 @@ def unpack_bootimage(args): if recovery_dtbo_size > 0: if recovery_dtbo_size > 0: image_info_list.append((recovery_dtbo_offset, recovery_dtbo_size, image_info_list.append((recovery_dtbo_offset, recovery_dtbo_size, 'recovery_dtbo')) 'recovery_dtbo')) if dtb_size > 0: num_second_pages = get_number_of_pages(second_size, page_size) num_recovery_dtbo_pages = get_number_of_pages(recovery_dtbo_size, page_size) dtb_offset = page_size * ( num_header_pages + num_kernel_pages + num_ramdisk_pages + num_second_pages + num_recovery_dtbo_pages ) image_info_list.append((dtb_offset, dtb_size, 'dtb')) for image_info in image_info_list: for image_info in image_info_list: extract_image(image_info[0], image_info[1], args.boot_img, extract_image(image_info[0], image_info[1], args.boot_img, Loading @@ -113,7 +130,7 @@ def parse_cmdline(): """parse command line arguments""" """parse command line arguments""" parser = ArgumentParser( parser = ArgumentParser( description='Unpacks boot.img/recovery.img, extracts the kernel,' description='Unpacks boot.img/recovery.img, extracts the kernel,' 'ramdisk, second bootloader and recovery dtbo') 'ramdisk, second bootloader, recovery dtbo and dtb') parser.add_argument( parser.add_argument( '--boot_img', '--boot_img', help='path to boot image', help='path to boot image', Loading