Exemplo n.º 1
0
static void vmx_vmexit_show_info()
{
   printf("qualification   : 0x%X\n", vm_exit_info.qualification.raw);

   if(vm_exit_info.reason.basic == VMX_VMEXIT_EPT_CONF)
   {
      offset_t  vaddr;
      pg_wlk_t  wlk;
      int       mode;

      vm_get_code_addr(&vaddr, 0, &mode);
      npg_walk(vaddr, &wlk);
   }
   else if(vm_exit_info.reason.basic == VMX_VMEXIT_EPT)
   {
      pg_wlk_t wlk;

      printf("-\n"
             " . glinear      : 0x%X\n"
             " . gphysical    : 0x%X\n"
             ,vm_exit_info.guest_linear.raw
             ,vm_exit_info.guest_physical.raw
         );
      npg_walk(vm_exit_info.guest_physical.raw, &wlk);
   }
   else if(vm_exit_info.reason.basic == VMX_VMEXIT_CR_ACCESS)
   {
      printf("-\n"
             " . cr num       : %d\n"
             " . type         : %d\n"
             " . lmsw op      : %d\n"
             " . gpr          : %d\n"
             " . lmsw data    : 0x%x\n"
             ,vm_exit_info.qualification.cr.nr
             ,vm_exit_info.qualification.cr.type
             ,vm_exit_info.qualification.cr.lmsw_op
             ,vm_exit_info.qualification.cr.gpr
             ,vm_exit_info.qualification.cr.lmsw_data);
   }
   else if(vm_exit_info.reason.basic == VMX_VMEXIT_IO_INSN)
   {
      printf("-\n"
             " . acc sz       : %d byte(s)\n"
             " . direction    : %s\n"
             " . string insn  : %s\n"
             " . rep prefix   : %s\n"
             " . operand      : %s\n"
             " . port         : 0x%x\n"
             ,vm_exit_info.qualification.io.sz+1
             ,vm_exit_info.qualification.io.d?"in":"out"
             ,vm_exit_info.qualification.io.s?"yes":"no"
             ,vm_exit_info.qualification.io.rep?"yes":"no"
             ,vm_exit_info.qualification.io.op?"imm":"dx"
             ,vm_exit_info.qualification.io.port);
   }
   else if(vm_exit_info.reason.basic == VMX_VMEXIT_INVL_G_STATE)
      vmx_vmexit_show_invalid_guest();
}
Exemplo n.º 2
0
/*
** Resolve guest virtual into system physical
**/
int vm_full_walk(offset_t vaddr, offset_t *paddr)
{
   size_t   sz;
   offset_t gp;

   if(vm_pg_walk(vaddr, &gp, &sz))
      return npg_walk(gp, paddr);

   return 0;
}
Exemplo n.º 3
0
static void gdb_vmm_npg_translate(uint8_t *data, size_t len)
{
   offset_t paddr, saddr;

   if(!gdb_get_number(data, len, (uint64_t*)&paddr, 0))
   {
      gdb_nak();
      return;
   }

   debug(GDBSTUB_CMD, "(nested) translating 0x%X\n", paddr);

   if(!npg_walk(paddr, &saddr))
   {
      debug(GDBSTUB, "(nested) memory translation failure\n");
      gdb_err_mem();
      return;
   }

   debug(GDBSTUB_CMD, "sending 0x%X\n", saddr);

   gdb_add_number(saddr, sizeof(uint64_t)*2, 0);
   gdb_send_packet();
}
Exemplo n.º 4
0
static void vmx_vmexit_show_info()
{
   printf("qualification   : 0x%X\n", vm_exit_info.qualification.raw);

   if(vm_exit_info.reason.basic == VMX_VMEXIT_EPT_CONF)
   {
      offset_t vaddr, paddr;
      int      mode;

      vm_get_code_addr(&vaddr, 0, &mode);
      npg_walk(vaddr, &paddr);
   }
   else if(vm_exit_info.reason.basic == VMX_VMEXIT_EPT)
   {
      offset_t paddr;

      printf("-\n"
	     " . glinear      : 0x%X\n"
	     " . gphysical    : 0x%X\n"
	     ,vm_exit_info.guest_linear.raw
	     ,vm_exit_info.guest_physical.raw
	 );
      npg_walk(vm_exit_info.guest_physical.raw, &paddr);
   }
   else if(vm_exit_info.reason.basic == VMX_VMEXIT_CR_ACCESS)
   {
      printf("-\n"
	     " . cr num       : %d\n"
	     " . type         : %d\n"
	     " . lmsw op      : %d\n"
	     " . gpr          : %d\n"
	     " . lmsw data    : 0x%x\n"
	     ,vm_exit_info.qualification.cr.nr
	     ,vm_exit_info.qualification.cr.type
	     ,vm_exit_info.qualification.cr.lmsw_op
	     ,vm_exit_info.qualification.cr.gpr
	     ,vm_exit_info.qualification.cr.lmsw_data);
   }
   else if(vm_exit_info.reason.basic == VMX_VMEXIT_IO_INSN)
   {
      printf("-\n"
	     " . acc sz       : %d byte(s)\n"
	     " . direction    : %s\n"
	     " . string insn  : %s\n"
	     " . rep prefix   : %s\n"
	     " . operand      : %s\n"
	     " . port         : 0x%x\n"
	     ,vm_exit_info.qualification.io.sz+1
	     ,vm_exit_info.qualification.io.d?"in":"out"
	     ,vm_exit_info.qualification.io.s?"yes":"no"
	     ,vm_exit_info.qualification.io.rep?"yes":"no"
	     ,vm_exit_info.qualification.io.op?"imm":"dx"
	     ,vm_exit_info.qualification.io.port);
   }
   else if(vm_exit_info.reason.basic == VMX_VMEXIT_INVL_G_STATE)
   {
      switch(vm_exit_info.qualification.low)
      {
      case 2: printf("page directory register related load failure\n");break;
      case 3: printf("NMI injection failure\n");break;
      case 4: printf("invalid VMCS link pointer\n");break;
      default:printf("(unused) %d\n", vm_exit_info.qualification.low);break;
      }
   }
}