VirtualBox

Changeset 12657 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Sep 22, 2008 6:29:06 PM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
36948
Message:

#1865: CPUM. Also added missing aliasing for DR4&5 to the guest DRx setter and getter.

Location:
trunk/src/VBox/VMM/VMMAll
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/CPUMAllA.asm

    r10687 r12657  
    266266ENDPROC     CPUMLoadFPUAsm
    267267
     268
    268269;;
    269270; Restores the guest's FPU/XMM state
     
    285286    ret
    286287ENDPROC CPUMSaveFPUAsm
     288
    287289
    288290;;
     
    310312    movdqa  xmm6, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*6]
    311313    movdqa  xmm7, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*7]
    312    
     314
    313315%ifdef RT_ARCH_AMD64
    314316    test qword [xDX + CPUMCTX.msrEFER], MSR_K6_EFER_LMA
    315317    jz CPUMLoadXMMAsm_done
    316    
     318
    317319    movdqa  xmm8, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*8]
    318320    movdqa  xmm9, [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*9]
     
    354356    movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*6], xmm6
    355357    movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*7], xmm7
    356    
     358
    357359%ifdef RT_ARCH_AMD64
    358360    test qword [xDX + CPUMCTX.msrEFER], MSR_K6_EFER_LMA
     
    367369    movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*14], xmm14
    368370    movdqa  [xDX + CPUMCTX.fpu + X86FXSTATE.aXMM + 16*15], xmm15
    369    
     371
    370372CPUMSaveXMMAsm_done:
    371373%endif
     
    396398ENDPROC   CPUMSetFCW
    397399
     400
    398401;;
    399402; Get the FPU control word
     
    408411
    409412;;
    410 ; Set the MXCSR; 
     413; Set the MXCSR;
    411414;
    412415; @param  u32MXCSR    x86:[esp+4] GCC:rdi MSC:rcx     New MXCSR
     
    428431ENDPROC   CPUMSetMXCSR
    429432
     433
    430434;;
    431435; Get the MXCSR
  • trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp

    r12600 r12657  
    11/* $Id$ */
    22/** @file
    3  * CPUM - CPU Monitor(/Manager) - Gets and Sets.
     3 * CPUM - CPU Monitor(/Manager) - Getters and Setters.
    44 */
    55
     
    3838
    3939
    40 
    4140/** Disable stack frame pointer generation here. */
    4241#if defined(_MSC_VER) && !defined(DEBUG)
     
    5857CPUMDECL(void) CPUMHyperSetCtxCore(PVM pVM, PCPUMCTXCORE pCtxCore)
    5958{
    60     LogFlow(("CPUMHyperSetCtxCore: %p/%p/%p -> %p\n", pVM->cpum.s.CTXALLSUFF(pHyperCore), pCtxCore));
     59    LogFlow(("CPUMHyperSetCtxCore: %p/%p/%p -> %p\n", pVM->cpum.s.CTX_SUFF(pHyperCore), pCtxCore));
    6160    if (!pCtxCore)
    6261    {
     
    6463        pVM->cpum.s.pHyperCoreR3 = (R3PTRTYPE(PCPUMCTXCORE))VM_R3_ADDR(pVM, pCtxCore);
    6564        pVM->cpum.s.pHyperCoreR0 = (R0PTRTYPE(PCPUMCTXCORE))VM_R0_ADDR(pVM, pCtxCore);
    66         pVM->cpum.s.pHyperCoreGC = (RCPTRTYPE(PCPUMCTXCORE))VM_GUEST_ADDR(pVM, pCtxCore);
     65        pVM->cpum.s.pHyperCoreRC = (RCPTRTYPE(PCPUMCTXCORE))VM_GUEST_ADDR(pVM, pCtxCore);
    6766    }
    6867    else
     
    7069        pVM->cpum.s.pHyperCoreR3 = (R3PTRTYPE(PCPUMCTXCORE))MMHyperCCToR3(pVM, pCtxCore);
    7170        pVM->cpum.s.pHyperCoreR0 = (R0PTRTYPE(PCPUMCTXCORE))MMHyperCCToR0(pVM, pCtxCore);
    72         pVM->cpum.s.pHyperCoreGC = (RCPTRTYPE(PCPUMCTXCORE))MMHyperCCToRC(pVM, pCtxCore);
     71        pVM->cpum.s.pHyperCoreRC = (RCPTRTYPE(PCPUMCTXCORE))MMHyperCCToRC(pVM, pCtxCore);
    7372    }
    7473}
     
    8382CPUMDECL(PCCPUMCTXCORE) CPUMGetHyperCtxCore(PVM pVM)
    8483{
    85     return pVM->cpum.s.CTXALLSUFF(pHyperCore);
     84    return pVM->cpum.s.CTX_SUFF(pHyperCore);
    8685}
    8786
     
    105104}
    106105
     106
    107107CPUMDECL(void) CPUMSetHyperGDTR(PVM pVM, uint32_t addr, uint16_t limit)
    108108{
     
    112112}
    113113
     114
    114115CPUMDECL(void) CPUMSetHyperIDTR(PVM pVM, uint32_t addr, uint16_t limit)
    115116{
     
    119120}
    120121
     122
    121123CPUMDECL(void) CPUMSetHyperCR3(PVM pVM, uint32_t cr3)
    122124{
     
    124126}
    125127
     128
    126129CPUMDECL(void) CPUMSetHyperCS(PVM pVM, RTSEL SelCS)
    127130{
    128     pVM->cpum.s.CTXALLSUFF(pHyperCore)->cs = SelCS;
    129 }
     131    pVM->cpum.s.CTX_SUFF(pHyperCore)->cs = SelCS;
     132}
     133
    130134
    131135CPUMDECL(void) CPUMSetHyperDS(PVM pVM, RTSEL SelDS)
    132136{
    133     pVM->cpum.s.CTXALLSUFF(pHyperCore)->ds = SelDS;
    134 }
     137    pVM->cpum.s.CTX_SUFF(pHyperCore)->ds = SelDS;
     138}
     139
    135140
    136141CPUMDECL(void) CPUMSetHyperES(PVM pVM, RTSEL SelES)
    137142{
    138     pVM->cpum.s.CTXALLSUFF(pHyperCore)->es = SelES;
    139 }
     143    pVM->cpum.s.CTX_SUFF(pHyperCore)->es = SelES;
     144}
     145
    140146
    141147CPUMDECL(void) CPUMSetHyperFS(PVM pVM, RTSEL SelFS)
    142148{
    143     pVM->cpum.s.CTXALLSUFF(pHyperCore)->fs = SelFS;
    144 }
     149    pVM->cpum.s.CTX_SUFF(pHyperCore)->fs = SelFS;
     150}
     151
    145152
    146153CPUMDECL(void) CPUMSetHyperGS(PVM pVM, RTSEL SelGS)
    147154{
    148     pVM->cpum.s.CTXALLSUFF(pHyperCore)->gs = SelGS;
    149 }
     155    pVM->cpum.s.CTX_SUFF(pHyperCore)->gs = SelGS;
     156}
     157
    150158
    151159CPUMDECL(void) CPUMSetHyperSS(PVM pVM, RTSEL SelSS)
    152160{
    153     pVM->cpum.s.CTXALLSUFF(pHyperCore)->ss = SelSS;
    154 }
     161    pVM->cpum.s.CTX_SUFF(pHyperCore)->ss = SelSS;
     162}
     163
    155164
    156165CPUMDECL(void) CPUMSetHyperESP(PVM pVM, uint32_t u32ESP)
    157166{
    158     pVM->cpum.s.CTXALLSUFF(pHyperCore)->esp = u32ESP;
    159 }
     167    pVM->cpum.s.CTX_SUFF(pHyperCore)->esp = u32ESP;
     168}
     169
    160170
    161171CPUMDECL(int) CPUMSetHyperEFlags(PVM pVM, uint32_t Efl)
    162172{
    163     pVM->cpum.s.CTXALLSUFF(pHyperCore)->eflags.u32 = Efl;
    164     return VINF_SUCCESS;
    165 }
     173    pVM->cpum.s.CTX_SUFF(pHyperCore)->eflags.u32 = Efl;
     174    return VINF_SUCCESS;
     175}
     176
    166177
    167178CPUMDECL(void) CPUMSetHyperEIP(PVM pVM, uint32_t u32EIP)
    168179{
    169     pVM->cpum.s.CTXALLSUFF(pHyperCore)->eip = u32EIP;
    170 }
     180    pVM->cpum.s.CTX_SUFF(pHyperCore)->eip = u32EIP;
     181}
     182
    171183
    172184CPUMDECL(void) CPUMSetHyperTR(PVM pVM, RTSEL SelTR)
     
    175187}
    176188
     189
    177190CPUMDECL(void) CPUMSetHyperLDTR(PVM pVM, RTSEL SelLDTR)
    178191{
    179192    pVM->cpum.s.Hyper.ldtr = SelLDTR;
    180193}
     194
    181195
    182196CPUMDECL(void) CPUMSetHyperDR0(PVM pVM, RTGCUINTREG uDr0)
     
    186200}
    187201
     202
    188203CPUMDECL(void) CPUMSetHyperDR1(PVM pVM, RTGCUINTREG uDr1)
    189204{
     
    192207}
    193208
     209
    194210CPUMDECL(void) CPUMSetHyperDR2(PVM pVM, RTGCUINTREG uDr2)
    195211{
     
    198214}
    199215
     216
    200217CPUMDECL(void) CPUMSetHyperDR3(PVM pVM, RTGCUINTREG uDr3)
    201218{
     
    204221}
    205222
     223
    206224CPUMDECL(void) CPUMSetHyperDR6(PVM pVM, RTGCUINTREG uDr6)
    207225{
     
    210228}
    211229
     230
    212231CPUMDECL(void) CPUMSetHyperDR7(PVM pVM, RTGCUINTREG uDr7)
    213232{
     
    219238CPUMDECL(RTSEL) CPUMGetHyperCS(PVM pVM)
    220239{
    221     return pVM->cpum.s.CTXALLSUFF(pHyperCore)->cs;
    222 }
     240    return pVM->cpum.s.CTX_SUFF(pHyperCore)->cs;
     241}
     242
    223243
    224244CPUMDECL(RTSEL) CPUMGetHyperDS(PVM pVM)
    225245{
    226     return pVM->cpum.s.CTXALLSUFF(pHyperCore)->ds;
    227 }
     246    return pVM->cpum.s.CTX_SUFF(pHyperCore)->ds;
     247}
     248
    228249
    229250CPUMDECL(RTSEL) CPUMGetHyperES(PVM pVM)
    230251{
    231     return pVM->cpum.s.CTXALLSUFF(pHyperCore)->es;
    232 }
     252    return pVM->cpum.s.CTX_SUFF(pHyperCore)->es;
     253}
     254
    233255
    234256CPUMDECL(RTSEL) CPUMGetHyperFS(PVM pVM)
    235257{
    236     return pVM->cpum.s.CTXALLSUFF(pHyperCore)->fs;
    237 }
     258    return pVM->cpum.s.CTX_SUFF(pHyperCore)->fs;
     259}
     260
    238261
    239262CPUMDECL(RTSEL) CPUMGetHyperGS(PVM pVM)
    240263{
    241     return pVM->cpum.s.CTXALLSUFF(pHyperCore)->gs;
    242 }
     264    return pVM->cpum.s.CTX_SUFF(pHyperCore)->gs;
     265}
     266
    243267
    244268CPUMDECL(RTSEL) CPUMGetHyperSS(PVM pVM)
    245269{
    246     return pVM->cpum.s.CTXALLSUFF(pHyperCore)->ss;
    247 }
    248 
    249 #if 0 /* these are not correct. */
    250 
    251 CPUMDECL(uint32_t) CPUMGetHyperCR0(PVM pVM)
    252 {
    253     return pVM->cpum.s.Hyper.cr0;
    254 }
    255 
    256 CPUMDECL(uint32_t) CPUMGetHyperCR2(PVM pVM)
    257 {
    258     return pVM->cpum.s.Hyper.cr2;
    259 }
    260 
    261 CPUMDECL(uint32_t) CPUMGetHyperCR3(PVM pVM)
    262 {
    263     return pVM->cpum.s.Hyper.cr3;
    264 }
    265 
    266 CPUMDECL(uint32_t) CPUMGetHyperCR4(PVM pVM)
    267 {
    268     return pVM->cpum.s.Hyper.cr4;
    269 }
    270 
    271 #endif /* not correct */
     270    return pVM->cpum.s.CTX_SUFF(pHyperCore)->ss;
     271}
     272
    272273
    273274CPUMDECL(uint32_t) CPUMGetHyperEAX(PVM pVM)
    274275{
    275     return pVM->cpum.s.CTXALLSUFF(pHyperCore)->eax;
    276 }
     276    return pVM->cpum.s.CTX_SUFF(pHyperCore)->eax;
     277}
     278
    277279
    278280CPUMDECL(uint32_t) CPUMGetHyperEBX(PVM pVM)
    279281{
    280     return pVM->cpum.s.CTXALLSUFF(pHyperCore)->ebx;
    281 }
     282    return pVM->cpum.s.CTX_SUFF(pHyperCore)->ebx;
     283}
     284
    282285
    283286CPUMDECL(uint32_t) CPUMGetHyperECX(PVM pVM)
    284287{
    285     return pVM->cpum.s.CTXALLSUFF(pHyperCore)->ecx;
    286 }
     288    return pVM->cpum.s.CTX_SUFF(pHyperCore)->ecx;
     289}
     290
    287291
    288292CPUMDECL(uint32_t) CPUMGetHyperEDX(PVM pVM)
    289293{
    290     return pVM->cpum.s.CTXALLSUFF(pHyperCore)->edx;
    291 }
     294    return pVM->cpum.s.CTX_SUFF(pHyperCore)->edx;
     295}
     296
    292297
    293298CPUMDECL(uint32_t) CPUMGetHyperESI(PVM pVM)
    294299{
    295     return pVM->cpum.s.CTXALLSUFF(pHyperCore)->esi;
    296 }
     300    return pVM->cpum.s.CTX_SUFF(pHyperCore)->esi;
     301}
     302
    297303
    298304CPUMDECL(uint32_t) CPUMGetHyperEDI(PVM pVM)
    299305{
    300     return pVM->cpum.s.CTXALLSUFF(pHyperCore)->edi;
    301 }
     306    return pVM->cpum.s.CTX_SUFF(pHyperCore)->edi;
     307}
     308
    302309
    303310CPUMDECL(uint32_t) CPUMGetHyperEBP(PVM pVM)
    304311{
    305     return pVM->cpum.s.CTXALLSUFF(pHyperCore)->ebp;
    306 }
     312    return pVM->cpum.s.CTX_SUFF(pHyperCore)->ebp;
     313}
     314
    307315
    308316CPUMDECL(uint32_t) CPUMGetHyperESP(PVM pVM)
    309317{
    310     return pVM->cpum.s.CTXALLSUFF(pHyperCore)->esp;
    311 }
     318    return pVM->cpum.s.CTX_SUFF(pHyperCore)->esp;
     319}
     320
    312321
    313322CPUMDECL(uint32_t) CPUMGetHyperEFlags(PVM pVM)
    314323{
    315     return pVM->cpum.s.CTXALLSUFF(pHyperCore)->eflags.u32;
    316 }
     324    return pVM->cpum.s.CTX_SUFF(pHyperCore)->eflags.u32;
     325}
     326
    317327
    318328CPUMDECL(uint32_t) CPUMGetHyperEIP(PVM pVM)
    319329{
    320     return pVM->cpum.s.CTXALLSUFF(pHyperCore)->eip;
    321 }
     330    return pVM->cpum.s.CTX_SUFF(pHyperCore)->eip;
     331}
     332
    322333
    323334CPUMDECL(uint64_t) CPUMGetHyperRIP(PVM pVM)
    324335{
    325     return pVM->cpum.s.CTXALLSUFF(pHyperCore)->rip;
    326 }
     336    return pVM->cpum.s.CTX_SUFF(pHyperCore)->rip;
     337}
     338
    327339
    328340CPUMDECL(uint32_t) CPUMGetHyperIDTR(PVM pVM, uint16_t *pcbLimit)
     
    333345}
    334346
     347
    335348CPUMDECL(uint32_t) CPUMGetHyperGDTR(PVM pVM, uint16_t *pcbLimit)
    336349{
     
    340353}
    341354
     355
    342356CPUMDECL(RTSEL) CPUMGetHyperLDTR(PVM pVM)
    343357{
     
    345359}
    346360
     361
    347362CPUMDECL(RTGCUINTREG) CPUMGetHyperDR0(PVM pVM)
    348363{
     
    350365}
    351366
     367
    352368CPUMDECL(RTGCUINTREG) CPUMGetHyperDR1(PVM pVM)
    353369{
     
    355371}
    356372
     373
    357374CPUMDECL(RTGCUINTREG) CPUMGetHyperDR2(PVM pVM)
    358375{
     
    360377}
    361378
     379
    362380CPUMDECL(RTGCUINTREG) CPUMGetHyperDR3(PVM pVM)
    363381{
     
    365383}
    366384
     385
    367386CPUMDECL(RTGCUINTREG) CPUMGetHyperDR6(PVM pVM)
    368387{
    369388    return pVM->cpum.s.Hyper.dr[6];
    370389}
     390
    371391
    372392CPUMDECL(RTGCUINTREG) CPUMGetHyperDR7(PVM pVM)
     
    396416CPUMDECL(void) CPUMSetGuestCtxCore(PVM pVM, PCCPUMCTXCORE pCtxCore)
    397417{
    398     /** @todo #1410 requires selectors to be checked. */
     418    /** @todo #1410 requires selectors to be checked. (huh? 1410?) */
    399419
    400420    PCPUMCTXCORE pCtxCoreDst = CPUMCTX2CORE(&pVM->cpum.s.Guest);
     
    511531                ASMSetCR0(HyperCR0);
    512532            }
    513 #ifdef VBOX_STRICT
     533# ifdef VBOX_STRICT
    514534            else
    515535            {
     
    518538                AssertMsg((HyperCR0 & X86_CR0_EM) == (pVM->cpum.s.Guest.cr0 & X86_CR0_EM), ("%#x\n", HyperCR0));
    519539            }
    520 #endif
     540# endif
    521541        }
    522542        else
     
    536556        }
    537557    }
    538 #endif
     558#endif /* IN_GC */
    539559
    540560    /*
     
    551571}
    552572
     573
    553574CPUMDECL(int) CPUMSetGuestCR2(PVM pVM, uint64_t cr2)
    554575{
     
    556577    return VINF_SUCCESS;
    557578}
     579
    558580
    559581CPUMDECL(int) CPUMSetGuestCR3(PVM pVM, uint64_t cr3)
     
    563585    return VINF_SUCCESS;
    564586}
     587
    565588
    566589CPUMDECL(int) CPUMSetGuestCR4(PVM pVM, uint64_t cr4)
     
    576599}
    577600
     601
    578602CPUMDECL(int) CPUMSetGuestEFlags(PVM pVM, uint32_t eflags)
    579603{
     
    582606}
    583607
     608
    584609CPUMDECL(int) CPUMSetGuestEIP(PVM pVM, uint32_t eip)
    585610{
     
    588613}
    589614
     615
    590616CPUMDECL(int) CPUMSetGuestEAX(PVM pVM, uint32_t eax)
    591617{
     
    594620}
    595621
     622
    596623CPUMDECL(int) CPUMSetGuestEBX(PVM pVM, uint32_t ebx)
    597624{
     
    600627}
    601628
     629
    602630CPUMDECL(int) CPUMSetGuestECX(PVM pVM, uint32_t ecx)
    603631{
     
    606634}
    607635
     636
    608637CPUMDECL(int) CPUMSetGuestEDX(PVM pVM, uint32_t edx)
    609638{
     
    612641}
    613642
     643
    614644CPUMDECL(int) CPUMSetGuestESP(PVM pVM, uint32_t esp)
    615645{
     
    618648}
    619649
     650
    620651CPUMDECL(int) CPUMSetGuestEBP(PVM pVM, uint32_t ebp)
    621652{
     
    624655}
    625656
     657
    626658CPUMDECL(int) CPUMSetGuestESI(PVM pVM, uint32_t esi)
    627659{
     
    630662}
    631663
     664
    632665CPUMDECL(int) CPUMSetGuestEDI(PVM pVM, uint32_t edi)
    633666{
     
    636669}
    637670
     671
    638672CPUMDECL(int) CPUMSetGuestSS(PVM pVM, uint16_t ss)
    639673{
     
    642676}
    643677
     678
    644679CPUMDECL(int) CPUMSetGuestCS(PVM pVM, uint16_t cs)
    645680{
     
    648683}
    649684
     685
    650686CPUMDECL(int) CPUMSetGuestDS(PVM pVM, uint16_t ds)
    651687{
     
    654690}
    655691
     692
    656693CPUMDECL(int) CPUMSetGuestES(PVM pVM, uint16_t es)
    657694{
     
    660697}
    661698
     699
    662700CPUMDECL(int) CPUMSetGuestFS(PVM pVM, uint16_t fs)
    663701{
     
    666704}
    667705
     706
    668707CPUMDECL(int) CPUMSetGuestGS(PVM pVM, uint16_t gs)
    669708{
     
    672711}
    673712
     713
    674714CPUMDECL(void) CPUMSetGuestEFER(PVM pVM, uint64_t val)
    675715{
     
    677717}
    678718
     719
    679720CPUMDECL(uint64_t)  CPUMGetGuestMsr(PVM pVM, unsigned idMsr)
    680721{
    681     uint64_t val = 0;
     722    uint64_t u64 = 0;
    682723
    683724    switch (idMsr)
    684725    {
    685     case MSR_IA32_CR_PAT:
    686         val = pVM->cpum.s.Guest.msrPAT;
    687         break;
    688 
    689     case MSR_IA32_SYSENTER_CS:
    690         val = pVM->cpum.s.Guest.SysEnter.cs;
    691         break;
    692 
    693     case MSR_IA32_SYSENTER_EIP:
    694         val = pVM->cpum.s.Guest.SysEnter.eip;
    695         break;
    696 
    697     case MSR_IA32_SYSENTER_ESP:
    698         val = pVM->cpum.s.Guest.SysEnter.esp;
    699         break;
    700 
    701     case MSR_K6_EFER:
    702         val = pVM->cpum.s.Guest.msrEFER;
    703         break;
    704 
    705     case MSR_K8_SF_MASK:
    706         val = pVM->cpum.s.Guest.msrSFMASK;
    707         break;
    708 
    709     case MSR_K6_STAR:
    710         val = pVM->cpum.s.Guest.msrSTAR;
    711         break;
    712 
    713     case MSR_K8_LSTAR:
    714         val = pVM->cpum.s.Guest.msrLSTAR;
    715         break;
    716 
    717     case MSR_K8_CSTAR:
    718         val = pVM->cpum.s.Guest.msrCSTAR;
    719         break;
    720 
    721     case MSR_K8_KERNEL_GS_BASE:
    722         val = pVM->cpum.s.Guest.msrKERNELGSBASE;
    723         break;
    724 
    725     /* fs & gs base skipped on purpose as the current context might not be up-to-date. */
    726     default:
    727         AssertFailed();
    728         break;
     726        case MSR_IA32_CR_PAT:
     727            u64 = pVM->cpum.s.Guest.msrPAT;
     728            break;
     729
     730        case MSR_IA32_SYSENTER_CS:
     731            u64 = pVM->cpum.s.Guest.SysEnter.cs;
     732            break;
     733
     734        case MSR_IA32_SYSENTER_EIP:
     735            u64 = pVM->cpum.s.Guest.SysEnter.eip;
     736            break;
     737
     738        case MSR_IA32_SYSENTER_ESP:
     739            u64 = pVM->cpum.s.Guest.SysEnter.esp;
     740            break;
     741
     742        case MSR_K6_EFER:
     743            u64 = pVM->cpum.s.Guest.msrEFER;
     744            break;
     745
     746        case MSR_K8_SF_MASK:
     747            u64 = pVM->cpum.s.Guest.msrSFMASK;
     748            break;
     749
     750        case MSR_K6_STAR:
     751            u64 = pVM->cpum.s.Guest.msrSTAR;
     752            break;
     753
     754        case MSR_K8_LSTAR:
     755            u64 = pVM->cpum.s.Guest.msrLSTAR;
     756            break;
     757
     758        case MSR_K8_CSTAR:
     759            u64 = pVM->cpum.s.Guest.msrCSTAR;
     760            break;
     761
     762        case MSR_K8_KERNEL_GS_BASE:
     763            u64 = pVM->cpum.s.Guest.msrKERNELGSBASE;
     764            break;
     765
     766        /* fs & gs base skipped on purpose as the current context might not be up-to-date. */
     767        default:
     768            AssertFailed();
     769            break;
    729770    }
    730     return val;
    731 }
     771    return u64;
     772}
     773
    732774
    733775CPUMDECL(RTGCPTR) CPUMGetGuestIDTR(PVM pVM, uint16_t *pcbLimit)
     
    738780}
    739781
     782
    740783CPUMDECL(RTSEL) CPUMGetGuestTR(PVM pVM)
    741784{
     
    743786}
    744787
     788
    745789CPUMDECL(RTSEL) CPUMGetGuestCS(PVM pVM)
    746790{
     
    748792}
    749793
     794
    750795CPUMDECL(RTSEL) CPUMGetGuestDS(PVM pVM)
    751796{
     
    753798}
    754799
     800
    755801CPUMDECL(RTSEL) CPUMGetGuestES(PVM pVM)
    756802{
     
    758804}
    759805
     806
    760807CPUMDECL(RTSEL) CPUMGetGuestFS(PVM pVM)
    761808{
     
    763810}
    764811
     812
    765813CPUMDECL(RTSEL) CPUMGetGuestGS(PVM pVM)
    766814{
     
    768816}
    769817
     818
    770819CPUMDECL(RTSEL) CPUMGetGuestSS(PVM pVM)
    771820{
     
    773822}
    774823
     824
    775825CPUMDECL(RTSEL) CPUMGetGuestLDTR(PVM pVM)
    776826{
     
    778828}
    779829
     830
    780831CPUMDECL(uint64_t) CPUMGetGuestCR0(PVM pVM)
    781832{
     
    783834}
    784835
     836
    785837CPUMDECL(uint64_t) CPUMGetGuestCR2(PVM pVM)
    786838{
     
    788840}
    789841
     842
    790843CPUMDECL(uint64_t) CPUMGetGuestCR3(PVM pVM)
    791844{
     
    793846}
    794847
     848
    795849CPUMDECL(uint64_t) CPUMGetGuestCR4(PVM pVM)
    796850{
     
    798852}
    799853
     854
    800855CPUMDECL(void) CPUMGetGuestGDTR(PVM pVM, PVBOXGDTR pGDTR)
    801856{
     
    803858}
    804859
     860
    805861CPUMDECL(uint32_t) CPUMGetGuestEIP(PVM pVM)
    806862{
     
    808864}
    809865
     866
    810867CPUMDECL(uint64_t) CPUMGetGuestRIP(PVM pVM)
    811868{
     
    813870}
    814871
     872
    815873CPUMDECL(uint32_t) CPUMGetGuestEAX(PVM pVM)
    816874{
     
    818876}
    819877
     878
    820879CPUMDECL(uint32_t) CPUMGetGuestEBX(PVM pVM)
    821880{
     
    823882}
    824883
     884
    825885CPUMDECL(uint32_t) CPUMGetGuestECX(PVM pVM)
    826886{
     
    828888}
    829889
     890
    830891CPUMDECL(uint32_t) CPUMGetGuestEDX(PVM pVM)
    831892{
     
    833894}
    834895
     896
    835897CPUMDECL(uint32_t) CPUMGetGuestESI(PVM pVM)
    836898{
     
    838900}
    839901
     902
    840903CPUMDECL(uint32_t) CPUMGetGuestEDI(PVM pVM)
    841904{
     
    843906}
    844907
     908
    845909CPUMDECL(uint32_t) CPUMGetGuestESP(PVM pVM)
    846910{
     
    848912}
    849913
     914
    850915CPUMDECL(uint32_t) CPUMGetGuestEBP(PVM pVM)
    851916{
     
    853918}
    854919
     920
    855921CPUMDECL(uint32_t) CPUMGetGuestEFlags(PVM pVM)
    856922{
     
    858924}
    859925
     926
    860927CPUMDECL(CPUMSELREGHID *) CPUMGetGuestTRHid(PVM pVM)
    861928{
     
    863930}
    864931
    865 //@todo: crx should be an array
     932
     933///@todo: crx should be an array
    866934CPUMDECL(int) CPUMGetGuestCRx(PVM pVM, unsigned iReg, uint64_t *pValue)
    867935{
     
    886954}
    887955
     956
    888957CPUMDECL(uint64_t) CPUMGetGuestDR0(PVM pVM)
    889958{
     
    891960}
    892961
     962
    893963CPUMDECL(uint64_t) CPUMGetGuestDR1(PVM pVM)
    894964{
     
    896966}
    897967
     968
    898969CPUMDECL(uint64_t) CPUMGetGuestDR2(PVM pVM)
    899970{
     
    901972}
    902973
     974
    903975CPUMDECL(uint64_t) CPUMGetGuestDR3(PVM pVM)
    904976{
     
    906978}
    907979
     980
    908981CPUMDECL(uint64_t) CPUMGetGuestDR6(PVM pVM)
    909982{
     
    911984}
    912985
     986
    913987CPUMDECL(uint64_t) CPUMGetGuestDR7(PVM pVM)
    914988{
     
    916990}
    917991
     992
    918993CPUMDECL(int) CPUMGetGuestDRx(PVM pVM, uint32_t iReg, uint64_t *pValue)
    919994{
    920995    AssertReturn(iReg <= USE_REG_DR7, VERR_INVALID_PARAMETER);
     996    /* DR4 is an alias for DR6, and DR5 is an alias for DR7. */
     997    if (iReg == 4 || iReg == 5)
     998        iReg += 2;
    921999    *pValue = pVM->cpum.s.Guest.dr[iReg];
    9221000    return VINF_SUCCESS;
    9231001}
    9241002
     1003
    9251004CPUMDECL(uint64_t) CPUMGetGuestEFER(PVM pVM)
    9261005{
    9271006    return pVM->cpum.s.Guest.msrEFER;
    9281007}
     1008
    9291009
    9301010/**
     
    9571037}
    9581038
     1039
    9591040/**
    9601041 * Gets a pointer to the array of standard CPUID leafs.
     
    9711052}
    9721053
     1054
    9731055/**
    9741056 * Gets a pointer to the array of extended CPUID leafs.
     
    9821064CPUMDECL(RCPTRTYPE(PCCPUMCPUID)) CPUMGetGuestCpuIdExtGCPtr(PVM pVM)
    9831065{
    984     return RCPTRTYPE(PCCPUMCPUID)VM_GUEST_ADDR(pVM, &pVM->cpum.s.aGuestCpuIdExt[0]);
    985 }
     1066    return (RCPTRTYPE(PCCPUMCPUID))VM_GUEST_ADDR(pVM, &pVM->cpum.s.aGuestCpuIdExt[0]);
     1067}
     1068
    9861069
    9871070/**
     
    9961079CPUMDECL(RCPTRTYPE(PCCPUMCPUID)) CPUMGetGuestCpuIdCentaurGCPtr(PVM pVM)
    9971080{
    998     return RCPTRTYPE(PCCPUMCPUID)VM_GUEST_ADDR(pVM, &pVM->cpum.s.aGuestCpuIdCentaur[0]);
    999 }
     1081    return (RCPTRTYPE(PCCPUMCPUID))VM_GUEST_ADDR(pVM, &pVM->cpum.s.aGuestCpuIdCentaur[0]);
     1082}
     1083
    10001084
    10011085/**
     
    10081092CPUMDECL(RCPTRTYPE(PCCPUMCPUID)) CPUMGetGuestCpuIdDefGCPtr(PVM pVM)
    10091093{
    1010     return RCPTRTYPE(PCCPUMCPUID)VM_GUEST_ADDR(pVM, &pVM->cpum.s.GuestCpuIdDef);
    1011 }
     1094    return (RCPTRTYPE(PCCPUMCPUID))VM_GUEST_ADDR(pVM, &pVM->cpum.s.GuestCpuIdDef);
     1095}
     1096
    10121097
    10131098/**
     
    10231108}
    10241109
     1110
    10251111/**
    10261112 * Gets a number of extended CPUID leafs.
     
    10351121}
    10361122
     1123
    10371124/**
    10381125 * Gets a number of centaur CPUID leafs.
     
    10461133    return RT_ELEMENTS(pVM->cpum.s.aGuestCpuIdCentaur);
    10471134}
     1135
    10481136
    10491137/**
     
    11961284}
    11971285
     1286
    11981287/**
    11991288 * Queries a CPUID feature bit.
     
    12201309    return false;
    12211310}
     1311
    12221312
    12231313/**
     
    12721362}
    12731363
     1364
    12741365/**
    12751366 * Gets the CPU vendor
     
    12901381}
    12911382
     1383
    12921384CPUMDECL(int) CPUMSetGuestDR1(PVM pVM, uint64_t uDr1)
    12931385{
     
    12961388}
    12971389
     1390
    12981391CPUMDECL(int) CPUMSetGuestDR2(PVM pVM, uint64_t uDr2)
    12991392{
     
    13021395}
    13031396
     1397
    13041398CPUMDECL(int) CPUMSetGuestDR3(PVM pVM, uint64_t uDr3)
    13051399{
     
    13081402}
    13091403
     1404
    13101405CPUMDECL(int) CPUMSetGuestDR6(PVM pVM, uint64_t uDr6)
    13111406{
     
    13141409}
    13151410
     1411
    13161412CPUMDECL(int) CPUMSetGuestDR7(PVM pVM, uint64_t uDr7)
    13171413{
     
    13201416}
    13211417
     1418
    13221419CPUMDECL(int) CPUMSetGuestDRx(PVM pVM, uint32_t iReg, uint64_t Value)
    13231420{
    13241421    AssertReturn(iReg <= USE_REG_DR7, VERR_INVALID_PARAMETER);
     1422    /* DR4 is an alias for DR6, and DR5 is an alias for DR7. */
     1423    if (iReg == 4 || iReg == 5)
     1424        iReg += 2;
    13251425    pVM->cpum.s.Guest.dr[iReg] = Value;
    13261426    return CPUMRecalcHyperDRx(pVM);
     
    16391739
    16401740
    1641 
    1642 
    16431741/**
    16441742 * Gets and resets the changed flags (CPUM_CHANGED_*).
     
    16611759}
    16621760
     1761
    16631762/**
    16641763 * Sets the specified changed flags (CPUM_CHANGED_*).
     
    16701769    pVM->cpum.s.fChanged |= fChangedFlags;
    16711770}
     1771
    16721772
    16731773/**
     
    17061806}
    17071807
    1708 
    17091808#ifndef IN_RING3
     1809
    17101810/**
    17111811 * Lazily sync in the FPU/XMM state
     
    17311831    return CPUMRestoreHostFPUStateAsm(&pVM->cpum.s);
    17321832}
     1833
    17331834#endif /* !IN_RING3 */
    1734 
    17351835
    17361836/**
     
    17561856
    17571857
    1758 
    17591858/**
    17601859 * Checks if the guest debug state is active
     
    17681867}
    17691868
     1869
    17701870/**
    17711871 * Mark the guest's debug state as inactive
     
    17741874 * @param   pVM         VM handle.
    17751875 */
    1776 CPUMDECL(void) CPUMDeactivateGuestDebugtate(PVM pVM)
     1876CPUMDECL(void) CPUMDeactivateGuestDebugState(PVM pVM)
    17771877{
    17781878    pVM->cpum.s.fUseFlags &= ~CPUM_USE_DEBUG_REGS;
     
    18201920         * not affected by loading a conforming coding segment.
    18211921         *
    1822          * This only seems to apply to AMD-V; in the VT-x case we *do* need to look at SS. (ACP2 regression during install after a far call to ring 2)
     1922         * This only seems to apply to AMD-V; in the VT-x case we *do* need to look
     1923         * at SS. (ACP2 regression during install after a far call to ring 2)
    18231924         */
    18241925        cpl = pCtxCore->ssHid.Attr.n.u2Dpl;
     
    18621963    if (!(pVM->cpum.s.Guest.cr0 & X86_CR0_PE))
    18631964        enmMode = CPUMMODE_REAL;
    1864     else
    1865     if (!(pVM->cpum.s.Guest.msrEFER & MSR_K6_EFER_LMA))
     1965    else if (!(pVM->cpum.s.Guest.msrEFER & MSR_K6_EFER_LMA))
    18661966        enmMode = CPUMMODE_PROTECTED;
    18671967    else
     
    18701970    return enmMode;
    18711971}
     1972
  • trunk/src/VBox/VMM/VMMAll/EMAll.cpp

    r12307 r12657  
    298298    if (RT_LIKELY(rc != VERR_ACCESS_DENIED))
    299299        return rc;
    300     /* 
    301      * The page pool cache may end up here in some cases because it 
    302      * flushed one of the shadow mappings used by the trapping 
     300    /*
     301     * The page pool cache may end up here in some cases because it
     302     * flushed one of the shadow mappings used by the trapping
    303303     * instruction and it either flushed the TLB or the CPU reused it.
    304304     */
     
    319319    if (RT_LIKELY(rc != VERR_ACCESS_DENIED))
    320320        return rc;
    321     /* 
    322      * The page pool cache may end up here in some cases because it 
    323      * flushed one of the shadow mappings used by the trapping 
     321    /*
     322     * The page pool cache may end up here in some cases because it
     323     * flushed one of the shadow mappings used by the trapping
    324324     * instruction and it either flushed the TLB or the CPU reused it.
    325      * We want to play safe here, verifying that we've got write 
     325     * We want to play safe here, verifying that we've got write
    326326     * access doesn't cost us much (see PGMPhysGCPtr2GCPhys()).
    327327     */
     
    331331    if (RT_FAILURE(rc))
    332332        return rc;
    333     if (    !(fFlags & X86_PTE_RW) 
     333    if (    !(fFlags & X86_PTE_RW)
    334334        &&  (CPUMGetGuestCR0(pVM) & X86_CR0_WP))
    335335        return VERR_ACCESS_DENIED;
     
    351351
    352352#if defined(VBOX_STRICT) || defined(LOG_ENABLED)
    353 /** 
     353/**
    354354 * Get the mnemonic for the disassembled instruction.
    355  * 
    356  * GC/R0 doesn't include the strings in the DIS tables because 
    357  * of limited space. 
    358  */ 
     355 *
     356 * GC/R0 doesn't include the strings in the DIS tables because
     357 * of limited space.
     358 */
    359359static const char *emGetMnemonic(PDISCPUSTATE pCpu)
    360360{
     
    803803 * LOCK XOR/OR/AND Emulation.
    804804 */
    805 static int emInterpretLockOrXorAnd(PVM pVM, PDISCPUSTATE pCpu, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, 
     805static int emInterpretLockOrXorAnd(PVM pVM, PDISCPUSTATE pCpu, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault,
    806806                                   uint32_t *pcbSize, PFNEMULATELOCKPARAM3 pfnEmulate)
    807807{
     
    10971097 * LOCK BTR/C/S Emulation.
    10981098 */
    1099 static int emInterpretLockBitTest(PVM pVM, PDISCPUSTATE pCpu, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, 
     1099static int emInterpretLockBitTest(PVM pVM, PDISCPUSTATE pCpu, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault,
    11001100                                  uint32_t *pcbSize, PFNEMULATELOCKPARAM2 pfnEmulate)
    11011101{
     
    11411141#ifdef IN_GC
    11421142    Assert(TRPMHasTrap(pVM));
    1143     AssertMsgReturn((RTGCPTR)((RTGCUINTPTR)GCPtrPar1 & ~(RTGCUINTPTR)3) == pvFault, 
    1144                     ("GCPtrPar1=%VGv pvFault=%VGv\n", GCPtrPar1, pvFault), 
     1143    AssertMsgReturn((RTGCPTR)((RTGCUINTPTR)GCPtrPar1 & ~(RTGCUINTPTR)3) == pvFault,
     1144                    ("GCPtrPar1=%VGv pvFault=%VGv\n", GCPtrPar1, pvFault),
    11451145                    VERR_EM_INTERPRETER);
    11461146#endif
     
    11571157    if (RT_FAILURE(rc))
    11581158    {
    1159         Log(("emInterpretLockBitTest %s: %VGv imm%d=%RX64 -> emulation failed due to page fault!\n", 
     1159        Log(("emInterpretLockBitTest %s: %VGv imm%d=%RX64 -> emulation failed due to page fault!\n",
    11601160             emGetMnemonic(pCpu), GCPtrPar1, pCpu->param2.size*8, ValPar2));
    11611161        return VERR_EM_INTERPRETER;
     
    13951395    }
    13961396    else
    1397     {   
    1398         if (!cTransfers) 
     1397    {
     1398        if (!cTransfers)
    13991399            return VINF_SUCCESS;
    14001400
     
    15171517    else
    15181518        eflags = EMEmulateCmpXchg(pvParam1, &pRegFrame->rax, valpar, pCpu->param2.size);
    1519    
     1519
    15201520    LogFlow(("%s %VGv rax=%RX64 %RX64 ZF=%d\n", pszInstr, GCPtrPar1, pRegFrame->rax, valpar, !!(eflags & X86_EFL_ZF)));
    15211521
     
    20432043        rc = DISFetchReg64(pRegFrame, SrcRegGen, &val);
    20442044    }
    2045     else 
     2045    else
    20462046    {
    20472047        uint32_t val32;
     
    20592059#ifdef IN_GC
    20602060            /* CR0.WP and CR0.AM changes require a reschedule run in ring 3. */
    2061             if (    (val    & (X86_CR0_WP | X86_CR0_AM)) 
     2061            if (    (val    & (X86_CR0_WP | X86_CR0_AM))
    20622062                !=  (oldval & (X86_CR0_WP | X86_CR0_AM)))
    20632063                return VERR_EM_INTERPRETER;
     
    22002200        rc = DISFetchReg64(pRegFrame, SrcRegGen, &val);
    22012201    }
    2202     else 
     2202    else
    22032203    {
    22042204        uint32_t val32;
     
    22072207    }
    22082208
    2209     if (VBOX_SUCCESS(rc))
    2210     {
    2211         /* @todo: we don't fail if illegal bits are set/cleared for e.g. dr7 */
     2209    if (RT_SUCCESS(rc))
     2210    {
     2211        /** @todo we don't fail if illegal bits are set/cleared for e.g. dr7 */
    22122212        rc = CPUMSetGuestDRx(pVM, DestRegDrx, val);
    2213         if (VBOX_SUCCESS(rc))
     2213        if (RT_SUCCESS(rc))
    22142214            return rc;
    22152215        AssertMsgFailed(("CPUMSetGuestDRx %d failed\n", DestRegDrx));
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