Ejemplo n.º 1
0
void check_boot_parameters()
{
    UINT64* regs = *g_guest_regs_save_area;
    UINT64 rdi_reg= regs[4];
    UINT64 rsi_reg= regs[5];
    UINT64  ept;
    UINT64  real;
    UINT64  virt;
    UINT64  value;

    bprint("rdi on entry: %llx, rsi: %llx\n", rdi_reg, rsi_reg);
    boot_params_t* boot_params= (boot_params_t*) rdi_reg;
    //HexDump((UINT8*)rdi_reg, (UINT8*)rdi_reg+32);
    //bprint("cmd line ptr: %p\n", boot_params->hdr.cmd_line_ptr);
    //bprint("code32_start: %p\n", boot_params->hdr.code32_start);
    bprint("loadflags: %02x\n", boot_params->hdr.loadflags);

    vmx_vmread(0x201a, &ept);
    virt= rdi_reg;
    real= getphysical(ept, virt);
    bprint("virt: %016llx, real: %016llx\n", virt, real);
    virt= (UINT64) &(boot_params->hdr.loadflags);
    real= getphysical(ept, virt);
    bprint("virt: %016llx, real: %016llx\n", virt, real);

    vmx_vmread(0x681e, &value);  // guest_rip
    virt =value;
    real= getphysical(ept, virt);
    bprint("virt: %016llx, real: %016llx\n", virt, real);
    virt =value+10;
    real= getphysical(ept, virt);
    bprint("virt: %016llx, real: %016llx\n", virt, real);
}
Ejemplo n.º 2
0
/*
** VMX insn operates on 64 bits in long mode
** so we ensure allocation
*/
void __regparm__(2) __vmcs_force_read(raw64_t *val, vmcs_field_enc_t enc)
{
   raw64_t tmp;

   if(!enc.fake)
   {
      vmx_insn_err_t vmx_err;

      if(!vmx_vmread(&vmx_err, &tmp.raw, enc.raw))
	 panic("vmread(0x%x) err %d\n", enc.raw, vmx_err.raw);

      switch(enc.fwidth)
      {
      case VMCS_FIELD_ENC_FIELD_WIDTH_16: val->raw = tmp.wlow; break;
      case VMCS_FIELD_ENC_FIELD_WIDTH_32: val->raw = tmp.low;  break;
      default:                            val->raw = tmp.raw;  break;
      }

      return;
   }

   if(val == (raw64_t*)&vm_state.cr2)
      vm_state.cr2.raw = get_cr2();
   else if(val == (raw64_t*)&vm_state.dr6)
      vm_state.dr6.raw = get_dr6();
}
Ejemplo n.º 3
0
/*
** VMX insn operates on 64 bits in long mode
** so we ensure allocation
*/
void __regparm__(2) __vmcs_force_read(raw64_t *val, vmcs_field_enc_t enc)
{
   raw64_t tmp;

   if(!enc.fake)
   {
      vmx_insn_err_t vmx_err;

      if(!vmx_vmread(&vmx_err, &tmp.raw, enc.raw))
         panic("vmread(0x%x) err %d\n", enc.raw, vmx_err.raw);

      switch(enc.fwidth)
      {
      case VMCS_FIELD_ENC_FIELD_WIDTH_16: val->wlow = tmp.wlow; break;
      case VMCS_FIELD_ENC_FIELD_WIDTH_32: val->low  = tmp.low;  break;
      default:                            val->raw  = tmp.raw;  break;
      }

      /*
      ** don't use debug, since some fields might have not been read
      */
#ifdef CONFIG_VMX_ACC_DBG
      printf("vmread(0x%x) = 0x%X\n", enc.raw, tmp.raw);
#endif
      return;
   }

   if(val == (raw64_t*)&vm_state.cr2)
      vm_state.cr2.raw = get_cr2();
   else if(val == (raw64_t*)&vm_state.dr6)
      vm_state.dr6.raw = get_dr6();
}
Ejemplo n.º 4
0
void fixupvmcs()
{
    UINT64  value;
    void loop_forever();

#ifdef JLMDEBUG
    UINT16* loop= (UINT16*)loop_forever;
    bprint("fixupvmcs %04x\n\n", *loop);
#endif
    vmx_vmread(0x681e, &value);  // guest_rip
#ifdef JLMDEBUG
    check_boot_parameters();
#endif
    //bprint("Code at %p\n", value);
    //HexDump((UINT8*)value, (UINT8*)value+32);
     //*(UINT16*) (value+0x8)= *loop;  // feeb
     //*(UINT16*) (value+0xa)= *loop;  // feeb
     //*(UINT16*) (value+0x10)= *loop;  // feeb
     //*(UINT16*) (value+0x16)= *loop;  // feeb

    // vmx_vmread(0x4000, &value);  // vmx_pin_controls
    // vmx_vmwrite(0x4000, value);  // vmx_pin_controls

    // vmx_vmread(0x4002, &value);  // vmx_cpu_controls
    // vmx_vmwrite(0x4002, value);  // vmx_cpu_controls

    // vmx_vmread(0x401e, &value);  // vmx_secondary_controls
    // vmx_vmwrite(0x401e, value);  // vmx_secondary_controls

    // vmx_vmread(0x4012, &value);  // vmx_entry_controls
    // vmx_vmwrite(0x4012, value);  // vmx_entry_controls

    // vmx_vmread(0x4002, &value);  // vmx_exit_controls
    // vmx_vmwrite(0x4002, value);  // vmx_exit_controls

    vmm_vmcs_guest_state_read((UINT64*) t_vmcs_save_area);
    vmm_print_vmcs_region((UINT64*) t_vmcs_save_area);
}