diff --git a/devicemodel/core/main.c b/devicemodel/core/main.c index af28392d2a..8f7e269087 100644 --- a/devicemodel/core/main.c +++ b/devicemodel/core/main.c @@ -736,8 +736,7 @@ vm_loop(struct vmctx *ctx) break; } - /* RTVM can't be reset */ - if ((VM_SUSPEND_SYSTEM_RESET == vm_get_suspend_mode()) && (!is_rtvm)) { + if (VM_SUSPEND_SYSTEM_RESET == vm_get_suspend_mode()) { vm_system_reset(ctx); } diff --git a/devicemodel/core/monitor.c b/devicemodel/core/monitor.c index fe34047299..9ecdc0c6fa 100644 --- a/devicemodel/core/monitor.c +++ b/devicemodel/core/monitor.c @@ -350,7 +350,7 @@ static void handle_stop(struct mngr_msg *msg, int client_fd, void *param) ack.msgid = msg->msgid; ack.timestamp = msg->timestamp; - if (msg->data.acrnd_stop.force && !is_rtvm) { + if (msg->data.acrnd_stop.force) { pr_info("%s: setting VM state to %s\n", __func__, vm_state_to_str(VM_SUSPEND_POWEROFF)); vm_set_suspend_mode(VM_SUSPEND_POWEROFF); ack.data.err = 0; diff --git a/devicemodel/hw/pci/passthrough.c b/devicemodel/hw/pci/passthrough.c index afc53fc020..f55081a5fa 100644 --- a/devicemodel/hw/pci/passthrough.c +++ b/devicemodel/hw/pci/passthrough.c @@ -980,13 +980,10 @@ passthru_deinit(struct vmctx *ctx, struct pci_vdev *dev, char *opts) pciaccess_cleanup(); free(ptdev); - if (!is_rtvm) { - /* Let the HV to deassign the pt device for RTVM, In this case, the RTVM - * could still be alive if DM died. - */ - vm_deassign_pcidev(ctx, &pcidev); - } - if (!is_rtvm && phys_bdf) { + /*Let device model to deassign pt device for all VMs, including RTVM if the Service VM plays + *supervisor role.*/ + vm_deassign_pcidev(ctx, &pcidev); + if (phys_bdf) { memset(reset_path, 0, sizeof(reset_path)); snprintf(reset_path, 40, "/sys/bus/pci/devices/0000:%02x:%02x.%x/reset", diff --git a/hypervisor/arch/x86/guest/vm.c b/hypervisor/arch/x86/guest/vm.c index 1ab7eb3126..f65bb00209 100644 --- a/hypervisor/arch/x86/guest/vm.c +++ b/hypervisor/arch/x86/guest/vm.c @@ -1048,9 +1048,8 @@ void pause_vm(struct acrn_vm *vm) uint16_t i; struct acrn_vcpu *vcpu = NULL; - /* For RTVM, we can only pause its vCPUs when it is powering off by itself */ - if (((!is_rt_vm(vm)) && (vm->state == VM_RUNNING)) || - ((is_rt_vm(vm)) && (vm->state == VM_READY_TO_POWEROFF)) || + if (((is_severity_pass(vm->vm_id)) && (vm->state == VM_RUNNING)) || + (vm->state == VM_READY_TO_POWEROFF) || (vm->state == VM_CREATED)) { foreach_vcpu(i, vm, vcpu) { zombie_vcpu(vcpu, VCPU_ZOMBIE); diff --git a/hypervisor/common/hypercall.c b/hypervisor/common/hypercall.c index 22054ca71f..2687da1be3 100644 --- a/hypervisor/common/hypercall.c +++ b/hypervisor/common/hypercall.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -69,11 +70,6 @@ bool is_hypercall_from_ring0(void) return ret; } -inline static bool is_severity_pass(uint16_t target_vmid) -{ - return SEVERITY_SERVICE_VM >= get_vm_severity(target_vmid); -} - /** * @brief offline vcpu from Service VM * diff --git a/hypervisor/include/arch/x86/asm/guest/vm.h b/hypervisor/include/arch/x86/asm/guest/vm.h index 0503ed8b47..fbb29443d4 100644 --- a/hypervisor/include/arch/x86/asm/guest/vm.h +++ b/hypervisor/include/arch/x86/asm/guest/vm.h @@ -232,6 +232,11 @@ static inline uint16_t vmid_2_rel_vmid(uint16_t service_vmid, uint16_t vmid) { return (vmid - service_vmid); } +static inline bool is_severity_pass(uint16_t target_vmid) +{ + return SEVERITY_SERVICE_VM >= get_vm_severity(target_vmid); +} + void make_shutdown_vm_request(uint16_t pcpu_id); bool need_shutdown_vm(uint16_t pcpu_id); int32_t shutdown_vm(struct acrn_vm *vm); diff --git a/hypervisor/include/arch/x86/asm/vm_config.h b/hypervisor/include/arch/x86/asm/vm_config.h index 14311652b9..476e5cbd19 100644 --- a/hypervisor/include/arch/x86/asm/vm_config.h +++ b/hypervisor/include/arch/x86/asm/vm_config.h @@ -70,7 +70,7 @@ /* ACRN guest severity */ enum acrn_vm_severity { SEVERITY_SAFETY_VM = 0x40U, - SEVERITY_RTVM = 0x30U, + SEVERITY_RTVM = RTVM_SEVERITY_LEVEL, SEVERITY_SERVICE_VM = 0x20U, SEVERITY_STANDARD_VM = 0x10U, }; diff --git a/misc/config_tools/schema/config.xsd b/misc/config_tools/schema/config.xsd index b75b91f021..2569c93e4e 100644 --- a/misc/config_tools/schema/config.xsd +++ b/misc/config_tools/schema/config.xsd @@ -63,6 +63,11 @@ Enable multiboot2 protocol support (with multiboot1 downward compatibility). If multiboot1 meets your requirements, disable this feature to reduce hypervisor code size. + + + Enable Service VM to play the supervisor role. If Enabled, the severity level of Service VM is higher than RTVM. + + Enable detection of split locks. A split lock can negatively affect an application's real-time performance. If a lock is detected, an alignment check exception #AC occurs. diff --git a/misc/config_tools/xforms/config_common.xsl b/misc/config_tools/xforms/config_common.xsl index 1d8e0a5ced..d486e1dd61 100644 --- a/misc/config_tools/xforms/config_common.xsl +++ b/misc/config_tools/xforms/config_common.xsl @@ -79,6 +79,10 @@ + + + + diff --git a/misc/config_tools/xforms/misc_cfg.h.xsl b/misc/config_tools/xforms/misc_cfg.h.xsl index d4df118ebd..5c35a121b4 100644 --- a/misc/config_tools/xforms/misc_cfg.h.xsl +++ b/misc/config_tools/xforms/misc_cfg.h.xsl @@ -40,6 +40,7 @@ + @@ -172,6 +173,17 @@ + + + + + + + + + + +