X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvmcb.c;h=a2eae49acd5b8388b8ee2a544f55e08485ccb662;hb=452885dcf15a56694ba283a079877ac38b545b0f;hp=f317088f1d79708ec70ddb4d5ae65f6284c1acfe;hpb=d0be182a2424036db4bc179bc512ea7e5b0bd62f;p=palacios.releases.git diff --git a/palacios/src/palacios/vmcb.c b/palacios/src/palacios/vmcb.c index f317088..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;