From ba2bb9f107fd2e74ee46a32086d3cfb661b37079 Mon Sep 17 00:00:00 2001 From: Diego Ongaro Date: Sun, 19 Oct 2008 11:22:33 -0500 Subject: [PATCH] set efer in guest to get past vmrun exit code -1 --- sys/kern/kern_fkvm.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/sys/kern/kern_fkvm.c b/sys/kern/kern_fkvm.c index e90a9617996..f9643f3c70f 100644 --- a/sys/kern/kern_fkvm.c +++ b/sys/kern/kern_fkvm.c @@ -129,16 +129,14 @@ vmrun_assert(struct vmcb *vmcb) { #define A(cond) do { if ((cond)) { printf("Error: assertion not met on line %d\n", __LINE__); bad = 1; } } while (0) - u_int64_t efer; int bad; bad = 0; - efer = rdmsr(MSR_EFER); // The following are illegal: //EFER.SVME is zero. - A((efer & 0x0000000000001000) == 0); + A((vmcb->save.efer & 0x0000000000001000) == 0); // CR0.CD is zero and CR0.NW is set A( ((vmcb->save.cr0 & 0x0000000040000000) == 0) && @@ -160,24 +158,24 @@ vmrun_assert(struct vmcb *vmcb) A((vmcb->save.dr7 & 0xFFFFFFFF00000000) == 0xFFFFFFFF00000000); // EFER[63:15] are not zero. - A((efer & 0xFFFFFFFFFFFF8000) == 0xFFFFFFFFFFF8000); + A((vmcb->save.efer & 0xFFFFFFFFFFFF8000) == 0xFFFFFFFFFFF8000); // EFER.LMA or EFER.LME is non-zero and this processor does not support long mode. - //// A((efer & 0x0000000000000500) != 0); + //// A((vmcb->save.efer & 0x0000000000000500) != 0); // EFER.LME and CR0.PG are both set and CR4.PAE is zero. - A( ((efer & 0x0000000000000100) != 0) && + A( ((vmcb->save.efer & 0x0000000000000100) != 0) && ((vmcb->save.cr0 & 0x0000000080000000) != 0) && ((vmcb->save.cr4 & 0x0000000000000020) != 0)); // EFER.LME and CR0.PG are both non-zero and CR0.PE is zero. - A( ((efer & 0x0000000000000100) != 0) && + A( ((vmcb->save.efer & 0x0000000000000100) != 0) && ((vmcb->save.cr0 & 0x0000000080000000) != 0) && ((vmcb->save.cr0 & 0x0000000000000001) == 0)); // EFER.LME, CR0.PG, CR4.PAE, CS.L, and CS.D are all non-zero. // cs.attrib = concat 55-52 and 47-40 (p372 v2) - A( ((efer & 0x0000000000000100) != 0) && + A( ((vmcb->save.efer & 0x0000000000000100) != 0) && ((vmcb->save.cr0 & 0x0000000080000000) != 0) && ((vmcb->save.cr4 & 0x0000000000000020) != 0) && ((vmcb->save.cs.attrib & 0x0200) != 0) && @@ -603,9 +601,26 @@ fkvm_vmcb_init(struct vmcb *vmcb) control->guest_asid = 1; control->tlb_control = VMCB_TLB_CONTROL_FLUSH_ALL; + /* let v_tpr default to 0 */ + /* let v_irq default to 0 */ + /* let v_intr default to 0 */ + control->v_intr_masking = 1; + + /* let v_intr_vector default to 0 */ + /* let intr_shadow default to 0 */ + /* let exit_code, exit_info_1, exit_info_2, exit_int_info, + exit_int_info_err_code default to 0 */ + control->nested_ctl = 1; + /* let event_inj default to 0 */ + + // (nested_cr3 is later) + + /* let lbr_virt_enable default to 0 */ + + fkvm_init_seg(&save->es); fkvm_init_seg(&save->ss); fkvm_init_seg(&save->ds); @@ -635,6 +650,8 @@ fkvm_vmcb_init(struct vmcb *vmcb) //save->rflags = 2; /* It seems like bit 1 is reserved. This line makes no sense. */ save->rip = 0x0000fff0; + save->efer = 0x0000000000001000; + control->nested_cr3 = fkvm_make_vm_map(); printf("ncr3: %" PRIx64 "\n", control->nested_cr3); -- 2.11.4.GIT