blob: 6e309bf7e50a135a9bac0dc09f8dea3597a388f1 [file] [log] [blame]
Pipat Methavanitpong8ca381f2019-07-30 15:22:53 +09001#!/usr/bin/env python3
Jerome Forissier1bb92982017-12-15 14:27:02 +01002# SPDX-License-Identifier: BSD-2-Clause
Jerome Forissierd0c63612017-07-25 18:17:11 +02003#
Jens Wiklandered30b6c2020-10-15 13:02:18 +02004# Copyright (c) 2017, 2020, Linaro Limited
Jelle Selsb43095e2020-10-21 16:40:37 +02005# Copyright (c) 2020, Arm Limited.
Jerome Forissierd0c63612017-07-25 18:17:11 +02006#
Jerome Forissierd0c63612017-07-25 18:17:11 +02007
8import argparse
9import array
Maxim Uvarov8355f922020-04-09 15:19:28 +010010from elftools.elf.elffile import ELFFile
Jerome Forissierd0c63612017-07-25 18:17:11 +020011import os
12import re
Maxim Uvarov8355f922020-04-09 15:19:28 +010013import struct
Jerome Forissierd0c63612017-07-25 18:17:11 +020014import uuid
Jerome Forissier509a9802017-08-01 10:14:57 +020015import zlib
Jerome Forissierd0c63612017-07-25 18:17:11 +020016
Jerome Forissierc51c4e12018-11-14 11:02:49 +010017
Jerome Forissierd0c63612017-07-25 18:17:11 +020018def get_args():
Jerome Forissierc51c4e12018-11-14 11:02:49 +010019 parser = argparse.ArgumentParser(
20 description='Converts a Trusted '
21 'Application ELF file into a C source file, ready for '
22 'inclusion in the TEE binary as an "early TA".')
Jerome Forissierd0c63612017-07-25 18:17:11 +020023
Jerome Forissierc51c4e12018-11-14 11:02:49 +010024 parser.add_argument('--out', required=True,
25 help='Name of the output C file')
Jerome Forissierd0c63612017-07-25 18:17:11 +020026
Jerome Forissierc51c4e12018-11-14 11:02:49 +010027 parser.add_argument(
28 '--ta',
29 required=True,
30 help='Path to the TA binary. File name has to be: <uuid>.* '
31 'such as: 8aaaf200-2450-11e4-abe2-0002a5d5c51b.stripped.elf')
Jerome Forissierd0c63612017-07-25 18:17:11 +020032
Jerome Forissierc51c4e12018-11-14 11:02:49 +010033 parser.add_argument(
34 '--compress',
35 dest="compress",
36 action="store_true",
37 help='Compress the TA using the DEFLATE '
38 'algorithm')
Jerome Forissier509a9802017-08-01 10:14:57 +020039
Jerome Forissierc51c4e12018-11-14 11:02:49 +010040 return parser.parse_args()
41
Jerome Forissierd0c63612017-07-25 18:17:11 +020042
Maxim Uvarov8355f922020-04-09 15:19:28 +010043def get_name(obj):
44 # Symbol or section .name can be a byte array or a string, we want a string
45 try:
46 name = obj.name.decode()
47 except (UnicodeDecodeError, AttributeError):
48 name = obj.name
49 return name
50
51
52def ta_get_flags(ta_f):
53 with open(ta_f, 'rb') as f:
54 elffile = ELFFile(f)
55
56 for s in elffile.iter_sections():
57 if get_name(s) == '.ta_head':
58 return struct.unpack('<16x4xI', s.data()[:24])[0]
59
60 raise Exception('.ta_head section not found')
61
62
Jerome Forissierd0c63612017-07-25 18:17:11 +020063def main():
Jerome Forissierc51c4e12018-11-14 11:02:49 +010064 args = get_args()
Jerome Forissierd0c63612017-07-25 18:17:11 +020065
Jerome Forissierc51c4e12018-11-14 11:02:49 +010066 ta_uuid = uuid.UUID(re.sub(r'\..*', '', os.path.basename(args.ta)))
Jerome Forissierd0c63612017-07-25 18:17:11 +020067
Jerome Forissierc51c4e12018-11-14 11:02:49 +010068 with open(args.ta, 'rb') as ta:
69 bytes = ta.read()
70 uncompressed_size = len(bytes)
71 if args.compress:
72 bytes = zlib.compress(bytes)
73 size = len(bytes)
Jerome Forissier509a9802017-08-01 10:14:57 +020074
Jerome Forissierc51c4e12018-11-14 11:02:49 +010075 f = open(args.out, 'w')
76 f.write('/* Generated from ' + args.ta + ' by ' +
77 os.path.basename(__file__) + ' */\n\n')
Jelle Selsb43095e2020-10-21 16:40:37 +020078 f.write('#include <kernel/embedded_ts.h>\n\n')
Jens Wiklandered30b6c2020-10-15 13:02:18 +020079 f.write('#include <scattered_array.h>\n\n')
80 f.write('const uint8_t ta_bin_' + ta_uuid.hex + '[] = {\n')
81 i = 0
82 while i < size:
83 if i % 8 == 0:
84 f.write('\t\t')
85 f.write(hex(bytes[i]) + ',')
86 i = i + 1
87 if i % 8 == 0 or i == size:
88 f.write('\n')
89 else:
90 f.write(' ')
91 f.write('};\n')
92
Jelle Selsb43095e2020-10-21 16:40:37 +020093 f.write('SCATTERED_ARRAY_DEFINE_PG_ITEM(early_tas, struct embedded_ts) = {\n')
Maxim Uvarov8355f922020-04-09 15:19:28 +010094 f.write('\t.flags = 0x{:04x},\n'.format(ta_get_flags(args.ta)))
Jerome Forissierc51c4e12018-11-14 11:02:49 +010095 f.write('\t.uuid = {\n')
96 f.write('\t\t.timeLow = 0x{:08x},\n'.format(ta_uuid.time_low))
97 f.write('\t\t.timeMid = 0x{:04x},\n'.format(ta_uuid.time_mid))
98 f.write('\t\t.timeHiAndVersion = ' +
99 '0x{:04x},\n'.format(ta_uuid.time_hi_version))
100 f.write('\t\t.clockSeqAndNode = {\n')
101 csn = '{0:02x}{1:02x}{2:012x}'.format(ta_uuid.clock_seq_hi_variant,
102 ta_uuid.clock_seq_low, ta_uuid.node)
103 f.write('\t\t\t')
104 f.write(', '.join('0x' + csn[i:i + 2] for i in range(0, len(csn), 2)))
105 f.write('\n\t\t},\n\t},\n')
Jens Wiklandered30b6c2020-10-15 13:02:18 +0200106 f.write('\t.size = sizeof(ta_bin_' + ta_uuid.hex +
107 '), /* {:d} */\n'.format(size))
108 f.write('\t.ta = ta_bin_' + ta_uuid.hex + ',\n')
Jerome Forissierc51c4e12018-11-14 11:02:49 +0100109 if args.compress:
110 f.write('\t.uncompressed_size = '
111 '{:d},\n'.format(uncompressed_size))
Jerome Forissierc51c4e12018-11-14 11:02:49 +0100112 f.write('};\n')
113 f.close()
114
Jerome Forissierd0c63612017-07-25 18:17:11 +0200115
116if __name__ == "__main__":
Jerome Forissierc51c4e12018-11-14 11:02:49 +0100117 main()