acrn-config: support non-contiguous HPA for pre-launched VM

This patch modifies the python scripts in scenario,
board and vm-configuration to support,
	1. Generation of seperate ve820 for each VM.
	2. Ability to configure each VM's HPA from
	   acrn-config UI tool.
	3. Non-contiguous HPAs for pre-launched VMs.

Signed-off-by: Vijay Dhanraj <vijay.dhanraj@intel.com>
Tracked-On: #4195
Acked-by: Anthony Xu <anthony.xu@intel.com>
This commit is contained in:
Vijay Dhanraj
2019-12-04 13:29:48 -08:00
committed by wenlingz
parent 6e8b413689
commit 706dbc0e00
5 changed files with 152 additions and 64 deletions

View File

@@ -6,12 +6,11 @@
import sys
import board_cfg_lib
FOUR_GBYTE = 4 * 1024 * 1024 * 1024
LOW_MEM_TO_PCI_HOLE = 0x20000000
def ve820_per_launch(config, hpa_size):
def ve820_per_launch(config, hpa_size, hpa2_size):
"""
Start to generate board.c
:param config: it is a file pointer of board information for writing to
@@ -22,88 +21,137 @@ def ve820_per_launch(config, hpa_size):
board_name = board_cfg_lib.undline_name(board_name)
high_mem_hpa_len = 0x0
low_mem_to_pci_hole_len = '0xA0000000'
low_mem_to_pci_hole = '0x20000000'
pci_hole_addr = '0xe0000000'
pci_hole_len = '0x20000000'
start_low_hpa = 0x100000
if (int(hpa_size, 16) <= 512 * 1024 * 1024):
low_mem_hpa_len = int(hpa_size, 16) - 1 * 1024 * 1024
else:
low_mem_hpa_len = 511 * 1024 * 1024
high_mem_hpa_len = int(hpa_size, 16) - 512 * 1024 * 1024
low_mem_hpa_len = []
high_mem_hpa_len = []
high_mem_hpa2_len = []
high_mem_hpa2_addr = []
# pre_launch memroy: mem_size is the ve820 length
print("#include <e820.h>", file=config)
print("#include <vm.h>", file=config)
print("", file=config)
if (high_mem_hpa_len == 0):
print("#define VE820_ENTRIES_{}\t{}U".format(board_name, 5), file=config)
else:
print("#define VE820_ENTRIES_{}\t{}U".format(board_name, 6), file=config)
print("static const struct e820_entry ve820_entry[{}] = {{".format(
"VE820_ENTRIES_{}".format(board_name)), file=config)
print("\t{\t/* usable RAM under 1MB */", file=config)
print("\t\t.baseaddr = 0x0UL,", file=config)
print("\t\t.length = 0xF0000UL,\t\t/* 960KB */", file=config)
print("\t\t.type = E820_TYPE_RAM", file=config)
print("\t},", file=config)
print("", file=config)
print("\t{\t/* mptable */", file=config)
print("\t\t.baseaddr = 0xF0000UL,\t\t/* 960KB */", file=config)
print("\t\t.length = 0x10000UL,\t\t/* 16KB */", file=config)
print("\t\t.type = E820_TYPE_RESERVED", file=config)
print("\t},", file=config)
print("", file=config)
for i in range(board_cfg_lib.VM_COUNT):
if (int(hpa_size[i], 16) <= 512 * 1024 * 1024):
low_mem_hpa_len.append(int(hpa_size[i], 16) - 1 * 1024 * 1024)
high_mem_hpa_len.append(0)
else:
low_mem_hpa_len.append(511 * 1024 * 1024)
high_mem_hpa_len.append(int(hpa_size[i], 16) - 512 * 1024 * 1024)
print("\t{\t/* lowmem */", file=config)
#HPA2 is always allocated in >4G space.
high_mem_hpa2_len.append(int(hpa2_size[i], 16))
if (high_mem_hpa_len[i] != 0) and (high_mem_hpa2_len[i] != 0):
high_mem_hpa2_addr.append(hex(FOUR_GBYTE) + high_mem_hpa_len[i])
else:
high_mem_hpa2_addr.append(hex(FOUR_GBYTE))
print("\t\t.baseaddr = {}UL,\t\t/* 1MB */".format(
hex(start_low_hpa)), file=config)
print("\t\t.length = {}UL,\t/* {}MB */".format(
hex(low_mem_hpa_len), low_mem_hpa_len / 1024 / 1024), file=config)
if (high_mem_hpa_len[i] != 0) and (high_mem_hpa2_len[i] != 0):
print("#define VM{}_VE820_ENTRIES_{}\t{}U".format(i, board_name, 7), file=config)
elif (high_mem_hpa_len[i] != 0) or (high_mem_hpa2_len[i] != 0):
print("#define VM{}_VE820_ENTRIES_{}\t{}U".format(i, board_name, 6), file=config)
else:
print("#define VM{}_VE820_ENTRIES_{}\t{}U".format(i, board_name, 5), file=config)
print("\t\t.type = E820_TYPE_RAM", file=config)
print("\t},", file=config)
print("", file=config)
for i in range(board_cfg_lib.VM_COUNT):
print("static const struct e820_entry vm{}_ve820_entry[{}] = {{".format(
i, "VM{}_VE820_ENTRIES_{}".format(i, board_name)), file=config)
print("\t{\t/* usable RAM under 1MB */", file=config)
print("\t\t.baseaddr = 0x0UL,", file=config)
print("\t\t.length = 0xF0000UL,\t\t/* 960KB */", file=config)
print("\t\t.type = E820_TYPE_RAM", file=config)
print("\t},", file=config)
print("", file=config)
print("\t{\t/* mptable */", file=config)
print("\t\t.baseaddr = 0xF0000UL,\t\t/* 960KB */", file=config)
print("\t\t.length = 0x10000UL,\t\t/* 64KB */", file=config)
print("\t\t.type = E820_TYPE_RESERVED", file=config)
print("\t},", file=config)
print("", file=config)
print("\t{\t/* between lowmem and PCI hole */", file=config)
print("\t\t.baseaddr = {}UL,\t/* {}MB */".format(
low_mem_to_pci_hole, int(low_mem_to_pci_hole, 16) / 1024 / 1024), file=config)
print("\t\t.length = {}UL,\t/* {}MB */".format(
low_mem_to_pci_hole_len, int(low_mem_to_pci_hole_len, 16) / 1024 / 1024), file=config)
print("\t\t.type = E820_TYPE_RESERVED", file=config)
print("\t},", file=config)
print("", file=config)
print("\t{\t/* between PCI hole and 4 GB */", file=config)
print("\t\t.baseaddr = {}UL,\t/* {}GB */".format(
hex(int(pci_hole_addr, 16)), int(pci_hole_addr, 16) / 1024 / 1024 / 1024), file=config)
print("\t\t.length = {}UL,\t/* {}MB */".format(
hex(int(pci_hole_len, 16)), int(pci_hole_len, 16) / 1024 / 1024), file=config)
print("\t\t.type = E820_TYPE_RESERVED", file=config)
print("\t},", file=config)
print("", file=config)
if (high_mem_hpa_len != 0):
print("\t{\t/* high mem after 4GB*/", file=config)
print("\t\t.baseaddr = {}UL,\t/* 4 GB */".format(
hex(FOUR_GBYTE)), file=config)
print("\t{\t/* lowmem */", file=config)
print("\t\t.baseaddr = {}UL,\t\t/* 1MB */".format(
hex(start_low_hpa)), file=config)
print("\t\t.length = {}UL,\t/* {}MB */".format(
hex(high_mem_hpa_len), high_mem_hpa_len / 1024 / 1024), file=config)
hex(low_mem_hpa_len[i]), low_mem_hpa_len[i] / 1024 / 1024), file=config)
print("\t\t.type = E820_TYPE_RAM", file=config)
print("\t},", file=config)
print("", file=config)
print("};", file=config)
print("", file=config)
print("\t{\t/* between lowmem and PCI hole */", file=config)
print("\t\t.baseaddr = {}UL,\t/* {}MB */".format(
low_mem_to_pci_hole, int(low_mem_to_pci_hole, 16) / 1024 / 1024), file=config)
print("\t\t.length = {}UL,\t/* {}MB */".format(
low_mem_to_pci_hole_len, int(low_mem_to_pci_hole_len, 16) / 1024 / 1024), file=config)
print("\t\t.type = E820_TYPE_RESERVED", file=config)
print("\t},", file=config)
print("", file=config)
print("\t{\t/* between PCI hole and 4 GB */", file=config)
print("\t\t.baseaddr = {}UL,\t/* {}GB */".format(
hex(int(pci_hole_addr, 16)), int(pci_hole_addr, 16) / 1024 / 1024 / 1024), file=config)
print("\t\t.length = {}UL,\t/* {}MB */".format(
hex(int(pci_hole_len, 16)), int(pci_hole_len, 16) / 1024 / 1024), file=config)
print("\t\t.type = E820_TYPE_RESERVED", file=config)
print("\t},", file=config)
print("", file=config)
if (high_mem_hpa_len[i] != 0) and (high_mem_hpa2_len[i] != 0):
print("\t{\t/* high mem after 4GB*/", file=config)
print("\t\t.baseaddr = {}UL,\t/* 4 GB */".format(
hex(FOUR_GBYTE)), file=config)
print("\t\t.length = {}UL,\t/* {}MB */".format(
hex(high_mem_hpa_len[i]), high_mem_hpa_len[i] / 1024 / 1024), file=config)
print("\t\t.type = E820_TYPE_RAM", file=config)
print("\t},", file=config)
print("", file=config)
print("\t{\t/* HPA2 after high mem*/", file=config)
print("\t\t.baseaddr = {}UL,\t/* {}GB */".format(
hex(high_mem_hpa2_addr[i]), int(high_mem_hpa2_addr[i], 16) / 1024 / 1024 / 1024), file=config)
print("\t\t.length = {}UL,\t/* {}MB */".format(
hex(high_mem_hpa_len[i]), high_mem_hpa_len[i] / 1024 / 1024), file=config)
print("\t\t.type = E820_TYPE_RAM", file=config)
print("\t},", file=config)
print("", file=config)
elif (high_mem_hpa_len[i] != 0):
print("\t{\t/* high mem after 4GB*/", file=config)
print("\t\t.baseaddr = {}UL,\t/* 4 GB */".format(
hex(FOUR_GBYTE)), file=config)
print("\t\t.length = {}UL,\t/* {}MB */".format(
hex(high_mem_hpa_len[i]), high_mem_hpa_len[i] / 1024 / 1024), file=config)
print("\t\t.type = E820_TYPE_RAM", file=config)
print("\t},", file=config)
print("", file=config)
elif(high_mem_hpa2_len[i] != 0):
print("\t{\t/* HPA2 after 4GB*/", file=config)
print("\t\t.baseaddr = {}UL,\t/* 4 GB */".format(
hex(FOUR_GBYTE)), file=config)
print("\t\t.length = {}UL,\t/* {}MB */".format(
hex(high_mem_hpa2_len[i]), high_mem_hpa2_len[i] / 1024 / 1024), file=config)
print("\t\t.type = E820_TYPE_RAM", file=config)
print("\t},", file=config)
print("", file=config)
print("};", file=config)
print("", file=config)
print("/**", file=config)
print(" * @pre vm != NULL", file=config)
print("*/", file=config)
print("void create_prelaunched_vm_e820(struct acrn_vm *vm)", file=config)
print("{", file=config)
print("\tvm->e820_entry_num = VE820_ENTRIES_{};".format(board_name), file=config)
print("\tvm->e820_entries = ve820_entry;", file=config)
for i in range(board_cfg_lib.VM_COUNT):
print("\tif (vm->vm_id == {}U)".format(hex(i)), file=config)
print("\t{", file=config)
print("\t\tvm->e820_entry_num = VM{}_VE820_ENTRIES_{};".format(i, board_name), file=config)
print("\t\tvm->e820_entries = vm{}_ve820_entry;".format(i), file=config)
print("\t}", file=config)
print("", file=config)
print("}", file=config)
return err_dic
@@ -144,9 +192,24 @@ def generate_file(config):
err_dic['board config: generate ve820.c failed'] = "Unknow type of host physical address size"
return err_dic
hpa_size = hpa_size_list[0]
if pre_vm_cnt != 0 and ('0x' in hpa_size or '0X' in hpa_size):
err_dic = ve820_per_launch(config, hpa_size)
# read HPA2 mem size from scenario.xml
hpa2_size_list = board_cfg_lib.get_sub_leaf_tag(
board_cfg_lib.SCENARIO_INFO_FILE, "memory", "size_hpa2")
ret = board_cfg_lib.is_hpa_size(hpa2_size_list)
if not ret:
board_cfg_lib.print_red("Unknow type of second host physical address size", err=True)
err_dic['board config: generate ve820.c failed'] = "Unknow type of second host physical address size"
return err_dic
# HPA size for both VMs should have valid length.
for i in range(board_cfg_lib.VM_COUNT):
if hpa_size_list[i] == '0x0' or hpa_size_list[i] == '0X0':
board_cfg_lib.print_red("HPA size should not be zero", err=True)
err_dic['board config: generate ve820.c failed'] = "HPA size should not be zero"
return err_dic
if pre_vm_cnt != 0:
err_dic = ve820_per_launch(config, hpa_size_list, hpa2_size_list)
else:
non_ve820_pre_launch(config)