X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmcb.c;h=b92c37100964be6206c967505141fb09ba3bc2cb;hb=f9bb3db89469169bb5775dc031d89e570c6fed70;hp=3933fc1b137e33343a7bc859a81f9336ad1c6512;hpb=a109eb919a162bd7de58d62020801bc2e633be50;p=palacios.git diff --git a/palacios/src/palacios/vmcb.c b/palacios/src/palacios/vmcb.c index 3933fc1..b92c371 100644 --- a/palacios/src/palacios/vmcb.c +++ b/palacios/src/palacios/vmcb.c @@ -1,8 +1,74 @@ +/* Northwestern University */ +/* (c) 2008, Jack Lange */ + #include #include #include + +void set_vmcb_segment(struct vmcb_selector * vmcb_seg, struct v3_segment * seg) { + vmcb_seg->selector = seg->selector; + vmcb_seg->limit = seg->limit; + vmcb_seg->base = seg->base; + vmcb_seg->attrib.fields.type = seg->type; + vmcb_seg->attrib.fields.S = seg->system; + vmcb_seg->attrib.fields.dpl = seg->dpl; + vmcb_seg->attrib.fields.P = seg->present; + vmcb_seg->attrib.fields.avl = seg->avail; + vmcb_seg->attrib.fields.L = seg->long_mode; + vmcb_seg->attrib.fields.db = seg->db; + vmcb_seg->attrib.fields.G = seg->granularity; +} + + +void get_vmcb_segment(struct vmcb_selector * vmcb_seg, struct v3_segment * seg) { + seg->selector = vmcb_seg->selector; + seg->limit = vmcb_seg->limit; + seg->base = vmcb_seg->base; + seg->type = vmcb_seg->attrib.fields.type; + seg->system = vmcb_seg->attrib.fields.S; + seg->dpl = vmcb_seg->attrib.fields.dpl; + seg->present = vmcb_seg->attrib.fields.P; + seg->avail = vmcb_seg->attrib.fields.avl; + seg->long_mode = vmcb_seg->attrib.fields.L; + seg->db = vmcb_seg->attrib.fields.db; + seg->granularity = vmcb_seg->attrib.fields.G; +} + + +void set_vmcb_segments(vmcb_t * vmcb, struct v3_segments * segs) { + vmcb_saved_state_t * guest_area = GET_VMCB_SAVE_STATE_AREA(vmcb); + + set_vmcb_segment(&(guest_area->cs), &(segs->cs)); + set_vmcb_segment(&(guest_area->ds), &(segs->ds)); + set_vmcb_segment(&(guest_area->es), &(segs->es)); + set_vmcb_segment(&(guest_area->fs), &(segs->fs)); + set_vmcb_segment(&(guest_area->gs), &(segs->gs)); + set_vmcb_segment(&(guest_area->ss), &(segs->ss)); + set_vmcb_segment(&(guest_area->ldtr), &(segs->ldtr)); + set_vmcb_segment(&(guest_area->gdtr), &(segs->gdtr)); + set_vmcb_segment(&(guest_area->idtr), &(segs->idtr)); + set_vmcb_segment(&(guest_area->tr), &(segs->tr)); +} + + +void get_vmcb_segments(vmcb_t * vmcb, struct v3_segments * segs) { + vmcb_saved_state_t * guest_area = GET_VMCB_SAVE_STATE_AREA(vmcb); + + get_vmcb_segment(&(guest_area->cs), &(segs->cs)); + get_vmcb_segment(&(guest_area->ds), &(segs->ds)); + get_vmcb_segment(&(guest_area->es), &(segs->es)); + get_vmcb_segment(&(guest_area->fs), &(segs->fs)); + get_vmcb_segment(&(guest_area->gs), &(segs->gs)); + get_vmcb_segment(&(guest_area->ss), &(segs->ss)); + get_vmcb_segment(&(guest_area->ldtr), &(segs->ldtr)); + get_vmcb_segment(&(guest_area->gdtr), &(segs->gdtr)); + get_vmcb_segment(&(guest_area->idtr), &(segs->idtr)); + get_vmcb_segment(&(guest_area->tr), &(segs->tr)); +} + + void PrintDebugVMCB(vmcb_t * vmcb) { reg_ex_t tmp_reg; @@ -12,80 +78,80 @@ void PrintDebugVMCB(vmcb_t * vmcb) { PrintDebug("VMCB (0x%.8x)\n", vmcb); PrintDebug("--Control Area--\n"); - PrintDebug("CR Reads: %x\n", ctrl_area->cr_reads.bitmap); - PrintDebug("CR Writes: %x\n", ctrl_area->cr_writes.bitmap); - PrintDebug("DR Reads: %x\n", ctrl_area->dr_reads.bitmap); - PrintDebug("DR Writes: %x\n", ctrl_area->dr_writes.bitmap); - - PrintDebug("Exception Bitmap: %x (at 0x%.8x)\n", ctrl_area->exceptions.bitmap, &(ctrl_area->exceptions)); - PrintDebug("\tDivide-by-Zero: %d\n", ctrl_area->exceptions.ex_names.de); - PrintDebug("\tDebug: %d\n", ctrl_area->exceptions.ex_names.db); - PrintDebug("\tNon-maskable interrupts: %d\n", ctrl_area->exceptions.ex_names.nmi); - PrintDebug("\tBreakpoint: %d\n", ctrl_area->exceptions.ex_names.bp); - PrintDebug("\tOverflow: %d\n", ctrl_area->exceptions.ex_names.of); - PrintDebug("\tBound-Range: %d\n", ctrl_area->exceptions.ex_names.br); - PrintDebug("\tInvalid Opcode: %d\n", ctrl_area->exceptions.ex_names.ud); - PrintDebug("\tDevice not available: %d\n", ctrl_area->exceptions.ex_names.nm); - PrintDebug("\tDouble Fault: %d\n", ctrl_area->exceptions.ex_names.df); - PrintDebug("\tInvalid TSS: %d\n", ctrl_area->exceptions.ex_names.ts); - PrintDebug("\tSegment not present: %d\n", ctrl_area->exceptions.ex_names.np); - PrintDebug("\tStack: %d\n", ctrl_area->exceptions.ex_names.ss); - PrintDebug("\tGPF: %d\n", ctrl_area->exceptions.ex_names.gp); - PrintDebug("\tPage Fault: %d\n", ctrl_area->exceptions.ex_names.pf); - PrintDebug("\tFloating Point: %d\n", ctrl_area->exceptions.ex_names.mf); - PrintDebug("\tAlignment Check: %d\n", ctrl_area->exceptions.ex_names.ac); - PrintDebug("\tMachine Check: %d\n", ctrl_area->exceptions.ex_names.mc); - PrintDebug("\tSIMD floating point: %d\n", ctrl_area->exceptions.ex_names.xf); - PrintDebug("\tSecurity: %d\n", ctrl_area->exceptions.ex_names.sx); - - PrintDebug("Instructions bitmap: %.8x (at 0x%.8x)\n", ctrl_area->instrs.bitmap, &(ctrl_area->instrs)); - PrintDebug("\tINTR: %d\n", ctrl_area->instrs.instrs.INTR); - PrintDebug("\tNMI: %d\n", ctrl_area->instrs.instrs.NMI); - PrintDebug("\tSMI: %d\n", ctrl_area->instrs.instrs.SMI); - PrintDebug("\tINIT: %d\n", ctrl_area->instrs.instrs.INIT); - PrintDebug("\tVINTR: %d\n", ctrl_area->instrs.instrs.VINTR); - PrintDebug("\tCR0: %d\n", ctrl_area->instrs.instrs.CR0); - PrintDebug("\tRD_IDTR: %d\n", ctrl_area->instrs.instrs.RD_IDTR); - PrintDebug("\tRD_GDTR: %d\n", ctrl_area->instrs.instrs.RD_GDTR); - PrintDebug("\tRD_LDTR: %d\n", ctrl_area->instrs.instrs.RD_LDTR); - PrintDebug("\tRD_TR: %d\n", ctrl_area->instrs.instrs.RD_TR); - PrintDebug("\tWR_IDTR: %d\n", ctrl_area->instrs.instrs.WR_IDTR); - PrintDebug("\tWR_GDTR: %d\n", ctrl_area->instrs.instrs.WR_GDTR); - PrintDebug("\tWR_LDTR: %d\n", ctrl_area->instrs.instrs.WR_LDTR); - PrintDebug("\tWR_TR: %d\n", ctrl_area->instrs.instrs.WR_TR); - PrintDebug("\tRDTSC: %d\n", ctrl_area->instrs.instrs.RDTSC); - PrintDebug("\tRDPMC: %d\n", ctrl_area->instrs.instrs.RDPMC); - PrintDebug("\tPUSHF: %d\n", ctrl_area->instrs.instrs.PUSHF); - PrintDebug("\tPOPF: %d\n", ctrl_area->instrs.instrs.POPF); - PrintDebug("\tCPUID: %d\n", ctrl_area->instrs.instrs.CPUID); - PrintDebug("\tRSM: %d\n", ctrl_area->instrs.instrs.RSM); - PrintDebug("\tIRET: %d\n", ctrl_area->instrs.instrs.IRET); - PrintDebug("\tINTn: %d\n", ctrl_area->instrs.instrs.INTn); - PrintDebug("\tINVD: %d\n", ctrl_area->instrs.instrs.INVD); - PrintDebug("\tPAUSE: %d\n", ctrl_area->instrs.instrs.PAUSE); - PrintDebug("\tHLT: %d\n", ctrl_area->instrs.instrs.HLT); - PrintDebug("\tINVLPG: %d\n", ctrl_area->instrs.instrs.INVLPG); - PrintDebug("\tINVLPGA: %d\n", ctrl_area->instrs.instrs.INVLPGA); - PrintDebug("\tIOIO_PROT: %d\n", ctrl_area->instrs.instrs.IOIO_PROT); - PrintDebug("\tMSR_PROT: %d\n", ctrl_area->instrs.instrs.MSR_PROT); - PrintDebug("\ttask_switch: %d\n", ctrl_area->instrs.instrs.task_switch); - PrintDebug("\tFERR_FREEZE: %d\n", ctrl_area->instrs.instrs.FERR_FREEZE); - PrintDebug("\tshutdown_evts: %d\n", ctrl_area->instrs.instrs.shutdown_evts); - - PrintDebug("SVM Instruction Bitmap: %.8x (at 0x%.8x)\n", ctrl_area->svm_instrs.bitmap, &(ctrl_area->svm_instrs)); - PrintDebug("\tVMRUN: %d\n", ctrl_area->svm_instrs.instrs.VMRUN); - PrintDebug("\tVMMCALL: %d\n", ctrl_area->svm_instrs.instrs.VMMCALL); - PrintDebug("\tVMLOAD: %d\n", ctrl_area->svm_instrs.instrs.VMLOAD); - PrintDebug("\tVMSAVE: %d\n", ctrl_area->svm_instrs.instrs.VMSAVE); - PrintDebug("\tSTGI: %d\n", ctrl_area->svm_instrs.instrs.STGI); - PrintDebug("\tCLGI: %d\n", ctrl_area->svm_instrs.instrs.CLGI); - PrintDebug("\tSKINIT: %d\n", ctrl_area->svm_instrs.instrs.SKINIT); - PrintDebug("\tRDTSCP: %d\n", ctrl_area->svm_instrs.instrs.RDTSCP); - PrintDebug("\tICEBP: %d\n", ctrl_area->svm_instrs.instrs.ICEBP); - PrintDebug("\tWBINVD: %d\n", ctrl_area->svm_instrs.instrs.WBINVD); - PrintDebug("\tMONITOR: %d\n", ctrl_area->svm_instrs.instrs.MONITOR); - PrintDebug("\tMWAIT_always: %d\n", ctrl_area->svm_instrs.instrs.MWAIT_always); - PrintDebug("\tMWAIT_if_armed: %d\n", ctrl_area->svm_instrs.instrs.MWAIT_if_armed); + PrintDebug("CR Reads: %x\n", *(ushort_t*)&(ctrl_area->cr_reads)); + PrintDebug("CR Writes: %x\n", *(ushort_t*)&(ctrl_area->cr_writes)); + PrintDebug("DR Reads: %x\n", *(ushort_t*)&(ctrl_area->dr_reads)); + PrintDebug("DR Writes: %x\n", *(ushort_t*)&(ctrl_area->dr_writes)); + + PrintDebug("Exception Bitmap: %x (at 0x%.8x)\n", *(uint_t*)&(ctrl_area->exceptions), &(ctrl_area->exceptions)); + PrintDebug("\tDivide-by-Zero: %d\n", ctrl_area->exceptions.de); + PrintDebug("\tDebug: %d\n", ctrl_area->exceptions.db); + PrintDebug("\tNon-maskable interrupts: %d\n", ctrl_area->exceptions.nmi); + PrintDebug("\tBreakpoint: %d\n", ctrl_area->exceptions.bp); + PrintDebug("\tOverflow: %d\n", ctrl_area->exceptions.of); + PrintDebug("\tBound-Range: %d\n", ctrl_area->exceptions.br); + PrintDebug("\tInvalid Opcode: %d\n", ctrl_area->exceptions.ud); + PrintDebug("\tDevice not available: %d\n", ctrl_area->exceptions.nm); + PrintDebug("\tDouble Fault: %d\n", ctrl_area->exceptions.df); + PrintDebug("\tInvalid TSS: %d\n", ctrl_area->exceptions.ts); + PrintDebug("\tSegment not present: %d\n", ctrl_area->exceptions.np); + PrintDebug("\tStack: %d\n", ctrl_area->exceptions.ss); + PrintDebug("\tGPF: %d\n", ctrl_area->exceptions.gp); + PrintDebug("\tPage Fault: %d\n", ctrl_area->exceptions.pf); + PrintDebug("\tFloating Point: %d\n", ctrl_area->exceptions.mf); + PrintDebug("\tAlignment Check: %d\n", ctrl_area->exceptions.ac); + PrintDebug("\tMachine Check: %d\n", ctrl_area->exceptions.mc); + PrintDebug("\tSIMD floating point: %d\n", ctrl_area->exceptions.xf); + PrintDebug("\tSecurity: %d\n", ctrl_area->exceptions.sx); + + PrintDebug("Instructions bitmap: %.8x (at 0x%.8x)\n", *(uint_t*)&(ctrl_area->instrs), &(ctrl_area->instrs)); + PrintDebug("\tINTR: %d\n", ctrl_area->instrs.INTR); + PrintDebug("\tNMI: %d\n", ctrl_area->instrs.NMI); + PrintDebug("\tSMI: %d\n", ctrl_area->instrs.SMI); + PrintDebug("\tINIT: %d\n", ctrl_area->instrs.INIT); + PrintDebug("\tVINTR: %d\n", ctrl_area->instrs.VINTR); + PrintDebug("\tCR0: %d\n", ctrl_area->instrs.CR0); + PrintDebug("\tRD_IDTR: %d\n", ctrl_area->instrs.RD_IDTR); + PrintDebug("\tRD_GDTR: %d\n", ctrl_area->instrs.RD_GDTR); + PrintDebug("\tRD_LDTR: %d\n", ctrl_area->instrs.RD_LDTR); + PrintDebug("\tRD_TR: %d\n", ctrl_area->instrs.RD_TR); + PrintDebug("\tWR_IDTR: %d\n", ctrl_area->instrs.WR_IDTR); + PrintDebug("\tWR_GDTR: %d\n", ctrl_area->instrs.WR_GDTR); + PrintDebug("\tWR_LDTR: %d\n", ctrl_area->instrs.WR_LDTR); + PrintDebug("\tWR_TR: %d\n", ctrl_area->instrs.WR_TR); + PrintDebug("\tRDTSC: %d\n", ctrl_area->instrs.RDTSC); + PrintDebug("\tRDPMC: %d\n", ctrl_area->instrs.RDPMC); + PrintDebug("\tPUSHF: %d\n", ctrl_area->instrs.PUSHF); + PrintDebug("\tPOPF: %d\n", ctrl_area->instrs.POPF); + PrintDebug("\tCPUID: %d\n", ctrl_area->instrs.CPUID); + PrintDebug("\tRSM: %d\n", ctrl_area->instrs.RSM); + PrintDebug("\tIRET: %d\n", ctrl_area->instrs.IRET); + PrintDebug("\tINTn: %d\n", ctrl_area->instrs.INTn); + PrintDebug("\tINVD: %d\n", ctrl_area->instrs.INVD); + PrintDebug("\tPAUSE: %d\n", ctrl_area->instrs.PAUSE); + PrintDebug("\tHLT: %d\n", ctrl_area->instrs.HLT); + PrintDebug("\tINVLPG: %d\n", ctrl_area->instrs.INVLPG); + PrintDebug("\tINVLPGA: %d\n", ctrl_area->instrs.INVLPGA); + PrintDebug("\tIOIO_PROT: %d\n", ctrl_area->instrs.IOIO_PROT); + PrintDebug("\tMSR_PROT: %d\n", ctrl_area->instrs.MSR_PROT); + PrintDebug("\ttask_switch: %d\n", ctrl_area->instrs.task_switch); + PrintDebug("\tFERR_FREEZE: %d\n", ctrl_area->instrs.FERR_FREEZE); + PrintDebug("\tshutdown_evts: %d\n", ctrl_area->instrs.shutdown_evts); + + PrintDebug("SVM Instruction Bitmap: %.8x (at 0x%.8x)\n", *(uint_t*)&(ctrl_area->svm_instrs), &(ctrl_area->svm_instrs)); + PrintDebug("\tVMRUN: %d\n", ctrl_area->svm_instrs.VMRUN); + PrintDebug("\tVMMCALL: %d\n", ctrl_area->svm_instrs.VMMCALL); + PrintDebug("\tVMLOAD: %d\n", ctrl_area->svm_instrs.VMLOAD); + PrintDebug("\tVMSAVE: %d\n", ctrl_area->svm_instrs.VMSAVE); + PrintDebug("\tSTGI: %d\n", ctrl_area->svm_instrs.STGI); + PrintDebug("\tCLGI: %d\n", ctrl_area->svm_instrs.CLGI); + PrintDebug("\tSKINIT: %d\n", ctrl_area->svm_instrs.SKINIT); + PrintDebug("\tRDTSCP: %d\n", ctrl_area->svm_instrs.RDTSCP); + PrintDebug("\tICEBP: %d\n", ctrl_area->svm_instrs.ICEBP); + PrintDebug("\tWBINVD: %d\n", ctrl_area->svm_instrs.WBINVD); + PrintDebug("\tMONITOR: %d\n", ctrl_area->svm_instrs.MONITOR); + PrintDebug("\tMWAIT_always: %d\n", ctrl_area->svm_instrs.MWAIT_always); + PrintDebug("\tMWAIT_if_armed: %d\n", ctrl_area->svm_instrs.MWAIT_if_armed); @@ -100,13 +166,13 @@ void PrintDebugVMCB(vmcb_t * vmcb) { PrintDebug("TLB_CONTROL: %d\n", ctrl_area->TLB_CONTROL); - PrintDebug("Guest Control Bitmap: %x (at 0x%.8x)\n", ctrl_area->guest_ctrl.bitmap, &(ctrl_area->guest_ctrl)); - PrintDebug("\tV_TPR: %d\n", ctrl_area->guest_ctrl.ctrls.V_TPR); - PrintDebug("\tV_IRQ: %d\n", ctrl_area->guest_ctrl.ctrls.V_IRQ); - PrintDebug("\tV_INTR_PRIO: %d\n", ctrl_area->guest_ctrl.ctrls.V_INTR_PRIO); - PrintDebug("\tV_IGN_TPR: %d\n", ctrl_area->guest_ctrl.ctrls.V_IGN_TPR); - PrintDebug("\tV_INTR_MASKING: %d\n", ctrl_area->guest_ctrl.ctrls.V_INTR_MASKING); - PrintDebug("\tV_INTR_VECTOR: %d\n", ctrl_area->guest_ctrl.ctrls.V_INTR_VECTOR); + PrintDebug("Guest Control Bitmap: %x (at 0x%.8x)\n", *(uint_t*)&(ctrl_area->guest_ctrl), &(ctrl_area->guest_ctrl)); + PrintDebug("\tV_TPR: %d\n", ctrl_area->guest_ctrl.V_TPR); + PrintDebug("\tV_IRQ: %d\n", ctrl_area->guest_ctrl.V_IRQ); + PrintDebug("\tV_INTR_PRIO: %d\n", ctrl_area->guest_ctrl.V_INTR_PRIO); + PrintDebug("\tV_IGN_TPR: %d\n", ctrl_area->guest_ctrl.V_IGN_TPR); + PrintDebug("\tV_INTR_MASKING: %d\n", ctrl_area->guest_ctrl.V_INTR_MASKING); + PrintDebug("\tV_INTR_VECTOR: %d\n", ctrl_area->guest_ctrl.V_INTR_VECTOR); PrintDebug("Interrupt_shadow: %d\n", ctrl_area->interrupt_shadow); @@ -118,15 +184,22 @@ void PrintDebugVMCB(vmcb_t * vmcb) { tmp_reg.r_reg = ctrl_area->exit_info2; PrintDebug("exit_info2: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low); - tmp_reg.r_reg = ctrl_area->exit_int_info; - PrintDebug("exit_int_info: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low); + + PrintDebug("Exit Int Info: (at 0x%.8x)\n", &(ctrl_area->exit_int_info)); + PrintDebug("Vector: %d\n", ctrl_area->exit_int_info.vector); + PrintDebug("(type=%d) (ev=%d) (valid=%d)\n", ctrl_area->exit_int_info.type, + ctrl_area->exit_int_info.ev, ctrl_area->exit_int_info.valid); + PrintDebug("Error Code: %d\n", ctrl_area->exit_int_info.error_code); tmp_reg.r_reg = ctrl_area->NP_ENABLE; PrintDebug("NP_ENABLE: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low); - tmp_reg.r_reg = ctrl_area->EVENTINJ; - PrintDebug("EVENTINJ: hi: 0x%.8x, lo: 0x%.8x\n", tmp_reg.e_reg.high, tmp_reg.e_reg.low); + PrintDebug("Event Injection: (at 0x%.8x)\n", &(ctrl_area->EVENTINJ)); + PrintDebug("Vector: %d\n", ctrl_area->EVENTINJ.vector); + PrintDebug("(type=%d) (ev=%d) (valid=%d)\n", ctrl_area->EVENTINJ.type, + ctrl_area->EVENTINJ.ev, ctrl_area->EVENTINJ.valid); + PrintDebug("Error Code: %d\n", ctrl_area->EVENTINJ.error_code); tmp_reg.r_reg = ctrl_area->N_CR3;