X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmcb.c;h=a2eae49acd5b8388b8ee2a544f55e08485ccb662;hb=a2b7cc4f2d739213d1edefb85ff941c41c86907b;hp=4c31432cdf7f6ef6ab5de5c99486c21c695f1648;hpb=fc90c3287f85c66e1f6616685b66a8339145c3ee;p=palacios.releases.git diff --git a/palacios/src/palacios/vmcb.c b/palacios/src/palacios/vmcb.c index 4c31432..a2eae49 100644 --- a/palacios/src/palacios/vmcb.c +++ b/palacios/src/palacios/vmcb.c @@ -1,8 +1,90 @@ +/* + * This file is part of the Palacios Virtual Machine Monitor developed + * by the V3VEE Project with funding from the United States National + * Science Foundation and the Department of Energy. + * + * The V3VEE Project is a joint project between Northwestern University + * and the University of New Mexico. You can find out more at + * http://www.v3vee.org + * + * Copyright (c) 2008, Jack Lange + * Copyright (c) 2008, The V3VEE Project + * All rights reserved. + * + * Author: Jack Lange + * + * This is free software. You are permitted to use, + * redistribute, and modify it as specified in the file "V3VEE_LICENSE". + */ + #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; @@ -118,8 +200,12 @@ 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;