mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-06-26 15:31:35 +00:00
hv/mod_irq: move guest interrupt API out of x86/irq.h
A new x86/guest/virq.h head file now contains all guest related interrupt handling API. Tracked-On: #5825 Signed-off-by: Jason Chen CJ <jason.cj.chen@intel.com>
This commit is contained in:
parent
798015876c
commit
ff732cfb2a
@ -7,7 +7,7 @@
|
|||||||
#include <types.h>
|
#include <types.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <vm.h>
|
#include <vm.h>
|
||||||
#include <irq.h>
|
#include <virq.h>
|
||||||
#include <pgtable.h>
|
#include <pgtable.h>
|
||||||
#include <mmu.h>
|
#include <mmu.h>
|
||||||
#include <ept.h>
|
#include <ept.h>
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
#include <mmu.h>
|
#include <mmu.h>
|
||||||
#include <per_cpu.h>
|
#include <per_cpu.h>
|
||||||
#include <logmsg.h>
|
#include <logmsg.h>
|
||||||
|
#include <virq.h>
|
||||||
|
|
||||||
#define CPU_REG_FIRST CPU_REG_RAX
|
#define CPU_REG_FIRST CPU_REG_RAX
|
||||||
#define CPU_REG_LAST CPU_REG_GDTR
|
#define CPU_REG_LAST CPU_REG_GDTR
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include <types.h>
|
#include <types.h>
|
||||||
#include <vcpu.h>
|
#include <vcpu.h>
|
||||||
#include <vm.h>
|
#include <vm.h>
|
||||||
#include <irq.h>
|
#include <virq.h>
|
||||||
#include <event.h>
|
#include <event.h>
|
||||||
#include <cpu_caps.h>
|
#include <cpu_caps.h>
|
||||||
#include <logmsg.h>
|
#include <logmsg.h>
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include <cpuid.h>
|
#include <cpuid.h>
|
||||||
#include <ucode.h>
|
#include <ucode.h>
|
||||||
#include <guest_memory.h>
|
#include <guest_memory.h>
|
||||||
#include <irq.h>
|
#include <virq.h>
|
||||||
#include <logmsg.h>
|
#include <logmsg.h>
|
||||||
|
|
||||||
#define MICRO_CODE_SIZE_MAX 0x40000U
|
#define MICRO_CODE_SIZE_MAX 0x40000U
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include <types.h>
|
#include <types.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <vcpu.h>
|
#include <vcpu.h>
|
||||||
|
#include <virq.h>
|
||||||
#include <bits.h>
|
#include <bits.h>
|
||||||
#include <vmx.h>
|
#include <vmx.h>
|
||||||
#include <logmsg.h>
|
#include <logmsg.h>
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include <types.h>
|
#include <types.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <bits.h>
|
#include <bits.h>
|
||||||
#include <irq.h>
|
#include <virq.h>
|
||||||
#include <lapic.h>
|
#include <lapic.h>
|
||||||
#include <mmu.h>
|
#include <mmu.h>
|
||||||
#include <vmx.h>
|
#include <vmx.h>
|
||||||
@ -32,6 +32,17 @@
|
|||||||
#define EXCEPTION_ABORT 2U
|
#define EXCEPTION_ABORT 2U
|
||||||
#define EXCEPTION_INTERRUPT 3U
|
#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] = {
|
static const uint16_t exception_type[32] = {
|
||||||
[0] = VMX_INT_TYPE_HW_EXP,
|
[0] = VMX_INT_TYPE_HW_EXP,
|
||||||
[1] = VMX_INT_TYPE_HW_EXP,
|
[1] = VMX_INT_TYPE_HW_EXP,
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
#include <types.h>
|
#include <types.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <bits.h>
|
#include <bits.h>
|
||||||
#include <irq.h>
|
#include <virq.h>
|
||||||
#include <mmu.h>
|
#include <mmu.h>
|
||||||
#include <vcpu.h>
|
#include <vcpu.h>
|
||||||
#include <vm.h>
|
#include <vm.h>
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
#include <lapic.h>
|
#include <lapic.h>
|
||||||
#include <vmcs.h>
|
#include <vmcs.h>
|
||||||
#include <vlapic.h>
|
#include <vlapic.h>
|
||||||
|
#include <virq.h>
|
||||||
#include <ptdev.h>
|
#include <ptdev.h>
|
||||||
#include <vmx.h>
|
#include <vmx.h>
|
||||||
#include <vm.h>
|
#include <vm.h>
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include <lapic.h>
|
#include <lapic.h>
|
||||||
#include <vm.h>
|
#include <vm.h>
|
||||||
#include <vm_reset.h>
|
#include <vm_reset.h>
|
||||||
|
#include <virq.h>
|
||||||
#include <bits.h>
|
#include <bits.h>
|
||||||
#include <e820.h>
|
#include <e820.h>
|
||||||
#include <multiboot.h>
|
#include <multiboot.h>
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include <spinlock.h>
|
#include <spinlock.h>
|
||||||
#include <vcpu.h>
|
#include <vcpu.h>
|
||||||
#include <vm.h>
|
#include <vm.h>
|
||||||
|
#include <virq.h>
|
||||||
#include <acrn_hv_defs.h>
|
#include <acrn_hv_defs.h>
|
||||||
#include <hypercall.h>
|
#include <hypercall.h>
|
||||||
#include <trace.h>
|
#include <trace.h>
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include <types.h>
|
#include <types.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <vmx.h>
|
#include <vmx.h>
|
||||||
#include <irq.h>
|
#include <virq.h>
|
||||||
#include <mmu.h>
|
#include <mmu.h>
|
||||||
#include <vcpu.h>
|
#include <vcpu.h>
|
||||||
#include <vm.h>
|
#include <vm.h>
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include <msr.h>
|
#include <msr.h>
|
||||||
#include <cpuid.h>
|
#include <cpuid.h>
|
||||||
#include <vcpu.h>
|
#include <vcpu.h>
|
||||||
|
#include <virq.h>
|
||||||
#include <vm.h>
|
#include <vm.h>
|
||||||
#include <vmx.h>
|
#include <vmx.h>
|
||||||
#include <sgx.h>
|
#include <sgx.h>
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
#include <vm_reset.h>
|
#include <vm_reset.h>
|
||||||
#include <vmcs.h>
|
#include <vmcs.h>
|
||||||
#include <vmexit.h>
|
#include <vmexit.h>
|
||||||
#include <irq.h>
|
#include <virq.h>
|
||||||
#include <schedule.h>
|
#include <schedule.h>
|
||||||
#include <profiling.h>
|
#include <profiling.h>
|
||||||
#include <sprintf.h>
|
#include <sprintf.h>
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#define pr_prefix "vpic: "
|
#define pr_prefix "vpic: "
|
||||||
|
|
||||||
#include <vm.h>
|
#include <vm.h>
|
||||||
|
#include <virq.h>
|
||||||
#include <irq.h>
|
#include <irq.h>
|
||||||
#include <assign.h>
|
#include <assign.h>
|
||||||
#include <spinlock.h>
|
#include <spinlock.h>
|
||||||
|
122
hypervisor/include/arch/x86/guest/virq.h
Normal file
122
hypervisor/include/arch/x86/guest/virq.h
Normal file
@ -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 */
|
@ -96,7 +96,6 @@ struct x86_irq_data {
|
|||||||
|
|
||||||
struct intr_excp_ctx;
|
struct intr_excp_ctx;
|
||||||
|
|
||||||
struct acrn_vcpu;
|
|
||||||
struct acrn_vm;
|
struct acrn_vm;
|
||||||
|
|
||||||
typedef void (*smp_call_func_t)(void *data);
|
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_notification(void);
|
||||||
void setup_pi_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
|
* @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);
|
void dispatch_interrupt(const struct intr_excp_ctx *ctx);
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/* End of acrn_virq */
|
|
||||||
|
|
||||||
/* Arch specific routines called from generic IRQ handling */
|
/* Arch specific routines called from generic IRQ handling */
|
||||||
|
|
||||||
struct irq_desc;
|
struct irq_desc;
|
||||||
|
Loading…
Reference in New Issue
Block a user