X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvm_guest.c;h=3572ee5775540ffed7dc2de7177aa122b29b8869;hb=75d9c52b3ee8673c9f358b7815d2026da5319ca7;hp=f920d1bc8a8b3be5ea63d90e0d69f564086f4270;hpb=8ee31494ea28d1756689574fb69791746daac3f3;p=palacios.releases.git diff --git a/palacios/src/palacios/vm_guest.c b/palacios/src/palacios/vm_guest.c index f920d1b..3572ee5 100644 --- a/palacios/src/palacios/vm_guest.c +++ b/palacios/src/palacios/vm_guest.c @@ -1,6 +1,63 @@ +/* (c) 2008, Jack Lange */ +/* (c) 2008, The V3VEE Project */ + #include +#include #include + +vm_cpu_mode_t get_cpu_mode(struct guest_info * info) { + struct cr0_32 * cr0; + struct cr4_32 * cr4 = (struct cr4_32 *)&(info->ctrl_regs.cr4); + struct efer_64 * efer = (struct efer_64 *)&(info->ctrl_regs.efer); + struct v3_segment * cs = &(info->segments.cs); + + if (info->shdw_pg_mode == SHADOW_PAGING) { + cr0 = (struct cr0_32 *)&(info->shdw_pg_state.guest_cr0); + } else if (info->shdw_pg_mode == NESTED_PAGING) { + cr0 = (struct cr0_32 *)&(info->ctrl_regs.cr0); + } else { + PrintError("Invalid Paging Mode...\n"); + V3_ASSERT(0); + return -1; + } + + if (cr0->pe == 0) { + return REAL; + } else if ((cr4->pae == 0) && (efer->lma == 0)) { + return PROTECTED; + } else if (efer->lma == 0) { + return PROTECTED_PAE; + } else if ((efer->lma == 1) && (cs->long_mode == 1)) { + return LONG; + } else { + return LONG_32_COMPAT; + } +} + +vm_mem_mode_t get_mem_mode(struct guest_info * info) { + struct cr0_32 * cr0; + + if (info->shdw_pg_mode == SHADOW_PAGING) { + cr0 = (struct cr0_32 *)&(info->shdw_pg_state.guest_cr0); + } else if (info->shdw_pg_mode == NESTED_PAGING) { + cr0 = (struct cr0_32 *)&(info->ctrl_regs.cr0); + } else { + PrintError("Invalid Paging Mode...\n"); + V3_ASSERT(0); + return -1; + } + + + + if (cr0->pg == 0) { + return PHYSICAL_MEM; + } else { + return VIRTUAL_MEM; + } +} + + void PrintV3Segments(struct guest_info * info) { struct v3_segments * segs = &(info->segments); int i = 0;