diff --git a/hypervisor/arch/x86/vmx.c b/hypervisor/arch/x86/vmx.c index aa61b1b95..90faead5a 100644 --- a/hypervisor/arch/x86/vmx.c +++ b/hypervisor/arch/x86/vmx.c @@ -604,42 +604,6 @@ static void init_guest_context_real(struct vcpu *vcpu) ectx->idtr.limit = 0xFFFFU; } -static void init_guest_context_vm0_bsp(struct vcpu *vcpu) -{ - struct ext_context *ectx = - &vcpu->arch_vcpu.contexts[vcpu->arch_vcpu.cur_context].ext_ctx; - struct acrn_vcpu_regs* init_ctx = - (struct acrn_vcpu_regs*)(&vm0_boot_context); - uint16_t *sel = &(init_ctx->cs_sel); - struct segment_sel *seg; - - for (seg = &(ectx->cs); seg <= &(ectx->gs); seg++) { - seg->base = 0UL; - seg->limit = 0xFFFFFFFFU; - seg->attr = PROTECTED_MODE_DATA_SEG_AR; - seg->selector = *sel; - sel++; - } - ectx->cs.attr = init_ctx->cs_ar; /* override cs attr */ - - vcpu_set_rip(vcpu, (uint64_t)vcpu->entry_addr); - vcpu_set_efer(vcpu, init_ctx->ia32_efer); - - ectx->gdtr.base = init_ctx->gdt.base; - ectx->gdtr.limit = init_ctx->gdt.limit; - - ectx->idtr.base = init_ctx->idt.base; - ectx->idtr.limit = init_ctx->idt.limit; - - ectx->ldtr.selector = init_ctx->ldt_sel; - ectx->tr.selector = init_ctx->tr_sel; -#ifdef CONFIG_EFI_STUB - vcpu_set_rsp(vcpu, efi_ctx->vcpu_regs.gprs.rsp); - /* clear flags for CF/PF/AF/ZF/SF/OF */ - vcpu_set_rflags(vcpu, efi_ctx->vcpu_regs.rflags & ~(0x8d5UL)); -#endif -} - /* only be called for UOS when bsp start from protected mode */ static void init_guest_context_protect(struct vcpu *vcpu) { @@ -730,7 +694,6 @@ static void init_guest_state(struct vcpu *vcpu) init_guest_context_real(vcpu); init_guest_vmx(vcpu, CR0_ET | CR0_NE, 0UL, 0UL); } else if (is_vm0(vcpu->vm) && is_vcpu_bsp(vcpu)) { - init_guest_context_vm0_bsp(vcpu); init_guest_vmx(vcpu, init_ctx->cr0, init_ctx->cr3, init_ctx->cr4 & ~CR4_VMXE); } else { diff --git a/hypervisor/bsp/uefi/uefi.c b/hypervisor/bsp/uefi/uefi.c index e1662fb20..dda032f9f 100644 --- a/hypervisor/bsp/uefi/uefi.c +++ b/hypervisor/bsp/uefi/uefi.c @@ -39,8 +39,8 @@ void efi_spurious_handler(int vector) int uefi_sw_loader(struct vm *vm, struct vcpu *vcpu) { int ret = 0; - struct run_context *cur_context = - &vcpu->arch_vcpu.contexts[vcpu->arch_vcpu.cur_context].run_ctx; + struct acrn_vcpu_regs *vcpu_regs = + (struct acrn_vcpu_regs *)&vm0_boot_context; ASSERT(vm != NULL, "Incorrect argument"); @@ -51,9 +51,17 @@ int uefi_sw_loader(struct vm *vm, struct vcpu *vcpu) vlapic_restore(vcpu_vlapic(vcpu), &uefi_lapic_regs); - vcpu->entry_addr = (void *)efi_ctx->vcpu_regs.rip; - memcpy_s(&cur_context->guest_cpu_regs, sizeof(struct acrn_gp_regs), - &efi_ctx->vcpu_regs.gprs, sizeof(struct acrn_gp_regs)); + /* For UEFI platform, the bsp init regs come from two places: + * 1. saved in efi_boot: gpregs, rip + * 2. saved when HV started: other registers + * We copy the info saved in efi_boot to vm0_boot_context and + * init bsp with vm0_boot_context. + */ + memcpy_s(&(vcpu_regs->gprs), sizeof(struct acrn_gp_regs), + &(efi_ctx->vcpu_regs.gprs), sizeof(struct acrn_gp_regs)); + + vcpu_regs->rip = efi_ctx->vcpu_regs.rip; + set_vcpu_regs(vcpu, vcpu_regs); /* defer irq enabling till vlapic is ready */ CPU_IRQ_ENABLE(); diff --git a/hypervisor/common/vm_load.c b/hypervisor/common/vm_load.c index 0e3f96a84..87565705e 100644 --- a/hypervisor/common/vm_load.c +++ b/hypervisor/common/vm_load.c @@ -138,6 +138,8 @@ int general_sw_loader(struct vm *vm, struct vcpu *vcpu) } #endif + set_vcpu_regs(vcpu, (struct acrn_vcpu_regs *)&vm0_boot_context); + /* calculate the kernel entry point */ zeropage = (struct zero_page *)sw_kernel->kernel_src_addr; kernel_entry_offset = (uint32_t)(zeropage->hdr.setup_sects + 1U) * 512U; @@ -151,9 +153,10 @@ int general_sw_loader(struct vm *vm, struct vcpu *vcpu) + kernel_entry_offset); if (is_vcpu_bsp(vcpu)) { /* Set VCPU entry point to kernel entry */ - vcpu->entry_addr = sw_kernel->kernel_entry_addr; + vcpu_set_rip(vcpu, (uint64_t)sw_kernel->kernel_entry_addr); pr_info("%s, VM %hu VCPU %hu Entry: 0x%016llx ", - __func__, vm->vm_id, vcpu->vcpu_id, vcpu->entry_addr); + __func__, vm->vm_id, vcpu->vcpu_id, + sw_kernel->kernel_entry_addr); } /* Calculate the host-physical address where the guest will be loaded */