Example #1
0
int dbg_hard_stp_event()
{
   offset_t  addr;
   int       mode;
   dbg_evt_t *evt;

   if(!dbg_hard_stp_enabled())
      return CTRL_EVT_IGNORE;

   debug(DBG_HARD_STP, "sstep event\n");

   if(dbg_soft_resuming())
      dbg_soft_resume_post(&__hstp_ctx.cr3);

   dbg_hard_set_dr6_dirty(1);
   dbg_hard_stp_disable();

   if(dbg_hard_stp_requestor() == DBG_REQ_VMM)
   {
      debug(DBG_HARD_STP, "internal sstep event\n");
      return CTRL_EVT_INTERN;
   }

   vm_get_code_addr(&addr, 0, &mode);

   evt = &info->vmm.ctrl.dbg.evt;
   evt->type = DBG_EVT_TYPE_HARD_SSTEP;
   evt->addr = addr;

   debug(DBG_HARD_STP, "prepared sstep ctrl event for 0x%X\n", evt->addr);
   return CTRL_EVT_DONE;
}
Example #2
0
int dbg_hard_stp_event()
{
   offset_t  addr;
   int       mode;
   dbg_evt_t *evt;

   if(!dbg_hard_stp_enabled())
      return VM_IGNORE;

   debug(DBG_HARD_STP, "sstep event [req %s]\n"
	 ,dbg_hard_stp_requestor()?"vmm":"usr");

   if(dbg_soft_resuming())
      dbg_soft_resume_post();

   dbg_hard_stp_disable();

   if(dbg_hard_stp_requestor() == DBG_REQ_VMM)
   {
      dbg_hard_dr6_clean();
      return VM_INTERN;
   }

   dbg_hard_set_dr6_dirty(1);
   vm_get_code_addr(&addr, 0, &mode);

   evt = &info->vmm.ctrl.dbg.evt;
   evt->type = DBG_EVT_TYPE_HARD_SSTEP;
   evt->addr = addr;

   debug(DBG_HARD_STP, "prepared sstep ctrl event for 0x%X\n", evt->addr);
   return VM_DONE;
}
Example #3
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();
}
Example #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;
      }
   }
}