From: Jack Lange Date: Wed, 9 Dec 2009 23:50:32 +0000 (-0600) Subject: removed vmcs accesses from io handler X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=5c5dfe422e57ac9833dd3ed3a7d0f5c39557b86c removed vmcs accesses from io handler --- diff --git a/palacios/include/palacios/vmx_io.h b/palacios/include/palacios/vmx_io.h index 3c2ebbd..b0b105f 100644 --- a/palacios/include/palacios/vmx_io.h +++ b/palacios/include/palacios/vmx_io.h @@ -21,14 +21,16 @@ #ifdef __V3VEE__ -#include + +struct vmx_exit_info; +struct guest_info; int v3_init_vmx_io_map(struct guest_info * info); -int v3_handle_vmx_io_in(struct guest_info * info); -int v3_handle_vmx_io_ins(struct guest_info * info); -int v3_handle_vmx_io_out(struct guest_info * info); -int v3_handle_vmx_io_outs(struct guest_info * info); +int v3_handle_vmx_io_in(struct guest_info * info, struct vmx_exit_info * exit_info); +int v3_handle_vmx_io_ins(struct guest_info * info, struct vmx_exit_info * exit_info); +int v3_handle_vmx_io_out(struct guest_info * info, struct vmx_exit_info * exit_info); +int v3_handle_vmx_io_outs(struct guest_info * info, struct vmx_exit_info * exit_info); #endif diff --git a/palacios/src/palacios/vmx_handler.c b/palacios/src/palacios/vmx_handler.c index 3fa4f98..1da8a58 100644 --- a/palacios/src/palacios/vmx_handler.c +++ b/palacios/src/palacios/vmx_handler.c @@ -133,24 +133,24 @@ int v3_handle_vmx_exit(struct guest_info * info, struct vmx_exit_info * exit_inf if (io_qual->dir == 0) { if (io_qual->string) { - if (v3_handle_vmx_io_outs(info) == -1) { + if (v3_handle_vmx_io_outs(info, exit_info) == -1) { PrintError("Error in outs IO handler\n"); return -1; } } else { - if (v3_handle_vmx_io_out(info) == -1) { + if (v3_handle_vmx_io_out(info, exit_info) == -1) { PrintError("Error in out IO handler\n"); return -1; } } } else { if (io_qual->string) { - if(v3_handle_vmx_io_ins(info) == -1) { + if(v3_handle_vmx_io_ins(info, exit_info) == -1) { PrintError("Error in ins IO handler\n"); return -1; } } else { - if (v3_handle_vmx_io_in(info) == -1) { + if (v3_handle_vmx_io_in(info, exit_info) == -1) { PrintError("Error in in IO handler\n"); return -1; } diff --git a/palacios/src/palacios/vmx_io.c b/palacios/src/palacios/vmx_io.c index fb9af1a..309d2cf 100644 --- a/palacios/src/palacios/vmx_io.c +++ b/palacios/src/palacios/vmx_io.c @@ -19,8 +19,6 @@ #include #include -#include -#include #include #include #include @@ -59,14 +57,12 @@ int v3_init_vmx_io_map(struct guest_info * info) { return 0; } -int v3_handle_vmx_io_in(struct guest_info * info) { - struct vmx_exit_io_qual io_qual; +int v3_handle_vmx_io_in(struct guest_info * info, struct vmx_exit_info * exit_info) { + struct vmx_exit_io_qual io_qual = *(struct vmx_exit_io_qual *)&(exit_info->exit_qual);; struct v3_io_hook * hook = NULL; int read_size = 0; - uint32_t instr_length = 0; - io_qual.value = 0; - vmcs_read(VMCS_EXIT_QUAL, &(io_qual.value)); + hook = v3_get_io_hook(info, io_qual.port); if (hook == NULL) { @@ -83,29 +79,22 @@ int v3_handle_vmx_io_in(struct guest_info * info) { return -1; } - if (vmcs_read(VMCS_EXIT_INSTR_LEN, &instr_length) != VMX_SUCCESS) { - PrintError("Could not read instruction length\n"); - return -1; - } - info->rip += instr_length; + info->rip += exit_info->instr_len; return 0; } -int v3_handle_vmx_io_ins(struct guest_info * info) { - struct vmx_exit_io_qual io_qual; +int v3_handle_vmx_io_ins(struct guest_info * info, struct vmx_exit_info * exit_info) { + struct vmx_exit_io_qual io_qual = *(struct vmx_exit_io_qual *)&(exit_info->exit_qual);; struct v3_io_hook * hook = NULL; int read_size = 0; - addr_t guest_va = 0; + addr_t guest_va = exit_info->guest_linear_addr; addr_t host_addr = 0; int rdi_change = 0; ulong_t rep_num = 1; struct rflags * flags = (struct rflags *)&(info->ctrl_regs.rflags); - int instr_len = 0; - io_qual.value = 0; - vmcs_read(VMCS_EXIT_QUAL, &(io_qual.value)); hook = v3_get_io_hook(info, io_qual.port); if (hook == NULL) { @@ -118,10 +107,7 @@ int v3_handle_vmx_io_ins(struct guest_info * info) { read_size = io_qual.access_size + 1; if (io_qual.rep) { - struct vmx_exit_io_instr_info instr_info; - - instr_info.value = 0; - vmcs_read(VMCS_EXIT_INSTR_INFO, &instr_info.value); + struct vmx_exit_io_instr_info instr_info = *(struct vmx_exit_io_instr_info *)&(exit_info->instr_info); if (instr_info.addr_size == 0) { rep_num = info->vm_regs.rcx & 0xffff; @@ -143,7 +129,7 @@ int v3_handle_vmx_io_ins(struct guest_info * info) { PrintDebug("INS size=%d for %ld steps\n", read_size, rep_num); - vmcs_read(VMCS_GUEST_LINEAR_ADDR, &guest_va); + if (guest_va_to_host_va(info, guest_va, &host_addr) == -1) { PrintError("Could not convert Guest VA to host VA\n"); @@ -166,21 +152,18 @@ int v3_handle_vmx_io_ins(struct guest_info * info) { } while (--rep_num > 0); - vmcs_read(VMCS_EXIT_INSTR_LEN, &instr_len); - info->rip += instr_len; + info->rip += exit_info->instr_len; return 0; } -int v3_handle_vmx_io_out(struct guest_info * info) { - struct vmx_exit_io_qual io_qual; +int v3_handle_vmx_io_out(struct guest_info * info, struct vmx_exit_info * exit_info) { + struct vmx_exit_io_qual io_qual = *(struct vmx_exit_io_qual *)&(exit_info->exit_qual); struct v3_io_hook * hook = NULL; int write_size = 0; - uint32_t instr_length = 0; - vmcs_read(VMCS_EXIT_QUAL, &(io_qual.value)); hook = v3_get_io_hook(info, io_qual.port); if (hook == NULL) { @@ -198,30 +181,24 @@ int v3_handle_vmx_io_out(struct guest_info * info) { } - if (vmcs_read(VMCS_EXIT_INSTR_LEN, &instr_length) != VMX_SUCCESS) { - PrintError("Could not read instruction length\n"); - return -1; - } - info->rip += instr_length; + info->rip += exit_info->instr_len; return 0; } -int v3_handle_vmx_io_outs(struct guest_info * info) { - struct vmx_exit_io_qual io_qual; +int v3_handle_vmx_io_outs(struct guest_info * info, struct vmx_exit_info * exit_info) { + struct vmx_exit_io_qual io_qual = *(struct vmx_exit_io_qual *)&(exit_info->exit_qual); struct v3_io_hook * hook = NULL; int write_size; - addr_t guest_va; + addr_t guest_va = exit_info->guest_linear_addr; addr_t host_addr; int rsi_change; ulong_t rep_num = 1; struct rflags * flags = (struct rflags *)&(info->ctrl_regs.rflags); - int instr_len = 0; - vmcs_read(VMCS_EXIT_QUAL, &(io_qual.value)); hook = v3_get_io_hook(info, io_qual.port); if (hook == NULL) { @@ -235,10 +212,7 @@ int v3_handle_vmx_io_outs(struct guest_info * info) { if (io_qual.rep) { // Grab the address sized bits of rcx - struct vmx_exit_io_instr_info instr_info; - - instr_info.value = 0; - vmcs_read(VMCS_EXIT_INSTR_INFO, &instr_info.value); + struct vmx_exit_io_instr_info instr_info = *(struct vmx_exit_io_instr_info *)&(exit_info->instr_info); if (instr_info.addr_size == 0) { rep_num = info->vm_regs.rcx & 0xffff; @@ -258,7 +232,7 @@ int v3_handle_vmx_io_outs(struct guest_info * info) { rsi_change = write_size; } - vmcs_read(VMCS_GUEST_LINEAR_ADDR, &guest_va); + PrintDebug("OUTS size=%d for %ld steps\n", write_size, rep_num); @@ -283,8 +257,7 @@ int v3_handle_vmx_io_outs(struct guest_info * info) { } while (--rep_num > 0); - vmcs_read(VMCS_EXIT_INSTR_LEN, &instr_len); - info->rip += instr_len; + info->rip += exit_info->instr_len; return 0; }