diff --git a/hypervisor/arch/x86/guest/ept.c b/hypervisor/arch/x86/guest/ept.c index 761cb4e3d..367efcdf8 100644 --- a/hypervisor/arch/x86/guest/ept.c +++ b/hypervisor/arch/x86/guest/ept.c @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/hypervisor/arch/x86/guest/instr_emul.c b/hypervisor/arch/x86/guest/instr_emul.c index 601287fb7..0ff86a994 100644 --- a/hypervisor/arch/x86/guest/instr_emul.c +++ b/hypervisor/arch/x86/guest/instr_emul.c @@ -36,6 +36,7 @@ #include #include #include +#include #define CPU_REG_FIRST CPU_REG_RAX #define CPU_REG_LAST CPU_REG_GDTR diff --git a/hypervisor/arch/x86/guest/splitlock.c b/hypervisor/arch/x86/guest/splitlock.c index cd6e99489..4e381716b 100644 --- a/hypervisor/arch/x86/guest/splitlock.c +++ b/hypervisor/arch/x86/guest/splitlock.c @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/hypervisor/arch/x86/guest/ucode.c b/hypervisor/arch/x86/guest/ucode.c index 946997e99..b853e8392 100644 --- a/hypervisor/arch/x86/guest/ucode.c +++ b/hypervisor/arch/x86/guest/ucode.c @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #define MICRO_CODE_SIZE_MAX 0x40000U diff --git a/hypervisor/arch/x86/guest/vcpu.c b/hypervisor/arch/x86/guest/vcpu.c index a80cd7a5c..a74c0add7 100644 --- a/hypervisor/arch/x86/guest/vcpu.c +++ b/hypervisor/arch/x86/guest/vcpu.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include diff --git a/hypervisor/arch/x86/guest/virq.c b/hypervisor/arch/x86/guest/virq.c index a3eb883e9..24c9ea362 100644 --- a/hypervisor/arch/x86/guest/virq.c +++ b/hypervisor/arch/x86/guest/virq.c @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include #include #include @@ -32,6 +32,17 @@ #define EXCEPTION_ABORT 2U #define EXCEPTION_INTERRUPT 3U +/* RFLAGS */ +#define HV_ARCH_VCPU_RFLAGS_TF (1UL<<8U) +#define HV_ARCH_VCPU_RFLAGS_IF (1UL<<9U) +#define HV_ARCH_VCPU_RFLAGS_RF (1UL<<16U) + +/* Interruptability State info */ + +#define HV_ARCH_VCPU_BLOCKED_BY_NMI (1UL<<3U) +#define HV_ARCH_VCPU_BLOCKED_BY_MOVSS (1UL<<1U) +#define HV_ARCH_VCPU_BLOCKED_BY_STI (1UL<<0U) + static const uint16_t exception_type[32] = { [0] = VMX_INT_TYPE_HW_EXP, [1] = VMX_INT_TYPE_HW_EXP, diff --git a/hypervisor/arch/x86/guest/virtual_cr.c b/hypervisor/arch/x86/guest/virtual_cr.c index d5e9e8dc3..68be87d6f 100644 --- a/hypervisor/arch/x86/guest/virtual_cr.c +++ b/hypervisor/arch/x86/guest/virtual_cr.c @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/hypervisor/arch/x86/guest/vlapic.c b/hypervisor/arch/x86/guest/vlapic.c index 7f2436383..3a98f8b22 100644 --- a/hypervisor/arch/x86/guest/vlapic.c +++ b/hypervisor/arch/x86/guest/vlapic.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include diff --git a/hypervisor/arch/x86/guest/vm.c b/hypervisor/arch/x86/guest/vm.c index afde6325b..e8fb77c91 100644 --- a/hypervisor/arch/x86/guest/vm.c +++ b/hypervisor/arch/x86/guest/vm.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include diff --git a/hypervisor/arch/x86/guest/vmcall.c b/hypervisor/arch/x86/guest/vmcall.c index 0a3486568..e1180cd0c 100644 --- a/hypervisor/arch/x86/guest/vmcall.c +++ b/hypervisor/arch/x86/guest/vmcall.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include diff --git a/hypervisor/arch/x86/guest/vmexit.c b/hypervisor/arch/x86/guest/vmexit.c index 2bb8ae62e..0c1f29e48 100644 --- a/hypervisor/arch/x86/guest/vmexit.c +++ b/hypervisor/arch/x86/guest/vmexit.c @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/hypervisor/arch/x86/guest/vmsr.c b/hypervisor/arch/x86/guest/vmsr.c index bae2bff2c..d3f6294cb 100644 --- a/hypervisor/arch/x86/guest/vmsr.c +++ b/hypervisor/arch/x86/guest/vmsr.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include diff --git a/hypervisor/common/hv_main.c b/hypervisor/common/hv_main.c index 1975058ad..33cf0081a 100644 --- a/hypervisor/common/hv_main.c +++ b/hypervisor/common/hv_main.c @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/hypervisor/dm/vpic.c b/hypervisor/dm/vpic.c index 8a1114241..8dd455f5e 100644 --- a/hypervisor/dm/vpic.c +++ b/hypervisor/dm/vpic.c @@ -28,6 +28,7 @@ #define pr_prefix "vpic: " #include +#include #include #include #include diff --git a/hypervisor/include/arch/x86/guest/virq.h b/hypervisor/include/arch/x86/guest/virq.h new file mode 100644 index 000000000..eaf4231f3 --- /dev/null +++ b/hypervisor/include/arch/x86/guest/virq.h @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2021 Intel Corporation. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ARCH_X86_GUEST_VIRQ_H +#define ARCH_X86_GUEST_VIRQ_H + +struct acrn_vcpu; +struct acrn_vm; + +/** + * @brief virtual IRQ + * + * @addtogroup acrn_virq ACRN vIRQ + * @{ + */ + +/** + * @brief Queue exception to guest. + * + * This exception may be injected immediately or later, + * depends on the exeception class. + * + * @param[in] vcpu Pointer to vCPU. + * @param[in] vector_arg Vector of the exeception. + * @param[in] err_code_arg Error Code to be injected. + * + * @retval 0 on success + * @retval -EINVAL on error that vector is invalid. + * + * @pre vcpu != NULL + */ +int32_t vcpu_queue_exception(struct acrn_vcpu *vcpu, uint32_t vector_arg, uint32_t err_code_arg); + +/** + * @brief Inject external interrupt to guest. + * + * @param[in] vcpu Pointer to vCPU. + * + * @return None + * + * @pre vcpu != NULL + */ +void vcpu_inject_extint(struct acrn_vcpu *vcpu); + +/** + * @brief Inject NMI to guest. + * + * @param[in] vcpu Pointer to vCPU. + * + * @return None + * + * @pre vcpu != NULL + */ +void vcpu_inject_nmi(struct acrn_vcpu *vcpu); + +/** + * @brief Inject general protection exeception(GP) to guest. + * + * @param[in] vcpu Pointer to vCPU. + * @param[in] err_code Error Code to be injected. + * + * @return None + * + * @pre vcpu != NULL + */ +void vcpu_inject_gp(struct acrn_vcpu *vcpu, uint32_t err_code); + +/** + * @brief Inject page fault exeception(PF) to guest. + * + * @param[in] vcpu Pointer to vCPU. + * @param[in] addr Address that result in PF. + * @param[in] err_code Error Code to be injected. + * + * @return None + * + * @pre vcpu != NULL + */ +void vcpu_inject_pf(struct acrn_vcpu *vcpu, uint64_t addr, uint32_t err_code); + +/** + * @brief Inject invalid opcode exeception(UD) to guest. + * + * @param[in] vcpu Pointer to vCPU. + * + * @return None + * + * @pre vcpu != NULL + */ +void vcpu_inject_ud(struct acrn_vcpu *vcpu); + +/** + * @brief Inject stack fault exeception(SS) to guest. + * + * @param[in] vcpu Pointer to vCPU. + * + * @return None + * + * @pre vcpu != NULL + */ +void vcpu_inject_ss(struct acrn_vcpu *vcpu); +void vcpu_make_request(struct acrn_vcpu *vcpu, uint16_t eventid); + +/* + * @pre vcpu != NULL + */ +int32_t exception_vmexit_handler(struct acrn_vcpu *vcpu); +int32_t nmi_window_vmexit_handler(struct acrn_vcpu *vcpu); +int32_t interrupt_window_vmexit_handler(struct acrn_vcpu *vcpu); +int32_t external_interrupt_vmexit_handler(struct acrn_vcpu *vcpu); +int32_t acrn_handle_pending_request(struct acrn_vcpu *vcpu); + +/** + * @} + */ +/* End of acrn_virq */ + + +#endif /* ARCH_X86_GUEST_VIRQ_H */ diff --git a/hypervisor/include/arch/x86/irq.h b/hypervisor/include/arch/x86/irq.h index c0b2c7abd..bf74e1dc7 100644 --- a/hypervisor/include/arch/x86/irq.h +++ b/hypervisor/include/arch/x86/irq.h @@ -96,7 +96,6 @@ struct x86_irq_data { struct intr_excp_ctx; -struct acrn_vcpu; struct acrn_vm; typedef void (*smp_call_func_t)(void *data); @@ -111,120 +110,6 @@ bool is_notification_nmi(const struct acrn_vm *vm); void setup_notification(void); void setup_pi_notification(void); -/* RFLAGS */ -#define HV_ARCH_VCPU_RFLAGS_TF (1UL<<8U) -#define HV_ARCH_VCPU_RFLAGS_IF (1UL<<9U) -#define HV_ARCH_VCPU_RFLAGS_RF (1UL<<16U) - -/* Interruptability State info */ - -#define HV_ARCH_VCPU_BLOCKED_BY_NMI (1UL<<3U) -#define HV_ARCH_VCPU_BLOCKED_BY_MOVSS (1UL<<1U) -#define HV_ARCH_VCPU_BLOCKED_BY_STI (1UL<<0U) - -/** - * @brief virtual IRQ - * - * @addtogroup acrn_virq ACRN vIRQ - * @{ - */ - -/** - * @brief Queue exception to guest. - * - * This exception may be injected immediately or later, - * depends on the exeception class. - * - * @param[in] vcpu Pointer to vCPU. - * @param[in] vector_arg Vector of the exeception. - * @param[in] err_code_arg Error Code to be injected. - * - * @retval 0 on success - * @retval -EINVAL on error that vector is invalid. - * - * @pre vcpu != NULL - */ -int32_t vcpu_queue_exception(struct acrn_vcpu *vcpu, uint32_t vector_arg, uint32_t err_code_arg); - -/** - * @brief Inject external interrupt to guest. - * - * @param[in] vcpu Pointer to vCPU. - * - * @return None - * - * @pre vcpu != NULL - */ -void vcpu_inject_extint(struct acrn_vcpu *vcpu); - -/** - * @brief Inject NMI to guest. - * - * @param[in] vcpu Pointer to vCPU. - * - * @return None - * - * @pre vcpu != NULL - */ -void vcpu_inject_nmi(struct acrn_vcpu *vcpu); - -/** - * @brief Inject general protection exeception(GP) to guest. - * - * @param[in] vcpu Pointer to vCPU. - * @param[in] err_code Error Code to be injected. - * - * @return None - * - * @pre vcpu != NULL - */ -void vcpu_inject_gp(struct acrn_vcpu *vcpu, uint32_t err_code); - -/** - * @brief Inject page fault exeception(PF) to guest. - * - * @param[in] vcpu Pointer to vCPU. - * @param[in] addr Address that result in PF. - * @param[in] err_code Error Code to be injected. - * - * @return None - * - * @pre vcpu != NULL - */ -void vcpu_inject_pf(struct acrn_vcpu *vcpu, uint64_t addr, uint32_t err_code); - -/** - * @brief Inject invalid opcode exeception(UD) to guest. - * - * @param[in] vcpu Pointer to vCPU. - * - * @return None - * - * @pre vcpu != NULL - */ -void vcpu_inject_ud(struct acrn_vcpu *vcpu); - -/** - * @brief Inject stack fault exeception(SS) to guest. - * - * @param[in] vcpu Pointer to vCPU. - * - * @return None - * - * @pre vcpu != NULL - */ -void vcpu_inject_ss(struct acrn_vcpu *vcpu); -void vcpu_make_request(struct acrn_vcpu *vcpu, uint16_t eventid); - -/* - * @pre vcpu != NULL - */ -int32_t exception_vmexit_handler(struct acrn_vcpu *vcpu); -int32_t nmi_window_vmexit_handler(struct acrn_vcpu *vcpu); -int32_t interrupt_window_vmexit_handler(struct acrn_vcpu *vcpu); -int32_t external_interrupt_vmexit_handler(struct acrn_vcpu *vcpu); -int32_t acrn_handle_pending_request(struct acrn_vcpu *vcpu); - /** * @brief Allocate a vectror and bind it to irq * @@ -255,11 +140,6 @@ uint32_t irq_to_vector(uint32_t irq); */ void dispatch_interrupt(const struct intr_excp_ctx *ctx); -/** - * @} - */ -/* End of acrn_virq */ - /* Arch specific routines called from generic IRQ handling */ struct irq_desc;