diff --git a/misc/acrn-config/board_config/board_cfg_gen.py b/misc/acrn-config/board_config/board_cfg_gen.py
index d8a65ad9e..9e0728bfb 100755
--- a/misc/acrn-config/board_config/board_cfg_gen.py
+++ b/misc/acrn-config/board_config/board_cfg_gen.py
@@ -13,6 +13,7 @@ import pci_devices_h
import acpi_platform_h
import misc_cfg_h
import new_board_kconfig
+import common
ACRN_PATH = board_cfg_lib.SOURCE_ROOT_DIR
ACRN_CONFIG_TARGET = ACRN_PATH + "hypervisor/arch/x86/configs/"
@@ -41,9 +42,12 @@ def main(args):
if err_dic:
return err_dic
+ common.BOARD_INFO_FILE = board_info_file
+ common.SCENARIO_INFO_FILE = scenario_info_file
+ common.get_vm_num(scenario_info_file)
board_cfg_lib.BOARD_INFO_FILE = board_info_file
board_cfg_lib.SCENARIO_INFO_FILE = scenario_info_file
- board_cfg_lib.get_vm_count(scenario_info_file)
+ board_cfg_lib.get_vm_num(scenario_info_file)
# get board name
(err_dic, board) = board_cfg_lib.get_board_name()
diff --git a/misc/acrn-config/launch_config/launch_cfg_gen.py b/misc/acrn-config/launch_config/launch_cfg_gen.py
index b60ad9d76..9b4471ac4 100644
--- a/misc/acrn-config/launch_config/launch_cfg_gen.py
+++ b/misc/acrn-config/launch_config/launch_cfg_gen.py
@@ -9,6 +9,7 @@ sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', '
from launch_item import AvailablePthru, PthruSelected, VirtioDeviceSelect, AcrnDmArgs
import launch_cfg_lib
import com
+import common
ACRN_PATH = launch_cfg_lib.SOURCE_ROOT_DIR
ACRN_CONFIG_TARGET = ACRN_PATH + '/misc/acrn-config/xmls/config-xmls/'
@@ -60,6 +61,9 @@ def validate_launch_setting(board_info, scenario_info, launch_info):
:return: return a dictionary contain errors
"""
launch_cfg_lib.ERR_LIST = {}
+ common.BOARD_INFO_FILE = board_info
+ common.SCENARIO_INFO_FILE = scenario_info
+ common.LAUNCH_INFO_FILE = launch_info
launch_cfg_lib.BOARD_INFO_FILE = board_info
launch_cfg_lib.SCENARIO_INFO_FILE = scenario_info
launch_cfg_lib.LAUNCH_INFO_FILE = launch_info
@@ -161,6 +165,9 @@ def main(args):
# 1: generate launch script for 1st post vm launch script
# 2: generate launch script for 2nd post vm launch script
+ common.BOARD_INFO_FILE = board_info_file
+ common.SCENARIO_INFO_FILE = scenario_info_file
+ common.LAUNCH_INFO_FILE = launch_info_file
launch_cfg_lib.BOARD_INFO_FILE = board_info_file
launch_cfg_lib.SCENARIO_INFO_FILE = scenario_info_file
launch_cfg_lib.LAUNCH_INFO_FILE = launch_info_file
diff --git a/misc/acrn-config/launch_config/launch_item.py b/misc/acrn-config/launch_config/launch_item.py
index b65c24572..59743e63c 100644
--- a/misc/acrn-config/launch_config/launch_item.py
+++ b/misc/acrn-config/launch_config/launch_item.py
@@ -3,6 +3,7 @@
# SPDX-License-Identifier: BSD-3-Clause
#
+import board_cfg_lib
import launch_cfg_lib
class AcrnDmArgs:
@@ -26,7 +27,7 @@ class AcrnDmArgs:
self.args["xhci"] = launch_cfg_lib.get_leaf_tag_map(self.launch_info, "usb_xhci")
def check_item(self):
- rootfs = launch_cfg_lib.get_rootdev_info(self.board_info)
+ rootfs = board_cfg_lib.get_rootfs(self.board_info)
launch_cfg_lib.args_aval_check(self.args["uos_type"], "uos_type", launch_cfg_lib.UOS_TYPES)
launch_cfg_lib.args_aval_check(self.args["rtos_type"], "rtos_type", launch_cfg_lib.RTOS_TYPE)
launch_cfg_lib.mem_size_check(self.args["mem_size"], "mem_size")
diff --git a/misc/acrn-config/library/board_cfg_lib.py b/misc/acrn-config/library/board_cfg_lib.py
index 33a21f3b2..39e81695b 100644
--- a/misc/acrn-config/library/board_cfg_lib.py
+++ b/misc/acrn-config/library/board_cfg_lib.py
@@ -3,10 +3,11 @@
# SPDX-License-Identifier: BSD-3-Clause
#
+import re
import sys
import common
-SOURCE_ROOT_DIR = common.SOURCE_PATH
+SOURCE_ROOT_DIR = common.SOURCE_ROOT_DIR
BOARD_NAME = ''
BOARD_INFO_FILE = "board_info.txt"
SCENARIO_INFO_FILE = ""
@@ -47,7 +48,7 @@ SIZE_G = common.SIZE_G
def prepare():
""" check environment """
- return common.check_env()
+ return common.prepare()
def print_yel(msg, warn=False):
@@ -56,7 +57,7 @@ def print_yel(msg, warn=False):
:param msg: the stings which will be output to STDOUT
:param warn: the condition if needs to be output the color of yellow with 'Warning'
"""
- common.print_if_yel(msg, warn)
+ common.print_yel(msg, warn)
def print_red(msg, err=False):
@@ -65,7 +66,7 @@ def print_red(msg, err=False):
:param msg: the stings which will be output to STDOUT
:param err: the condition if needs to be output the color of red with 'Error'
"""
- common.print_if_red(msg, err)
+ common.print_red(msg, err)
def get_board_name():
@@ -73,8 +74,7 @@ def get_board_name():
Get board name from board.xml at fist line
:param board_info: it is a file what contains board information for script to read from
"""
- (err_dic, board) = common.get_xml_attrib(BOARD_INFO_FILE, "board")
- return (err_dic, board)
+ return common.get_board_name()
def get_scenario_name():
@@ -82,19 +82,12 @@ def get_scenario_name():
Get scenario name from scenario.xml at fist line
:param scenario_info: it is a file what contains board information for script to read from
"""
- (err_dic, scenario) = common.get_xml_attrib(SCENARIO_INFO_FILE, "scenario")
- return (err_dic, scenario)
+ return common.get_scenario_name()
def is_config_file_match():
- (err_dic, scenario_for_board) = common.get_xml_attrib(SCENARIO_INFO_FILE, "board")
- (err_dic, board_name) = common.get_xml_attrib(BOARD_INFO_FILE, "board")
-
- if scenario_for_board == board_name:
- return (err_dic, True)
- else:
- return (err_dic, False)
+ return common.is_config_file_match()
def usage(file_name):
@@ -117,8 +110,34 @@ def get_info(board_info, msg_s, msg_e):
:param msg_s: it is a pattern of key stings what start to match from board information
:param msg_e: it is a pattern of key stings what end to match from board information
"""
- info_lines = common.get_board_info(board_info, msg_s, msg_e)
- return info_lines
+ info_start = False
+ info_end = False
+ info_lines = []
+ num = len(msg_s.split())
+
+ with open(board_info, 'rt') as f_board:
+ while True:
+
+ line = f_board.readline()
+ if not line:
+ break
+
+ if " ".join(line.split()[0:num]) == msg_s:
+ info_start = True
+ info_end = False
+ continue
+
+ if " ".join(line.split()[0:num]) == msg_e:
+ info_start = False
+ info_end = True
+ continue
+
+ if info_start and not info_end:
+ info_lines.append(line)
+ continue
+
+ if not info_start and info_end:
+ return info_lines
def handle_bios_info(config):
@@ -156,17 +175,44 @@ def handle_bios_info(config):
print(" */", file=config)
-def get_tree_tag(config_file, tag_str):
+def handle_root_dev(line):
+ """Handle if it match root device information pattern
+ :param line: one line of information which had decoded to 'ASCII'
"""
- This is get tag value by tag_str from config file
- :param config_file: it is a file what contains information for script to read from
- :param tag_str: it is key of pattern to config file item
- :return: value of tag_str item
- """
- return common.get_tree_tag_val(config_file, tag_str)
+ for root_type in line.split():
+ # only support ext4 rootfs
+ if "ext4" in root_type:
+ return True
+
+ return False
-def get_sub_leaf_tag(config_file, branch_tag, tag_str):
+def get_max_clos_mask(board_file):
+ """
+ Parse CLOS information
+ :param board_file: it is a file what contains board information for script to read from
+ :return: type of rdt resource supported and their corresponding clos max.
+ """
+ rdt_res=[]
+ rdt_res_clos_max=[]
+ rdt_res_mask_max=[]
+
+ clos_lines = get_info(board_file, "", "")
+ for line in clos_lines:
+ if line.split(':')[0].strip() == "rdt resources supported":
+ rdt_res = line.split(':')[1].strip()
+ elif line.split(':')[0].strip() == "rdt resource clos max":
+ rdt_res_clos_max = line.split(':')[1].strip()
+ elif line.split(':')[0].strip() == "rdt resource mask max":
+ rdt_res_mask_max = line.split(':')[1].strip()
+
+ if (len(rdt_res) == 0) or (len(rdt_res_clos_max) == 0):
+ return rdt_res, rdt_res_clos_max, rdt_res_mask_max
+ else:
+ return list(re.split(', |\s |,', rdt_res)), list(map(int, rdt_res_clos_max.split(','))), list(re.split(', |\s |,', rdt_res_mask_max))
+
+
+def get_sub_leaf_tag(config_file, branch_tag, tag_str=''):
"""
This is get tag value by tag_str from config file
:param config_file: it is a file what contains information for script to read from
@@ -174,17 +220,7 @@ def get_sub_leaf_tag(config_file, branch_tag, tag_str):
:param tag_str: it is key of pattern to config file leaf tag item
:return: value of tag_str item
"""
- return common.get_leaf_tag_val(config_file, branch_tag, tag_str)
-
-
-def is_hpa_size(hpa_size_list):
- """
- This is identify if the host physical size list is correct format
- :param hpa_size_list: host physical size list
- :return: True if good format
- """
- ret = common.check_hpa_size(hpa_size_list)
- return ret
+ return common.get_sub_leaf_tag(config_file, branch_tag, tag_str)
def get_rootfs(config_file):
@@ -204,7 +240,7 @@ def get_rootfs(config_file):
if not rootfs_line:
break
- if not common.handle_root_dev(rootfs_line):
+ if not handle_root_dev(rootfs_line):
continue
root_dev = rootfs_line.strip().split(':')[0]
@@ -215,27 +251,17 @@ def get_rootfs(config_file):
def clos_info_parser(board_info):
""" Parse CLOS information """
- return common.get_max_clos_mask(board_info)
+ return get_max_clos_mask(board_info)
-def get_pre_launch_cnt(config_file):
- """
- This is get pre launched vm count
- :param config_file: it is a file what contains vm information for script to read from
- :return: number of per launched vm
- """
- pre_launch_cnt = common.vm_pre_launch_cnt(config_file)
- return pre_launch_cnt
-
-
-def get_vm_count(config_file):
+def get_vm_num(config_file):
"""
This is get vm count
:param config_file: it is a file what contains vm information for script to read from
:return: number of vm
"""
global VM_COUNT
- VM_COUNT = common.get_vm_count(config_file)
+ VM_COUNT = common.get_vm_num(config_file)
def get_order_type_by_vmid(idx):
@@ -383,6 +409,29 @@ def get_board_private_vuart(branch_tag, tag_console):
return (err_dic, vuart0_console_dic, vuart1_console_dic)
+def get_vuart_id(tmp_vuart, leaf_tag, leaf_text):
+ """
+ Get all vuart id member of class
+ :param tmp_vuart: a dictionary to store member:value
+ :param leaf_tag: key pattern of item tag
+ :param leaf_text: key pattern of item tag's value
+ :return: a dictionary to which stored member:value
+ """
+ if leaf_tag == "type":
+ tmp_vuart['type'] = leaf_text
+ if leaf_tag == "base":
+ tmp_vuart['base'] = leaf_text
+ if leaf_tag == "irq":
+ tmp_vuart['irq'] = leaf_text
+
+ if leaf_tag == "target_vm_id":
+ tmp_vuart['target_vm_id'] = leaf_text
+ if leaf_tag == "target_uart_id":
+ tmp_vuart['target_uart_id'] = leaf_text
+
+ return tmp_vuart
+
+
def get_vuart_info_id(config_file, idx):
"""
Get vuart information by vuart id indexx
@@ -390,7 +439,23 @@ def get_vuart_info_id(config_file, idx):
:param idx: vuart index in range: [0,1]
:return: dictionary which stored the vuart-id
"""
- tmp_tag = common.get_vuart_info_id(config_file, idx)
+ tmp_tag = {}
+ vm_id = 0
+ root = common.get_config_root(config_file)
+ for item in root:
+ for sub in item:
+ tmp_vuart = {}
+ for leaf in sub:
+ if sub.tag == "vuart" and int(sub.attrib['id']) == idx:
+ tmp_vuart = get_vuart_id(tmp_vuart, leaf.tag, leaf.text)
+
+ # append vuart for each vm
+ if tmp_vuart and sub.tag == "vuart":
+ tmp_tag[vm_id] = tmp_vuart
+
+ if item.tag == "vm":
+ vm_id += 1
+
return tmp_tag
@@ -421,6 +486,100 @@ def get_processor_info():
return tmp_list
+def get_ttys_info(board_info):
+ """
+ Get ttySn from board info
+ :param board_info: it is a file what contains board information for script to read from
+ :return: serial console list
+ """
+ ttys_list = []
+ ttys_info = get_info(board_info, "", "")
+
+ for ttys_line in ttys_info:
+ if not ttys_line:
+ break
+
+ ttys_dev = ttys_line.split()[0].split(':')[1]
+ ttysn = ttys_dev.split('/')[-1]
+ # currently SOS console can only support legacy serial port
+ if ttysn not in list(LEGACY_TTYS.keys()):
+ continue
+ ttys_list.append(ttys_dev)
+
+ return ttys_list
+
+def get_total_mem():
+ """
+ get total memory size from config file which is dumped from native board
+ :return: integer number of total memory size, Unit: MByte
+ """
+ scale_to_mb = 1
+ total_mem_mb = scale_to_mb
+ mem_lines = get_info(common.BOARD_INFO_FILE, "", "")
+ for mem_line in mem_lines:
+ mem_info_list = mem_line.split()
+
+ if len(mem_info_list) <= 1:
+ return total_mem_mb
+
+ if mem_info_list[1] == "kB":
+ scale_to_mb = 1024
+
+ total_mem_mb = int(mem_info_list[0]) / scale_to_mb
+ return total_mem_mb
+
+
+def get_pci_info(board_info):
+ pci_bdf_vpid = {}
+ pci_vid_start = False
+ pci_vid_end = False
+ pci_desc = {}
+ pci_start = False
+ pci_end = False
+
+ with open(board_info, 'r') as f:
+ while True:
+ line = f.readline()
+ if not line:
+ break
+
+ s = " "
+ if s.join(line.split()[0:2]) == "":
+ pci_start = True
+ pci_end = False
+ continue
+
+ if s.join(line.split()[0:2]) == "":
+ pci_start = False
+ pci_end = True
+ continue
+
+ # all pci device wiht description
+ if pci_start and not pci_end:
+ if "Region" in line and "Memory at" in line:
+ continue
+ bdf = line.split()[0]
+ pci_desc[bdf] = line
+
+ if s.join(line.split()[0:2]) == "":
+ pci_vid_start = True
+ pci_vid_end = False
+ continue
+
+ if s.join(line.split()[0:2]) == "":
+ pci_vid_start = False
+ pci_vid_end = True
+ continue
+
+ # all pci device with vid/pid and bdf
+ if pci_vid_start and not pci_vid_end:
+ bdf_str = line.split()[0]
+ vid_pid = line.split()[2]
+ pci_bdf_vpid[bdf_str] = vid_pid
+
+ return (pci_desc, pci_bdf_vpid)
+
+
def undline_name(name):
"""
This convert name which has contain '-' to '_'
diff --git a/misc/acrn-config/library/common.py b/misc/acrn-config/library/common.py
index 415712270..045e89c95 100644
--- a/misc/acrn-config/library/common.py
+++ b/misc/acrn-config/library/common.py
@@ -8,20 +8,15 @@ import sys
import getopt
import shutil
import subprocess
-import re
import xml.etree.ElementTree as ET
-SOURCE_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../../')
-HV_LICENSE_FILE = SOURCE_PATH + 'misc/acrn-config/library/hypervisor_license'
+SOURCE_ROOT_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../../../')
+HV_LICENSE_FILE = SOURCE_ROOT_DIR + 'misc/acrn-config/library/hypervisor_license'
PY_CACHES = ["__pycache__", "../board_config/__pycache__", "../scenario_config/__pycache__"]
GUEST_FLAG = ["0UL", "GUEST_FLAG_SECURE_WORLD_ENABLED", "GUEST_FLAG_LAPIC_PASSTHROUGH",
"GUEST_FLAG_IO_COMPLETION_POLLING", "GUEST_FLAG_HIDE_MTRR", "GUEST_FLAG_RT"]
-# Support 512M, 1G, 2G
-# pre launch less then 2G, sos vm less than 24G
-START_HPA_SIZE_LIST = ['0x20000000', '0x40000000', '0x80000000', 'CONFIG_SOS_RAM_SIZE']
-
MULTI_ITEM = ["guest_flag", "pcpu_id", "vcpu_clos", "input", "block", "network"]
@@ -31,6 +26,11 @@ SIZE_2G = 2 * SIZE_M * SIZE_K
SIZE_4G = 2 * SIZE_2G
SIZE_G = SIZE_M * 1024
+VM_COUNT = 0
+BOARD_INFO_FILE = ""
+SCENARIO_INFO_FILE = ""
+LAUNCH_INFO_FILE = ""
+
class MultiItem():
def __init__(self):
@@ -55,7 +55,7 @@ def open_license():
return license_s
-def print_if_yel(msg, warn=False):
+def print_yel(msg, warn=False):
"""
Print the message with 'Warning' if warn is true
:param msg: the stings which will be output to STDOUT
@@ -67,7 +67,7 @@ def print_if_yel(msg, warn=False):
print("\033[1;33m{0}\033[0m".format(msg))
-def print_if_red(msg, err=False):
+def print_red(msg, err=False):
"""
Print the message with 'Error' if err is true
:param msg: the stings which will be output to STDOUT
@@ -129,7 +129,7 @@ def get_param(args):
return (err_dic, board_info_file, scenario_info_file, output_folder)
-def check_env():
+def prepare():
""" Prepare to check the environment """
err_dic = {}
bin_list = []
@@ -149,22 +149,6 @@ def check_env():
return err_dic
-def check_hpa_size(hpa_size_list):
- """
- This is identify if the host physical size list is correct format
- :param hpa_size_list: host physical size list
- :return: True if good format
- """
- for hpa_size in hpa_size_list:
- hpa_sz_strip_ul = hpa_size.strip('UL')
- hpa_sz_strip_u = hpa_size.strip('U')
- if hpa_sz_strip_u not in START_HPA_SIZE_LIST and hpa_sz_strip_ul not in START_HPA_SIZE_LIST:
- if '0x' not in hpa_size and '0X' not in hpa_size:
- return False
-
- return True
-
-
def get_xml_attrib(config_file, attrib):
"""
Get attribute from xml at fist line
@@ -193,41 +177,33 @@ def get_xml_attrib(config_file, attrib):
return (err_dic, value)
-def get_board_info(board_info, msg_s, msg_e):
+def get_board_name():
"""
- Get information which specify by argument
+ Get board name from board.xml at fist line
:param board_info: it is a file what contains board information for script to read from
- :param msg_s: it is a pattern of key stings what start to match from board information
- :param msg_e: it is a pattern of key stings what end to match from board information
"""
- info_start = False
- info_end = False
- info_lines = []
- num = len(msg_s.split())
+ (err_dic, board) = get_xml_attrib(BOARD_INFO_FILE, "board")
+ return (err_dic, board)
- with open(board_info, 'rt') as f_board:
- while True:
- line = f_board.readline()
- if not line:
- break
+def get_scenario_name():
+ """
+ Get scenario name from scenario.xml at fist line
+ :param scenario_info: it is a file what contains board information for script to read from
+ """
+ (err_dic, scenario) = get_xml_attrib(SCENARIO_INFO_FILE, "scenario")
+ return (err_dic, scenario)
- if " ".join(line.split()[0:num]) == msg_s:
- info_start = True
- info_end = False
- continue
- if " ".join(line.split()[0:num]) == msg_e:
- info_start = False
- info_end = True
- continue
+def is_config_file_match():
- if info_start and not info_end:
- info_lines.append(line)
- continue
+ (err_dic, scenario_for_board) = get_xml_attrib(SCENARIO_INFO_FILE, "board")
+ (err_dic, board_name) = get_xml_attrib(BOARD_INFO_FILE, "board")
- if not info_start and info_end:
- return info_lines
+ if scenario_for_board == board_name:
+ return (err_dic, True)
+ else:
+ return (err_dic, False)
def find_index_guest_flag(flag):
@@ -276,7 +252,7 @@ def get_config_root(config_file):
return root
-def get_vm_count(config_file):
+def get_vm_num(config_file):
"""
Get vm number
:param config_file: it is a file what contains information for script to read from
@@ -288,61 +264,12 @@ def get_vm_count(config_file):
# vm number in scenario
if item.tag == "vm":
vm_count += 1
-
+ VM_COUNT = vm_count
return vm_count
-def launch_vm_cnt(config_file):
- """
- Get post vm number
- :param config_file: it is a file what contains information for script to read from
- :return: total post vm number in launch file
- """
- post_vm_count = 0
-
- # get post vm number
- root = get_config_root(config_file)
- for item in root:
- if item.tag == "uos":
- post_vm_count += 1
-
- return post_vm_count
-
-
-def get_post_num_list(config_file):
- """
- Get post vm number list
- :param config_file: it is a file what contains information for script to read from
- :return: total post dic: {launch_id:scenario_id} in launch file
- """
- post_vm_list = []
-
- # get post vm number
- root = get_config_root(config_file)
- for item in root:
- if item.tag == "uos":
- post_vm_list.append(int(item.attrib['id']))
-
- return post_vm_list
-
-
-def get_tree_tag_val(config_file, tag_str):
- """
- This is get tag value by tag_str from config file
- :param config_file: it is a file what contains information for script to read from
- :param tag_str: it is key of pattern to config file item
- :return: value of tag_str item
- """
- root = get_config_root(config_file)
- for item in root:
- if item.tag == tag_str:
- return item.text
-
- return False
-
-
# TODO: This will be abandonment in future
-def get_leaf_tag_val(config_file, branch_tag, tag_str=''):
+def get_sub_leaf_tag(config_file, branch_tag, tag_str=''):
"""
This is get tag value by tag_str from config file
:param config_file: it is a file what contains information for script to read from
@@ -500,7 +427,7 @@ def order_type_map_vmid(config_file, vm_count):
:return: table of id:order type dictionary
"""
order_id_dic = {}
- load_type_list = get_leaf_tag_val(config_file, "load_order")
+ load_type_list = get_sub_leaf_tag(config_file, "load_order")
for i in range(vm_count):
order_id_dic[i] = load_type_list[i]
@@ -523,75 +450,6 @@ def get_load_order_by_vmid(config_file, vm_count, idx):
return (err_dic, order_id_dic[idx])
-def vm_pre_launch_cnt(config_file):
- """
- Calculate the pre launched vm number
- :param config_file: it is a file what contains information for script to read from
- :return: number of pre launched vm
- """
- pre_launch_cnt = 0
- load_type_list = get_leaf_tag_val(config_file, "load_order")
-
- for vm_type in load_type_list:
- if vm_type == "PRE_LAUNCHED_VM":
- pre_launch_cnt += 1
-
- return pre_launch_cnt
-
-
-def post_vm_cnt(config_file):
- """
- Calculate the pre launched vm number
- :param config_file: it is a file what contains information for script to read from
- :return: number of post launched vm
- """
- post_launch_cnt = 0
- load_type_list = get_leaf_tag_val(config_file, "load_order")
-
- for vm_type in load_type_list:
- if vm_type == "POST_LAUNCHED_VM":
- post_launch_cnt += 1
-
- return post_launch_cnt
-
-
-def handle_root_dev(line):
- """Handle if it match root device information pattern
- :param line: one line of information which had decoded to 'ASCII'
- """
- for root_type in line.split():
- # only support ext4 rootfs
- if "ext4" in root_type:
- return True
-
- return False
-
-
-def get_max_clos_mask(board_file):
- """
- Parse CLOS information
- :param board_file: it is a file what contains board information for script to read from
- :return: type of rdt resource supported and their corresponding clos max.
- """
- rdt_res=[]
- rdt_res_clos_max=[]
- rdt_res_mask_max=[]
-
- clos_lines = get_board_info(board_file, "", "")
- for line in clos_lines:
- if line.split(':')[0].strip() == "rdt resources supported":
- rdt_res = line.split(':')[1].strip()
- elif line.split(':')[0].strip() == "rdt resource clos max":
- rdt_res_clos_max = line.split(':')[1].strip()
- elif line.split(':')[0].strip() == "rdt resource mask max":
- rdt_res_mask_max = line.split(':')[1].strip()
-
- if (len(rdt_res) == 0) or (len(rdt_res_clos_max) == 0):
- return rdt_res, rdt_res_clos_max, rdt_res_mask_max
- else:
- return list(re.split(', |\s |,', rdt_res)), list(map(int, rdt_res_clos_max.split(','))), list(re.split(', |\s |,', rdt_res_mask_max))
-
-
def undline_name(name):
"""
This convert name which has contain '-' to '_'
@@ -608,56 +466,6 @@ def undline_name(name):
return name_str
-def get_vuart_id(tmp_vuart, leaf_tag, leaf_text):
- """
- Get all vuart id member of class
- :param tmp_vuart: a dictionary to store member:value
- :param leaf_tag: key pattern of item tag
- :param leaf_text: key pattern of item tag's value
- :return: a dictionary to which stored member:value
- """
- if leaf_tag == "type":
- tmp_vuart['type'] = leaf_text
- if leaf_tag == "base":
- tmp_vuart['base'] = leaf_text
- if leaf_tag == "irq":
- tmp_vuart['irq'] = leaf_text
-
- if leaf_tag == "target_vm_id":
- tmp_vuart['target_vm_id'] = leaf_text
- if leaf_tag == "target_uart_id":
- tmp_vuart['target_uart_id'] = leaf_text
-
- return tmp_vuart
-
-
-def get_vuart_info_id(config_file, idx):
- """
- Get vuart information by vuart id indexx
- :param config_file: it is a file what contains information for script to read from
- :param idx: vuart index in range: [0,1]
- :return: dictionary which stored the vuart-id
- """
- tmp_tag = {}
- vm_id = 0
- root = get_config_root(config_file)
- for item in root:
- for sub in item:
- tmp_vuart = {}
- for leaf in sub:
- if sub.tag == "vuart" and int(sub.attrib['id']) == idx:
- tmp_vuart = get_vuart_id(tmp_vuart, leaf.tag, leaf.text)
-
- # append vuart for each vm
- if tmp_vuart and sub.tag == "vuart":
- tmp_tag[vm_id] = tmp_vuart
-
- if item.tag == "vm":
- vm_id += 1
-
- return tmp_tag
-
-
def round_up(addr, mem_align):
"""Keep memory align"""
return ((addr + (mem_align - 1)) & (~(mem_align - 1)))
@@ -669,4 +477,4 @@ def mkdir(path):
try:
subprocess.check_call('mkdir -p {}'.format(path), shell=True, stdout=subprocess.PIPE)
except subprocess.CalledProcessError:
- print_if_red("{} file create failed!".format(path), err=True)
+ print_red("{} file create failed!".format(path), err=True)
diff --git a/misc/acrn-config/library/launch_cfg_lib.py b/misc/acrn-config/library/launch_cfg_lib.py
index da842c034..a662f206a 100644
--- a/misc/acrn-config/library/launch_cfg_lib.py
+++ b/misc/acrn-config/library/launch_cfg_lib.py
@@ -6,8 +6,9 @@
import os
import getopt
import common
+import board_cfg_lib
-SOURCE_ROOT_DIR = common.SOURCE_PATH
+SOURCE_ROOT_DIR = common.SOURCE_ROOT_DIR
BOARD_INFO_FILE = "board_info.txt"
SCENARIO_INFO_FILE = ""
LAUNCH_INFO_FILE = ""
@@ -62,7 +63,7 @@ MOUNT_FLAG_DIC = {}
def prepare():
""" Check environment """
- return common.check_env()
+ return common.prepare()
def print_yel(msg, warn=False):
@@ -71,7 +72,7 @@ def print_yel(msg, warn=False):
:param msg: the stings which will be output to STDOUT
:param warn: the condition if needs to be output the color of yellow with 'Warning'
"""
- common.print_if_yel(msg, warn)
+ common.print_yel(msg, warn)
def print_red(msg, err=False):
@@ -80,7 +81,7 @@ def print_red(msg, err=False):
:param msg: the stings which will be output to STDOUT
:param err: the condition if needs to be output the color of red with 'Error'
"""
- common.print_if_red(msg, err)
+ common.print_red(msg, err)
def usage(file_name):
@@ -152,14 +153,53 @@ def get_param(args):
return (err_dic, board_info_file, scenario_info_file, launch_info_file, int(vm_th), output_folder)
+def launch_vm_cnt(config_file):
+ """
+ Get post vm number
+ :param config_file: it is a file what contains information for script to read from
+ :return: total post vm number in launch file
+ """
+ post_vm_count = 0
+
+ # get post vm number
+ root = common.get_config_root(config_file)
+ for item in root:
+ if item.tag == "uos":
+ post_vm_count += 1
+
+ return post_vm_count
+
+
def get_post_num_list():
"""
- Get board name from launch.xml at fist line
- :param scenario_file: it is a file what contains scenario information for script to read from
+ Get post vm number list
+ :return: total post dic: {launch_id:scenario_id} in launch file
"""
- post_num_list = common.get_post_num_list(LAUNCH_INFO_FILE)
- # {launch_id:scenario_id}
- return post_num_list
+ post_vm_list = []
+
+ # get post vm number
+ root = common.get_config_root(LAUNCH_INFO_FILE)
+ for item in root:
+ if item.tag == "uos":
+ post_vm_list.append(int(item.attrib['id']))
+
+ return post_vm_list
+
+
+def post_vm_cnt(config_file):
+ """
+ Calculate the pre launched vm number
+ :param config_file: it is a file what contains information for script to read from
+ :return: number of post launched vm
+ """
+ post_launch_cnt = 0
+ load_type_list = common.get_sub_leaf_tag(config_file, "load_order")
+
+ for vm_type in load_type_list:
+ if vm_type == "POST_LAUNCHED_VM":
+ post_launch_cnt += 1
+
+ return post_launch_cnt
def get_post_vm_cnt():
@@ -167,8 +207,8 @@ def get_post_vm_cnt():
Get board name from launch.xml at fist line
:param scenario_file: it is a file what contains scenario information for script to read from
"""
- launch_vm_count = common.launch_vm_cnt(LAUNCH_INFO_FILE)
- post_vm_count = common.post_vm_cnt(SCENARIO_INFO_FILE)
+ launch_vm_count = launch_vm_cnt(LAUNCH_INFO_FILE)
+ post_vm_count = post_vm_cnt(SCENARIO_INFO_FILE)
return (launch_vm_count, post_vm_count)
@@ -242,7 +282,7 @@ def get_info(board_info, msg_s, msg_e):
:param msg_s: it is a pattern of key stings what start to match from board information
:param msg_e: it is a pattern of key stings what end to match from board information
"""
- info_lines = common.get_board_info(board_info, msg_s, msg_e)
+ info_lines = board_cfg_lib.get_info(board_info, msg_s, msg_e)
return info_lines
@@ -253,7 +293,7 @@ def get_rootdev_info(board_info):
:return: root devices list
"""
rootdev_list = []
- rootdev_info = get_info(board_info, "", "")
+ rootdev_info = board_cfg_lib.get_info(board_info, "", "")
if rootdev_info == None:
return rootdev_list
@@ -262,7 +302,7 @@ def get_rootdev_info(board_info):
if not rootdev_line:
break
- if not common.handle_root_dev(rootdev_line):
+ if not board_cfg_lib.handle_root_dev(rootdev_line):
continue
root_dev = rootdev_line.strip().split(':')[0]
@@ -276,9 +316,7 @@ def get_scenario_name():
Get board name from scenario.xml at fist line
:param scenario_file: it is a file what contains scenario information for script to read from
"""
- (err_dic, scenario) = common.get_xml_attrib(SCENARIO_INFO_FILE, "scenario")
-
- return (err_dic, scenario)
+ return common.get_scenario_name()
def get_board_name():
@@ -286,8 +324,7 @@ def get_board_name():
Get board name from board.xml at fist line
:param board_info: it is a file what contains board information for script to read from
"""
- (err_dic, board) = common.get_xml_attrib(BOARD_INFO_FILE, "board")
- return (err_dic, board)
+ return common.get_board_name()
def is_config_file_match():
@@ -474,7 +511,7 @@ def get_cpu_processor_num():
get cpu processor number from config file which is dumped from native board
:return: integer number of cpu processor
"""
- cpu_lines = get_info(BOARD_INFO_FILE, "", "")
+ cpu_lines = board_cfg_lib.get_info(BOARD_INFO_FILE, "", "")
for cpu_line in cpu_lines:
cpu_processor_num = len(cpu_line.split(','))
@@ -489,7 +526,7 @@ def get_total_mem():
"""
scale_to_mb = 1
total_mem_mb = scale_to_mb
- mem_lines = get_info(BOARD_INFO_FILE, "", "")
+ mem_lines = board_cfg_lib.get_info(BOARD_INFO_FILE, "", "")
for mem_line in mem_lines:
mem_info_list = mem_line.split()
@@ -593,7 +630,7 @@ def undline_name(name):
def get_vuart1_from_scenario(vmid):
"""Get the vmid's vuart1 base"""
- vuart1 = common.get_vuart_info_id(SCENARIO_INFO_FILE, 1)
+ vuart1 = board_cfg_lib.get_vuart_info_id(SCENARIO_INFO_FILE, 1)
return vuart1[vmid]['base']
@@ -614,7 +651,7 @@ def pt_devs_check_audio(audio_map, audio_codec_map):
def check_block_mount(virtio_blk_dic):
- blk_dev_list = get_rootdev_info(BOARD_INFO_FILE)
+ blk_dev_list = board_cfg_lib.get_rootfs(BOARD_INFO_FILE)
for vmid in list(virtio_blk_dic.keys()):
mount_flags = []
for blk in virtio_blk_dic[vmid]:
diff --git a/misc/acrn-config/library/scenario_cfg_lib.py b/misc/acrn-config/library/scenario_cfg_lib.py
index 0d276f046..06dc85cf7 100644
--- a/misc/acrn-config/library/scenario_cfg_lib.py
+++ b/misc/acrn-config/library/scenario_cfg_lib.py
@@ -4,8 +4,9 @@
#
import common
+import board_cfg_lib
-SOURCE_ROOT_DIR = common.SOURCE_PATH
+SOURCE_ROOT_DIR = common.SOURCE_ROOT_DIR
HEADER_LICENSE = common.open_license()
BOARD_INFO_FILE = "board_info.txt"
SCENARIO_INFO_FILE = ""
@@ -30,6 +31,9 @@ VUART_IRQ = ['SOS_COM1_IRQ', 'SOS_COM2_IRQ', 'COM1_IRQ', 'COM2_IRQ', 'COM3_IRQ',
PCI_DEV_NUM_LIST = ['SOS_EMULATED_PCI_DEV_NUM', 'VM0_CONFIG_PCI_DEV_NUM', 'VM1_CONFIG_PCI_DEV_NUM']
PCI_DEVS_LIST = ['sos_pci_devs', 'vm0_pci_devs', 'vm1_pci_devs']
+# Support 512M, 1G, 2G
+# pre launch less then 2G, sos vm less than 24G
+START_HPA_SIZE_LIST = ['0x20000000', '0x40000000', '0x80000000', 'CONFIG_SOS_RAM_SIZE']
COMMUNICATE_VM_ID = []
@@ -54,7 +58,7 @@ LEGACY_TTYS = {
def prepare():
""" Check environment """
- return common.check_env()
+ return common.prepare()
def print_yel(msg, warn=False):
@@ -63,7 +67,7 @@ def print_yel(msg, warn=False):
:param msg: the stings which will be output to STDOUT
:param warn: the condition if needs to be output the color of yellow with 'Warning'
"""
- common.print_if_yel(msg, warn)
+ common.print_yel(msg, warn)
def print_red(msg, err=False):
@@ -72,7 +76,7 @@ def print_red(msg, err=False):
:param msg: the stings which will be output to STDOUT
:param err: the condition if needs to be output the color of red with 'Error'
"""
- common.print_if_red(msg, err)
+ common.print_red(msg, err)
def usage(file_name):
@@ -93,20 +97,12 @@ def get_scenario_name():
Get board name from scenario.xml at fist line
:param scenario_file: it is a file what contains scenario information for script to read from
"""
- (err_dic, scenario) = common.get_xml_attrib(SCENARIO_INFO_FILE, "scenario")
-
- return (err_dic, scenario)
+ return common.get_scenario_name()
def is_config_file_match():
- (err_dic, scenario_for_board) = common.get_xml_attrib(SCENARIO_INFO_FILE, "board")
- (err_dic, board_name) = common.get_xml_attrib(BOARD_INFO_FILE, "board")
-
- if scenario_for_board == board_name:
- return (err_dic, True)
- else:
- return (err_dic, False)
+ return common.is_config_file_match()
def get_info(board_info, msg_s, msg_e):
@@ -116,7 +112,7 @@ def get_info(board_info, msg_s, msg_e):
:param msg_s: it is a pattern of key stings what start to match from board information
:param msg_e: it is a pattern of key stings what end to match from board information
"""
- info_lines = common.get_board_info(board_info, msg_s, msg_e)
+ info_lines = board_cfg_lib.get_info(board_info, msg_s, msg_e)
return info_lines
@@ -128,7 +124,7 @@ def get_processor_info(board_info):
"""
processor_list = []
tmp_list = []
- processor_info = get_info(board_info, "", "")
+ processor_info = board_cfg_lib.get_info(board_info, "", "")
if not processor_info:
key = "vm:id=0,vcpu_affinity"
@@ -154,7 +150,7 @@ def get_rootdev_info(board_info):
:return: root devices list
"""
rootdev_list = []
- rootdev_info = get_info(board_info, "", "")
+ rootdev_info = board_cfg_lib.get_info(board_info, "", "")
# none 'BLOCK_DEVICE_INFO' tag
if rootdev_info == None:
@@ -164,7 +160,7 @@ def get_rootdev_info(board_info):
if not rootdev_line:
break
- if not common.handle_root_dev(rootdev_line):
+ if not board_cfg_lib.handle_root_dev(rootdev_line):
continue
root_dev = rootdev_line.strip().split(':')[0]
@@ -180,7 +176,7 @@ def get_ttys_info(board_info):
:return: serial console list
"""
ttys_list = []
- ttys_info = get_info(board_info, "", "")
+ ttys_info = board_cfg_lib.get_info(board_info, "", "")
for ttys_line in ttys_info:
if not ttys_line:
@@ -232,7 +228,7 @@ def get_vm_num(config_file):
:param config_file: it is a file what contains vm information for script to read from
:return: number of vm
"""
- return common.get_vm_count(config_file)
+ return common.get_vm_num(config_file)
def get_sub_leaf_tag(config_file, branch_tag, tag_str=''):
@@ -243,7 +239,7 @@ def get_sub_leaf_tag(config_file, branch_tag, tag_str=''):
:param tag_str: it is key of pattern to config file leaf tag item
:return: value of tag_str item
"""
- return common.get_leaf_tag_val(config_file, branch_tag, tag_str)
+ return common.get_sub_leaf_tag(config_file, branch_tag, tag_str)
def get_order_type_by_vmid(idx):
@@ -445,8 +441,8 @@ def mem_size_check(id_hpa_size_dic, prime_item, item):
ERR_LIST[key] = "VM start host physical memory size should not empty"
return
- if hpa_sz_strip_ul not in common.START_HPA_SIZE_LIST and hpa_sz_strip_u not in \
- common.START_HPA_SIZE_LIST:
+ if hpa_sz_strip_ul not in START_HPA_SIZE_LIST and hpa_sz_strip_u not in \
+ START_HPA_SIZE_LIST:
key = "vm:id={},{},{}".format(id_key, prime_item, item)
if '0x' not in hpa_size and '0X' not in hpa_size:
ERR_LIST[key] = "Mem size should be Hex format"
@@ -696,7 +692,7 @@ def get_vuart_info_id(config_file, idx):
:param idx: vuart index in range: [0,1]
:return: dictionary which stored the vuart-id
"""
- tmp_tag = common.get_vuart_info_id(config_file, idx)
+ tmp_tag = board_cfg_lib.get_vuart_info_id(config_file, idx)
return tmp_tag
diff --git a/misc/acrn-config/scenario_config/scenario_cfg_gen.py b/misc/acrn-config/scenario_config/scenario_cfg_gen.py
index 0e9294e9c..d8f5cd9da 100755
--- a/misc/acrn-config/scenario_config/scenario_cfg_gen.py
+++ b/misc/acrn-config/scenario_config/scenario_cfg_gen.py
@@ -12,6 +12,7 @@ import scenario_cfg_lib
import vm_configurations_c
import vm_configurations_h
import pci_dev_c
+import common
ACRN_PATH = scenario_cfg_lib.SOURCE_ROOT_DIR
ACRN_CONFIG_TARGET = ACRN_PATH + 'hypervisor/scenarios/'
@@ -27,6 +28,8 @@ def get_scenario_item_values(board_info, scenario_info):
hw_info = HwInfo(board_info)
# get vm count
+ common.BOARD_INFO_FILE = board_info
+ common.SCENARIO_INFO_FILE = scenario_info
scenario_cfg_lib.SCENARIO_INFO_FILE = scenario_info
scenario_cfg_lib.BOARD_INFO_FILE = board_info
scenario_cfg_lib.VM_COUNT = scenario_cfg_lib.get_vm_num(scenario_info)
@@ -59,6 +62,8 @@ def validate_scenario_setting(board_info, scenario_info):
:return: return a dictionary contain errors
"""
scenario_cfg_lib.ERR_LIST = {}
+ common.BOARD_INFO_FILE = board_info
+ common.SCENARIO_INFO_FILE = scenario_info
scenario_cfg_lib.BOARD_INFO_FILE = board_info
scenario_cfg_lib.SCENARIO_INFO_FILE = scenario_info
@@ -91,6 +96,8 @@ def main(args):
if err_dic:
return err_dic
+ common.BOARD_INFO_FILE = board_info_file
+ common.SCENARIO_INFO_FILE = scenario_info_file
scenario_cfg_lib.BOARD_INFO_FILE = board_info_file
scenario_cfg_lib.SCENARIO_INFO_FILE = scenario_info_file