* [U-Boot] [PATCH 1/2] rockchip: make_fit_atf.py: Eliminate pyelftools dependency
2019-07-13 12:20 [U-Boot] [PATCH 0/2] rockchip: make_fit_atf.py Eliminate pyelftools dependency Chris Webb
@ 2019-07-13 12:21 ` Chris Webb
2019-07-13 12:22 ` [U-Boot] [PATCH 2/2] rockchip: Remove obsolete references to pyelftools Chris Webb
1 sibling, 0 replies; 4+ messages in thread
From: Chris Webb @ 2019-07-13 12:21 UTC (permalink / raw)
To: u-boot
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>
---
arch/arm/mach-rockchip/make_fit_atf.py | 74 +++++++++++---------------
1 file changed, 31 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..4b0acb8105 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)
+ 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 i, (entry, paddr, data) in enumerate(segments):
+ append_bl31_node(fit_file, i + 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,28 @@ 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 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 offset in range(e_phoff, e_phoff + e_phnum*e_phentsize, e_phentsize):
+ 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((e_entry, p_paddr, p_data))
+ return segments
def main():
uboot_elf = "./u-boot"
^ permalink raw reply related [flat|nested] 4+ messages in thread* [U-Boot] [PATCH 2/2] rockchip: Remove obsolete references to pyelftools
2019-07-13 12:20 [U-Boot] [PATCH 0/2] rockchip: make_fit_atf.py Eliminate pyelftools dependency Chris Webb
2019-07-13 12:21 ` [U-Boot] [PATCH 1/2] rockchip: make_fit_atf.py: " Chris Webb
@ 2019-07-13 12:22 ` Chris Webb
2019-07-13 12:35 ` Chris Webb
1 sibling, 1 reply; 4+ messages in thread
From: Chris Webb @ 2019-07-13 12:22 UTC (permalink / raw)
To: u-boot
make_fit_atf.py no longer requires pyelftools, and nothing else in the
tree requires it either, so remove references to installing it from the
documentation and travis configuration.
Signed-off-by: Chris Webb <chris@arachsys.com>
---
.travis.yml | 1 -
board/rockchip/evb_rk3399/README | 6 ------
board/synopsys/hsdk/README | 7 -------
doc/README.rockchip | 4 ----
4 files changed, 18 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index 6662ca126a..e4e7e653f6 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -50,7 +50,6 @@ install:
- . /tmp/venv/bin/activate
- pip install pytest==2.8.7
- pip install python-subunit
- - pip install pyelftools
- grub-mkimage -o ~/grub_x86.efi -O i386-efi normal echo lsefimmap lsefi lsefisystab efinet tftp minicmd
- grub-mkimage -o ~/grub_x64.efi -O x86_64-efi normal echo lsefimmap lsefi lsefisystab efinet tftp minicmd
- mkdir ~/grub2-arm
diff --git a/board/rockchip/evb_rk3399/README b/board/rockchip/evb_rk3399/README
index 6469821987..ea3258cf37 100644
--- a/board/rockchip/evb_rk3399/README
+++ b/board/rockchip/evb_rk3399/README
@@ -35,12 +35,6 @@ Get the Source and prebuild binary
> git clone https://github.com/rockchip-linux/rkbin.git
> git clone https://github.com/rockchip-linux/rkdeveloptool.git
-Get some prerequisites
-======================
-
-You need the Python elftools.elf.elffile library for make_fit_atf.py to work:
-
- > sudo apt-get install python-pyelftools
Compile ATF
===========
diff --git a/board/synopsys/hsdk/README b/board/synopsys/hsdk/README
index 9155f17c6e..6e7f9a6c3e 100644
--- a/board/synopsys/hsdk/README
+++ b/board/synopsys/hsdk/README
@@ -82,13 +82,6 @@ Useful notes on bulding and using of U-Boot on ARC HS Development Kit (AKA HSDK)
be put on the first FAT partition of micro SD-card to be inserted in the
HSDK board.
- Note that Python3 script is used for generation of a header, thus
- to get that done it's required to have Python3 with "pyelftools" installed.
-
- "pyelftools" could be installed with help of "pip" even w/o root rights:
- ------------------------->8----------------------
- python3 -m pip install --user pyelftools
- ------------------------->8----------------------
EXECUTING U-BOOT
diff --git a/doc/README.rockchip b/doc/README.rockchip
index 02e2497b15..8ccbb87264 100644
--- a/doc/README.rockchip
+++ b/doc/README.rockchip
@@ -123,10 +123,6 @@ For example:
Option 2: Package the image with SPL:
- - We need the Python elftools.elf.elffile library for make_fit_atf.py to work
-
- => sudo apt-get install python-pyelftools
-
- Export cross compiler path for aarch64
- Compile ATF
^ permalink raw reply related [flat|nested] 4+ messages in thread