| #!/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')) |