blob: 1496f8163b54955083d34ef5db8bd698202a5029 [file] [log] [blame]
Jerome Forissierd0c63612017-07-25 18:17:11 +02001#!/usr/bin/env python
Jerome Forissier1bb92982017-12-15 14:27:02 +01002# SPDX-License-Identifier: BSD-2-Clause
Jerome Forissierd0c63612017-07-25 18:17:11 +02003#
4# Copyright (c) 2017, Linaro Limited
Jerome Forissierd0c63612017-07-25 18:17:11 +02005#
Jerome Forissierd0c63612017-07-25 18:17:11 +02006
7import argparse
8import array
9import os
10import re
11import uuid
Jerome Forissier509a9802017-08-01 10:14:57 +020012import zlib
Jerome Forissierd0c63612017-07-25 18:17:11 +020013
Jerome Forissierc51c4e12018-11-14 11:02:49 +010014
Jerome Forissierd0c63612017-07-25 18:17:11 +020015def get_args():
16
Jerome Forissierc51c4e12018-11-14 11:02:49 +010017 parser = argparse.ArgumentParser(
18 description='Converts a Trusted '
19 'Application ELF file into a C source file, ready for '
20 'inclusion in the TEE binary as an "early TA".')
Jerome Forissierd0c63612017-07-25 18:17:11 +020021
Jerome Forissierc51c4e12018-11-14 11:02:49 +010022 parser.add_argument('--out', required=True,
23 help='Name of the output C file')
Jerome Forissierd0c63612017-07-25 18:17:11 +020024
Jerome Forissierc51c4e12018-11-14 11:02:49 +010025 parser.add_argument(
26 '--ta',
27 required=True,
28 help='Path to the TA binary. File name has to be: <uuid>.* '
29 'such as: 8aaaf200-2450-11e4-abe2-0002a5d5c51b.stripped.elf')
Jerome Forissierd0c63612017-07-25 18:17:11 +020030
Jerome Forissierc51c4e12018-11-14 11:02:49 +010031 parser.add_argument(
32 '--compress',
33 dest="compress",
34 action="store_true",
35 help='Compress the TA using the DEFLATE '
36 'algorithm')
Jerome Forissier509a9802017-08-01 10:14:57 +020037
Jerome Forissierc51c4e12018-11-14 11:02:49 +010038 return parser.parse_args()
39
Jerome Forissierd0c63612017-07-25 18:17:11 +020040
41def main():
42
Jerome Forissierc51c4e12018-11-14 11:02:49 +010043 args = get_args()
Jerome Forissierd0c63612017-07-25 18:17:11 +020044
Jerome Forissierc51c4e12018-11-14 11:02:49 +010045 ta_uuid = uuid.UUID(re.sub(r'\..*', '', os.path.basename(args.ta)))
Jerome Forissierd0c63612017-07-25 18:17:11 +020046
Jerome Forissierc51c4e12018-11-14 11:02:49 +010047 with open(args.ta, 'rb') as ta:
48 bytes = ta.read()
49 uncompressed_size = len(bytes)
50 if args.compress:
51 bytes = zlib.compress(bytes)
52 size = len(bytes)
Jerome Forissier509a9802017-08-01 10:14:57 +020053
Jerome Forissierc51c4e12018-11-14 11:02:49 +010054 f = open(args.out, 'w')
55 f.write('/* Generated from ' + args.ta + ' by ' +
56 os.path.basename(__file__) + ' */\n\n')
57 f.write('#include <compiler.h>\n')
58 f.write('#include <kernel/early_ta.h>\n\n')
59 f.write('__extension__ const struct early_ta __early_ta_' +
60 ta_uuid.hex +
61 '\n__early_ta __aligned(__alignof__(struct early_ta)) = {\n')
62 f.write('\t.uuid = {\n')
63 f.write('\t\t.timeLow = 0x{:08x},\n'.format(ta_uuid.time_low))
64 f.write('\t\t.timeMid = 0x{:04x},\n'.format(ta_uuid.time_mid))
65 f.write('\t\t.timeHiAndVersion = ' +
66 '0x{:04x},\n'.format(ta_uuid.time_hi_version))
67 f.write('\t\t.clockSeqAndNode = {\n')
68 csn = '{0:02x}{1:02x}{2:012x}'.format(ta_uuid.clock_seq_hi_variant,
69 ta_uuid.clock_seq_low, ta_uuid.node)
70 f.write('\t\t\t')
71 f.write(', '.join('0x' + csn[i:i + 2] for i in range(0, len(csn), 2)))
72 f.write('\n\t\t},\n\t},\n')
73 f.write('\t.size = {:d},\n'.format(size))
74 if args.compress:
75 f.write('\t.uncompressed_size = '
76 '{:d},\n'.format(uncompressed_size))
77 f.write('\t.ta = {\n')
78 i = 0
79 while i < size:
80 if i % 8 == 0:
81 f.write('\t\t')
82 f.write('0x' + '{:02x}'.format(ord(bytes[i])) + ',')
83 i = i + 1
84 if i % 8 == 0 or i == size:
85 f.write('\n')
86 else:
87 f.write(' ')
88 f.write('\t},\n')
89 f.write('};\n')
90 f.close()
91
Jerome Forissierd0c63612017-07-25 18:17:11 +020092
93if __name__ == "__main__":
Jerome Forissierc51c4e12018-11-14 11:02:49 +010094 main()