VirtualBox

Changeset 14969 in vbox for trunk/src/recompiler_new


Ignore:
Timestamp:
Dec 4, 2008 10:57:17 AM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
40333
Message:

VMM support for completing VA in TLB (not much tested)

Location:
trunk/src/recompiler_new
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/recompiler_new/Makefile.kmk

    r14834 r14969  
    7070#
    7171$(REM_MOD)_DEFS             = IN_REM_R3 REM_INCLUDE_CPU_H
    72 $(REM_MOD)_DEFS            += REM_PHYS_ADDR_IN_TLB
     72#$(REM_MOD)_DEFS            += REM_PHYS_ADDR_IN_TLB
    7373$(REM_MOD)_DEFS            += VBOX_WITH_NEW_RECOMPILER
    7474#$(REM_MOD)_DEFS           += DEBUG_ALL_LOGGING DEBUG_DISAS DEBUG_PCALL DEBUG_EXEC DEBUG_FLUSH DEBUG_IOPORT DEBUG_SIGNAL DEBUG_TLB_CHECK DEBUG_TB_INVALIDATE DEBUG_TLB  # Enables huge amounts of debug logging.
  • trunk/src/recompiler_new/VBoxREMWrapper.cpp

    r14755 r14969  
    718718    { REMPARMDESC_FLAGS_INT,        sizeof(PRTR3PTR), NULL }
    719719};
     720static const REMPARMDESC g_aArgsPGMPhysGCPhys2R3PtrEx[] =
     721{
     722    { REMPARMDESC_FLAGS_INT,        sizeof(PVM), NULL },
     723    { REMPARMDESC_FLAGS_GCPHYS,     sizeof(RTGCPHYS), NULL },
     724    { REMPARMDESC_FLAGS_GCPTR,      sizeof(RTGCPHYS), NULL },
     725    { REMPARMDESC_FLAGS_INT,        sizeof(uint32_t), NULL },
     726    { REMPARMDESC_FLAGS_INT,        sizeof(PRTR3PTR), NULL }
     727};
    720728static const REMPARMDESC g_aArgsPGMPhysGCPtr2R3PtrByGstCR3[] =
    721729{
     
    804812    { REMPARMDESC_FLAGS_INT,        sizeof(void*), NULL },
    805813    { REMPARMDESC_FLAGS_INT,        sizeof(PRTGCPHYS), NULL }
    806 };
    807 static const REMPARMDESC g_aArgsPGMHandlerIsAddressMonitored[] =
    808 {
    809     { REMPARMDESC_FLAGS_INT,        sizeof(PVM), NULL },
    810     { REMPARMDESC_FLAGS_INT,        sizeof(RTHCUINTPTR), NULL }
    811814};
    812815static const REMPARMDESC g_aArgsRTMemRealloc[] =
     
    11491152    { "PGMR3PhysWriteU64",                      (void *)(uintptr_t)&PGMR3PhysWriteU64,              &g_aArgsPGMR3PhysWriteU64[0],               RT_ELEMENTS(g_aArgsPGMR3PhysWriteU32),                 REMFNDESC_FLAGS_RET_VOID,   0,                  NULL },
    11501153    { "PGMR3DbgR3Ptr2GCPhys",                   (void *)(uintptr_t)&PGMR3DbgR3Ptr2GCPhys,              &g_aArgsPGMR3DbgR3Ptr2GCPhys[0],               RT_ELEMENTS(g_aArgsPGMR3DbgR3Ptr2GCPhys),                 REMFNDESC_FLAGS_RET_INT,   sizeof(uint64_t),                  NULL },
    1151     { "PGMHandlerIsAddressMonitored",          (void *)(uintptr_t)&PGMHandlerIsAddressMonitored,              &g_aArgsPGMHandlerIsAddressMonitored[0],               RT_ELEMENTS(g_aArgsPGMHandlerIsAddressMonitored),                 REMFNDESC_FLAGS_RET_INT,   sizeof(bool),                  NULL },
     1154    { "PGMPhysGCPhys2R3PtrEx",          (void *)(uintptr_t)&PGMPhysGCPhys2R3PtrEx,              &g_aArgsPGMPhysGCPhys2R3PtrEx[0],               RT_ELEMENTS(g_aArgsPGMPhysGCPhys2R3PtrEx),                 REMFNDESC_FLAGS_RET_INT,   sizeof(int),                  NULL },
    11521155    { "SSMR3GetGCPtr",                          (void *)(uintptr_t)&SSMR3GetGCPtr,                  &g_aArgsSSMR3GetGCPtr[0],                   RT_ELEMENTS(g_aArgsSSMR3GetGCPtr),                     REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
    11531156    { "SSMR3GetMem",                            (void *)(uintptr_t)&SSMR3GetMem,                    &g_aArgsSSMR3GetMem[0],                     RT_ELEMENTS(g_aArgsSSMR3GetMem),                       REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
  • trunk/src/recompiler_new/VBoxRecompiler.c

    r14962 r14969  
    13901390
    13911391#ifndef REM_PHYS_ADDR_IN_TLB
    1392 void* remR3GCPhys2HCVirt(CPUState *env1, target_ulong physAddr)
     1392void* remR3GCPhys2HCVirt(CPUState *env1, target_ulong physAddr, target_ulong virtAddr)
    13931393{
    13941394    void* rv = NULL;
    13951395    int rc;
    1396 
    1397     rc = PGMPhysGCPhys2R3Ptr(env1->pVM, (RTGCPHYS)physAddr, 1, &rv);
     1396    uint32_t flags = PGMPHYS_TRANSLATION_FLAG_CHECK_PHYS_MONITORED;
     1397   
     1398    if (virtAddr != (target_ulong)-1)
     1399      flags |= PGMPHYS_TRANSLATION_FLAG_CHECK_VIRT_MONITORED;
     1400
     1401    rc = PGMPhysGCPhys2R3PtrEx(env1->pVM, (RTGCPHYS)physAddr, (RTGCPTR)virtAddr,
     1402                               flags, &rv);
     1403
     1404    if (rc == VERR_PGM_PHYS_PAGE_RESERVED)
     1405    {
     1406      return (void*)-1;
     1407    }
    13981408    Assert (RT_SUCCESS(rc));
    13991409
     
    14501460#endif
    14511461}
    1452 
    1453 #ifndef REM_PHYS_ADDR_IN_TLB
    1454 bool remR3IsMonitored(CPUState *env, RTGCPTR GCPtr)
    1455 {
    1456      return PGMHandlerIsAddressMonitored(env->pVM, GCPtr);
    1457 }
    1458 #endif
    14591462
    14601463/**
  • trunk/src/recompiler_new/cpu-all.h

    r14962 r14969  
    272272#ifndef REM_PHYS_ADDR_IN_TLB
    273273target_ulong remR3HCVirt2GCPhys(CPUState *env1, void *addr);
    274 void* remR3GCPhys2HCVirt(CPUState *env1, target_ulong physAddr);
     274void* remR3GCPhys2HCVirt(CPUState *env1, target_ulong physAddr, target_ulong virtAddr);
    275275#endif
    276276
  • trunk/src/recompiler_new/exec-all.h

    r14742 r14969  
    385385#  if !defined(REM_PHYS_ADDR_IN_TLB)
    386386target_ulong remR3HCVirt2GCPhys(CPUState *env1, void *addr);
    387 #if 0
    388 bool         remR3IsVAMonitored(CPUState *env, RTGCPTR GCPtr);
    389 bool         remR3IsPAMonitored(CPUState *env, RTGCPHYS GCPhys);
    390 #else
    391 bool         remR3IsMonitored(CPUState *env, RTGCPTR GCPtr);
    392 #endif
    393387#  endif
    394388# endif
  • trunk/src/recompiler_new/exec.c

    r14346 r14969  
    20222022    start1 = start + (unsigned long)phys_ram_base;
    20232023#else
    2024     start1 = (unsigned long)remR3GCPhys2HCVirt(first_cpu, start);
     2024    start1 = (unsigned long)remR3GCPhys2HCVirt(first_cpu, start, -1);
    20252025#endif
    20262026    for(env = first_cpu; env != NULL; env = env->next_cpu) {
     
    21712171    addend = (unsigned long)phys_ram_base + (pd & TARGET_PAGE_MASK);
    21722172#else
    2173     addend = (unsigned long)remR3GCPhys2HCVirt(env, pd & TARGET_PAGE_MASK);
     2173    addend = (unsigned long)remR3GCPhys2HCVirt(env,
     2174                                               pd & TARGET_PAGE_MASK,
     2175                                               vaddr & TARGET_PAGE_MASK);
    21742176#endif
    21752177    if ((pd & ~TARGET_PAGE_MASK) <= IO_MEM_ROM) {
     
    22042206#ifdef VBOX
    22052207#  if !defined(REM_PHYS_ADDR_IN_TLB)
    2206     if (remR3IsMonitored(env, vaddr & TARGET_PAGE_MASK))
     2208    if (addend == (target_phys_addr_t)-1)
    22072209    {
    22082210         address |= TLB_MMIO;
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette