xref: /rk3399_rockchip-uboot/arch/arm/mach-rockchip/decode_bl31.py (revision 59a90a33e7b7350cad1e878d85c938c7d1d186e2)
1392231a7SJoseph Chen#!/usr/bin/env python2
2392231a7SJoseph Chen#
3392231a7SJoseph Chen# Copyright (C) 2020 Rockchip Electronics Co., Ltd
4392231a7SJoseph Chen#
5392231a7SJoseph Chen# SPDX-License-Identifier:     GPL-2.0+
6392231a7SJoseph Chen#
7392231a7SJoseph Chen"""
8392231a7SJoseph ChenA script to decode bl31.elf to binary
9392231a7SJoseph Chen"""
10392231a7SJoseph Chen
11*59a90a33SJoseph Chenimport os
12*59a90a33SJoseph Chenimport sys
13*59a90a33SJoseph Chenimport getopt
14*59a90a33SJoseph Chenimport logging
15*59a90a33SJoseph Chenimport struct
16392231a7SJoseph Chen
17*59a90a33SJoseph Chendef unpack_elf(filename):
18*59a90a33SJoseph Chen    with open(filename, 'rb') as file:
19*59a90a33SJoseph Chen        elf = file.read()
20*59a90a33SJoseph Chen    if elf[0:7] != b'\x7fELF\x02\x01\x01' or elf[18:20] != b'\xb7\x00':
21*59a90a33SJoseph Chen        raise ValueError("Invalid arm64 ELF file '%s'" % filename)
22*59a90a33SJoseph Chen
23*59a90a33SJoseph Chen    e_entry, e_phoff = struct.unpack_from('<2Q', elf, 0x18)
24*59a90a33SJoseph Chen    e_phentsize, e_phnum = struct.unpack_from('<2H', elf, 0x36)
25*59a90a33SJoseph Chen    segments = []
26*59a90a33SJoseph Chen
27*59a90a33SJoseph Chen    for index in range(e_phnum):
28*59a90a33SJoseph Chen        offset = e_phoff + e_phentsize * index
29*59a90a33SJoseph Chen        p_type, p_flags, p_offset = struct.unpack_from('<LLQ', elf, offset)
30*59a90a33SJoseph Chen        if p_type == 1: # PT_LOAD
31*59a90a33SJoseph Chen            p_paddr, p_filesz = struct.unpack_from('<2Q', elf, offset + 0x18)
32*59a90a33SJoseph Chen            if p_filesz > 0:
33*59a90a33SJoseph Chen                p_data = elf[p_offset:p_offset + p_filesz]
34*59a90a33SJoseph Chen                segments.append((index, e_entry, p_paddr, p_data))
35*59a90a33SJoseph Chen    return segments
36392231a7SJoseph Chen
37392231a7SJoseph Chendef generate_atf_binary(bl31_file_name):
38*59a90a33SJoseph Chen    for index, entry, paddr, data in unpack_elf(bl31_file_name):
39392231a7SJoseph Chen        file_name = 'bl31_0x%08x.bin' % paddr
40392231a7SJoseph Chen        with open(file_name, "wb") as atf:
41*59a90a33SJoseph Chen            atf.write(data)
42392231a7SJoseph Chen
43392231a7SJoseph Chendef main():
44392231a7SJoseph Chen    bl31_elf="./bl31.elf"
45392231a7SJoseph Chen    generate_atf_binary(bl31_elf);
46392231a7SJoseph Chen
47392231a7SJoseph Chenif __name__ == "__main__":
48392231a7SJoseph Chen    main()
49