J-Alves | 30f3908 | 2020-12-16 13:43:51 +0000 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
| 2 | # |
| 3 | # Copyright 2020 The Hafnium Authors. |
| 4 | # |
| 5 | # Use of this source code is governed by a BSD-style |
| 6 | # license that can be found in the LICENSE file or at |
| 7 | # https://opensource.org/licenses/BSD-3-Clause. |
| 8 | |
| 9 | import argparse |
| 10 | import sys |
| 11 | import os |
| 12 | import json |
| 13 | |
| 14 | """ |
| 15 | This script aims at generating a json file that contains the artifacts of |
| 16 | partitions that will execute alongside in the same test setup. |
| 17 | A partition can be: |
| 18 | - Virtual Machine (VM) - to execute in EL1; |
| 19 | - Secure Partition (SP) - to execute in S-EL1. |
| 20 | |
| 21 | A setup can have multiple VMs and multiple SPs executing alongside. |
| 22 | The json file shall list the VMs and SPs, such as: |
| 23 | { |
| 24 | "SPs" : [ <SP information>, ... , <SPx Information>], |
| 25 | "VMs" : [ <VM information>, ... , <VMx Information>] |
| 26 | } |
| 27 | |
| 28 | Where the information of each partition shall obey the following format: |
| 29 | { |
| 30 | "img" : <path to partition package>.img, |
| 31 | "dts" : <path to manifest>.dts |
| 32 | } |
| 33 | |
| 34 | In the arguments of this script provide the path to partition's artifacts |
| 35 | separated by the character defined as 'ARG_SPLITTER'. Example: |
| 36 | --sp <path to img>,<path to dts> |
| 37 | --vm <path to img>,<path to dts> |
| 38 | """ |
| 39 | |
| 40 | ARG_SPLITTER = ',' |
| 41 | ARG_FORMAT = f"<img>{ARG_SPLITTER}<dts>" |
| 42 | |
| 43 | def split_partition_arg(sp_arg : str): |
| 44 | ret = sp_arg.split(ARG_SPLITTER) |
| 45 | if len(ret) != 2: |
| 46 | raise Exception(f"Argument should follow format {ARG_FORMAT}") |
| 47 | return ret |
| 48 | |
| 49 | def partition_info(img, dts): |
| 50 | return {"img": img, "dts": dts} |
| 51 | |
| 52 | def list_of_partitions(partitions : list): |
| 53 | return [partition_info(*split_partition_arg(p)) for p in partitions] |
| 54 | |
| 55 | def Main(): |
| 56 | parser = argparse.ArgumentParser() |
| 57 | parser.add_argument("--sp", action="append") |
| 58 | parser.add_argument("--vm", action="append") |
| 59 | parser.add_argument("--out", action="store", required=True) |
| 60 | args = parser.parse_args() |
| 61 | |
| 62 | #Arguments sanity check: |
| 63 | if args.vm is None and args.sp is None: |
| 64 | raise Exception("Specify at least one VM (--vm) or one SP (--sp)") |
| 65 | |
| 66 | partitions = dict() |
| 67 | if args.sp is not None: |
| 68 | partitions["SPs"] = list_of_partitions(args.sp) |
| 69 | if args.vm is not None: |
| 70 | partitions["VMs"] = list_of_partitions(args.vm) |
| 71 | |
| 72 | json.dump(partitions, open(args.out, "w+")) |
| 73 | return 0 |
| 74 | |
| 75 | if __name__ == "__main__": |
| 76 | sys.exit(Main()) |