From e5117bf19ab0d579b516eea3af1f9863aef8c401 Mon Sep 17 00:00:00 2001 From: Yin Fengwei Date: Mon, 16 Dec 2019 13:31:01 +0800 Subject: [PATCH] vm: add severity for vm_config Add severity definitions for different scenarios. The static guest severity is defined according to guest configurations. Also add sanity check to make sure the severity for all guests are correct. Tracked-On: #4270 Signed-off-by: Yin Fengwei --- hypervisor/arch/x86/configs/vm_config.c | 46 ++++++++++++++++++- hypervisor/include/arch/x86/vm_config.h | 15 ++++++ .../scenarios/hybrid/vm_configurations.c | 10 ++-- .../scenarios/industry/vm_configurations.c | 11 +++-- hypervisor/scenarios/sdc/vm_configurations.c | 5 +- hypervisor/scenarios/sdc2/vm_configurations.c | 6 ++- 6 files changed, 81 insertions(+), 12 deletions(-) diff --git a/hypervisor/arch/x86/configs/vm_config.c b/hypervisor/arch/x86/configs/vm_config.c index 9861b6318..f109eaba9 100644 --- a/hypervisor/arch/x86/configs/vm_config.c +++ b/hypervisor/arch/x86/configs/vm_config.c @@ -10,6 +10,9 @@ #include #include +static uint8_t rtvm_uuid1[16] = RTVM_UUID1; +static uint8_t safety_vm_uuid1[16] = SAFETY_VM_UUID1; + /* * @pre vm_id < CONFIG_MAX_VM_NUM * @post return != NULL @@ -40,6 +43,27 @@ bool vm_has_matched_uuid(uint16_t vmid, const uint8_t *uuid) return (uuid_is_equal(vm_config->uuid, uuid)); } +/** + * return true if the input uuid is for RTVM + * + * @pre vmid < CONFIG_MAX_VM_NUM + */ +static bool is_safety_vm_uuid(const uint8_t *uuid) +{ + /* TODO: Extend to check more safety VM uuid if we have more than one safety VM. */ + return uuid_is_equal(uuid, safety_vm_uuid1); +} + +/** + * return true if the input uuid is for RTVM + * + * @pre vmid < CONFIG_MAX_VM_NUM + */ +static bool is_rtvm_uuid(const uint8_t *uuid) +{ + /* TODO: Extend to check more rtvm uuid if we have more than one RTVM. */ + return uuid_is_equal(uuid, rtvm_uuid1); +} /** * return true if no UUID collision is found in vm configs array start from vm_configs[vm_id] @@ -108,7 +132,9 @@ bool sanitize_vm_config(void) } else if (((vm_config->guest_flags & GUEST_FLAG_LAPIC_PASSTHROUGH) != 0U) && ((vm_config->guest_flags & GUEST_FLAG_RT) == 0U)) { ret = false; - }else if (vm_config->epc.size != 0UL) { + } else if (vm_config->epc.size != 0UL) { + ret = false; + } else if (is_safety_vm_uuid(vm_config->uuid) && (vm_config->severity != (uint8_t)SEVERITY_SAFETY_VM)) { ret = false; } else { pre_launch_pcpu_bitmap |= vm_pcpu_bitmap; @@ -119,6 +145,8 @@ bool sanitize_vm_config(void) sos_pcpu_bitmap ^= pre_launch_pcpu_bitmap; if ((sos_pcpu_bitmap == 0U) || ((vm_config->guest_flags & GUEST_FLAG_LAPIC_PASSTHROUGH) != 0U)) { ret = false; + } else if (vm_config->severity != (uint8_t)SEVERITY_SOS) { + ret = false; } else { vm_config->vcpu_num = bitmap_weight(sos_pcpu_bitmap); for (vcpu_id = 0U; vcpu_id < vm_config->vcpu_num; vcpu_id++) { @@ -133,6 +161,22 @@ bool sanitize_vm_config(void) pr_err("%s: Post-launch VM has no pcpus or share pcpu with Pre-launch VM!", __func__); ret = false; } + + if ((vm_config->severity == (uint8_t)SEVERITY_SAFETY_VM) || + (vm_config->severity == (uint8_t)SEVERITY_SOS)) { + ret = false; + } + + /* VM with RTVM uuid must have RTVM severity */ + if (is_rtvm_uuid(vm_config->uuid) && (vm_config->severity != (uint8_t)SEVERITY_RTVM)) { + ret = false; + } + + /* VM WITHOUT RTVM uuid must NOT have RTVM severity */ + if (!is_rtvm_uuid(vm_config->uuid) && (vm_config->severity == (uint8_t)SEVERITY_RTVM)) { + ret = false; + } + break; default: /* Nothing to do for a unknown VM, break directly. */ diff --git a/hypervisor/include/arch/x86/vm_config.h b/hypervisor/include/arch/x86/vm_config.h index 8bdf3ed72..a221f38c1 100644 --- a/hypervisor/include/arch/x86/vm_config.h +++ b/hypervisor/include/arch/x86/vm_config.h @@ -24,6 +24,12 @@ #define PCI_DEV_TYPE_HVEMUL (1U << 1U) #define PCI_DEV_TYPE_SOSEMUL (1U << 2U) +#define RTVM_UUID1 {0x49U, 0x5aU, 0xe2U, 0xe5U, 0x26U, 0x03U, 0x4dU, 0x64U, \ + 0xafU, 0x76U, 0xd4U, 0xbcU, 0x5aU, 0x8eU, 0xc0U, 0xe5U} + +#define SAFETY_VM_UUID1 {0xfcU, 0x83U, 0x69U, 0x01U, 0x86U, 0x85U, 0x4bU, 0xc0U, \ + 0x8bU, 0x71U, 0x6eU, 0x31U, 0xdcU, 0x36U, 0xfaU, 0x47U} + /* * PRE_LAUNCHED_VM is launched by ACRN hypervisor, with LAPIC_PT; * SOS_VM is launched by ACRN hypervisor, without LAPIC_PT; @@ -35,6 +41,14 @@ enum acrn_vm_load_order { POST_LAUNCHED_VM /* Launched by Devicemodel in SOS_VM */ }; +/* ACRN guest severity */ +enum acrn_vm_severity { + SEVERITY_SAFETY_VM = 0x40U, + SEVERITY_RTVM = 0x30U, + SEVERITY_SOS = 0x20U, + SEVERITY_STANDARD_VM = 0x10U, +}; + 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 */ @@ -99,6 +113,7 @@ struct acrn_vm_config { char name[MAX_VM_OS_NAME_LEN]; /* VM name identifier, useful for debug. */ const uint8_t uuid[16]; /* UUID of the VM */ uint16_t vcpu_num; /* Number of vCPUs for the VM */ + uint8_t severity; /* severity of the VM */ uint64_t vcpu_affinity[MAX_VCPUS_PER_VM];/* bitmaps for vCPUs' affinity */ uint64_t guest_flags; /* VM flags that we want to configure for guest diff --git a/hypervisor/scenarios/hybrid/vm_configurations.c b/hypervisor/scenarios/hybrid/vm_configurations.c index 4c00462d6..82775efcc 100644 --- a/hypervisor/scenarios/hybrid/vm_configurations.c +++ b/hypervisor/scenarios/hybrid/vm_configurations.c @@ -12,13 +12,13 @@ struct acrn_vm_config vm_configs[CONFIG_MAX_VM_NUM] = { { /* VM0 */ .load_order = PRE_LAUNCHED_VM, .name = "ACRN PRE-LAUNCHED VM0", - .uuid = {0xfcU, 0x83U, 0x69U, 0x01U, 0x86U, 0x85U, 0x4bU, 0xc0U, \ - 0x8bU, 0x71U, 0x6eU, 0x31U, 0xdcU, 0x36U, 0xfaU, 0x47U}, - /* fc836901-8685-4bc0-8b71-6e31dc36fa47 */ - .guest_flags = GUEST_FLAG_HIGHEST_SEVERITY, + /* fc836901-8685-4bc0-8b71-6e31dc36fa47 */ + .uuid = SAFETY_VM_UUID1, + .guest_flags = 0UL, .vcpu_num = 1U, .vcpu_affinity = VM0_CONFIG_VCPU_AFFINITY, .clos = 0U, + .severity = SEVERITY_SAFETY_VM, .memory = { .start_hpa = VM0_CONFIG_MEM_START_HPA, .size = VM0_CONFIG_MEM_SIZE, @@ -53,6 +53,7 @@ struct acrn_vm_config vm_configs[CONFIG_MAX_VM_NUM] = { .guest_flags = 0UL, .clos = 0U, + .severity = SEVERITY_SOS, .memory = { .start_hpa = 0UL, .size = CONFIG_SOS_RAM_SIZE, @@ -85,6 +86,7 @@ struct acrn_vm_config vm_configs[CONFIG_MAX_VM_NUM] = { /* d2795438-25d6-11e8-864e-cb7a18b34643 */ .vcpu_num = 1U, .vcpu_affinity = VM2_CONFIG_VCPU_AFFINITY, + .severity = SEVERITY_STANDARD_VM, .vuart[0] = { .type = VUART_LEGACY_PIO, .addr.port_base = COM1_BASE, diff --git a/hypervisor/scenarios/industry/vm_configurations.c b/hypervisor/scenarios/industry/vm_configurations.c index 188ee579b..685b1e416 100644 --- a/hypervisor/scenarios/industry/vm_configurations.c +++ b/hypervisor/scenarios/industry/vm_configurations.c @@ -17,6 +17,7 @@ struct acrn_vm_config vm_configs[CONFIG_MAX_VM_NUM] = { /* dbbbd434-7a57-4216-a12c-2201f1ab0240 */ .guest_flags = 0UL, .clos = 0U, + .severity = SEVERITY_SOS, .memory = { .start_hpa = 0UL, .size = CONFIG_SOS_RAM_SIZE, @@ -49,6 +50,7 @@ struct acrn_vm_config vm_configs[CONFIG_MAX_VM_NUM] = { /* d2795438-25d6-11e8-864e-cb7a18b34643 */ .vcpu_num = 1U, .vcpu_affinity = VM1_CONFIG_VCPU_AFFINITY, + .severity = SEVERITY_STANDARD_VM, .vuart[0] = { .type = VUART_LEGACY_PIO, .addr.port_base = COM1_BASE, @@ -62,14 +64,13 @@ struct acrn_vm_config vm_configs[CONFIG_MAX_VM_NUM] = { }, { .load_order = POST_LAUNCHED_VM, - .uuid = {0x49U, 0x5aU, 0xe2U, 0xe5U, 0x26U, 0x03U, 0x4dU, 0x64U, \ - 0xafU, 0x76U, 0xd4U, 0xbcU, 0x5aU, 0x8eU, 0xc0U, 0xe5U}, - /* 495ae2e5-2603-4d64-af76-d4bc5a8ec0e5 */ - + /* 495ae2e5-2603-4d64-af76-d4bc5a8ec0e5 */ + .uuid = RTVM_UUID1, /* The hard RTVM must be launched as VM2 */ - .guest_flags = GUEST_FLAG_HIGHEST_SEVERITY, + .guest_flags = 0UL, .vcpu_num = 2U, .vcpu_affinity = VM2_CONFIG_VCPU_AFFINITY, + .severity = SEVERITY_RTVM, .vuart[0] = { .type = VUART_LEGACY_PIO, .addr.port_base = COM1_BASE, diff --git a/hypervisor/scenarios/sdc/vm_configurations.c b/hypervisor/scenarios/sdc/vm_configurations.c index 66270cde8..1a5b26dd1 100644 --- a/hypervisor/scenarios/sdc/vm_configurations.c +++ b/hypervisor/scenarios/sdc/vm_configurations.c @@ -17,8 +17,9 @@ struct acrn_vm_config vm_configs[CONFIG_MAX_VM_NUM] = { /* dbbbd434-7a57-4216-a12c-2201f1ab0240 */ /* Allow SOS to reboot the host since there is supposed to be the highest severity guest */ - .guest_flags = GUEST_FLAG_HIGHEST_SEVERITY, + .guest_flags = 0UL, .clos = 0U, + .severity = SEVERITY_SOS, .memory = { .start_hpa = 0UL, .size = CONFIG_SOS_RAM_SIZE, @@ -48,6 +49,7 @@ struct acrn_vm_config vm_configs[CONFIG_MAX_VM_NUM] = { /* d2795438-25d6-11e8-864e-cb7a18b34643 */ .vcpu_num = MAX_PCPU_NUM - CONFIG_MAX_KATA_VM_NUM - 1U, .vcpu_affinity = VM1_CONFIG_VCPU_AFFINITY, + .severity = SEVERITY_STANDARD_VM, .vuart[0] = { .type = VUART_LEGACY_PIO, .addr.port_base = INVALID_COM_BASE, @@ -66,6 +68,7 @@ struct acrn_vm_config vm_configs[CONFIG_MAX_VM_NUM] = { /* a7ada506-1ab0-4b6b-a0da-e513ca9b8c2f */ .vcpu_num = 1U, .vcpu_affinity = VM2_CONFIG_VCPU_AFFINITY, + .severity = SEVERITY_STANDARD_VM, .vuart[0] = { .type = VUART_LEGACY_PIO, .addr.port_base = INVALID_COM_BASE, diff --git a/hypervisor/scenarios/sdc2/vm_configurations.c b/hypervisor/scenarios/sdc2/vm_configurations.c index 32df114e3..5202ff09f 100644 --- a/hypervisor/scenarios/sdc2/vm_configurations.c +++ b/hypervisor/scenarios/sdc2/vm_configurations.c @@ -17,8 +17,9 @@ struct acrn_vm_config vm_configs[CONFIG_MAX_VM_NUM] = { /* dbbbd434-7a57-4216-a12c-2201f1ab0240 */ /* Allow SOS to reboot the host since there is supposed to be the highest severity guest */ - .guest_flags = GUEST_FLAG_HIGHEST_SEVERITY, + .guest_flags = 0UL, .clos = 0U, + .severity = SEVERITY_SOS, .memory = { .start_hpa = 0UL, .size = CONFIG_SOS_RAM_SIZE, @@ -48,6 +49,7 @@ struct acrn_vm_config vm_configs[CONFIG_MAX_VM_NUM] = { /* d2795438-25d6-11e8-864e-cb7a18b34643 */ .vcpu_num = 1U, .vcpu_affinity = VM1_CONFIG_VCPU_AFFINITY, + .severity = SEVERITY_STANDARD_VM, .vuart[0] = { .type = VUART_LEGACY_PIO, .addr.port_base = INVALID_COM_BASE, @@ -65,6 +67,7 @@ struct acrn_vm_config vm_configs[CONFIG_MAX_VM_NUM] = { /* 495ae2e5-2603-4d64-af76-d4bc5a8ec0e5 */ .vcpu_num = 1U, .vcpu_affinity = VM2_CONFIG_VCPU_AFFINITY, + .severity = SEVERITY_STANDARD_VM, .vuart[0] = { .type = VUART_LEGACY_PIO, .addr.port_base = INVALID_COM_BASE, @@ -82,6 +85,7 @@ struct acrn_vm_config vm_configs[CONFIG_MAX_VM_NUM] = { /* 38158821-5208-4005-b72a-8a609e4190d0 */ .vcpu_num = 1U, .vcpu_affinity = VM3_CONFIG_VCPU_AFFINITY, + .severity = SEVERITY_STANDARD_VM, .vuart[0] = { .type = VUART_LEGACY_PIO, .addr.port_base = INVALID_COM_BASE,