X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fsvm.c;h=296559f59568eb3344db3ced7a6e65e1af915308;hb=570ad6257ed18fbbc840c17a600f12f2dc44b010;hp=954b904f85d1dbda56c0bc5a179f5d6a2ac0087a;hpb=1cf6b8a334fd683681665c177d33ad6c452ad366;p=palacios.git diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index 954b904..296559f 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -10,10 +10,6 @@ #include -/* TEMPORARY BECAUSE SVM IS WEIRD */ -//#include -/* ** */ - extern struct vmm_os_hooks * os_hooks; @@ -142,11 +138,11 @@ int start_svm_guest(struct guest_info *info) { while (1) { - PrintDebug("SVM Launch Args (vmcb=%x), (info=%x), (vm_regs=%x)\n", info->vmm_data, &(info->vm_regs)); - PrintDebug("Launching to RIP: %x\n", info->rip); + //PrintDebug("SVM Launch Args (vmcb=%x), (info=%x), (vm_regs=%x)\n", info->vmm_data, &(info->vm_regs)); + //PrintDebug("Launching to RIP: %x\n", info->rip); safe_svm_launch((vmcb_t*)(info->vmm_data), &(info->vm_regs)); //launch_svm((vmcb_t*)(info->vmm_data)); - PrintDebug("SVM Returned\n"); + //PrintDebug("SVM Returned\n"); if (handle_svm_exit(info) != 0) { // handle exit code.... @@ -180,28 +176,28 @@ void Init_VMCB(vmcb_t * vmcb, struct guest_info vm_info) { //ctrl_area->instrs.instrs.CR0 = 1; - ctrl_area->cr_reads.crs.cr0 = 1; - ctrl_area->cr_writes.crs.cr0 = 1; + ctrl_area->cr_reads.cr0 = 1; + ctrl_area->cr_writes.cr0 = 1; guest_state->efer |= EFER_MSR_svm_enable; guest_state->rflags = 0x00000002; // The reserved bit is always 1 - ctrl_area->svm_instrs.instrs.VMRUN = 1; + ctrl_area->svm_instrs.VMRUN = 1; // guest_state->cr0 = 0x00000001; // PE ctrl_area->guest_ASID = 1; - ctrl_area->exceptions.ex_names.de = 1; - ctrl_area->exceptions.ex_names.df = 1; - ctrl_area->exceptions.ex_names.pf = 1; - ctrl_area->exceptions.ex_names.ts = 1; - ctrl_area->exceptions.ex_names.ss = 1; - ctrl_area->exceptions.ex_names.ac = 1; - ctrl_area->exceptions.ex_names.mc = 1; - ctrl_area->exceptions.ex_names.gp = 1; - ctrl_area->exceptions.ex_names.ud = 1; - ctrl_area->exceptions.ex_names.np = 1; - ctrl_area->exceptions.ex_names.of = 1; - ctrl_area->exceptions.ex_names.nmi = 1; + ctrl_area->exceptions.de = 1; + ctrl_area->exceptions.df = 1; + ctrl_area->exceptions.pf = 1; + ctrl_area->exceptions.ts = 1; + ctrl_area->exceptions.ss = 1; + ctrl_area->exceptions.ac = 1; + ctrl_area->exceptions.mc = 1; + ctrl_area->exceptions.gp = 1; + ctrl_area->exceptions.ud = 1; + ctrl_area->exceptions.np = 1; + ctrl_area->exceptions.of = 1; + ctrl_area->exceptions.nmi = 1; guest_state->cs.selector = 0x0000; guest_state->cs.limit=~0u; @@ -242,10 +238,10 @@ void Init_VMCB(vmcb_t * vmcb, struct guest_info vm_info) { //PrintDebugMemDump((uchar_t*)io_port_bitmap, PAGE_SIZE *2); - ctrl_area->instrs.instrs.IOIO_PROT = 1; + ctrl_area->instrs.IOIO_PROT = 1; } - ctrl_area->instrs.instrs.INTR = 1; + ctrl_area->instrs.INTR = 1; @@ -256,12 +252,12 @@ void Init_VMCB(vmcb_t * vmcb, struct guest_info vm_info) { guest_state->cr3 = vm_info.shdw_pg_state.shadow_cr3.r_reg; - ctrl_area->cr_reads.crs.cr3 = 1; - ctrl_area->cr_writes.crs.cr3 = 1; + ctrl_area->cr_reads.cr3 = 1; + ctrl_area->cr_writes.cr3 = 1; - ctrl_area->instrs.instrs.INVLPG = 1; - ctrl_area->instrs.instrs.INVLPGA = 1; + ctrl_area->instrs.INVLPG = 1; + ctrl_area->instrs.INVLPGA = 1; guest_state->g_pat = 0x7040600070406ULL; @@ -302,32 +298,35 @@ void Init_VMCB_BIOS(vmcb_t * vmcb, struct guest_info vm_info) { guest_state->rip = 0xfff0; //ctrl_area->instrs.instrs.CR0 = 1; - ctrl_area->cr_reads.crs.cr0 = 1; - ctrl_area->cr_writes.crs.cr0 = 1; + ctrl_area->cr_reads.cr0 = 1; + ctrl_area->cr_writes.cr0 = 1; guest_state->efer |= EFER_MSR_svm_enable; guest_state->rflags = 0x00000002; // The reserved bit is always 1 - ctrl_area->svm_instrs.instrs.VMRUN = 1; + ctrl_area->svm_instrs.VMRUN = 1; // guest_state->cr0 = 0x00000001; // PE ctrl_area->guest_ASID = 1; + ctrl_area->exceptions.de = 1; + ctrl_area->exceptions.df = 1; + ctrl_area->exceptions.pf = 1; + ctrl_area->exceptions.ts = 1; + ctrl_area->exceptions.ss = 1; + ctrl_area->exceptions.ac = 1; + ctrl_area->exceptions.mc = 1; + ctrl_area->exceptions.gp = 1; + ctrl_area->exceptions.ud = 1; + ctrl_area->exceptions.np = 1; + ctrl_area->exceptions.of = 1; + ctrl_area->exceptions.nmi = 1; + + vm_info.vm_regs.rdx = 0x00000f00; - ctrl_area->exceptions.ex_names.de = 1; - ctrl_area->exceptions.ex_names.df = 1; - ctrl_area->exceptions.ex_names.pf = 1; - ctrl_area->exceptions.ex_names.ts = 1; - ctrl_area->exceptions.ex_names.ss = 1; - ctrl_area->exceptions.ex_names.ac = 1; - ctrl_area->exceptions.ex_names.mc = 1; - ctrl_area->exceptions.ex_names.gp = 1; - ctrl_area->exceptions.ex_names.ud = 1; - ctrl_area->exceptions.ex_names.np = 1; - ctrl_area->exceptions.ex_names.of = 1; - ctrl_area->exceptions.ex_names.nmi = 1; + guest_state->cr0 = 0x60000010; guest_state->cs.selector = 0xf000; - guest_state->cs.limit=~0u; - guest_state->cs.base = guest_state->cs.selector<<4; + guest_state->cs.limit=0xffff; + guest_state->cs.base = 0x0000000f0000LL; guest_state->cs.attrib.raw = 0xf3; @@ -336,11 +335,28 @@ void Init_VMCB_BIOS(vmcb_t * vmcb, struct guest_info vm_info) { struct vmcb_selector * seg = segregs[i]; seg->selector = 0x0000; - seg->base = seg->selector << 4; + // seg->base = seg->selector << 4; + seg->base = 0x00000000; seg->attrib.raw = 0xf3; seg->limit = ~0u; } + guest_state->gdtr.limit = 0x0000ffff; + guest_state->gdtr.base = 0x0000000000000000LL; + guest_state->idtr.limit = 0x0000ffff; + guest_state->idtr.base = 0x0000000000000000LL; + + guest_state->ldtr.selector = 0x0000; + guest_state->ldtr.limit = 0x0000ffff; + guest_state->ldtr.base = 0x0000000000000000LL; + guest_state->tr.selector = 0x0000; + guest_state->tr.limit = 0x0000ffff; + guest_state->tr.base = 0x0000000000000000LL; + + + guest_state->dr6 = 0x00000000ffff0ff0LL; + guest_state->dr7 = 0x0000000000000400LL; + if (vm_info.io_map.num_ports > 0) { vmm_io_hook_t * iter; addr_t io_port_bitmap; @@ -357,17 +373,17 @@ void Init_VMCB_BIOS(vmcb_t * vmcb, struct guest_info vm_info) { uchar_t * bitmap = (uchar_t *)io_port_bitmap; bitmap += (port / 8); - PrintDebug("Setting Bit in block %x\n", bitmap); + PrintDebug("Setting Bit for port 0x%x\n", port); *bitmap |= 1 << (port % 8); } //PrintDebugMemDump((uchar_t*)io_port_bitmap, PAGE_SIZE *2); - ctrl_area->instrs.instrs.IOIO_PROT = 1; + ctrl_area->instrs.IOIO_PROT = 1; } - ctrl_area->instrs.instrs.INTR = 1; + //ctrl_area->instrs.instrs.INTR = 1; @@ -380,12 +396,12 @@ void Init_VMCB_BIOS(vmcb_t * vmcb, struct guest_info vm_info) { //PrintDebugPageTables((pde32_t*)(vm_info.shdw_pg_state.shadow_cr3.e_reg.low)); - ctrl_area->cr_reads.crs.cr3 = 1; - ctrl_area->cr_writes.crs.cr3 = 1; + ctrl_area->cr_reads.cr3 = 1; + ctrl_area->cr_writes.cr3 = 1; - ctrl_area->instrs.instrs.INVLPG = 1; - ctrl_area->instrs.instrs.INVLPGA = 1; + ctrl_area->instrs.INVLPG = 1; + ctrl_area->instrs.INVLPGA = 1; guest_state->g_pat = 0x7040600070406ULL; @@ -469,7 +485,7 @@ void Init_VMCB_pe(vmcb_t *vmcb, struct guest_info vm_info) { guest_state->efer |= EFER_MSR_svm_enable; guest_state->rflags = 0x00000002; // The reserved bit is always 1 - ctrl_area->svm_instrs.instrs.VMRUN = 1; + ctrl_area->svm_instrs.VMRUN = 1; guest_state->cr0 = 0x00000001; // PE ctrl_area->guest_ASID = 1; @@ -480,24 +496,24 @@ void Init_VMCB_pe(vmcb_t *vmcb, struct guest_info vm_info) { // Setup exits - ctrl_area->cr_writes.crs.cr4 = 1; + ctrl_area->cr_writes.cr4 = 1; - ctrl_area->exceptions.ex_names.de = 1; - ctrl_area->exceptions.ex_names.df = 1; - ctrl_area->exceptions.ex_names.pf = 1; - ctrl_area->exceptions.ex_names.ts = 1; - ctrl_area->exceptions.ex_names.ss = 1; - ctrl_area->exceptions.ex_names.ac = 1; - ctrl_area->exceptions.ex_names.mc = 1; - ctrl_area->exceptions.ex_names.gp = 1; - ctrl_area->exceptions.ex_names.ud = 1; - ctrl_area->exceptions.ex_names.np = 1; - ctrl_area->exceptions.ex_names.of = 1; - ctrl_area->exceptions.ex_names.nmi = 1; + ctrl_area->exceptions.de = 1; + ctrl_area->exceptions.df = 1; + ctrl_area->exceptions.pf = 1; + ctrl_area->exceptions.ts = 1; + ctrl_area->exceptions.ss = 1; + ctrl_area->exceptions.ac = 1; + ctrl_area->exceptions.mc = 1; + ctrl_area->exceptions.gp = 1; + ctrl_area->exceptions.ud = 1; + ctrl_area->exceptions.np = 1; + ctrl_area->exceptions.of = 1; + ctrl_area->exceptions.nmi = 1; - ctrl_area->instrs.instrs.IOIO_PROT = 1; + ctrl_area->instrs.IOIO_PROT = 1; ctrl_area->IOPM_BASE_PA = (uint_t)os_hooks->allocate_pages(3); { @@ -506,7 +522,7 @@ void Init_VMCB_pe(vmcb_t *vmcb, struct guest_info vm_info) { memset((void*)(tmp_reg.e_reg.low), 0xffffffff, PAGE_SIZE * 2); } - ctrl_area->instrs.instrs.INTR = 1; + ctrl_area->instrs.INTR = 1; { @@ -612,18 +628,18 @@ void Init_VMCB_Real(vmcb_t * vmcb, struct guest_info vm_info) { guest_state->cr0 = 0x60000010; - ctrl_area->exceptions.ex_names.de = 1; - ctrl_area->exceptions.ex_names.df = 1; - ctrl_area->exceptions.ex_names.pf = 1; - ctrl_area->exceptions.ex_names.ts = 1; - ctrl_area->exceptions.ex_names.ss = 1; - ctrl_area->exceptions.ex_names.ac = 1; - ctrl_area->exceptions.ex_names.mc = 1; - ctrl_area->exceptions.ex_names.gp = 1; - ctrl_area->exceptions.ex_names.ud = 1; - ctrl_area->exceptions.ex_names.np = 1; - ctrl_area->exceptions.ex_names.of = 1; - ctrl_area->exceptions.ex_names.nmi = 1; + ctrl_area->exceptions.de = 1; + ctrl_area->exceptions.df = 1; + ctrl_area->exceptions.pf = 1; + ctrl_area->exceptions.ts = 1; + ctrl_area->exceptions.ss = 1; + ctrl_area->exceptions.ac = 1; + ctrl_area->exceptions.mc = 1; + ctrl_area->exceptions.gp = 1; + ctrl_area->exceptions.ud = 1; + ctrl_area->exceptions.np = 1; + ctrl_area->exceptions.of = 1; + ctrl_area->exceptions.nmi = 1; guest_state->cs.selector = 0xf000; guest_state->cs.limit=0xffff;