X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmx_io.c;fp=palacios%2Fsrc%2Fpalacios%2Fvmx_io.c;h=bfe1703615eddaae35ba58d4eea5ed9cc433dbab;hb=52a58bb7bdf06ca22ad6883f8095f8aa5ca4b8a4;hp=0000000000000000000000000000000000000000;hpb=a24a1722328a575cec8dd8578902fd0f68c72c1c;p=palacios.git diff --git a/palacios/src/palacios/vmx_io.c b/palacios/src/palacios/vmx_io.c new file mode 100644 index 0000000..bfe1703 --- /dev/null +++ b/palacios/src/palacios/vmx_io.c @@ -0,0 +1,89 @@ + +#include +#include +#include +#include +#include + +/* Same as SVM */ +static int update_map(struct guest_info * info, uint16_t port, int hook_read, int hook_write) +{ + uchar_t * bitmap = (uint8_t *)(info->io_map.arch_data); + int major = port / 8; + int minor = port % 8; + + if ((hook_read == 0) && (hook_write == 0)) { + *(bitmap + major) &= ~(0x1 << minor); + } else { + *(bitmap + major) |= (0x1 << minor); + } + + return 0; +} + +int v3_init_vmx_io_map(struct guest_info * info) +{ + info->io_map.update_map = update_map; + + info->io_map.arch_data = V3_VAddr(V3_AllocPages(2)); + memset(info->io_map.arch_data, 0, PAGE_SIZE_4KB*2); + + return 0; +} + +int v3_handle_vmx_io_in(struct guest_info * info) +{ + PrintDebug("IN not implemented\n"); + return -1; +} + +int v3_handle_vmx_io_ins(struct guest_info * info) +{ + PrintDebug("INS not implemented\n"); + return -1; +} + +int v3_handle_vmx_io_out(struct guest_info * info) +{ + ulong_t exit_qual; + + vmcs_read(VMCS_EXIT_QUAL, &exit_qual); + + struct vmcs_io_qual * io_qual = (struct vmcs_io_qual *)&exit_qual; + + struct v3_io_hook * hook = v3_get_io_hook(info, io_qual->port); + + if(hook == NULL) { + PrintError("Hook not present for out on port %x\n", io_qual->port); + return -1; + } + + int write_size = 1<<(io_qual->accessSize); + + PrintDebug("OUT of %d bytes on port %d (0x%x)\n", write_size, io_qual->port, io_qual->port); + + if(hook->write(io_qual->port, &(info->vm_regs.rax), write_size, hook->priv_data) != write_size) { + PrintError("Write failure for out on port %x\n",io_qual->port); + return -1; + } + + uint32_t instr_length; + + vmcs_read(VMCS_EXIT_INSTR_LEN, &instr_length); + + info->rip += instr_length; + + return 0; +} + +int v3_handle_vmx_io_outs(struct guest_info * info) +{ + ulong_t exit_qual; + + vmcs_read(VMCS_EXIT_QUAL, &exit_qual); + + struct vmcs_io_qual * io_qual = (struct vmcs_io_qual *)&exit_qual; + + PrintDebug("OUTS on port %d, (0x%x)\n", io_qual->port, io_qual->port); + return -1; +}