diff --git a/misc/acrn-config/library/scenario_cfg_lib.py b/misc/acrn-config/library/scenario_cfg_lib.py index a50b707d2..3791f9a51 100644 --- a/misc/acrn-config/library/scenario_cfg_lib.py +++ b/misc/acrn-config/library/scenario_cfg_lib.py @@ -260,48 +260,6 @@ def get_order_type_by_vmid(idx): return order_type -def get_vmid_by_order_type(type_str): - """ - This is mapping table for {id:order type} - :param type_str: vm loader type - :return: table of id:order type dictionary - """ - - idx_list = [] - order_id_dic = common.order_type_map_vmid(SCENARIO_INFO_FILE, VM_COUNT) - - for idx, order_type in order_id_dic.items(): - if type_str == order_type: - idx_list.append(idx) - - return idx_list - - -def is_pre_launch_vm(idx): - """ - Identification the vm id loader type is pre launched - :param idx: vm id number - :return: True if it is a pre launched vm - """ - order_type = get_order_type_by_vmid(idx) - if order_type == "PRE_LAUNCHED_VM": - status = True - else: - status = False - - return status - -def pre_launch_vm_ids(): - """ Get pre launched vm ids as list """ - pre_vm = [] - - for i in range(VM_COUNT): - if is_pre_launch_vm(i): - pre_vm.append(i) - - return pre_vm - - def vm_name_check(vm_names, item): """ Check vm name @@ -323,7 +281,18 @@ def load_order_check(load_orders, item): :param item: vm name item in xml :return: None """ + sos_vm_ids = [] + pre_vm_ids = [] + post_vm_ids = [] for order_i, load_str in load_orders.items(): + if load_str == "SOS_VM": + sos_vm_ids.append(order_i) + + if load_str == "PRE_LAUNCHED_VM": + pre_vm_ids.append(order_i) + + if load_str == "POST_LAUNCHED_VM": + post_vm_ids.append(order_i) if not load_str: key = "vm:id={},{}".format(order_i, item) @@ -334,6 +303,35 @@ def load_order_check(load_orders, item): key = "vm:id={},{}".format(order_i, item) ERR_LIST[key] = "VM load order unknown" + if len(sos_vm_ids) >= 2: + key = "vm:id={},{}".format(sos_vm_ids[0], item) + ERR_LIST[key] = "SOS_VM number should not be greater than 1" + + if post_vm_ids and sos_vm_ids: + if post_vm_ids[0] < sos_vm_ids[-1]: + key = "vm:id={},{}".format(post_vm_ids[0], item) + ERR_LIST[key] = "POST_LAUNCHED_VM should be configured after SOS_VM" + + if pre_vm_ids and sos_vm_ids: + if sos_vm_ids[-1] < pre_vm_ids[-1]: + key = "vm:id={},{}".format(sos_vm_ids[0], item) + ERR_LIST[key] = "PRE_LAUNCHED_VM should be configured before SOS_VM" + + +def get_load_order_cnt(load_orders, type_name): + """ + Get load order type count + :param load_orders: dictionary of vm load_order + :param type_name: load order type for vm + :return: number for this load order type name + """ + type_cnt = 0 + for load_str in load_orders.values(): + if type_name == load_str: + type_cnt += 1 + + return type_cnt + def guest_flag_check(guest_flag_idx, branch_tag, leaf_tag): diff --git a/misc/acrn-config/scenario_config/scenario_item.py b/misc/acrn-config/scenario_config/scenario_item.py index 137e338ec..30509d43e 100644 --- a/misc/acrn-config/scenario_config/scenario_item.py +++ b/misc/acrn-config/scenario_config/scenario_item.py @@ -261,6 +261,18 @@ class EpcSection: self.size = scenario_cfg_lib.get_leaf_tag_map(self.scenario_info, "epc_section", "size") +class LoadOrderNum: + """ This is Abstract of VM number for different load order """ + def __init__(self): + self.pre_vm = 0 + self.sos_vm = 0 + self.post_vm = 0 + + def get_info(self, load_order): + self.pre_vm = scenario_cfg_lib.get_load_order_cnt(load_order, "PRE_LAUNCHED_VM") + self.sos_vm = scenario_cfg_lib.get_load_order_cnt(load_order, "SOS_VM") + self.post_vm = scenario_cfg_lib.get_load_order_cnt(load_order, "POST_LAUNCHED_VM") + class VmInfo: """ This is Abstract of class of VM setting """ name = {} @@ -281,6 +293,7 @@ class VmInfo: self.os_cfg = CfgOsKern(self.scenario_info) self.vuart = VuartInfo(self.scenario_info) self.cfg_pci = CfgPci(self.scenario_info) + self.load_order_cnt = LoadOrderNum() def get_info(self): """ @@ -301,6 +314,7 @@ class VmInfo: self.os_cfg.get_info() self.vuart.get_info() self.cfg_pci.get_info() + self.load_order_cnt.get_info(self.load_order) def get_cpu_bitmap(self, index): """ diff --git a/misc/acrn-config/scenario_config/vm_configurations_h.py b/misc/acrn-config/scenario_config/vm_configurations_h.py index cf33df17e..8ba851fba 100644 --- a/misc/acrn-config/scenario_config/vm_configurations_h.py +++ b/misc/acrn-config/scenario_config/vm_configurations_h.py @@ -36,6 +36,12 @@ def cpu_affinity_output(vm_info, i, config): i, cpu_bits['cpu_map']), file=config) +def scenario_vm_num(load_type_cnt, config): + + print("#define PRE_VM_NUM\t\t{}U".format(load_type_cnt.pre_vm), file=config) + print("#define SOS_VM_NUM\t\t{}U".format(load_type_cnt.sos_vm), file=config) + print("#define MAX_POST_VM_NUM\t\t{}U".format(load_type_cnt.post_vm), file=config) + def gen_sdc_header(vm_info, config): """ Generate vm_configuration.h of sdc scenario @@ -45,7 +51,7 @@ def gen_sdc_header(vm_info, config): gen_common_header(config) print("#include \n", file=config) - print("#define CONFIG_MAX_VM_NUM\t\t(2U + CONFIG_MAX_KATA_VM_NUM)", file=config) + scenario_vm_num(vm_info.load_order_cnt, config) print("", file=config) print("/* Bits mask of guest flags that can be programmed by device model." + " Other bits are set by hypervisor only */", file=config) @@ -86,8 +92,7 @@ def gen_sdc2_header(vm_info, config): """ gen_common_header(config) print("#include \n", file=config) - print("#define CONFIG_MAX_VM_NUM\t\t({0}U + CONFIG_MAX_KATA_VM_NUM)".format( - scenario_cfg_lib.VM_COUNT), file=config) + scenario_vm_num(vm_info.load_order_cnt, config) print("", file=config) print("/* Bits mask of guest flags that can be programmed by device model." + " Other bits are set by hypervisor only */", file=config) @@ -107,14 +112,14 @@ def gen_sdc2_header(vm_info, config): print("{0}".format(VM_END_DEFINE), file=config) -def logic_max_vm_num(config): +def logic_max_vm_num(vm_info, config): """ This is logical max vm number comment :param config: it is the pointer which file write to :return: None """ print("", file=config) - print("#define CONFIG_MAX_VM_NUM\t\t{0}U".format(scenario_cfg_lib.VM_COUNT), file=config) + scenario_vm_num(vm_info.load_order_cnt, config) print("", file=config) print("/* The VM CONFIGs like:", file=config) print(" *\tVMX_CONFIG_VCPU_AFFINITY", file=config) @@ -146,7 +151,7 @@ def gen_logical_partition_header(vm_info, config): " Other bits are set by hypervisor only */", file=config) print("#define DM_OWNED_GUEST_FLAG_MASK\t0UL", file=config) - logic_max_vm_num(config) + logic_max_vm_num(vm_info, config) for i in range(scenario_cfg_lib.VM_COUNT): @@ -206,8 +211,7 @@ def gen_industry_header(vm_info, config): gen_common_header(config) print("#include ", file=config) print("", file=config) - print("#define CONFIG_MAX_VM_NUM\t\t({0}U + CONFIG_MAX_KATA_VM_NUM)".format( - scenario_cfg_lib.VM_COUNT), file=config) + scenario_vm_num(vm_info.load_order_cnt, config) print("", file=config) print("/* Bits mask of guest flags that can be programmed by device model." + " Other bits are set by hypervisor only */", file=config) @@ -241,8 +245,7 @@ def gen_hybrid_header(vm_info, config): "\t\t\t\t\t\tGUEST_FLAG_RT | GUEST_FLAG_IO_COMPLETION_POLLING)", file=config) print("", file=config) - print("#define CONFIG_MAX_VM_NUM\t\t({0}U + CONFIG_MAX_KATA_VM_NUM)".format( - scenario_cfg_lib.VM_COUNT), file=config) + scenario_vm_num(vm_info.load_order_cnt, config) print("", file=config) for i in range(scenario_cfg_lib.VM_COUNT): cpu_affinity_output(vm_info, i, config)