blob: cabddbbd9221a997bd13b862bfd35cb88df17e56 [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
14def get_args():
15
16 parser = argparse.ArgumentParser(description='Converts a Trusted '
17 'Application ELF file into a C source file, ready for '
18 'inclusion in the TEE binary as an "early TA".')
19
20 parser.add_argument('--out', required=True,
21 help='Name of the output C file')
22
23 parser.add_argument('--ta', required=True,
24 help='Path to the TA binary. File name has to be: <uuid>.* '
25 'such as: 8aaaf200-2450-11e4-abe2-0002a5d5c51b.stripped.elf')
26
Jerome Forissier509a9802017-08-01 10:14:57 +020027 parser.add_argument('--compress', dest="compress",
28 action="store_true", help='Compress the TA using the DEFLATE '
29 'algorithm')
30
Jerome Forissierd0c63612017-07-25 18:17:11 +020031 return parser.parse_args()
32
33def main():
34
35 args = get_args();
36
37 ta_uuid = uuid.UUID(re.sub('\..*', '', os.path.basename(args.ta)))
38
Jerome Forissier509a9802017-08-01 10:14:57 +020039 with open(args.ta, 'rb') as ta:
40 bytes = ta.read()
41 uncompressed_size = len(bytes)
42 if args.compress:
43 bytes = zlib.compress(bytes)
44 size = len(bytes)
45
Jerome Forissierd0c63612017-07-25 18:17:11 +020046 f = open(args.out, 'w')
47 f.write('/* Generated from ' + args.ta + ' by ' +
48 os.path.basename(__file__) + ' */\n\n')
49 f.write('#include <compiler.h>\n');
50 f.write('#include <kernel/early_ta.h>\n\n');
51 f.write('__extension__ const struct early_ta __early_ta_' +
52 ta_uuid.hex +
53 '\n__early_ta __aligned(__alignof__(struct early_ta)) = {\n')
54 f.write('\t.uuid = {\n')
55 f.write('\t\t.timeLow = 0x{:08x},\n'.format(ta_uuid.time_low))
56 f.write('\t\t.timeMid = 0x{:04x},\n'.format(ta_uuid.time_mid))
57 f.write('\t\t.timeHiAndVersion = ' +
58 '0x{:04x},\n'.format(ta_uuid.time_hi_version))
59 f.write('\t\t.clockSeqAndNode = {\n')
60 csn = '{0:02x}{1:02x}{2:012x}'.format(ta_uuid.clock_seq_hi_variant,
61 ta_uuid.clock_seq_low, ta_uuid.node)
62 f.write('\t\t\t')
63 f.write(', '.join('0x' + csn[i:i+2] for i in range(0, len(csn), 2)))
64 f.write('\n\t\t},\n\t},\n')
Jerome Forissier509a9802017-08-01 10:14:57 +020065 f.write('\t.size = {:d},\n'.format(size))
66 if args.compress:
67 f.write('\t.uncompressed_size = '
68 '{:d},\n'.format(uncompressed_size))
Jerome Forissierd0c63612017-07-25 18:17:11 +020069 f.write('\t.ta = {\n')
70 i = 0
Jerome Forissier509a9802017-08-01 10:14:57 +020071 while i < size:
72 if i % 8 == 0:
73 f.write('\t\t');
74 f.write('0x' + '{:02x}'.format(ord(bytes[i])) + ',')
75 i = i + 1
76 if i % 8 == 0 or i == size:
77 f.write('\n')
78 else:
79 f.write(' ')
Jerome Forissierd0c63612017-07-25 18:17:11 +020080 f.write('\t},\n')
81 f.write('};\n');
82 f.close()
83
84if __name__ == "__main__":
85 main()