acrn-config: add support to parse board defconfig from configurations

Board defconfig depends on hypervisor configurations and vm configurations,
add this to support to parse board defconfig from vm configuration.

Tracked-On: #4634
Signed-off-by: Wei Liu <weix.w.liu@intel.com>
Acked-by: Victor Sun <victor.sun@intel.com>
Acked-by: Terry Zou <terry.zou@intel.com>
This commit is contained in:
Wei Liu
2020-04-04 10:26:01 +08:00
committed by wenlingz
parent d4f789f47e
commit b30d304d69
12 changed files with 544 additions and 139 deletions

View File

@@ -7,6 +7,7 @@ import os
import sys
import copy
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'library'))
sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'hv_config'))
from scenario_item import HwInfo, VmInfo
import board_cfg_lib
import scenario_cfg_lib
@@ -14,10 +15,14 @@ import vm_configurations_c
import vm_configurations_h
import pci_dev_c
import common
import hv_cfg_lib
import board_defconfig
from hv_item import HvInfo
ACRN_PATH = common.SOURCE_ROOT_DIR
ACRN_CONFIG_DEF = ACRN_PATH + 'hypervisor/scenarios/'
GEN_FILE = ["vm_configurations.h", "vm_configurations.c", "pci_dev.c"]
ACRN_CONFIGS = ACRN_PATH + "hypervisor/arch/x86/configs/"
GEN_FILE = ["vm_configurations.h", "vm_configurations.c", "pci_dev.c", ".config"]
def get_scenario_item_values(board_info, scenario_info):
@@ -27,6 +32,7 @@ def get_scenario_item_values(board_info, scenario_info):
"""
scenario_item_values = {}
hw_info = HwInfo(board_info)
hv_info = HvInfo(scenario_info)
# get vm count
common.BOARD_INFO_FILE = board_info
@@ -44,12 +50,31 @@ def get_scenario_item_values(board_info, scenario_info):
scenario_item_values.update(scenario_cfg_lib.avl_vuart_ui_select(scenario_info))
# pre board_private
scenario_item_values["vm,board_private,rootfs"] = board_cfg_lib.get_rootfs(board_info)
scenario_item_values["vm,board_private,console"] = board_cfg_lib.get_ttys_info(board_info)
(scenario_item_values["vm,board_private,rootfs"], num) = board_cfg_lib.get_rootfs(board_info)
# os config
scenario_item_values["vm,os_config,rootfs"] = board_cfg_lib.get_rootfs(board_info)
(scenario_item_values["vm,os_config,rootfs"], num) = board_cfg_lib.get_rootfs(board_info)
scenario_item_values["hv,DEBUG_OPTIONS,RELEASE"] = hv_cfg_lib.N_Y
scenario_item_values["hv,DEBUG_OPTIONS,NPK_LOGLEVEL"] = hv_cfg_lib.get_select_range("DEBUG_OPTIONS", "LOG_LEVEL")
scenario_item_values["hv,DEBUG_OPTIONS,MEM_LOGLEVEL"] = hv_cfg_lib.get_select_range("DEBUG_OPTIONS", "LOG_LEVEL")
scenario_item_values["hv,DEBUG_OPTIONS,CONSOLE_LOGLEVEL"] = hv_cfg_lib.get_select_range("DEBUG_OPTIONS", "LOG_LEVEL")
scenario_item_values["hv,DEBUG_OPTIONS,SERIAL_CONSOLE"] = board_cfg_lib.get_ttys_info(board_info)
scenario_item_values["hv,DEBUG_OPTIONS,LOG_DESTINATION"] = hv_cfg_lib.get_select_range("DEBUG_OPTIONS", "LOG_DESTINATION_BITMAP")
scenario_item_values["hv,CAPACITIES,MAX_KATA_VM_NUM"] = hv_cfg_lib.get_select_range("CAPACITIES", "KATA_VM_NUM")
scenario_item_values["hv,CAPACITIES,MAX_IOAPIC_NUM"] = hv_cfg_lib.get_select_range("CAPACITIES", "IOAPIC_NUM")
scenario_item_values["hv,FEATURES,MULTIBOOT2"] = hv_cfg_lib.N_Y
scenario_item_values["hv,FEATURES,SCHEDULER"] = hv_cfg_lib.SCHEDULER_TYPE
scenario_item_values["hv,FEATURES,RELOC"] = hv_cfg_lib.N_Y
scenario_item_values["hv,FEATURES,HYPERV_ENABLED"] = hv_cfg_lib.N_Y
scenario_item_values["hv,FEATURES,ACPI_PARSE_ENABLED"] = hv_cfg_lib.N_Y
scenario_item_values["hv,FEATURES,L1D_VMENTRY_ENABLED"] = hv_cfg_lib.N_Y
scenario_item_values["hv,FEATURES,MCE_ON_PSC_DISABLED"] = hv_cfg_lib.N_Y
scenario_item_values["hv,FEATURES,IOMMU_ENFORCE_SNP"] = hv_cfg_lib.N_Y
scenario_cfg_lib.ERR_LIST.update(hv_cfg_lib.ERR_LIST)
return scenario_item_values
@@ -64,13 +89,20 @@ def validate_scenario_setting(board_info, scenario_info):
common.BOARD_INFO_FILE = board_info
common.SCENARIO_INFO_FILE = scenario_info
scenario_info_items = {}
vm_info = VmInfo(board_info, scenario_info)
vm_info.get_info()
vm_info.check_item()
return (scenario_cfg_lib.ERR_LIST, vm_info)
hv_info = HvInfo(scenario_info)
hv_info.get_info()
hv_info.check_item()
scenario_info_items['vm'] = vm_info
scenario_info_items['hv'] = hv_info
scenario_cfg_lib.ERR_LIST.update(hv_cfg_lib.ERR_LIST)
return (scenario_cfg_lib.ERR_LIST, scenario_info_items)
def main(args):
@@ -80,20 +112,22 @@ def main(args):
"""
err_dic = {}
(err_dic, board_info_file, scenario_info_file, output_folder) = common.get_param(args)
(err_dic, params) = common.get_param(args)
if err_dic:
return err_dic
if output_folder:
common.ACRN_CONFIG_TARGET = os.path.abspath(output_folder) + '/'
# check env
err_dic = common.prepare()
if err_dic:
return err_dic
common.BOARD_INFO_FILE = board_info_file
common.SCENARIO_INFO_FILE = scenario_info_file
common.BOARD_INFO_FILE = params['--board']
common.SCENARIO_INFO_FILE = params['--scenario']
common.ACRN_CONFIG_TARGET= os.path.abspath(params['--out']) + '/'
common.get_vm_num(params['--scenario'])
# get board name
(err_dic, board_name) = common.get_board_name()
# get scenario name
(err_dic, scenario) = common.get_scenario_name()
@@ -103,13 +137,16 @@ def main(args):
# check if this is the scenario config which matched board info
(err_dic, status) = common.is_config_file_match()
if not status:
err_dic['scenario config: Not match'] = "The board xml and scenario xml should be matched!"
err_dic['scenario config'] = "The board xml and scenario xml should be matched!"
return err_dic
if common.ACRN_CONFIG_TARGET:
if params['--out']:
scenario_dir = common.ACRN_CONFIG_TARGET + scenario + '/'
config_hv = common.ACRN_CONFIG_TARGET + board_name + GEN_FILE[3]
else:
scenario_dir = ACRN_CONFIG_DEF + scenario + '/'
config_hv = ACRN_CONFIGS + board_name + GEN_FILE[3]
common.print_yel("{}".format("Override board defconfig...", warn=True))
common.mkdir(scenario_dir)
vm_config_h = scenario_dir + GEN_FILE[0]
@@ -117,26 +154,31 @@ def main(args):
pci_config_c = scenario_dir + GEN_FILE[2]
# parse the scenario.xml
get_scenario_item_values(board_info_file, scenario_info_file)
(err_dic, vm_info) = validate_scenario_setting(board_info_file, scenario_info_file)
get_scenario_item_values(params['--board'], params['--scenario'])
(err_dic, scenario_items) = validate_scenario_setting(params['--board'], params['--scenario'])
if err_dic:
common.print_red("Validate the scenario item failue", err=True)
common.print_red("Validate the scenario item failure", err=True)
return err_dic
# get kata vm count
if scenario != "logical_partition":
scenario_cfg_lib.KATA_VM_COUNT = common.VM_COUNT - scenario_cfg_lib.DEFAULT_VM_COUNT[scenario]
if scenario_cfg_lib.KATA_VM_COUNT > 1:
err_dic['scenario config: kata vm count err'] = "Only one kata vm is supported!"
scenario_cfg_lib.KATA_VM_COUNT = int(scenario_items['hv'].cap.max_kata_vm_num)
if scenario_cfg_lib.KATA_VM_COUNT > 1:
err_dic['scenario config'] = "Only one kata vm is supported!"
return err_dic
# generate board defconfig
with open(config_hv, 'w+') as config:
err_dic = board_defconfig.generate_file(scenario_items['hv'], config)
if err_dic:
return err_dic
# generate vm_configuration.h
with open(vm_config_h, 'w') as config:
vm_configurations_h.generate_file(scenario, vm_info, config)
vm_configurations_h.generate_file(scenario, scenario_items['vm'], config)
# generate vm_configuration.c
with open(vm_config_c, 'w') as config:
err_dic = vm_configurations_c.generate_file(scenario, vm_info, config)
err_dic = vm_configurations_c.generate_file(scenario, scenario_items['vm'], config)
if err_dic:
return err_dic

