Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ed3f1a58 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Modify mkbootimg.py to support boot image header version 2"

parents c98b1efd ad518bd4
Loading
Loading
Loading
Loading
+11 −3
Original line number Original line Diff line number Diff line
@@ -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:
 *
 *
 * +---------------------+
 * +---------------------+
@@ -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
@@ -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));
+11 −0
Original line number Original line Diff line number Diff line
@@ -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())


@@ -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


@@ -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',
@@ -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',
@@ -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()

mkbootimg/unpack_bootimg.py

100644 → 100755
+19 −2
Original line number Original line Diff line number Diff line
@@ -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
@@ -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
@@ -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,
@@ -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',