xref: /OK3568_Linux_fs/u-boot/arch/arm/mach-rockchip/decode_bl31.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1#!/usr/bin/env python2
2#
3# Copyright (C) 2020 Rockchip Electronics Co., Ltd
4#
5# SPDX-License-Identifier:     GPL-2.0+
6#
7"""
8A script to decode bl31.elf to binary
9"""
10
11import os
12import sys
13import getopt
14import logging
15import struct
16
17def unpack_elf(filename):
18    with open(filename, 'rb') as file:
19        elf = file.read()
20    if elf[0:7] != b'\x7fELF\x02\x01\x01' or elf[18:20] != b'\xb7\x00':
21        raise ValueError("Invalid arm64 ELF file '%s'" % filename)
22
23    e_entry, e_phoff = struct.unpack_from('<2Q', elf, 0x18)
24    e_phentsize, e_phnum = struct.unpack_from('<2H', elf, 0x36)
25    segments = []
26
27    for index in range(e_phnum):
28        offset = e_phoff + e_phentsize * index
29        p_type, p_flags, p_offset = struct.unpack_from('<LLQ', elf, offset)
30        if p_type == 1: # PT_LOAD
31            p_paddr, p_filesz = struct.unpack_from('<2Q', elf, offset + 0x18)
32            if p_filesz > 0:
33                p_data = elf[p_offset:p_offset + p_filesz]
34                segments.append((index, e_entry, p_paddr, p_data))
35    return segments
36
37def generate_atf_binary(bl31_file_name):
38    for index, entry, paddr, data in unpack_elf(bl31_file_name):
39        file_name = 'bl31_0x%08x.bin' % paddr
40        with open(file_name, "wb") as atf:
41            atf.write(data)
42
43def main():
44    bl31_elf="./bl31.elf"
45    generate_atf_binary(bl31_elf);
46
47if __name__ == "__main__":
48    main()
49