From adc7913741a77339b4548803da99134260e9e017 Mon Sep 17 00:00:00 2001 From: Yin Fengwei Date: Fri, 28 Sep 2018 14:50:14 +0800 Subject: [PATCH] hv: efi_context refine For SBL platform, struct acrn_vcpu_regs are used as boot context. Now the boot_ctx is only for UEFI platform. Rename struct boot_ctx to efi_context. Tracked-On: #1231 Signed-off-by: Yin Fengwei --- hypervisor/arch/x86/vmx.c | 2 +- hypervisor/bsp/uefi/efi/boot.c | 42 ++++++++++---------- hypervisor/bsp/uefi/efi/boot.h | 4 +- hypervisor/bsp/uefi/uefi.c | 8 ++-- hypervisor/include/arch/x86/guest/vm0_boot.h | 6 +-- 5 files changed, 30 insertions(+), 32 deletions(-) diff --git a/hypervisor/arch/x86/vmx.c b/hypervisor/arch/x86/vmx.c index 728670935..51399e972 100644 --- a/hypervisor/arch/x86/vmx.c +++ b/hypervisor/arch/x86/vmx.c @@ -7,7 +7,7 @@ #include #include #ifdef CONFIG_EFI_STUB -extern struct boot_ctx* efi_ctx; +extern struct efi_context* efi_ctx; #endif #define REAL_MODE_BSP_INIT_CODE_SEL (0xf000U) diff --git a/hypervisor/bsp/uefi/efi/boot.c b/hypervisor/bsp/uefi/efi/boot.c index 451638bef..af0972303 100644 --- a/hypervisor/bsp/uefi/efi/boot.c +++ b/hypervisor/bsp/uefi/efi/boot.c @@ -45,11 +45,11 @@ extern const uint64_t guest_entry; static UINT64 hv_hpa; static inline void hv_jump(EFI_PHYSICAL_ADDRESS hv_start, - struct multiboot_info *mbi, struct boot_ctx *efi_ctx) + struct multiboot_info *mbi, struct efi_context *efi_ctx) { hv_func hf; - efi_ctx->rip = (uint64_t)&guest_entry; + efi_ctx->vcpu_regs.rip = (uint64_t)&guest_entry; /* The 64-bit entry of acrn hypervisor is 0x200 from the start * address of hv image. But due to there is multiboot header, @@ -75,7 +75,7 @@ EFI_STATUS construct_mbi(EFI_PHYSICAL_ADDRESS hv_hpa) EFI_STATUS err = EFI_SUCCESS; struct multiboot_info *mbi; struct multiboot_mmap *mmap; - struct boot_ctx *efi_ctx; + struct efi_context *efi_ctx; int i, j; mbi = MBOOT_INFO_PTR(hv_hpa); @@ -199,7 +199,7 @@ switch_to_guest_mode(EFI_HANDLE image, EFI_PHYSICAL_ADDRESS hv_hpa) EFI_PHYSICAL_ADDRESS addr; EFI_STATUS err; struct multiboot_info *mbi; - struct boot_ctx *efi_ctx; + struct efi_context *efi_ctx; struct acpi_table_rsdp *rsdp = NULL; int i; EFI_CONFIGURATION_TABLE *config_table; @@ -250,24 +250,24 @@ switch_to_guest_mode(EFI_HANDLE image, EFI_PHYSICAL_ADDRESS hv_hpa) asm volatile ("pushf\n\t" "pop %0\n\t" - : "=r"(efi_ctx->rflags) + : "=r"(efi_ctx->vcpu_regs.rflags) : ); - asm volatile ("movq %%rax, %0" : "=r"(efi_ctx->gprs.rax)); - asm volatile ("movq %%rbx, %0" : "=r"(efi_ctx->gprs.rbx)); - asm volatile ("movq %%rcx, %0" : "=r"(efi_ctx->gprs.rcx)); - asm volatile ("movq %%rdx, %0" : "=r"(efi_ctx->gprs.rdx)); - asm volatile ("movq %%rdi, %0" : "=r"(efi_ctx->gprs.rdi)); - asm volatile ("movq %%rsi, %0" : "=r"(efi_ctx->gprs.rsi)); - asm volatile ("movq %%rsp, %0" : "=r"(efi_ctx->gprs.rsp)); - asm volatile ("movq %%rbp, %0" : "=r"(efi_ctx->gprs.rbp)); - asm volatile ("movq %%r8, %0" : "=r"(efi_ctx->gprs.r8)); - asm volatile ("movq %%r9, %0" : "=r"(efi_ctx->gprs.r9)); - asm volatile ("movq %%r10, %0" : "=r"(efi_ctx->gprs.r10)); - asm volatile ("movq %%r11, %0" : "=r"(efi_ctx->gprs.r11)); - asm volatile ("movq %%r12, %0" : "=r"(efi_ctx->gprs.r12)); - asm volatile ("movq %%r13, %0" : "=r"(efi_ctx->gprs.r13)); - asm volatile ("movq %%r14, %0" : "=r"(efi_ctx->gprs.r14)); - asm volatile ("movq %%r15, %0" : "=r"(efi_ctx->gprs.r15)); + asm volatile ("movq %%rax, %0" : "=r"(efi_ctx->vcpu_regs.gprs.rax)); + asm volatile ("movq %%rbx, %0" : "=r"(efi_ctx->vcpu_regs.gprs.rbx)); + asm volatile ("movq %%rcx, %0" : "=r"(efi_ctx->vcpu_regs.gprs.rcx)); + asm volatile ("movq %%rdx, %0" : "=r"(efi_ctx->vcpu_regs.gprs.rdx)); + asm volatile ("movq %%rdi, %0" : "=r"(efi_ctx->vcpu_regs.gprs.rdi)); + asm volatile ("movq %%rsi, %0" : "=r"(efi_ctx->vcpu_regs.gprs.rsi)); + asm volatile ("movq %%rsp, %0" : "=r"(efi_ctx->vcpu_regs.gprs.rsp)); + asm volatile ("movq %%rbp, %0" : "=r"(efi_ctx->vcpu_regs.gprs.rbp)); + asm volatile ("movq %%r8, %0" : "=r"(efi_ctx->vcpu_regs.gprs.r8)); + asm volatile ("movq %%r9, %0" : "=r"(efi_ctx->vcpu_regs.gprs.r9)); + asm volatile ("movq %%r10, %0" : "=r"(efi_ctx->vcpu_regs.gprs.r10)); + asm volatile ("movq %%r11, %0" : "=r"(efi_ctx->vcpu_regs.gprs.r11)); + asm volatile ("movq %%r12, %0" : "=r"(efi_ctx->vcpu_regs.gprs.r12)); + asm volatile ("movq %%r13, %0" : "=r"(efi_ctx->vcpu_regs.gprs.r13)); + asm volatile ("movq %%r14, %0" : "=r"(efi_ctx->vcpu_regs.gprs.r14)); + asm volatile ("movq %%r15, %0" : "=r"(efi_ctx->vcpu_regs.gprs.r15)); hv_jump(hv_hpa, mbi, efi_ctx); asm volatile (".global guest_entry\n\t" diff --git a/hypervisor/bsp/uefi/efi/boot.h b/hypervisor/bsp/uefi/efi/boot.h index 57e76ce66..761c4b95b 100644 --- a/hypervisor/bsp/uefi/efi/boot.h +++ b/hypervisor/bsp/uefi/efi/boot.h @@ -76,14 +76,14 @@ typedef void(*hv_func)(int, struct multiboot_info*); #define MBOOT_MMAP_NUMS 128 #define MBOOT_MMAP_SIZE (sizeof(struct multiboot_mmap) * MBOOT_MMAP_NUMS) #define MBOOT_INFO_SIZE (sizeof(struct multiboot_info)) -#define BOOT_CTX_SIZE (sizeof(struct boot_ctx)) +#define BOOT_CTX_SIZE (sizeof(struct efi_context)) #define HV_RUNTIME_MEM_SIZE \ (CONFIG_RAM_SIZE + MBOOT_MMAP_SIZE + MBOOT_INFO_SIZE + BOOT_CTX_SIZE) #define MBOOT_MMAP_PTR(addr) \ ((struct multiboot_mmap *)((VOID *)addr + CONFIG_RAM_SIZE)) #define MBOOT_INFO_PTR(addr) ((struct multiboot_info *) \ ((VOID *)addr + CONFIG_RAM_SIZE + MBOOT_MMAP_SIZE)) -#define BOOT_CTX_PTR(addr) ((struct boot_ctx *) \ +#define BOOT_CTX_PTR(addr) ((struct efi_context *) \ ((VOID *)addr + CONFIG_RAM_SIZE + MBOOT_MMAP_SIZE + MBOOT_INFO_SIZE)) diff --git a/hypervisor/bsp/uefi/uefi.c b/hypervisor/bsp/uefi/uefi.c index 318dd080a..e1662fb20 100644 --- a/hypervisor/bsp/uefi/uefi.c +++ b/hypervisor/bsp/uefi/uefi.c @@ -11,7 +11,7 @@ #ifdef CONFIG_EFI_STUB static void efi_init(void); -struct boot_ctx* efi_ctx = NULL; +struct efi_context* efi_ctx = NULL; struct lapic_regs uefi_lapic_regs; static int efi_initialized; @@ -51,9 +51,9 @@ int uefi_sw_loader(struct vm *vm, struct vcpu *vcpu) vlapic_restore(vcpu_vlapic(vcpu), &uefi_lapic_regs); - vcpu->entry_addr = (void *)efi_ctx->rip; + vcpu->entry_addr = (void *)efi_ctx->vcpu_regs.rip; memcpy_s(&cur_context->guest_cpu_regs, sizeof(struct acrn_gp_regs), - &efi_ctx->gprs, sizeof(struct acrn_gp_regs)); + &efi_ctx->vcpu_regs.gprs, sizeof(struct acrn_gp_regs)); /* defer irq enabling till vlapic is ready */ CPU_IRQ_ENABLE(); @@ -87,7 +87,7 @@ static void efi_init(void) if (!(mbi->mi_flags & MULTIBOOT_INFO_HAS_DRIVES)) ASSERT(0, "no multiboot drivers for uefi found"); - efi_ctx = (struct boot_ctx *)hpa2hva((uint64_t)mbi->mi_drives_addr); + efi_ctx = (struct efi_context *)hpa2hva((uint64_t)mbi->mi_drives_addr); ASSERT(efi_ctx != NULL, "no uefi context found"); vm_sw_loader = uefi_sw_loader; diff --git a/hypervisor/include/arch/x86/guest/vm0_boot.h b/hypervisor/include/arch/x86/guest/vm0_boot.h index 636d1fa9f..cad08a168 100644 --- a/hypervisor/include/arch/x86/guest/vm0_boot.h +++ b/hypervisor/include/arch/x86/guest/vm0_boot.h @@ -85,15 +85,13 @@ struct acrn_vcpu_regs { uint16_t reserved_16[4]; }; -struct boot_ctx { - struct acrn_vcpu_regs vcpu_regs; #ifdef CONFIG_EFI_STUB +struct efi_context { + struct acrn_vcpu_regs vcpu_regs; void *rsdp; void *ap_trampoline_buf; -#endif }__attribute__((packed)); -#ifdef CONFIG_EFI_STUB void *get_rsdp_from_uefi(void); void *get_ap_trampoline_buf(void); #endif