80 lines
2.7 KiB
Python
Executable File
80 lines
2.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
#
|
|
# Copyright (c) 2019-2020, Arm Limited. All rights reserved.
|
|
#
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
#
|
|
|
|
import re
|
|
import os
|
|
import sys
|
|
import operator
|
|
|
|
# List of folder/map to parse
|
|
bl_images = ['bl1', 'bl2', 'bl31']
|
|
|
|
# List of symbols to search for
|
|
blx_symbols = ['__BL1_RAM_START__', '__BL1_RAM_END__',
|
|
'__BL2_END__',
|
|
'__BL31_END__',
|
|
'__TEXT_START__', '__TEXT_END__',
|
|
'__RODATA_START__', '__RODATA_END__',
|
|
'__DATA_START__', '__DATA_END__',
|
|
'__STACKS_START__', '__STACKS_END__',
|
|
'__BSS_END',
|
|
'__COHERENT_RAM_START__', '__COHERENT_RAM_END__',
|
|
]
|
|
|
|
# Regex to extract address from map file
|
|
address_pattern = re.compile(r"\b0x\w*")
|
|
|
|
# List of found element: [address, symbol, file]
|
|
address_list = []
|
|
|
|
# Get the directory from command line or use a default one
|
|
inverted_print = True
|
|
if len(sys.argv) >= 2:
|
|
build_dir = sys.argv[1]
|
|
if len(sys.argv) >= 3:
|
|
inverted_print = sys.argv[2] == '0'
|
|
else:
|
|
build_dir = 'build/fvp/debug'
|
|
|
|
# Extract all the required symbols from the map files
|
|
for image in bl_images:
|
|
file_path = os.path.join(build_dir, image, '{}.map'.format(image))
|
|
if os.path.isfile(file_path):
|
|
with open (file_path, 'rt') as mapfile:
|
|
for line in mapfile:
|
|
for symbol in blx_symbols:
|
|
# Regex to find symbol definition
|
|
line_pattern = re.compile(r"\b0x\w*\s*" + symbol + "\s= .")
|
|
match = line_pattern.search(line)
|
|
if match:
|
|
# Extract address from line
|
|
match = address_pattern.search(line)
|
|
if match:
|
|
address_list.append([match.group(0), symbol, image])
|
|
|
|
# Sort by address
|
|
address_list.sort(key=operator.itemgetter(0))
|
|
|
|
# Invert list for lower address at bottom
|
|
if inverted_print:
|
|
address_list = reversed(address_list)
|
|
|
|
# Generate memory view
|
|
print('{:-^93}'.format('Memory Map from: ' + build_dir))
|
|
for address in address_list:
|
|
if "bl1" in address[2]:
|
|
print(address[0], '+{:-^22}+ |{:^22}| |{:^22}|'.format(address[1], '', ''))
|
|
elif "bl2" in address[2]:
|
|
print(address[0], '|{:^22}| +{:-^22}+ |{:^22}|'.format('', address[1], ''))
|
|
elif "bl31" in address[2]:
|
|
print(address[0], '|{:^22}| |{:^22}| +{:-^22}+'.format('', '', address[1]))
|
|
else:
|
|
print(address[0], '|{:^22}| |{:^22}| +{:-^22}+'.format('', '', address[1]))
|
|
|
|
print('{:^20}{:_^22} {:_^22} {:_^22}'.format('', '', '', ''))
|
|
print('{:^20}{:^22} {:^22} {:^22}'.format('address', 'bl1', 'bl2', 'bl31'))
|