mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-21 21:19:35 +00:00
HV: modularization vm config code
- move sanitize_vm_config() from vm.c to vm_config.c; - move get_vm_config() from vm.h to vm_config.h; Tracked-On: #2291 Signed-off-by: Victor Sun <victor.sun@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
parent
35dfadc98e
commit
1bb15c64a6
@ -132,6 +132,7 @@ C_SRCS += boot/reloc.c
|
|||||||
C_SRCS += arch/x86/init.c
|
C_SRCS += arch/x86/init.c
|
||||||
|
|
||||||
# configuration component
|
# configuration component
|
||||||
|
C_SRCS += arch/x86/configs/vm_config.c
|
||||||
ifeq ($(CONFIG_SHARING_MODE),y)
|
ifeq ($(CONFIG_SHARING_MODE),y)
|
||||||
C_SRCS += arch/x86/configs/sharing_config.c
|
C_SRCS += arch/x86/configs/sharing_config.c
|
||||||
else ifeq ($(CONFIG_PARTITION_MODE),y)
|
else ifeq ($(CONFIG_PARTITION_MODE),y)
|
||||||
|
61
hypervisor/arch/x86/configs/vm_config.c
Normal file
61
hypervisor/arch/x86/configs/vm_config.c
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 Intel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <vm_config.h>
|
||||||
|
#include <cpu.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <acrn_common.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @pre vm_config != NULL
|
||||||
|
*/
|
||||||
|
int32_t sanitize_vm_config(void)
|
||||||
|
{
|
||||||
|
int32_t ret = 0;
|
||||||
|
uint16_t vm_id;
|
||||||
|
uint64_t sos_pcpu_bitmap, pre_launch_pcpu_bitmap;
|
||||||
|
struct acrn_vm_config *vm_config;
|
||||||
|
|
||||||
|
sos_pcpu_bitmap = (uint64_t)((((uint64_t)1U) << get_pcpu_nums()) - 1U);
|
||||||
|
pre_launch_pcpu_bitmap = 0U;
|
||||||
|
/* All physical CPUs except ocuppied by Pre-launched VMs are all
|
||||||
|
* belong to SOS_VM. i.e. The pcpu_bitmap of a SOS_VM is decided
|
||||||
|
* by pcpu_bitmap status in PRE_LAUNCHED_VMs.
|
||||||
|
* We need to setup a rule, that the vm_configs[] array should follow
|
||||||
|
* the order of PRE_LAUNCHED_VM first, and then SOS_VM.
|
||||||
|
*/
|
||||||
|
for (vm_id = 0U; vm_id < CONFIG_MAX_VM_NUM; vm_id++) {
|
||||||
|
vm_config = get_vm_config(vm_id);
|
||||||
|
switch (vm_config->type) {
|
||||||
|
case PRE_LAUNCHED_VM:
|
||||||
|
if (vm_config->pcpu_bitmap == 0U) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
} else {
|
||||||
|
pre_launch_pcpu_bitmap |= vm_config->pcpu_bitmap;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SOS_VM:
|
||||||
|
/* Deduct pcpus of PRE_LAUNCHED_VMs */
|
||||||
|
sos_pcpu_bitmap ^= pre_launch_pcpu_bitmap;
|
||||||
|
if ((sos_pcpu_bitmap == 0U) || ((vm_config->guest_flags & LAPIC_PASSTHROUGH) != 0U)) {
|
||||||
|
ret = -EINVAL;
|
||||||
|
} else {
|
||||||
|
vm_config->pcpu_bitmap = sos_pcpu_bitmap;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case NORMAL_VM:
|
||||||
|
ret = -EINVAL;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* Nothing to do for a UNDEFINED_VM, break directly. */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (ret != 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
@ -579,72 +579,6 @@ void prepare_vm(uint16_t vm_id, struct acrn_vm_config *vm_config)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @pre vm_config != NULL
|
|
||||||
*/
|
|
||||||
int32_t sanitize_vm_config(void)
|
|
||||||
{
|
|
||||||
int32_t ret = 0;
|
|
||||||
uint16_t vm_id;
|
|
||||||
uint64_t sos_pcpu_bitmap, pre_launch_pcpu_bitmap;
|
|
||||||
struct acrn_vm_config *vm_config;
|
|
||||||
|
|
||||||
sos_pcpu_bitmap = (uint64_t)((((uint64_t)1U) << get_pcpu_nums()) - 1U);
|
|
||||||
pre_launch_pcpu_bitmap = 0U;
|
|
||||||
/* All physical CPUs except ocuppied by Pre-launched VMs are all
|
|
||||||
* belong to SOS_VM. i.e. The pcpu_bitmap of a SOS_VM is decided
|
|
||||||
* by pcpu_bitmap status in PRE_LAUNCHED_VMs.
|
|
||||||
* We need to setup a rule, that the vm_configs[] array should follow
|
|
||||||
* the order of PRE_LAUNCHED_VM first, and then SOS_VM.
|
|
||||||
*/
|
|
||||||
for (vm_id = 0U; vm_id < CONFIG_MAX_VM_NUM; vm_id++) {
|
|
||||||
vm_config = get_vm_config(vm_id);
|
|
||||||
switch (vm_config->type) {
|
|
||||||
case PRE_LAUNCHED_VM:
|
|
||||||
if (vm_config->pcpu_bitmap == 0U) {
|
|
||||||
ret = -EINVAL;
|
|
||||||
} else {
|
|
||||||
pre_launch_pcpu_bitmap |= vm_config->pcpu_bitmap;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SOS_VM:
|
|
||||||
/* Deduct pcpus of PRE_LAUNCHED_VMs */
|
|
||||||
sos_pcpu_bitmap ^= pre_launch_pcpu_bitmap;
|
|
||||||
if ((sos_pcpu_bitmap == 0U) || ((vm_config->guest_flags & LAPIC_PASSTHROUGH) != 0U)) {
|
|
||||||
ret = -EINVAL;
|
|
||||||
} else {
|
|
||||||
vm_config->pcpu_bitmap = sos_pcpu_bitmap;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case NORMAL_VM:
|
|
||||||
ret = -EINVAL;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* Nothing to do for a UNDEFINED_VM, break directly. */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((vm_config->guest_flags & CLOS_REQUIRED) != 0U) {
|
|
||||||
if (cat_cap_info.support) {
|
|
||||||
if (vm_config->clos > cat_cap_info.clos_max) {
|
|
||||||
pr_err("%s CLOS exceed MAX CLOS\n", __func__);
|
|
||||||
ret = -EINVAL;
|
|
||||||
} else {
|
|
||||||
cat_cap_info.enabled = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pr_err("%s set CLOS but CAT is not supported\n", __func__);
|
|
||||||
ret = -EINVAL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret != 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @pre vm_config != NULL
|
* @pre vm_config != NULL
|
||||||
*/
|
*/
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include <vpci.h>
|
#include <vpci.h>
|
||||||
#include <cpu_caps.h>
|
#include <cpu_caps.h>
|
||||||
#include <e820.h>
|
#include <e820.h>
|
||||||
|
#include <vm_config.h>
|
||||||
|
|
||||||
#ifdef CONFIG_PARTITION_MODE
|
#ifdef CONFIG_PARTITION_MODE
|
||||||
#include <mptable.h>
|
#include <mptable.h>
|
||||||
@ -35,8 +36,6 @@
|
|||||||
|
|
||||||
#define INVALID_VM_ID 0xffffU
|
#define INVALID_VM_ID 0xffffU
|
||||||
|
|
||||||
#define PLUG_CPU(n) (1U << (n))
|
|
||||||
|
|
||||||
struct vm_hw_info {
|
struct vm_hw_info {
|
||||||
/* vcpu array of this VM */
|
/* vcpu array of this VM */
|
||||||
struct acrn_vcpu vcpu_array[CONFIG_MAX_VCPUS_PER_VM];
|
struct acrn_vcpu vcpu_array[CONFIG_MAX_VCPUS_PER_VM];
|
||||||
@ -159,59 +158,6 @@ struct acrn_vm {
|
|||||||
uint64_t intr_inject_delay_delta; /* delay of intr injection */
|
uint64_t intr_inject_delay_delta; /* delay of intr injection */
|
||||||
} __aligned(PAGE_SIZE);
|
} __aligned(PAGE_SIZE);
|
||||||
|
|
||||||
#define MAX_BOOTARGS_SIZE 1024U
|
|
||||||
#define MAX_CONFIG_NAME_SIZE 32U
|
|
||||||
|
|
||||||
/*
|
|
||||||
* PRE_LAUNCHED_VM is launched by ACRN hypervisor, with LAPIC_PT;
|
|
||||||
* SOS_VM is launched by ACRN hypervisor, without LAPIC_PT;
|
|
||||||
* NORMAL_VM is launched by ACRN devicemodel, with/without LAPIC_PT depends on usecases.
|
|
||||||
*/
|
|
||||||
enum acrn_vm_type {
|
|
||||||
UNDEFINED_VM = 0,
|
|
||||||
PRE_LAUNCHED_VM,
|
|
||||||
SOS_VM,
|
|
||||||
NORMAL_VM /* Post-launched VM */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct acrn_vm_mem_config {
|
|
||||||
uint64_t start_hpa; /* the start HPA of VM memory configuration, for pre-launched VMs only */
|
|
||||||
uint64_t size; /* VM memory size configuration */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct acrn_vm_os_config {
|
|
||||||
char name[MAX_CONFIG_NAME_SIZE]; /* OS name, useful for debug */
|
|
||||||
char bootargs[MAX_BOOTARGS_SIZE]; /* boot args/cmdline */
|
|
||||||
} __aligned(8);
|
|
||||||
|
|
||||||
struct acrn_vm_pci_ptdev_config {
|
|
||||||
union pci_bdf vbdf; /* virtual BDF of PCI PT device */
|
|
||||||
union pci_bdf pbdf; /* physical BDF of PCI PT device */
|
|
||||||
} __aligned(8);
|
|
||||||
|
|
||||||
struct acrn_vm_config {
|
|
||||||
enum acrn_vm_type type; /* specify the type of VM */
|
|
||||||
char name[MAX_CONFIG_NAME_SIZE]; /* VM name identifier, useful for debug. */
|
|
||||||
uint8_t GUID[16]; /* GUID of the VM */
|
|
||||||
uint64_t pcpu_bitmap; /* from pcpu bitmap, we could know VM core number */
|
|
||||||
uint64_t guest_flags; /* VM flags that we want to configure for guest
|
|
||||||
* Now we have two flags:
|
|
||||||
* SECURE_WORLD_ENABLED
|
|
||||||
* LAPIC_PASSTHROUGH
|
|
||||||
* We could add more guest flags in future;
|
|
||||||
*/
|
|
||||||
struct acrn_vm_mem_config memory; /* memory configuration of VM */
|
|
||||||
uint16_t pci_ptdev_num; /* indicate how many PCI PT devices in VM */
|
|
||||||
struct acrn_vm_pci_ptdev_config *pci_ptdevs; /* point to PCI PT devices BDF list */
|
|
||||||
struct acrn_vm_os_config os_config; /* OS information the VM */
|
|
||||||
|
|
||||||
#ifdef CONFIG_PARTITION_MODE
|
|
||||||
bool vm_vuart;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
uint16_t clos; /* if guest_flags has CAT_ENABLED, then VM use this CLOS */
|
|
||||||
} __aligned(8);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @pre vlapic != NULL
|
* @pre vlapic != NULL
|
||||||
*/
|
*/
|
||||||
@ -283,10 +229,6 @@ int32_t reset_vm(struct acrn_vm *vm);
|
|||||||
int32_t create_vm(uint16_t vm_id, struct acrn_vm_config *vm_config, struct acrn_vm **rtn_vm);
|
int32_t create_vm(uint16_t vm_id, struct acrn_vm_config *vm_config, struct acrn_vm **rtn_vm);
|
||||||
void prepare_vm(uint16_t vm_id, struct acrn_vm_config *vm_config);
|
void prepare_vm(uint16_t vm_id, struct acrn_vm_config *vm_config);
|
||||||
void launch_vms(uint16_t pcpu_id);
|
void launch_vms(uint16_t pcpu_id);
|
||||||
int32_t sanitize_vm_config(void);
|
|
||||||
|
|
||||||
extern struct acrn_vm_config vm_configs[CONFIG_MAX_VM_NUM];
|
|
||||||
|
|
||||||
bool is_sos_vm(const struct acrn_vm *vm);
|
bool is_sos_vm(const struct acrn_vm *vm);
|
||||||
uint16_t find_free_vm_id(void);
|
uint16_t find_free_vm_id(void);
|
||||||
struct acrn_vm *get_vm_from_vmid(uint16_t vm_id);
|
struct acrn_vm *get_vm_from_vmid(uint16_t vm_id);
|
||||||
@ -302,14 +244,6 @@ uint16_t get_vm_pcpu_nums(const struct acrn_vm_config *vm_config);
|
|||||||
void vrtc_init(struct acrn_vm *vm);
|
void vrtc_init(struct acrn_vm *vm);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* @pre vm_id < CONFIG_MAX_VM_NUM
|
|
||||||
*/
|
|
||||||
static inline struct acrn_vm_config *get_vm_config(uint16_t vm_id)
|
|
||||||
{
|
|
||||||
return &vm_configs[vm_id];
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool is_lapic_pt(const struct acrn_vm *vm)
|
static inline bool is_lapic_pt(const struct acrn_vm *vm)
|
||||||
{
|
{
|
||||||
return ((vm_configs[vm->vm_id].guest_flags & LAPIC_PASSTHROUGH) != 0U);
|
return ((vm_configs[vm->vm_id].guest_flags & LAPIC_PASSTHROUGH) != 0U);
|
||||||
|
79
hypervisor/include/arch/x86/vm_config.h
Normal file
79
hypervisor/include/arch/x86/vm_config.h
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 Intel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef VM_CONFIG_H_
|
||||||
|
#define VM_CONFIG_H_
|
||||||
|
|
||||||
|
#include <types.h>
|
||||||
|
#include <pci.h>
|
||||||
|
|
||||||
|
#define MAX_BOOTARGS_SIZE 1024U
|
||||||
|
#define MAX_CONFIG_NAME_SIZE 32U
|
||||||
|
|
||||||
|
#define PLUG_CPU(n) (1U << (n))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* PRE_LAUNCHED_VM is launched by ACRN hypervisor, with LAPIC_PT;
|
||||||
|
* SOS_VM is launched by ACRN hypervisor, without LAPIC_PT;
|
||||||
|
* NORMAL_VM is launched by ACRN devicemodel, with/without LAPIC_PT depends on usecases.
|
||||||
|
*/
|
||||||
|
enum acrn_vm_type {
|
||||||
|
UNDEFINED_VM = 0,
|
||||||
|
PRE_LAUNCHED_VM,
|
||||||
|
SOS_VM,
|
||||||
|
NORMAL_VM /* Post-launched VM */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct acrn_vm_mem_config {
|
||||||
|
uint64_t start_hpa; /* the start HPA of VM memory configuration, for pre-launched VMs only */
|
||||||
|
uint64_t size; /* VM memory size configuration */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct acrn_vm_os_config {
|
||||||
|
char name[MAX_CONFIG_NAME_SIZE]; /* OS name, useful for debug */
|
||||||
|
char bootargs[MAX_BOOTARGS_SIZE]; /* boot args/cmdline */
|
||||||
|
} __aligned(8);
|
||||||
|
|
||||||
|
struct acrn_vm_pci_ptdev_config {
|
||||||
|
union pci_bdf vbdf; /* virtual BDF of PCI PT device */
|
||||||
|
union pci_bdf pbdf; /* physical BDF of PCI PT device */
|
||||||
|
} __aligned(8);
|
||||||
|
|
||||||
|
struct acrn_vm_config {
|
||||||
|
enum acrn_vm_type type; /* specify the type of VM */
|
||||||
|
char name[MAX_CONFIG_NAME_SIZE]; /* VM name identifier, useful for debug. */
|
||||||
|
uint8_t GUID[16]; /* GUID of the VM */
|
||||||
|
uint64_t pcpu_bitmap; /* from pcpu bitmap, we could know VM core number */
|
||||||
|
uint64_t guest_flags; /* VM flags that we want to configure for guest
|
||||||
|
* Now we have two flags:
|
||||||
|
* SECURE_WORLD_ENABLED
|
||||||
|
* LAPIC_PASSTHROUGH
|
||||||
|
* We could add more guest flags in future;
|
||||||
|
*/
|
||||||
|
struct acrn_vm_mem_config memory; /* memory configuration of VM */
|
||||||
|
uint16_t pci_ptdev_num; /* indicate how many PCI PT devices in VM */
|
||||||
|
struct acrn_vm_pci_ptdev_config *pci_ptdevs; /* point to PCI PT devices BDF list */
|
||||||
|
struct acrn_vm_os_config os_config; /* OS information the VM */
|
||||||
|
uint16_t clos; /* if guest_flags has CAT_ENABLED, then VM use this CLOS */
|
||||||
|
|
||||||
|
#ifdef CONFIG_PARTITION_MODE
|
||||||
|
bool vm_vuart;
|
||||||
|
#endif
|
||||||
|
} __aligned(8);
|
||||||
|
|
||||||
|
extern struct acrn_vm_config vm_configs[CONFIG_MAX_VM_NUM];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @pre vm_id < CONFIG_MAX_VM_NUM
|
||||||
|
*/
|
||||||
|
static inline struct acrn_vm_config *get_vm_config(uint16_t vm_id)
|
||||||
|
{
|
||||||
|
return &vm_configs[vm_id];
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t sanitize_vm_config(void);
|
||||||
|
|
||||||
|
#endif /* VM_CONFIG_H_ */
|
Loading…
Reference in New Issue
Block a user