コード例 #1
0
ファイル: gdbstub_vmm.c プロジェクト: my33love/ramooflax
static void gdb_vmm_translate(uint8_t *data, size_t len)
{
   offset_t vaddr, paddr;
   size_t   psz, sz;

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

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

   if(!__paging())
      paddr = vaddr;
   else if(!__pg_walk(info->vmm.ctrl.active_cr3, vaddr, &paddr, &psz, 1))
   {
      debug(GDBSTUB, "memory translation failure\n");
      gdb_err_mem();
      return;
   }

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

   if(cpu_addr_sz() == 64)
      sz = sizeof(uint64_t)*2;
   else /* XXX: gdb seems to wait for 32 bits regs at least */
      sz = sizeof(uint32_t)*2;

   gdb_add_number(paddr, sz, 0);
   gdb_send_packet();
}
コード例 #2
0
ファイル: vm.c プロジェクト: Debug-Orz/ramooflax
int __vm_access_mem(vm_access_t *access)
{
   offset_t vaddr, nxt;
   size_t   psz, len;

   if(!access->len)
      return 1;

   if(!__paging())
      return access->operator(access);

   vaddr = access->addr;
   len   = access->len;

   while(len)
   {
      if(!__pg_walk(access->cr3, vaddr, &access->addr, &psz, 1))
      {
	 debug(VM_ACCESS, "#PF on vm access 0x%X sz 0x%X\n", vaddr, len);
	 return 0;
      }

      nxt = __align_next(vaddr, psz);
      access->len = min(len, (nxt - vaddr));

      if(!access->operator(access))
	 return 0;

      len  -= access->len;
      vaddr = nxt;
   }

   return 1;
}
コード例 #3
0
ファイル: vm.c プロジェクト: Debug-Orz/ramooflax
/*
** Resolve guest virtual into guest physical
*/
int vm_pg_walk(offset_t vaddr, offset_t *paddr, size_t *psz)
{
   if(!__paging())
   {
      debug(VM, "walk while paging disabled !\n");
      return 0;
   }

   return __pg_walk(&__cr3, vaddr, paddr, psz, 1);
}