From: Jack Lange Date: Fri, 21 Aug 2009 20:39:41 +0000 (-0500) Subject: minor cleanup to vmxassist context code X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=fd6d48d413ea965d2e0fca5a2480889f9460ec33 minor cleanup to vmxassist context code --- diff --git a/palacios/include/palacios/vmx_assist.h b/palacios/include/palacios/vmx_assist.h index 3f5ec93..b367cd3 100644 --- a/palacios/include/palacios/vmx_assist.h +++ b/palacios/include/palacios/vmx_assist.h @@ -32,14 +32,15 @@ #define VMXASSIST_BASE 0xD0000 #define VMXASSIST_MAGIC 0x17101966 -#define VMXASSIST_MAGIC_OFFSET (VMXASSIST_BASE+8) -#define VMXASSIST_NEW_CONTEXT (VMXASSIST_BASE + 12) -#define VMXASSIST_OLD_CONTEXT (VMXASSIST_NEW_CONTEXT + 4) -#define NR_EXCEPTION_HANDLER 32 -#define NR_INTERRUPT_HANDLERS 16 -#define NR_TRAPS (NR_EXCEPTION_HANDLER+NR_INTERRUPT_HANDLERS) +struct vmx_assist_header { + uint64_t rsvd; // 8 bytes of nothing + uint32_t magic; + uint32_t new_ctx_gpa; + uint32_t old_ctx_gpa; +} __attribute__((packed)); + union vmcs_arbytes { struct arbyte_fields { diff --git a/palacios/src/palacios/vmx_assist.c b/palacios/src/palacios/vmx_assist.c index 8a12fe7..3e7933d 100644 --- a/palacios/src/palacios/vmx_assist.c +++ b/palacios/src/palacios/vmx_assist.c @@ -26,42 +26,32 @@ static int vmx_save_world_ctx(struct guest_info * info, struct vmx_assist_contex static int vmx_restore_world_ctx(struct guest_info * info, struct vmx_assist_context * ctx); int v3_vmxassist_ctx_switch(struct guest_info * info) { - uint32_t vmx_magic = 0; // Magic number to check for vmxassist struct vmx_assist_context * old_ctx = NULL; - struct vmx_assist_context * new_ctx = NULL; - uint32_t old_ctx_gpa = 0; - uint32_t new_ctx_gpa = 0; + struct vmx_assist_context * new_ctx = NULL; + struct vmx_assist_header * hdr = NULL; vmx_state_t state = ((struct vmx_data *)info->vmm_data)->state; - /* Check validity of VMXASSIST_MAGIC field */ - if (read_guest_pa_memory(info, VMXASSIST_MAGIC_OFFSET, sizeof(vmx_magic), (uint8_t *)&vmx_magic) != sizeof(vmx_magic)) { - PrintError("Could not read guest VMXASSIST magic field\n"); + + if (guest_pa_to_host_va(info, VMXASSIST_BASE, (addr_t *)&hdr) == -1) { + PrintError("Could not translate address for vmxassist header\n"); return -1; } - if (vmx_magic != VMXASSIST_MAGIC) { + if (hdr->magic != VMXASSIST_MAGIC) { PrintError("VMXASSIT_MAGIC field is invalid\n"); return -1; } - /* Retrieve the pointer to the Old Context struct */ - if (read_guest_pa_memory(info, VMXASSIST_OLD_CONTEXT, sizeof(old_ctx_gpa), (uint8_t *)&old_ctx_gpa) != sizeof(old_ctx_gpa)) { - PrintError("Could not read Old Context pointer field\n"); + if (guest_pa_to_host_va(info, (addr_t)(hdr->old_ctx_gpa), (addr_t *)&(old_ctx)) == -1) { + PrintError("Could not translate address for VMXASSIST old context\n"); return -1; } - - guest_pa_to_host_va(info, (addr_t)old_ctx_gpa, (addr_t *)&(old_ctx)); - - /* Retrieve the pointer to the New Context struct */ - if (read_guest_pa_memory(info, VMXASSIST_NEW_CONTEXT, sizeof(new_ctx_gpa), (uint8_t *)&new_ctx_gpa) != sizeof(new_ctx_gpa)) { - PrintError("Could not read New Context pointer field\n"); + if (guest_pa_to_host_va(info, (addr_t)(hdr->new_ctx_gpa), (addr_t *)&(new_ctx)) == -1) { + PrintError("Could not translate address for VMXASSIST new context\n"); return -1; } - - guest_pa_to_host_va(info, (addr_t)new_ctx_gpa, (addr_t *)&(new_ctx)); - if (state == VMXASSIST_DISABLED) {