View File

@@ -31,7 +31,7 @@ class HwInfo:
Get root devices from board info
:return: root devices list
"""
self.root_dev_val = common.get_rootfs(self.board_info)
(self.root_dev_val, num) = common.get_rootfs(self.board_info)
return self.root_dev_val
def get_ttys_val(self):
@@ -95,8 +95,8 @@ class CfgOsKern:
self.scenario_info, "os_config", "kern_mod")
self.kern_args = common.get_leaf_tag_map(
self.scenario_info, "os_config", "bootargs")
self.kern_console = common.get_leaf_tag_map(
self.scenario_info, "os_config", "console")
self.kern_console = common.get_hv_item_tag(
self.scenario_info, "DEBUG_OPTIONS", "SERIAL_CONSOLE")
self.kern_load_addr = common.get_leaf_tag_map(
self.scenario_info, "os_config", "kern_load_addr")
self.kern_entry_addr = common.get_leaf_tag_map(
@@ -117,48 +117,16 @@ class CfgOsKern:
scenario_cfg_lib.os_kern_type_check(self.kern_type, "os_config", "kern_type")
scenario_cfg_lib.os_kern_mod_check(self.kern_mod, "os_config", "kern_mod")
scenario_cfg_lib.os_kern_args_check(self.kern_args, "os_config", "kern_args")
scenario_cfg_lib.os_kern_console_check(self.kern_console, "os_config", "console")
scenario_cfg_lib.os_kern_console_check(self.kern_console, "DEBUG_OPTIONS", "SERIAL_CONSOLE")
scenario_cfg_lib.os_kern_load_addr_check(self.kern_load_addr, "os_config", "kern_load_addr")
scenario_cfg_lib.os_kern_entry_addr_check(self.kern_entry_addr, "os_config", "kern_entry_addr")
scenario_cfg_lib.os_kern_root_dev_check(self.kern_root_dev, "os_config", "rootdev")
class VuartTarget:
""" This is Abstract of class of vm target vuart """
t_vm_id = []
t_vuart_id = []
def __init__(self):
self.t_vm_id = []
def style_check_1(self):
""" This is public method for style check"""
self.t_vm_id = []
def style_check_2(self):
""" This is public method for style check"""
self.t_vm_id = []
class VuartCfg(VuartTarget):
""" This is Abstract of class of vm vuart configuration """
v_type = []
v_base = []
v_irq = []
target = VuartTarget()
def __init__(self):
self.v1_type = []
def style_check_1(self):
""" This is public method for style check"""
self.v1_type = []
class VuartInfo:
""" This is Abstract of class of vm vuart setting """
v0_vuart = VuartCfg()
v1_vuart = VuartCfg()
v0_vuart = {}
v1_vuart = {}
def __init__(self, scenario_file):
self.scenario_info = scenario_file

View File

@@ -194,7 +194,7 @@ def gen_logical_partition_header(vm_info, config):
print('#define VM{0}_CONFIG_OS_BOOTARG_MAXCPUS\t\t"maxcpus={1} "'.format(
i, cpu_bits['cpu_num']), file=config)
print('#define VM{0}_CONFIG_OS_BOOTARG_CONSOLE\t\t"console={1} "'.format(
i, vm_info.os_cfg.kern_console[i].strip('/dev/')), file=config)
i, vm_info.os_cfg.kern_console.strip('/dev/')), file=config)
print("", file=config)
print('/* VM pass-through devices assign policy:', file=config)