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