All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kever Yang <kever.yang@rock-chips.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 1/2] rockchip: make_fit_atf.py: Eliminate pyelftools dependency
Date: Wed, 17 Jul 2019 18:47:07 +0800	[thread overview]
Message-ID: <5667c7e0-7b16-f4ae-40a8-0f4b4c00ecdd@rock-chips.com> (raw)
In-Reply-To: <20190716195256.GB10526@arachsys.com>


On 2019/7/17 上午3:52, Chris Webb wrote:
> make_fit_aft.py depends on the non-standard library pyelftools to pull
> out PT_LOAD segments from ELF files. However, this is as easy to do
> manually, without imposing the extra dependency on users.
>
> Structures in the ELF file are unpacked into variables named to exactly
> match the ELF spec to ensure the destructuring code is reasonably
> self-documenting.
>
> Signed-off-by: Chris Webb <chris@arachsys.com>


Reviewed-by: Kever Yang <Kever.yang@rock-chips.com>

Thanks,
  - Kever
> ---
>   arch/arm/mach-rockchip/make_fit_atf.py | 75 +++++++++++---------------
>   1 file changed, 32 insertions(+), 43 deletions(-)
>
> diff --git a/arch/arm/mach-rockchip/make_fit_atf.py b/arch/arm/mach-rockchip/make_fit_atf.py
> index db0ae96ca8..b9a1988298 100755
> --- a/arch/arm/mach-rockchip/make_fit_atf.py
> +++ b/arch/arm/mach-rockchip/make_fit_atf.py
> @@ -13,16 +13,7 @@ import os
>   import sys
>   import getopt
>   import logging
> -
> -# pip install pyelftools
> -from elftools.elf.elffile import ELFFile
> -
> -ELF_SEG_P_TYPE = 'p_type'
> -ELF_SEG_P_PADDR = 'p_paddr'
> -ELF_SEG_P_VADDR = 'p_vaddr'
> -ELF_SEG_P_OFFSET = 'p_offset'
> -ELF_SEG_P_FILESZ = 'p_filesz'
> -ELF_SEG_P_MEMSZ = 'p_memsz'
> +import struct
>   
>   DT_HEADER = """
>   /*
> @@ -118,33 +109,19 @@ def append_conf_node(file, dtbs, segments):
>       file.write('\n')
>   
>   def generate_atf_fit_dts_uboot(fit_file, uboot_file_name):
> -    num_load_seg = 0
> -    p_paddr = 0xFFFFFFFF
> -    with open(uboot_file_name, 'rb') as uboot_file:
> -        uboot = ELFFile(uboot_file)
> -        for i in range(uboot.num_segments()):
> -            seg = uboot.get_segment(i)
> -            if seg.__getitem__(ELF_SEG_P_TYPE) == 'PT_LOAD':
> -                p_paddr = seg.__getitem__(ELF_SEG_P_PADDR)
> -                num_load_seg = num_load_seg + 1
> -
> -    assert (p_paddr != 0xFFFFFFFF and num_load_seg == 1)
> -
> +    segments = unpack_elf(uboot_file_name)
> +    if len(segments) != 1:
> +        raise ValueError("Invalid u-boot ELF image '%s'" % uboot_file_name)
> +    index, entry, p_paddr, data = segments[0]
>       fit_file.write(DT_UBOOT % p_paddr)
>   
>   def generate_atf_fit_dts_bl31(fit_file, bl31_file_name, dtbs_file_name):
> -    with open(bl31_file_name, 'rb') as bl31_file:
> -        bl31 = ELFFile(bl31_file)
> -        elf_entry = bl31.header['e_entry']
> -        segments = bl31.num_segments()
> -        for i in range(segments):
> -            seg = bl31.get_segment(i)
> -            if seg.__getitem__(ELF_SEG_P_TYPE) == 'PT_LOAD':
> -                paddr = seg.__getitem__(ELF_SEG_P_PADDR)
> -                append_bl31_node(fit_file, i + 1, paddr, elf_entry)
> +    segments = unpack_elf(bl31_file_name)
> +    for index, entry, paddr, data in segments:
> +        append_bl31_node(fit_file, index + 1, paddr, entry)
>       append_fdt_node(fit_file, dtbs_file_name)
>       fit_file.write(DT_IMAGES_NODE_END)
> -    append_conf_node(fit_file, dtbs_file_name, segments)
> +    append_conf_node(fit_file, dtbs_file_name, len(segments))
>   
>   def generate_atf_fit_dts(fit_file_name, bl31_file_name, uboot_file_name, dtbs_file_name):
>       # Generate FIT script for ATF image.
> @@ -162,17 +139,29 @@ def generate_atf_fit_dts(fit_file_name, bl31_file_name, uboot_file_name, dtbs_fi
>           fit_file.close()
>   
>   def generate_atf_binary(bl31_file_name):
> -    with open(bl31_file_name, 'rb') as bl31_file:
> -        bl31 = ELFFile(bl31_file)
> -
> -        num = bl31.num_segments()
> -        for i in range(num):
> -            seg = bl31.get_segment(i)
> -            if seg.__getitem__(ELF_SEG_P_TYPE) == 'PT_LOAD':
> -                paddr = seg.__getitem__(ELF_SEG_P_PADDR)
> -                file_name = 'bl31_0x%08x.bin' % paddr
> -                with open(file_name, "wb") as atf:
> -                    atf.write(seg.data())
> +    for index, entry, paddr, data in unpack_elf(bl31_file_name):
> +        file_name = 'bl31_0x%08x.bin' % paddr
> +        with open(file_name, "wb") as atf:
> +            atf.write(data)
> +
> +def unpack_elf(filename):
> +    with open(filename, 'rb') as file:
> +        elf = file.read()
> +    if elf[0:7] != b'\x7fELF\x02\x01\x01' or elf[18:20] != b'\xb7\x00':
> +        raise ValueError("Invalid arm64 ELF file '%s'" % filename)
> +
> +    e_entry, e_phoff = struct.unpack_from('<2Q', elf, 0x18)
> +    e_phentsize, e_phnum = struct.unpack_from('<2H', elf, 0x36)
> +    segments = []
> +
> +    for index in range(e_phnum):
> +        offset = e_phoff + e_phentsize * index
> +        p_type, p_flags, p_offset = struct.unpack_from('<LLQ', elf, offset)
> +        if p_type == 1: # PT_LOAD
> +            p_paddr, p_filesz = struct.unpack_from('<2Q', elf, offset + 0x18)
> +            p_data = elf[p_offset:p_offset + p_filesz]
> +            segments.append((index, e_entry, p_paddr, p_data))
> +    return segments
>   
>   def main():
>       uboot_elf = "./u-boot"

  parent reply	other threads:[~2019-07-17 10:47 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-16 19:51 [U-Boot] [PATCH v3 0/2] rockchip: make_fit_atf.py Eliminate pyelftools dependency Chris Webb
2019-07-16 19:52 ` [U-Boot] [PATCH v3 1/2] rockchip: make_fit_atf.py: " Chris Webb
2019-07-17  1:08   ` Andy Yan
2019-07-17 10:47   ` Kever Yang [this message]
2019-07-23  8:04     ` [U-Boot] [PATCH v3 1/2] rockchip: make_fit_atf.py: Eliminate pyelftools dependency【请注意,邮件由u-boot-bounces@lists.denx.de代发】 Kever Yang
2019-07-16 19:53 ` [U-Boot] [PATCH v3 2/2] rockchip: Remove obsolete references to pyelftools Chris Webb
2019-07-17 10:39   ` Kever Yang
2019-07-23  8:04     ` [U-Boot] [PATCH v3 2/2] rockchip: Remove obsolete references to pyelftools【请注意,邮件由u-boot-bounces@lists.denx.de代发】 pyelftools Kever Yang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5667c7e0-7b16-f4ae-40a8-0f4b4c00ecdd@rock-chips.com \
    --to=kever.yang@rock-chips.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.