#include <palacios/vm_guest.h>
#include <palacios/vmm_ctrl_regs.h>
#include <palacios/vmm.h>
+#include <palacios/vmm_decoder.h>
#include <palacios/vmcb.h>
-v3_vm_cpu_mode_t v3_get_cpu_mode(struct guest_info * info) {
+v3_cpu_mode_t v3_get_vm_cpu_mode(struct guest_info * info) {
struct cr0_32 * cr0;
+ struct efer_64 * efer;
struct cr4_32 * cr4 = (struct cr4_32 *)&(info->ctrl_regs.cr4);
- struct efer_64 * efer = (struct efer_64 *)&(info->guest_efer);
struct v3_segment * cs = &(info->segments.cs);
+ vmcb_saved_state_t * guest_state = GET_VMCB_SAVE_STATE_AREA((vmcb_t*)(info->vmm_data));
if (info->shdw_pg_mode == SHADOW_PAGING) {
cr0 = (struct cr0_32 *)&(info->shdw_pg_state.guest_cr0);
+ efer = (struct efer_64 *)&(info->shdw_pg_state.guest_efer);
} else if (info->shdw_pg_mode == NESTED_PAGING) {
cr0 = (struct cr0_32 *)&(info->ctrl_regs.cr0);
+ efer = (struct efer_64 *)&(guest_state->efer);
} else {
PrintError("Invalid Paging Mode...\n");
V3_ASSERT(0);
uint_t v3_get_addr_width(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->guest_efer);
+ struct efer_64 * efer;
struct v3_segment * cs = &(info->segments.cs);
+ vmcb_saved_state_t * guest_state = GET_VMCB_SAVE_STATE_AREA((vmcb_t*)(info->vmm_data));
if (info->shdw_pg_mode == SHADOW_PAGING) {
cr0 = (struct cr0_32 *)&(info->shdw_pg_state.guest_cr0);
+ efer = (struct efer_64 *)&(info->shdw_pg_state.guest_efer);
} else if (info->shdw_pg_mode == NESTED_PAGING) {
cr0 = (struct cr0_32 *)&(info->ctrl_regs.cr0);
+ efer = (struct efer_64 *)&(guest_state->efer);
} else {
PrintError("Invalid Paging Mode...\n");
V3_ASSERT(0);
static const uchar_t LONG_32_COMPAT_STR[] = "32bit Compat";
static const uchar_t LONG_16_COMPAT_STR[] = "16bit Compat";
-const uchar_t * v3_cpu_mode_to_str(v3_vm_cpu_mode_t mode) {
+const uchar_t * v3_cpu_mode_to_str(v3_cpu_mode_t mode) {
switch (mode) {
case REAL:
return REAL_STR;
}
}
-v3_vm_mem_mode_t v3_get_mem_mode(struct guest_info * info) {
+v3_mem_mode_t v3_get_vm_mem_mode(struct guest_info * info) {
struct cr0_32 * cr0;
if (info->shdw_pg_mode == SHADOW_PAGING) {
static const uchar_t PHYS_MEM_STR[] = "Physical Memory";
static const uchar_t VIRT_MEM_STR[] = "Virtual Memory";
-const uchar_t * v3_mem_mode_to_str(v3_vm_mem_mode_t mode) {
+const uchar_t * v3_mem_mode_to_str(v3_mem_mode_t mode) {
switch (mode) {
case PHYSICAL_MEM:
return PHYS_MEM_STR;
char * reg_names[] = {"CR0", "CR2", "CR3", "CR4", "CR8", "FLAGS", NULL};
vmcb_saved_state_t * guest_state = GET_VMCB_SAVE_STATE_AREA(info->vmm_data);
- reg_ptr= (v3_reg_t *)regs;
+ reg_ptr = (v3_reg_t *)regs;
PrintDebug("32 bit Ctrl Regs:\n");
}
+void v3_print_guest_state(struct guest_info * info) {
+ addr_t linear_addr = 0;
+
+ PrintDebug("RIP: %p\n", (void *)(addr_t)(info->rip));
+ linear_addr = get_addr_linear(info, info->rip, &(info->segments.cs));
+ PrintDebug("RIP Linear: %p\n", (void *)linear_addr);
+
+ v3_print_segments(info);
+ v3_print_ctrl_regs(info);
+
+ if (info->shdw_pg_mode == SHADOW_PAGING) {
+ PrintDebug("Shadow Paging Guest Registers:\n");
+ PrintDebug("\tGuest CR0=%p\n", (void *)(addr_t)(info->shdw_pg_state.guest_cr0));
+ PrintDebug("\tGuest CR3=%p\n", (void *)(addr_t)(info->shdw_pg_state.guest_cr3));
+ PrintDebug("\tGuest EFER=%p\n", (void *)(addr_t)(info->shdw_pg_state.guest_efer.value));
+ // CR4
+ }
+ v3_print_GPRs(info);
+}
+
+
#ifdef __V3_32BIT__
+
void v3_print_GPRs(struct guest_info * info) {
struct v3_gprs * regs = &(info->vm_regs);
int i = 0;
PrintDebug("\t%s=0x%p\n", reg_names[i], (void *)(addr_t)reg_ptr[i]);
}
}
+
#elif __V3_64BIT__
+
void v3_print_GPRs(struct guest_info * info) {
struct v3_gprs * regs = &(info->vm_regs);
int i = 0;
}
}
-
-
#endif