VirtualBox

vbox的更動 17274 路徑 trunk/src/recompiler_new


忽略:
時間撮記:
2009-3-3 下午01:16:06 (16 年 以前)
作者:
vboxsync
訊息:

REM: fixed #3525 - avoid using HVA -> GPA PGM function, store GPA in REM TLB instead

位置:
trunk/src/recompiler_new
檔案:
修改 6 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/recompiler_new/VBoxRecompiler.c

    r17251 r17274  
    50725072{
    50735073}
    5074 
  • trunk/src/recompiler_new/cpu-defs.h

    r13559 r17274  
    11/*
    22 * common defines for all CPUs
    3  * 
     3 *
    44 * Copyright (c) 2003 Fabrice Bellard
    55 *
     
    4141#endif
    4242
    43 #ifndef TARGET_PHYS_ADDR_BITS 
     43#ifndef TARGET_PHYS_ADDR_BITS
    4444#if TARGET_LONG_BITS >= HOST_LONG_BITS
    4545#define TARGET_PHYS_ADDR_BITS TARGET_LONG_BITS
     
    8686#define HOST_LONG_SIZE (HOST_LONG_BITS / 8)
    8787
    88 #define EXCP_INTERRUPT  0x10000 /* async interruption */
     88#define EXCP_INTERRUPT  0x10000 /* async interruption */
    8989#define EXCP_HLT        0x10001 /* hlt instruction reached */
    9090#define EXCP_DEBUG      0x10002 /* cpu stopped after a breakpoint or singlestep */
     
    126126       bit 2..0                   : zero
    127127    */
    128     target_ulong addr_read; 
    129     target_ulong addr_write; 
    130     target_ulong addr_code; 
     128    target_ulong addr_read;
     129    target_ulong addr_write;
     130    target_ulong addr_code;
    131131      /* Addend to virtual address to get physical address.  IO accesses
    132132       use the correcponding iotlb value.  */
     
    138138#endif
    139139    /* padding to get a power of two size */
    140     uint8_t dummy[(1 << CPU_TLB_ENTRY_BITS) - 
    141                   (sizeof(target_ulong) * 3 + 
    142                    ((-sizeof(target_ulong) * 3) & (sizeof(target_phys_addr_t) - 1)) + 
     140    uint8_t dummy[(1 << CPU_TLB_ENTRY_BITS) -
     141                  (sizeof(target_ulong) * 3 +
     142                   ((-sizeof(target_ulong) * 3) & (sizeof(target_phys_addr_t) - 1)) +
    143143                   sizeof(target_phys_addr_t))];
    144144} CPUTLBEntry;
     
    174174    CPUTLBEntry tlb_table[NB_MMU_MODES][CPU_TLB_SIZE];                  \
    175175    target_phys_addr_t iotlb[NB_MMU_MODES][CPU_TLB_SIZE];               \
     176    /** addends for HVA -> GPA translations */                          \
     177    VBOX_ONLY(target_phys_addr_t   phys_addends[NB_MMU_MODES][CPU_TLB_SIZE]); \
    176178    struct TranslationBlock *tb_jmp_cache[TB_JMP_CACHE_SIZE];           \
    177179    /* buffer for temporaries in the code generator */                  \
     
    213215    void *opaque;                                                       \
    214216                                                                        \
    215     const char *cpu_model_str;                                         
    216 
    217 #endif
     217    const char *cpu_model_str;
     218
     219#endif
  • trunk/src/recompiler_new/exec-all.h

    r16339 r17274  
    418418    return addr + env1->tlb_table[mmu_idx][page_index].addend;
    419419# elif defined(VBOX)
    420     return remR3HCVirt2GCPhys(env1, (void *)(uintptr_t)(addr + env1->tlb_table[mmu_idx][page_index].addend));
     420    Assert(env1->phys_addends[mmu_idx][page_index] != -1);
     421    /** @todo: nike: will remove this assert along with remR3HCVirt2GCPhys() soon */
     422    Assert(remR3HCVirt2GCPhys(env1, (void *)(uintptr_t)(addr + env1->tlb_table[mmu_idx][page_index].addend)) == addr + env1->phys_addends[mmu_idx][page_index]);
     423    return addr + env1->phys_addends[mmu_idx][page_index];
    421424# else
    422425    return addr + env1->tlb_table[mmu_idx][page_index].addend - (unsigned long)phys_ram_base;
  • trunk/src/recompiler_new/exec.c

    r15761 r17274  
    18491849{
    18501850    int i;
    1851 
    18521851#if defined(DEBUG_TLB)
    18531852    printf("tlb_flush:\n");
     
    18641863        env->tlb_table[1][i].addr_write = -1;
    18651864        env->tlb_table[1][i].addr_code = -1;
     1865#if defined(VBOX) && !defined(REM_PHYS_ADDR_IN_TLB)
     1866        env->phys_addends[0][i] = -1;
     1867        env->phys_addends[1][i] = -1;
     1868#endif
    18661869#if (NB_MMU_MODES >= 3)
    18671870        env->tlb_table[2][i].addr_read = -1;
    18681871        env->tlb_table[2][i].addr_write = -1;
    18691872        env->tlb_table[2][i].addr_code = -1;
     1873#if defined(VBOX) && !defined(REM_PHYS_ADDR_IN_TLB)
     1874        env->phys_addends[2][i] = -1;
     1875#endif
    18701876#if (NB_MMU_MODES == 4)
    18711877        env->tlb_table[3][i].addr_read = -1;
    18721878        env->tlb_table[3][i].addr_write = -1;
    18731879        env->tlb_table[3][i].addr_code = -1;
     1880#if defined(VBOX) && !defined(REM_PHYS_ADDR_IN_TLB)
     1881        env->phys_addends[3][i] = -1;
     1882#endif
    18741883#endif
    18751884#endif
     
    20582067#endif
    20592068
    2060 #ifndef VBOX
     2069#if defined(VBOX) && !defined(REM_PHYS_ADDR_IN_TLB)
     2070DECLINLINE(void) tlb_update_dirty(CPUTLBEntry *tlb_entry, target_phys_addr_t phys_addend)
     2071#else
    20612072static inline void tlb_update_dirty(CPUTLBEntry *tlb_entry)
    2062 #else
    2063 DECLINLINE(void) tlb_update_dirty(CPUTLBEntry *tlb_entry)
    20642073#endif
    20652074{
     
    20742083            tlb_entry->addend - (unsigned long)phys_ram_base;
    20752084#else
    2076         ram_addr = remR3HCVirt2GCPhys(first_cpu, (void*)((tlb_entry->addr_write & TARGET_PAGE_MASK) + tlb_entry->addend));
     2085        Assert(phys_addend != -1);
     2086        ram_addr = (tlb_entry->addr_write & TARGET_PAGE_MASK) + phys_addend;
     2087       
     2088        /** @todo: nike: will remove this assert along with remR3HCVirt2GCPhys() soon */
     2089        Assert(ram_addr == remR3HCVirt2GCPhys(first_cpu, (void*)((tlb_entry->addr_write & TARGET_PAGE_MASK) + tlb_entry->addend)));
    20772090#endif
    20782091        if (!cpu_physical_memory_is_dirty(ram_addr)) {
     
    20862099{
    20872100    int i;
     2101#if defined(VBOX) && !defined(REM_PHYS_ADDR_IN_TLB)
     2102    for(i = 0; i < CPU_TLB_SIZE; i++)
     2103        tlb_update_dirty(&env->tlb_table[0][i], env->phys_addends[0][i]);
     2104    for(i = 0; i < CPU_TLB_SIZE; i++)
     2105        tlb_update_dirty(&env->tlb_table[1][i], env->phys_addends[1][i]);
     2106#if (NB_MMU_MODES >= 3)
     2107    for(i = 0; i < CPU_TLB_SIZE; i++)
     2108        tlb_update_dirty(&env->tlb_table[2][i], env->phys_addends[2][i]);
     2109#if (NB_MMU_MODES == 4)
     2110    for(i = 0; i < CPU_TLB_SIZE; i++)
     2111        tlb_update_dirty(&env->tlb_table[3][i], env->phys_addends[3][i]);
     2112#endif
     2113#endif
     2114#else /* VBOX */
    20882115    for(i = 0; i < CPU_TLB_SIZE; i++)
    20892116        tlb_update_dirty(&env->tlb_table[0][i]);
     
    20982125#endif
    20992126#endif
     2127#endif /* VBOX */
    21002128}
    21012129
     
    22782306    if (prot & PAGE_WRITE)
    22792307        te->addr_write |= write_mods;
     2308
     2309    env->phys_addends[mmu_idx][index] = (pd & TARGET_PAGE_MASK)- vaddr;
    22802310#endif
    22812311
  • trunk/src/recompiler_new/osdep.h

    r16455 r17274  
    1212
    1313#include "config.h"
     14
     15#define VBOX_ONLY(x) x
    1416
    1517#ifndef _MSC_VER
     
    4951
    5052#include <stdarg.h>
     53
     54#define VBOX_ONLY(x)
    5155
    5256#define qemu_snprintf snprintf   /* bird */
  • trunk/src/recompiler_new/target-i386/cpu.h

    r14425 r17274  
    11/*
    22 * i386 virtual CPU header
    3  * 
     3 *
    44 *  Copyright (c) 2003 Fabrice Bellard
    55 *
     
    112112
    113113/* eflags masks */
    114 #define CC_C    0x0001
    115 #define CC_P    0x0004
     114#define CC_C    0x0001
     115#define CC_P    0x0004
    116116#define CC_A    0x0010
    117117#define CC_Z    0x0040
     
    123123#define VM_SHIFT   17
    124124
    125 #define TF_MASK                 0x00000100
    126 #define IF_MASK                 0x00000200
    127 #define DF_MASK                 0x00000400
     125#define TF_MASK                 0x00000100
     126#define IF_MASK                 0x00000200
     127#define DF_MASK                 0x00000400
    128128#define IOPL_MASK               0x00003000
    129 #define NT_MASK                 0x00004000
     129#define NT_MASK                 0x00004000
    130130#define RF_MASK                 0x00010000
    131131#define VM_MASK                 0x00020000
    132 #define AC_MASK                 0x00040000 
     132#define AC_MASK                 0x00040000
    133133#define VIF_MASK                0x00080000
    134134#define VIP_MASK                0x00100000
     
    193193
    194194#define HF2_GIF_MASK          (1 << HF2_GIF_SHIFT)
    195 #define HF2_HIF_MASK          (1 << HF2_HIF_SHIFT) 
     195#define HF2_HIF_MASK          (1 << HF2_HIF_SHIFT)
    196196#define HF2_NMI_MASK          (1 << HF2_NMI_SHIFT)
    197197#define HF2_VINTR_MASK        (1 << HF2_VINTR_SHIFT)
     
    257257#define MSR_IA32_SYSENTER_ESP           0x175
    258258#define MSR_IA32_SYSENTER_EIP           0x176
    259 #endif 
     259#endif
    260260
    261261#define MSR_IA32_SYSENTER_CS            0x174
     
    377377
    378378#define CPUID_VENDOR_AMD_1   0x68747541 /* "Auth" */
    379 #define CPUID_VENDOR_AMD_2   0x69746e65 /* "enti" */ 
     379#define CPUID_VENDOR_AMD_2   0x69746e65 /* "enti" */
    380380#define CPUID_VENDOR_AMD_3   0x444d4163 /* "cAMD" */
    381381
     
    572572        CPU86_LDouble d __attribute__((aligned(16)));
    573573#else
    574         ALIGNED_MEMBER(CPU86_LDouble, d, 16); 
     574        ALIGNED_MEMBER(CPU86_LDouble, d, 16);
    575575#endif
    576576#else
     
    584584#ifdef VBOX
    585585    uint32_t alignment3[3]; /* force the long double to start a 16 byte line. */
    586 #endif 
     586#endif
    587587    CPU86_LDouble ft0;
    588588#if defined(VBOX) && defined(RT_ARCH_X86) && !defined(RT_OS_DARWIN)
    589589    uint32_t alignment4; /* long double is 12 byte, pad it to 16. */
    590 #endif 
    591    
     590#endif
     591
    592592    float_status mmx_status; /* for 3DNow! float ops */
    593593    float_status sse_status;
     
    604604#ifdef VBOX
    605605    uint32_t alignment0;
    606 #endif 
     606#endif
    607607    uint64_t efer;
    608608    uint64_t star;
    609    
     609
    610610    uint64_t vm_hsave;
    611611    uint64_t vm_vmcb;
     
    677677#else
    678678    uint32_t alignment2[3];
    679 #endif 
     679#endif
    680680} CPUX86State;
    681681
     
    747747#ifdef VBOX
    748748    uint32_t alignment3[3]; /* force the long double to start a 16 byte line. */
    749 #endif 
     749#endif
    750750    CPU86_LDouble ft0;
    751751#if defined(VBOX) && defined(RT_ARCH_X86) && !defined(RT_OS_DARWIN)
    752752    uint32_t alignment4; /* long double is 12 byte, pad it to 16. */
    753 #endif 
     753#endif
    754754    union {
    755755        float f;
     
    758758        int64_t i64;
    759759    } fp_convert;
    760    
     760
    761761    float_status sse_status;
    762762    uint32_t mxcsr;
     
    771771#ifdef VBOX
    772772    uint32_t alignment0;
    773 #endif 
     773#endif
    774774    uint64_t efer;
    775775    uint64_t star;
     
    783783    int native_fp_regs; /* if true, the FPU state is in the native CPU regs */
    784784#endif
    785    
     785
    786786    /* exception/interrupt handling */
    787787    jmp_buf jmp_env;
    788788} CPUX86State_Ver16;
    789789
    790 /** CPUX86State state flags 
     790/** CPUX86State state flags
    791791 * @{ */
    792792#define CPU_RAW_RING0            0x0002 /* Set after first time RawR0 is executed, never cleared. */
     
    813813   cache: it synchronizes the hflags with the segment cache values */
    814814#ifndef VBOX
    815 static inline void cpu_x86_load_seg_cache(CPUX86State *env, 
     815static inline void cpu_x86_load_seg_cache(CPUX86State *env,
    816816                                          int seg_reg, unsigned int selector,
    817817                                          target_ulong base,
    818                                           unsigned int limit, 
     818                                          unsigned int limit,
    819819                                          unsigned int flags)
    820820#else
    821 DECLINLINE(void)  cpu_x86_load_seg_cache(CPUX86State *env, 
     821DECLINLINE(void)  cpu_x86_load_seg_cache(CPUX86State *env,
    822822                                          int seg_reg, unsigned int selector,
    823823                                          target_ulong base,
    824                                           unsigned int limit, 
     824                                          unsigned int limit,
    825825                                          unsigned int flags)
    826826
     
    829829    SegmentCache *sc;
    830830    unsigned int new_hflags;
    831    
     831
    832832    sc = &env->segs[seg_reg];
    833833    sc->selector = selector;
     
    847847                env->hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK;
    848848                env->hflags &= ~(HF_ADDSEG_MASK);
    849             } else 
     849            } else
    850850#endif
    851851            {
     
    861861        if (env->hflags & HF_CS64_MASK) {
    862862            /* zero base assumed for DS, ES and SS in long mode */
    863         } else if (!(env->cr[0] & CR0_PE_MASK) || 
     863        } else if (!(env->cr[0] & CR0_PE_MASK) ||
    864864                   (env->eflags & VM_MASK) ||
    865865                   !(env->hflags & HF_CS32_MASK)) {
     
    871871            new_hflags |= HF_ADDSEG_MASK;
    872872        } else {
    873             new_hflags |= ((env->segs[R_DS].base | 
     873            new_hflags |= ((env->segs[R_DS].base |
    874874                            env->segs[R_ES].base |
    875                             env->segs[R_SS].base) != 0) << 
     875                            env->segs[R_SS].base) != 0) <<
    876876                HF_ADDSEG_SHIFT;
    877877        }
    878         env->hflags = (env->hflags & 
     878        env->hflags = (env->hflags &
    879879                       ~(HF_SS32_MASK | HF_ADDSEG_MASK)) | new_hflags;
    880880    }
     
    908908   signal handlers to inform the virtual CPU of exceptions. non zero
    909909   is returned if the signal was handled by the virtual CPU.  */
    910 int cpu_x86_signal_handler(int host_signum, void *pinfo, 
     910int cpu_x86_signal_handler(int host_signum, void *pinfo,
    911911                           void *puc);
    912912void cpu_x86_set_a20(CPUX86State *env, int a20_state);
     
    923923uint64_t cpu_apic_rdmsr(CPUX86State *env, uint32_t reg);
    924924void     cpu_apic_wrmsr(CPUX86State *env, uint32_t reg, uint64_t value);
    925 uint64_t cpu_rdmsr(CPUX86State *env, uint32_t msr); 
    926 void     cpu_wrmsr(CPUX86State *env, uint32_t msr, uint64_t val); 
     925uint64_t cpu_rdmsr(CPUX86State *env, uint32_t msr);
     926void     cpu_wrmsr(CPUX86State *env, uint32_t msr, uint64_t val);
    927927#endif
    928928void cpu_smm_update(CPUX86State *env);
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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