mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-08-19 08:42:22 +00:00
hv:Replace vlapic pointer with instance in vcpu_arch
-- update 'vlapic' in 'struct vcpu_arch' from pointer to instance -- add inline function(vcpu_vlapic) in vcpu.h Tracked-On: #861 Signed-off-by: Mingqiang Chi <mingqiang.chi@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
This commit is contained in:
parent
f744762ad3
commit
60c05ace1a
@ -297,7 +297,7 @@ int set_vcpuid_entries(struct vm *vm)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void guest_cpuid(const struct vcpu *vcpu,
|
||||
void guest_cpuid(struct vcpu *vcpu,
|
||||
uint32_t *eax, uint32_t *ebx,
|
||||
uint32_t *ecx, uint32_t *edx)
|
||||
{
|
||||
@ -329,7 +329,7 @@ void guest_cpuid(const struct vcpu *vcpu,
|
||||
case 0x01U:
|
||||
{
|
||||
cpuid(leaf, eax, ebx, ecx, edx);
|
||||
uint32_t apicid = vlapic_get_id(vcpu->arch_vcpu.vlapic);
|
||||
uint32_t apicid = vlapic_get_id(vcpu_vlapic(vcpu));
|
||||
/* Patching initial APIC ID */
|
||||
*ebx &= ~APIC_ID_MASK;
|
||||
*ebx |= (apicid & APIC_ID_MASK);
|
||||
|
@ -417,7 +417,7 @@ void reset_vcpu(struct vcpu *vcpu)
|
||||
}
|
||||
vcpu->arch_vcpu.cur_context = NORMAL_WORLD;
|
||||
|
||||
vlapic = vcpu->arch_vcpu.vlapic;
|
||||
vlapic = vcpu_vlapic(vcpu);
|
||||
vlapic_reset(vlapic);
|
||||
}
|
||||
|
||||
|
@ -111,7 +111,7 @@ vm_lapic_from_vcpu_id(struct vm *vm, uint16_t vcpu_id)
|
||||
vcpu = vcpu_from_vid(vm, vcpu_id);
|
||||
ASSERT(vcpu != NULL, "vm%d, vcpu%hu", vm->vm_id, vcpu_id);
|
||||
|
||||
return vcpu->arch_vcpu.vlapic;
|
||||
return vcpu_vlapic(vcpu);
|
||||
}
|
||||
|
||||
struct acrn_vlapic *
|
||||
@ -122,7 +122,7 @@ vm_lapic_from_pcpuid(struct vm *vm, uint16_t pcpu_id)
|
||||
vcpu = vcpu_from_pid(vm, pcpu_id);
|
||||
ASSERT(vcpu != NULL, "vm%d, pcpu%hu", vm->vm_id, pcpu_id);
|
||||
|
||||
return vcpu->arch_vcpu.vlapic;
|
||||
return vcpu_vlapic(vcpu);
|
||||
}
|
||||
|
||||
static uint16_t vm_apicid2vcpu_id(struct vm *vm, uint8_t lapicid)
|
||||
@ -131,7 +131,7 @@ static uint16_t vm_apicid2vcpu_id(struct vm *vm, uint8_t lapicid)
|
||||
struct vcpu *vcpu;
|
||||
|
||||
foreach_vcpu(i, vm, vcpu) {
|
||||
struct acrn_vlapic *vlapic = vcpu->arch_vcpu.vlapic;
|
||||
struct acrn_vlapic *vlapic = vcpu_vlapic(vcpu);
|
||||
if (vlapic_get_apicid(vlapic) == lapicid) {
|
||||
return vcpu->vcpu_id;
|
||||
}
|
||||
@ -272,14 +272,13 @@ vlapic_lvtt_masked(struct acrn_vlapic *vlapic)
|
||||
!= 0U;
|
||||
}
|
||||
|
||||
/**
|
||||
* @pre vlapic != NULL
|
||||
*/
|
||||
static void vlapic_create_timer(struct acrn_vlapic *vlapic)
|
||||
{
|
||||
struct vlapic_timer *vtimer;
|
||||
|
||||
if (vlapic == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
vtimer = &vlapic->vtimer;
|
||||
(void)memset(vtimer, 0U, sizeof(struct vlapic_timer));
|
||||
|
||||
@ -288,14 +287,13 @@ static void vlapic_create_timer(struct acrn_vlapic *vlapic)
|
||||
0UL, 0, 0UL);
|
||||
}
|
||||
|
||||
/**
|
||||
* @pre vlapic != NULL
|
||||
*/
|
||||
static void vlapic_reset_timer(struct acrn_vlapic *vlapic)
|
||||
{
|
||||
struct hv_timer *timer;
|
||||
|
||||
if (vlapic == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
timer = &vlapic->vtimer.timer;
|
||||
del_timer(timer);
|
||||
timer->mode = 0;
|
||||
@ -1591,10 +1589,12 @@ vlapic_reset(struct acrn_vlapic *vlapic)
|
||||
vlapic->isrvec_stk_top = 0U;
|
||||
}
|
||||
|
||||
/**
|
||||
* @pre vlapic->vm != NULL
|
||||
*/
|
||||
void
|
||||
vlapic_init(struct acrn_vlapic *vlapic)
|
||||
{
|
||||
ASSERT(vlapic->vm != NULL, "%s: vm is not initialized", __func__);
|
||||
ASSERT(vlapic->vcpu->vcpu_id < phys_cpu_num,
|
||||
"%s: vcpu_id is not initialized", __func__);
|
||||
|
||||
@ -1695,7 +1695,7 @@ vlapic_deliver_intr(struct vm *vm, bool level, uint32_t dest, bool phys,
|
||||
}
|
||||
|
||||
/* only make request when vlapic enabled */
|
||||
vlapic = target_vcpu->arch_vcpu.vlapic;
|
||||
vlapic = vcpu_vlapic(target_vcpu);
|
||||
if (vlapic_enabled(vlapic)) {
|
||||
if (delmode == IOAPIC_RTE_DELEXINT) {
|
||||
vcpu_inject_extint(target_vcpu);
|
||||
@ -1811,7 +1811,7 @@ vlapic_set_intr(struct vcpu *vcpu, uint32_t vector, bool level)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
vlapic = vcpu->arch_vcpu.vlapic;
|
||||
vlapic = vcpu_vlapic(vcpu);
|
||||
if (vlapic_set_intr_ready(vlapic, vector, level) != 0) {
|
||||
vcpu_make_request(vcpu, ACRN_REQUEST_EVENT);
|
||||
} else {
|
||||
@ -1898,7 +1898,7 @@ static void vlapic_timer_expired(void *data)
|
||||
struct acrn_vlapic *vlapic;
|
||||
struct lapic_regs *lapic;
|
||||
|
||||
vlapic = vcpu->arch_vcpu.vlapic;
|
||||
vlapic = vcpu_vlapic(vcpu);
|
||||
lapic = &(vlapic->apic_page);
|
||||
|
||||
/* inject vcpu timer interrupt if not masked */
|
||||
@ -1918,7 +1918,7 @@ vlapic_rdmsr(struct vcpu *vcpu, uint32_t msr, uint64_t *rval)
|
||||
struct acrn_vlapic *vlapic;
|
||||
|
||||
dev_dbg(ACRN_DBG_LAPIC, "cpu[%hu] rdmsr: %x", vcpu->vcpu_id, msr);
|
||||
vlapic = vcpu->arch_vcpu.vlapic;
|
||||
vlapic = vcpu_vlapic(vcpu);
|
||||
|
||||
switch (msr) {
|
||||
case MSR_IA32_APIC_BASE:
|
||||
@ -1944,7 +1944,7 @@ vlapic_wrmsr(struct vcpu *vcpu, uint32_t msr, uint64_t wval)
|
||||
int error = 0;
|
||||
struct acrn_vlapic *vlapic;
|
||||
|
||||
vlapic = vcpu->arch_vcpu.vlapic;
|
||||
vlapic = vcpu_vlapic(vcpu);
|
||||
|
||||
switch (msr) {
|
||||
case MSR_IA32_APIC_BASE:
|
||||
@ -1968,11 +1968,8 @@ vlapic_wrmsr(struct vcpu *vcpu, uint32_t msr, uint64_t wval)
|
||||
|
||||
int vlapic_create(struct vcpu *vcpu)
|
||||
{
|
||||
struct acrn_vlapic *vlapic = calloc(1U, sizeof(struct acrn_vlapic));
|
||||
|
||||
ASSERT(vlapic != NULL, "vlapic allocate failed");
|
||||
vlapic->vm = vcpu->vm;
|
||||
vlapic->vcpu = vcpu;
|
||||
vcpu->arch_vcpu.vlapic.vm = vcpu->vm;
|
||||
vcpu->arch_vcpu.vlapic.vcpu = vcpu;
|
||||
|
||||
if (is_vcpu_bsp(vcpu)) {
|
||||
uint64_t *pml4_page =
|
||||
@ -1988,8 +1985,7 @@ int vlapic_create(struct vcpu *vcpu)
|
||||
EPT_WR | EPT_RD | EPT_UNCACHED);
|
||||
}
|
||||
|
||||
vcpu->arch_vcpu.vlapic = vlapic;
|
||||
vlapic_init(vlapic);
|
||||
vlapic_init(vcpu_vlapic(vcpu));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2001,13 +1997,10 @@ void vlapic_free(struct vcpu *vcpu)
|
||||
return;
|
||||
}
|
||||
|
||||
vlapic = vcpu->arch_vcpu.vlapic;
|
||||
if (vlapic == NULL) {
|
||||
return;
|
||||
}
|
||||
vlapic = vcpu_vlapic(vcpu);
|
||||
|
||||
del_timer(&vlapic->vtimer.timer);
|
||||
|
||||
free(vlapic);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2196,7 +2189,7 @@ int apic_access_vmexit_handler(struct vcpu *vcpu)
|
||||
offset = (uint32_t)apic_access_offset(qual);
|
||||
}
|
||||
|
||||
vlapic = vcpu->arch_vcpu.vlapic;
|
||||
vlapic = vcpu_vlapic(vcpu);
|
||||
|
||||
err = decode_instruction(vcpu);
|
||||
/* apic access should already fetched instruction, decode_instruction
|
||||
@ -2236,7 +2229,7 @@ int veoi_vmexit_handler(struct vcpu *vcpu)
|
||||
|
||||
vcpu_retain_rip(vcpu);
|
||||
|
||||
vlapic = vcpu->arch_vcpu.vlapic;
|
||||
vlapic = vcpu_vlapic(vcpu);
|
||||
lapic = &(vlapic->apic_page);
|
||||
vector = (uint32_t)(vcpu->arch_vcpu.exit_qualification & 0xFFUL);
|
||||
|
||||
@ -2266,7 +2259,7 @@ int apic_write_vmexit_handler(struct vcpu *vcpu)
|
||||
|
||||
handled = 1;
|
||||
vcpu_retain_rip(vcpu);
|
||||
vlapic = vcpu->arch_vcpu.vlapic;
|
||||
vlapic = vcpu_vlapic(vcpu);
|
||||
|
||||
switch (offset) {
|
||||
case APIC_OFFSET_ID:
|
||||
|
@ -78,7 +78,7 @@ static bool vcpu_pending_request(struct vcpu *vcpu)
|
||||
int ret = 0;
|
||||
|
||||
/* Query vLapic to get vector to inject */
|
||||
vlapic = vcpu->arch_vcpu.vlapic;
|
||||
vlapic = vcpu_vlapic(vcpu);
|
||||
ret = vlapic_pending_intr(vlapic, &vector);
|
||||
|
||||
/* we need to check and raise request if we have pending event
|
||||
@ -111,7 +111,7 @@ void vcpu_make_request(struct vcpu *vcpu, uint16_t eventid)
|
||||
|
||||
static int vcpu_inject_vlapic_int(struct vcpu *vcpu)
|
||||
{
|
||||
struct acrn_vlapic *vlapic = vcpu->arch_vcpu.vlapic;
|
||||
struct acrn_vlapic *vlapic = vcpu_vlapic(vcpu);
|
||||
uint32_t vector = 0U;
|
||||
int ret = 0;
|
||||
|
||||
@ -390,7 +390,7 @@ int acrn_handle_pending_request(struct vcpu *vcpu)
|
||||
uint32_t error_code;
|
||||
struct vcpu_arch * arch_vcpu = &vcpu->arch_vcpu;
|
||||
uint64_t *pending_req_bits = &arch_vcpu->pending_req;
|
||||
struct acrn_vlapic *vlapic = vcpu->arch_vcpu.vlapic;
|
||||
struct acrn_vlapic *vlapic = vcpu_vlapic(vcpu);
|
||||
|
||||
if (bitmap_test_and_clear_lock(ACRN_REQUEST_TRP_FAULT, pending_req_bits)) {
|
||||
pr_fatal("Triple fault happen -> shutdown!");
|
||||
|
@ -294,11 +294,11 @@ int cr_access_vmexit_handler(struct vcpu *vcpu)
|
||||
vcpu_inject_gp(vcpu, 0U);
|
||||
break;
|
||||
}
|
||||
vlapic_set_cr8(vcpu->arch_vcpu.vlapic, reg);
|
||||
vlapic_set_cr8(vcpu_vlapic(vcpu), reg);
|
||||
break;
|
||||
case 0x18UL:
|
||||
/* mov from cr8 */
|
||||
reg = vlapic_get_cr8(vcpu->arch_vcpu.vlapic);
|
||||
reg = vlapic_get_cr8(vcpu_vlapic(vcpu));
|
||||
vcpu_set_gpreg(vcpu, idx, reg);
|
||||
break;
|
||||
default:
|
||||
|
@ -972,7 +972,7 @@ static void init_exec_ctrl(struct vcpu *vcpu)
|
||||
exec_vmwrite64(VMX_APIC_ACCESS_ADDR_FULL, value64);
|
||||
|
||||
/*APIC-v, config APIC virtualized page address*/
|
||||
value64 = vlapic_apicv_get_apic_page_addr(vcpu->arch_vcpu.vlapic);
|
||||
value64 = vlapic_apicv_get_apic_page_addr(vcpu_vlapic(vcpu));
|
||||
exec_vmwrite64(VMX_VIRTUAL_APIC_PAGE_ADDR_FULL, value64);
|
||||
|
||||
if (is_apicv_intr_delivery_supported()) {
|
||||
|
@ -37,7 +37,7 @@ void efi_spurious_handler(int vector)
|
||||
return;
|
||||
|
||||
vcpu = per_cpu(vcpu, 0);
|
||||
if ((vcpu != NULL) && vcpu->arch_vcpu.vlapic) {
|
||||
if (vcpu != NULL) {
|
||||
ret = vlapic_set_intr(vcpu, vector, 0);
|
||||
if (ret != 0)
|
||||
pr_err("%s vlapic set intr fail, interrupt lost\n",
|
||||
@ -62,7 +62,7 @@ int uefi_sw_loader(struct vm *vm, struct vcpu *vcpu)
|
||||
if (!is_vm0(vm))
|
||||
return load_guest(vm, vcpu);
|
||||
|
||||
vlapic_restore(vcpu->arch_vcpu.vlapic, &uefi_lapic_regs);
|
||||
vlapic_restore(vcpu_vlapic(vcpu), &uefi_lapic_regs);
|
||||
|
||||
vcpu->entry_addr = (void *)efi_ctx->rip;
|
||||
memcpy_s(&cur_context->guest_cpu_regs, sizeof(struct cpu_gp_regs),
|
||||
|
@ -36,7 +36,7 @@ int32_t hcall_sos_offline_cpu(struct vm *vm, uint64_t lapicid)
|
||||
pr_info("sos offline cpu with lapicid %lld", lapicid);
|
||||
|
||||
foreach_vcpu(i, vm, vcpu) {
|
||||
if (vlapic_get_apicid(vcpu->arch_vcpu.vlapic) == lapicid) {
|
||||
if (vlapic_get_apicid(vcpu_vlapic(vcpu)) == lapicid) {
|
||||
/* should not offline BSP */
|
||||
if (vcpu->vcpu_id == BOOT_CPU_ID)
|
||||
return -1;
|
||||
|
@ -189,7 +189,7 @@ vioapic_update_tmr(struct vcpu *vcpu)
|
||||
bool level;
|
||||
uint32_t pin, pincount;
|
||||
|
||||
vlapic = vcpu->arch_vcpu.vlapic;
|
||||
vlapic = vcpu_vlapic(vcpu);
|
||||
vioapic = vm_ioapic(vcpu->vm);
|
||||
|
||||
VIOAPIC_LOCK(vioapic);
|
||||
|
@ -132,7 +132,7 @@ static inline void cpuid_subleaf(uint32_t leaf, uint32_t subleaf,
|
||||
}
|
||||
|
||||
int set_vcpuid_entries(struct vm *vm);
|
||||
void guest_cpuid(const struct vcpu *vcpu,
|
||||
void guest_cpuid(struct vcpu *vcpu,
|
||||
uint32_t *eax, uint32_t *ebx,
|
||||
uint32_t *ecx, uint32_t *edx);
|
||||
|
||||
|
@ -166,6 +166,8 @@ struct cpu_context {
|
||||
struct vcpu_arch {
|
||||
/* vmcs region for this vcpu, MUST be 4KB-aligned */
|
||||
uint8_t vmcs[CPU_PAGE_SIZE];
|
||||
/* per vcpu lapic */
|
||||
struct acrn_vlapic vlapic;
|
||||
int cur_context;
|
||||
struct cpu_context contexts[NR_WORLD];
|
||||
|
||||
@ -203,8 +205,6 @@ struct vcpu_arch {
|
||||
bool inject_event_pending;
|
||||
struct event_injection_info inject_info;
|
||||
|
||||
/* per vcpu lapic */
|
||||
void *vlapic;
|
||||
} __aligned(CPU_PAGE_SIZE);
|
||||
|
||||
struct vm;
|
||||
@ -264,6 +264,12 @@ static inline void vcpu_retain_rip(struct vcpu *vcpu)
|
||||
(vcpu)->arch_vcpu.inst_len = 0U;
|
||||
}
|
||||
|
||||
static inline struct acrn_vlapic *
|
||||
vcpu_vlapic(struct vcpu *vcpu)
|
||||
{
|
||||
return &(vcpu->arch_vcpu.vlapic);
|
||||
}
|
||||
|
||||
/* External Interfaces */
|
||||
uint64_t vcpu_get_gpreg(struct vcpu *vcpu, uint32_t reg);
|
||||
void vcpu_set_gpreg(struct vcpu *vcpu, uint32_t reg, uint64_t val);
|
||||
|
Loading…
Reference in New Issue
Block a user