blob: 4309314d21b5647fb8c718574116eeb4f873c388 [file] [log] [blame]
Jerome Forissierabaf1202017-11-08 13:31:29 +01001#!/usr/bin/env python3
2#
3# Copyright (c) 2014-2017, Linaro Limited
4# All rights reserved.
5#
6# SPDX-License-Identifier: BSD-3-Clause
7
8import argparse
9import os
10import subprocess
11import sys
12
13
14def get_args():
15 parser = argparse.ArgumentParser(
16 description='Shows the memory layout of the TEE ELF file. '
17 'Size is provided for each section.')
18 parser.add_argument('tee_elf', help='The OP-TEE ELF file (tee.elf)')
19 return parser.parse_args()
20
21
22def printf(format, *args):
23 sys.stdout.write(format % args)
24
25
26def print_sect(name, addr, size, round_up=False, print_num_pages=False):
27 if size == 0:
28 size_kib = 0
29 num_pages = 0
30 else:
31 if round_up:
32 size_kib = (size - 1) / 1024 + 1
33 else:
34 size_kib = size / 1024
35 num_pages = (size - 1) / 4096 + 1
36
37 printf('%-16s %.8X - %.8X size %.8X %3d KiB', name, addr, addr + size,
38 size, size_kib)
39 if print_num_pages:
40 printf(' %d pages', num_pages)
41 printf('\n')
42
43
44def readelf_cmd():
45 return os.getenv('CROSS_COMPILE', '') + 'readelf'
46
47
48def main():
49 in_shdr = False
50 sects = []
51
52 args = get_args()
53 env = os.environ.copy()
54 env['LC_ALL'] = 'C'
55 readelf = subprocess.Popen([readelf_cmd(), '-S', '-W', args.tee_elf],
56 stdout=subprocess.PIPE, env=env,
57 universal_newlines=True)
58 for line in iter(readelf.stdout.readline, ''):
59 if 'Section Headers:' in line:
60 in_shdr = True
61 continue
62 if 'Key to Flags:' in line:
63 in_shdr = False
64 continue
65 if in_shdr:
66 words = line.split()
67 if words[0] == '[':
68 words.pop(0)
69 try:
70 (_, name, _, addr, offs, size, _,
71 flags) = words[:8]
72 except:
73 continue
74 if (flags == 'AX' or flags == 'WA' or flags == 'A' or
75 flags == 'AL'):
76 sects.append({'name': name, 'addr': addr,
77 'offs': offs, 'size': size})
78 for sect in sects:
79 if sect['addr'] != 0:
80 first_addr = sect['addr']
81 break
82 last_addr = sects[-1]['addr']
83 last_size = sects[-1]['size']
84
85 ram_usage = int(last_addr, 16) + int(last_size, 16) - int(first_addr, 16)
86 print_sect('RAM Usage', int(first_addr, 16), ram_usage, True, True)
87
88 last_addr = 0
89 last_size = 0
90 for sect in sects:
91 name = sect['name']
92 addr = int(sect['addr'], 16)
93 size = int(sect['size'], 16)
94
95 if last_addr != 0 and addr != last_addr + last_size:
96 print_sect('*hole*', last_addr + last_size,
97 addr - (last_addr + last_size))
98 print_sect(name, addr, size)
99 last_addr = addr
100 last_size = size
101
102
103if __name__ == "__main__":
104 main()