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