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:
Mingqiang Chi 2018-09-10 19:26:30 +08:00 committed by lijinxia
parent f744762ad3
commit 60c05ace1a
11 changed files with 47 additions and 48 deletions

View File

@ -297,7 +297,7 @@ int set_vcpuid_entries(struct vm *vm)
return 0; return 0;
} }
void guest_cpuid(const struct vcpu *vcpu, void guest_cpuid(struct vcpu *vcpu,
uint32_t *eax, uint32_t *ebx, uint32_t *eax, uint32_t *ebx,
uint32_t *ecx, uint32_t *edx) uint32_t *ecx, uint32_t *edx)
{ {
@ -329,7 +329,7 @@ void guest_cpuid(const struct vcpu *vcpu,
case 0x01U: case 0x01U:
{ {
cpuid(leaf, eax, ebx, ecx, edx); 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 */ /* Patching initial APIC ID */
*ebx &= ~APIC_ID_MASK; *ebx &= ~APIC_ID_MASK;
*ebx |= (apicid & APIC_ID_MASK); *ebx |= (apicid & APIC_ID_MASK);

View File

@ -417,7 +417,7 @@ void reset_vcpu(struct vcpu *vcpu)
} }
vcpu->arch_vcpu.cur_context = NORMAL_WORLD; vcpu->arch_vcpu.cur_context = NORMAL_WORLD;
vlapic = vcpu->arch_vcpu.vlapic; vlapic = vcpu_vlapic(vcpu);
vlapic_reset(vlapic); vlapic_reset(vlapic);
} }

View File

@ -111,7 +111,7 @@ vm_lapic_from_vcpu_id(struct vm *vm, uint16_t vcpu_id)
vcpu = vcpu_from_vid(vm, vcpu_id); vcpu = vcpu_from_vid(vm, vcpu_id);
ASSERT(vcpu != NULL, "vm%d, vcpu%hu", vm->vm_id, 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 * 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); vcpu = vcpu_from_pid(vm, pcpu_id);
ASSERT(vcpu != NULL, "vm%d, pcpu%hu", vm->vm_id, 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) 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; struct vcpu *vcpu;
foreach_vcpu(i, vm, 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) { if (vlapic_get_apicid(vlapic) == lapicid) {
return vcpu->vcpu_id; return vcpu->vcpu_id;
} }
@ -272,14 +272,13 @@ vlapic_lvtt_masked(struct acrn_vlapic *vlapic)
!= 0U; != 0U;
} }
/**
* @pre vlapic != NULL
*/
static void vlapic_create_timer(struct acrn_vlapic *vlapic) static void vlapic_create_timer(struct acrn_vlapic *vlapic)
{ {
struct vlapic_timer *vtimer; struct vlapic_timer *vtimer;
if (vlapic == NULL) {
return;
}
vtimer = &vlapic->vtimer; vtimer = &vlapic->vtimer;
(void)memset(vtimer, 0U, sizeof(struct vlapic_timer)); (void)memset(vtimer, 0U, sizeof(struct vlapic_timer));
@ -288,14 +287,13 @@ static void vlapic_create_timer(struct acrn_vlapic *vlapic)
0UL, 0, 0UL); 0UL, 0, 0UL);
} }
/**
* @pre vlapic != NULL
*/
static void vlapic_reset_timer(struct acrn_vlapic *vlapic) static void vlapic_reset_timer(struct acrn_vlapic *vlapic)
{ {
struct hv_timer *timer; struct hv_timer *timer;
if (vlapic == NULL) {
return;
}
timer = &vlapic->vtimer.timer; timer = &vlapic->vtimer.timer;
del_timer(timer); del_timer(timer);
timer->mode = 0; timer->mode = 0;
@ -1591,10 +1589,12 @@ vlapic_reset(struct acrn_vlapic *vlapic)
vlapic->isrvec_stk_top = 0U; vlapic->isrvec_stk_top = 0U;
} }
/**
* @pre vlapic->vm != NULL
*/
void void
vlapic_init(struct acrn_vlapic *vlapic) vlapic_init(struct acrn_vlapic *vlapic)
{ {
ASSERT(vlapic->vm != NULL, "%s: vm is not initialized", __func__);
ASSERT(vlapic->vcpu->vcpu_id < phys_cpu_num, ASSERT(vlapic->vcpu->vcpu_id < phys_cpu_num,
"%s: vcpu_id is not initialized", __func__); "%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 */ /* only make request when vlapic enabled */
vlapic = target_vcpu->arch_vcpu.vlapic; vlapic = vcpu_vlapic(target_vcpu);
if (vlapic_enabled(vlapic)) { if (vlapic_enabled(vlapic)) {
if (delmode == IOAPIC_RTE_DELEXINT) { if (delmode == IOAPIC_RTE_DELEXINT) {
vcpu_inject_extint(target_vcpu); vcpu_inject_extint(target_vcpu);
@ -1811,7 +1811,7 @@ vlapic_set_intr(struct vcpu *vcpu, uint32_t vector, bool level)
return -EINVAL; return -EINVAL;
} }
vlapic = vcpu->arch_vcpu.vlapic; vlapic = vcpu_vlapic(vcpu);
if (vlapic_set_intr_ready(vlapic, vector, level) != 0) { if (vlapic_set_intr_ready(vlapic, vector, level) != 0) {
vcpu_make_request(vcpu, ACRN_REQUEST_EVENT); vcpu_make_request(vcpu, ACRN_REQUEST_EVENT);
} else { } else {
@ -1898,7 +1898,7 @@ static void vlapic_timer_expired(void *data)
struct acrn_vlapic *vlapic; struct acrn_vlapic *vlapic;
struct lapic_regs *lapic; struct lapic_regs *lapic;
vlapic = vcpu->arch_vcpu.vlapic; vlapic = vcpu_vlapic(vcpu);
lapic = &(vlapic->apic_page); lapic = &(vlapic->apic_page);
/* inject vcpu timer interrupt if not masked */ /* 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; struct acrn_vlapic *vlapic;
dev_dbg(ACRN_DBG_LAPIC, "cpu[%hu] rdmsr: %x", vcpu->vcpu_id, msr); dev_dbg(ACRN_DBG_LAPIC, "cpu[%hu] rdmsr: %x", vcpu->vcpu_id, msr);
vlapic = vcpu->arch_vcpu.vlapic; vlapic = vcpu_vlapic(vcpu);
switch (msr) { switch (msr) {
case MSR_IA32_APIC_BASE: case MSR_IA32_APIC_BASE:
@ -1944,7 +1944,7 @@ vlapic_wrmsr(struct vcpu *vcpu, uint32_t msr, uint64_t wval)
int error = 0; int error = 0;
struct acrn_vlapic *vlapic; struct acrn_vlapic *vlapic;
vlapic = vcpu->arch_vcpu.vlapic; vlapic = vcpu_vlapic(vcpu);
switch (msr) { switch (msr) {
case MSR_IA32_APIC_BASE: 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) int vlapic_create(struct vcpu *vcpu)
{ {
struct acrn_vlapic *vlapic = calloc(1U, sizeof(struct acrn_vlapic)); vcpu->arch_vcpu.vlapic.vm = vcpu->vm;
vcpu->arch_vcpu.vlapic.vcpu = vcpu;
ASSERT(vlapic != NULL, "vlapic allocate failed");
vlapic->vm = vcpu->vm;
vlapic->vcpu = vcpu;
if (is_vcpu_bsp(vcpu)) { if (is_vcpu_bsp(vcpu)) {
uint64_t *pml4_page = uint64_t *pml4_page =
@ -1988,8 +1985,7 @@ int vlapic_create(struct vcpu *vcpu)
EPT_WR | EPT_RD | EPT_UNCACHED); EPT_WR | EPT_RD | EPT_UNCACHED);
} }
vcpu->arch_vcpu.vlapic = vlapic; vlapic_init(vcpu_vlapic(vcpu));
vlapic_init(vlapic);
return 0; return 0;
} }
@ -2001,13 +1997,10 @@ void vlapic_free(struct vcpu *vcpu)
return; return;
} }
vlapic = vcpu->arch_vcpu.vlapic; vlapic = vcpu_vlapic(vcpu);
if (vlapic == NULL) {
return;
}
del_timer(&vlapic->vtimer.timer); 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); offset = (uint32_t)apic_access_offset(qual);
} }
vlapic = vcpu->arch_vcpu.vlapic; vlapic = vcpu_vlapic(vcpu);
err = decode_instruction(vcpu); err = decode_instruction(vcpu);
/* apic access should already fetched instruction, decode_instruction /* apic access should already fetched instruction, decode_instruction
@ -2236,7 +2229,7 @@ int veoi_vmexit_handler(struct vcpu *vcpu)
vcpu_retain_rip(vcpu); vcpu_retain_rip(vcpu);
vlapic = vcpu->arch_vcpu.vlapic; vlapic = vcpu_vlapic(vcpu);
lapic = &(vlapic->apic_page); lapic = &(vlapic->apic_page);
vector = (uint32_t)(vcpu->arch_vcpu.exit_qualification & 0xFFUL); vector = (uint32_t)(vcpu->arch_vcpu.exit_qualification & 0xFFUL);
@ -2266,7 +2259,7 @@ int apic_write_vmexit_handler(struct vcpu *vcpu)
handled = 1; handled = 1;
vcpu_retain_rip(vcpu); vcpu_retain_rip(vcpu);
vlapic = vcpu->arch_vcpu.vlapic; vlapic = vcpu_vlapic(vcpu);
switch (offset) { switch (offset) {
case APIC_OFFSET_ID: case APIC_OFFSET_ID:

View File

@ -78,7 +78,7 @@ static bool vcpu_pending_request(struct vcpu *vcpu)
int ret = 0; int ret = 0;
/* Query vLapic to get vector to inject */ /* Query vLapic to get vector to inject */
vlapic = vcpu->arch_vcpu.vlapic; vlapic = vcpu_vlapic(vcpu);
ret = vlapic_pending_intr(vlapic, &vector); ret = vlapic_pending_intr(vlapic, &vector);
/* we need to check and raise request if we have pending event /* 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) 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; uint32_t vector = 0U;
int ret = 0; int ret = 0;
@ -390,7 +390,7 @@ int acrn_handle_pending_request(struct vcpu *vcpu)
uint32_t error_code; uint32_t error_code;
struct vcpu_arch * arch_vcpu = &vcpu->arch_vcpu; struct vcpu_arch * arch_vcpu = &vcpu->arch_vcpu;
uint64_t *pending_req_bits = &arch_vcpu->pending_req; 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)) { if (bitmap_test_and_clear_lock(ACRN_REQUEST_TRP_FAULT, pending_req_bits)) {
pr_fatal("Triple fault happen -> shutdown!"); pr_fatal("Triple fault happen -> shutdown!");

View File

@ -294,11 +294,11 @@ int cr_access_vmexit_handler(struct vcpu *vcpu)
vcpu_inject_gp(vcpu, 0U); vcpu_inject_gp(vcpu, 0U);
break; break;
} }
vlapic_set_cr8(vcpu->arch_vcpu.vlapic, reg); vlapic_set_cr8(vcpu_vlapic(vcpu), reg);
break; break;
case 0x18UL: case 0x18UL:
/* mov from cr8 */ /* mov from cr8 */
reg = vlapic_get_cr8(vcpu->arch_vcpu.vlapic); reg = vlapic_get_cr8(vcpu_vlapic(vcpu));
vcpu_set_gpreg(vcpu, idx, reg); vcpu_set_gpreg(vcpu, idx, reg);
break; break;
default: default:

View File

@ -972,7 +972,7 @@ static void init_exec_ctrl(struct vcpu *vcpu)
exec_vmwrite64(VMX_APIC_ACCESS_ADDR_FULL, value64); exec_vmwrite64(VMX_APIC_ACCESS_ADDR_FULL, value64);
/*APIC-v, config APIC virtualized page address*/ /*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); exec_vmwrite64(VMX_VIRTUAL_APIC_PAGE_ADDR_FULL, value64);
if (is_apicv_intr_delivery_supported()) { if (is_apicv_intr_delivery_supported()) {

View File

@ -37,7 +37,7 @@ void efi_spurious_handler(int vector)
return; return;
vcpu = per_cpu(vcpu, 0); vcpu = per_cpu(vcpu, 0);
if ((vcpu != NULL) && vcpu->arch_vcpu.vlapic) { if (vcpu != NULL) {
ret = vlapic_set_intr(vcpu, vector, 0); ret = vlapic_set_intr(vcpu, vector, 0);
if (ret != 0) if (ret != 0)
pr_err("%s vlapic set intr fail, interrupt lost\n", 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)) if (!is_vm0(vm))
return load_guest(vm, vcpu); 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; vcpu->entry_addr = (void *)efi_ctx->rip;
memcpy_s(&cur_context->guest_cpu_regs, sizeof(struct cpu_gp_regs), memcpy_s(&cur_context->guest_cpu_regs, sizeof(struct cpu_gp_regs),

View File

@ -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); pr_info("sos offline cpu with lapicid %lld", lapicid);
foreach_vcpu(i, vm, vcpu) { 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 */ /* should not offline BSP */
if (vcpu->vcpu_id == BOOT_CPU_ID) if (vcpu->vcpu_id == BOOT_CPU_ID)
return -1; return -1;

View File

@ -189,7 +189,7 @@ vioapic_update_tmr(struct vcpu *vcpu)
bool level; bool level;
uint32_t pin, pincount; uint32_t pin, pincount;
vlapic = vcpu->arch_vcpu.vlapic; vlapic = vcpu_vlapic(vcpu);
vioapic = vm_ioapic(vcpu->vm); vioapic = vm_ioapic(vcpu->vm);
VIOAPIC_LOCK(vioapic); VIOAPIC_LOCK(vioapic);

View File

@ -132,7 +132,7 @@ static inline void cpuid_subleaf(uint32_t leaf, uint32_t subleaf,
} }
int set_vcpuid_entries(struct vm *vm); 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 *eax, uint32_t *ebx,
uint32_t *ecx, uint32_t *edx); uint32_t *ecx, uint32_t *edx);

View File

@ -166,6 +166,8 @@ struct cpu_context {
struct vcpu_arch { struct vcpu_arch {
/* vmcs region for this vcpu, MUST be 4KB-aligned */ /* vmcs region for this vcpu, MUST be 4KB-aligned */
uint8_t vmcs[CPU_PAGE_SIZE]; uint8_t vmcs[CPU_PAGE_SIZE];
/* per vcpu lapic */
struct acrn_vlapic vlapic;
int cur_context; int cur_context;
struct cpu_context contexts[NR_WORLD]; struct cpu_context contexts[NR_WORLD];
@ -203,8 +205,6 @@ struct vcpu_arch {
bool inject_event_pending; bool inject_event_pending;
struct event_injection_info inject_info; struct event_injection_info inject_info;
/* per vcpu lapic */
void *vlapic;
} __aligned(CPU_PAGE_SIZE); } __aligned(CPU_PAGE_SIZE);
struct vm; struct vm;
@ -264,6 +264,12 @@ static inline void vcpu_retain_rip(struct vcpu *vcpu)
(vcpu)->arch_vcpu.inst_len = 0U; (vcpu)->arch_vcpu.inst_len = 0U;
} }
static inline struct acrn_vlapic *
vcpu_vlapic(struct vcpu *vcpu)
{
return &(vcpu->arch_vcpu.vlapic);
}
/* External Interfaces */ /* External Interfaces */
uint64_t vcpu_get_gpreg(struct vcpu *vcpu, uint32_t reg); uint64_t vcpu_get_gpreg(struct vcpu *vcpu, uint32_t reg);
void vcpu_set_gpreg(struct vcpu *vcpu, uint32_t reg, uint64_t val); void vcpu_set_gpreg(struct vcpu *vcpu, uint32_t reg, uint64_t val);