VirtualBox

Changeset 9411 in vbox for trunk


Ignore:
Timestamp:
Jun 5, 2008 11:41:38 AM (17 years ago)
Author:
vboxsync
Message:

Use a union for esp & rsp, so they are in-sync.

Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/cpum.h

    r9354 r9411  
    117117        uint64_t        rcx;
    118118    };
    119     /* Note: we rely on the exact layout, because we use lss esp, [] in the switcher */
    120     uint32_t        esp;
    121     RTSEL           ss;
    122     RTSEL           ssPadding;
    123     /* Note: no overlap with esp here. */
    124     uint64_t        rsp;
    125 
    126     RTSEL           gs;
    127     RTSEL           gsPadding;
    128     RTSEL           fs;
    129     RTSEL           fsPadding;
    130     RTSEL           es;
    131     RTSEL           esPadding;
    132     RTSEL           ds;
    133     RTSEL           dsPadding;
    134     RTSEL           cs;
    135     RTSEL           csPadding[3];  /* 3 words to force 8 byte alignment for the remainder */
     119    union
     120    {
     121        uint32_t        esp;
     122        uint64_t        rsp;
     123    };
     124    /* Note: lss esp, [] in the switcher needs some space, so we reserve it here instead of relying on the exact esp & ss layout as before. */
     125    uint32_t            lss_esp;
     126    RTSEL               ss;
     127    RTSEL               ssPadding;
     128
     129    RTSEL               gs;
     130    RTSEL               gsPadding;
     131    RTSEL               fs;
     132    RTSEL               fsPadding;
     133    RTSEL               es;
     134    RTSEL               esPadding;
     135    RTSEL               ds;
     136    RTSEL               dsPadding;
     137    RTSEL               cs;
     138    RTSEL               csPadding[3];  /* 3 words to force 8 byte alignment for the remainder */
    136139
    137140    union
     
    217220        uint64_t        rcx;
    218221    };
    219     /* Note: we rely on the exact layout, because we use lss esp, [] in the switcher */
    220     uint32_t        esp;
    221     RTSEL           ss;
    222     RTSEL           ssPadding;
    223     /* Note: no overlap with esp here. */
    224     uint64_t        rsp;
    225 
    226     RTSEL           gs;
    227     RTSEL           gsPadding;
    228     RTSEL           fs;
    229     RTSEL           fsPadding;
    230     RTSEL           es;
    231     RTSEL           esPadding;
    232     RTSEL           ds;
    233     RTSEL           dsPadding;
    234     RTSEL           cs;
    235     RTSEL           csPadding[3];  /* 3 words to force 8 byte alignment for the remainder */
     222    union
     223    {
     224        uint32_t        esp;
     225        uint64_t        rsp;
     226    };
     227    /* Note: lss esp, [] in the switcher needs some space, so we reserve it here instead of relying on the exact esp & ss layout as before (prevented us from using a union with rsp). */
     228    uint32_t            lss_esp;
     229    RTSEL               ss;
     230    RTSEL               ssPadding;
     231
     232    RTSEL               gs;
     233    RTSEL               gsPadding;
     234    RTSEL               fs;
     235    RTSEL               fsPadding;
     236    RTSEL               es;
     237    RTSEL               esPadding;
     238    RTSEL               ds;
     239    RTSEL               dsPadding;
     240    RTSEL               cs;
     241    RTSEL               csPadding[3];  /* 3 words to force 8 byte alignment for the remainder */
    236242
    237243    union
  • trunk/include/VBox/cpum.mac

    r8155 r9411  
    4545    .edx            resq    1
    4646    .ecx            resq    1
    47     .esp            resd    1
     47    .esp            resq    1
     48    .lss_esp        resd    1
    4849    .ss             resw    1
    4950    .ssPadding      resw    1
    50     .rsp            resq    1
    5151    .gs             resw    1
    5252    .gsPadding      resw    1
     
    108108    .edx            resq    1
    109109    .ecx            resq    1
    110     .esp            resd    1
     110    .esp            resq    1
     111    .lss_esp        resd    1
    111112    .ss             resw    1
    112113    .ssPadding      resw    1
    113     .rsp            resq    1
    114114    .gs             resw    1
    115115    .gsPadding      resw    1
  • trunk/include/iprt/cdefs.h

    r9251 r9411  
    546546# define DECLGCCALLBACKMEMBER(type, name, args)  type (RTCALL * name) args
    547547#else
    548 # define DECLGCCALLBACKMEMBER(type, name, args)  RTGCPTR32 name
     548# define DECLGCCALLBACKMEMBER(type, name, args)  RTRCPTR name
    549549#endif
    550550
  • trunk/src/VBox/VMM/CPUMInternal.mac

    r9354 r9411  
    181181    .Hyper.edx            resq    1
    182182    .Hyper.ecx            resq    1
    183     .Hyper.esp            resd    1
     183    .Hyper.esp            resq    1
     184    .Hyper.lss_esp        resd    1
    184185    .Hyper.ss             resw    1
    185186    .Hyper.ssPadding      resw    1
    186     .Hyper.rsp            resq    1
    187187    .Hyper.gs             resw    1
    188188    .Hyper.gsPadding      resw    1
     
    297297    .Guest.edx            resq    1
    298298    .Guest.ecx            resq    1
    299     .Guest.esp            resd    1
     299    .Guest.esp            resq    1
     300    .Guest.lss_esp        resd    1
    300301    .Guest.ss             resw    1
    301302    .Guest.ssPadding      resw    1
    302     .Guest.rsp            resq    1
    303303    .Guest.gs             resw    1
    304304    .Guest.gsPadding      resw    1
  • trunk/src/VBox/VMM/VMMR0/HWACCMR0.cpp

    r9409 r9411  
    738738    /* Setup the register and mask according to the current execution mode. */
    739739    if (pCtx->msrEFER & MSR_K6_EFER_LMA)
    740         pVM->hwaccm.s.u64RegisterMask = 0xFFFFFFFFFFFFFFFFULL;
     740        pVM->hwaccm.s.u64RegisterMask = UINT64_C(0xFFFFFFFFFFFFFFFF);
    741741    else
    742         pVM->hwaccm.s.u64RegisterMask = 0xFFFFFFFFULL;
     742        pVM->hwaccm.s.u64RegisterMask = UINT64_C(0xFFFFFFFF);
    743743
    744744    rc  = HWACCMR0Globals.pfnEnterSession(pVM, &HWACCMR0Globals.aCpuInfo[idCpu]);
  • trunk/src/VBox/VMM/VMMR0/HWSVMR0.cpp

    r9407 r9411  
    686686
    687687    /* EIP, ESP and EFLAGS */
    688     pVMCB->guest.u64RIP    = pCtx->eip;
    689     pVMCB->guest.u64RSP    = pCtx->esp;
     688    pVMCB->guest.u64RIP    = pCtx->rip;
     689    pVMCB->guest.u64RSP    = pCtx->rsp;
    690690    pVMCB->guest.u64RFlags = pCtx->eflags.u32;
    691691
     
    694694
    695695    /* RAX/EAX too, as VMRUN uses RAX as an implicit parameter. */
    696     pVMCB->guest.u64RAX    = pCtx->eax;
     696    pVMCB->guest.u64RAX    = pCtx->rax;
    697697
    698698    /* vmrun will fail without MSR_K6_EFER_SVME. */
     
    10461046
    10471047    /* Let's first sync back eip, esp, and eflags. */
    1048     pCtx->eip        = pVMCB->guest.u64RIP;
    1049     pCtx->esp        = pVMCB->guest.u64RSP;
     1048    pCtx->rip        = pVMCB->guest.u64RIP;
     1049    pCtx->rsp        = pVMCB->guest.u64RSP;
    10501050    pCtx->eflags.u32 = pVMCB->guest.u64RFlags;
    10511051    /* eax is saved/restore across the vmrun instruction */
    1052     pCtx->eax        = pVMCB->guest.u64RAX;
     1052    pCtx->rax        = pVMCB->guest.u64RAX;
    10531053
    10541054    /* Guest CPU context: ES, CS, SS, DS, FS, GS. */
  • trunk/src/VBox/VMM/VMMR0/HWVMXR0.cpp

    r9407 r9411  
    899899
    900900    /* EIP, ESP and EFLAGS */
    901     rc  = VMXWriteVMCS(VMX_VMCS_GUEST_RIP,              pCtx->eip);
    902     rc |= VMXWriteVMCS(VMX_VMCS_GUEST_RSP,              pCtx->esp);
     901    rc  = VMXWriteVMCS(VMX_VMCS_GUEST_RIP,              pCtx->rip);
     902    rc |= VMXWriteVMCS(VMX_VMCS_GUEST_RSP,              pCtx->rsp);
    903903    AssertRC(rc);
    904904
     
    951951    val = (pVM->hwaccm.s.vmx.msr.vmx_entry & 0xFFFFFFFF);
    952952
    953     /* 64 bits guest mode? */
    954     if (pCtx->msrEFER & MSR_K6_EFER_LMA)
    955         val |= VMX_VMCS_CTRL_ENTRY_CONTROLS_IA64_MODE;
    956 
    957953    /* Mask away the bits that the CPU doesn't support */
    958954    /** @todo make sure they don't conflict with the above requirements. */
     
    961957    rc = VMXWriteVMCS(VMX_VMCS_CTRL_ENTRY_CONTROLS, val);
    962958    AssertRC(rc);
     959
     960    /* 64 bits guest mode? */
     961    if (pCtx->msrEFER & MSR_K6_EFER_LMA)
     962        val |= VMX_VMCS_CTRL_ENTRY_CONTROLS_IA64_MODE;
    963963
    964964    /* Done. */
     
    13381338    AssertRC(rc);
    13391339
     1340    /* Let's first sync back eip, esp, and eflags. */
     1341    rc = VMXReadVMCS(VMX_VMCS_GUEST_RIP,              &val);
     1342    AssertRC(rc);
     1343    pCtx->rip               = val;
     1344    rc = VMXReadVMCS(VMX_VMCS_GUEST_RSP,              &val);
     1345    AssertRC(rc);
     1346    pCtx->rsp               = val;
     1347    rc = VMXReadVMCS(VMX_VMCS_GUEST_RFLAGS,           &val);
     1348    AssertRC(rc);
     1349    pCtx->eflags.u32        = val;
     1350
    13401351    /* Take care of instruction fusing (sti, mov ss) */
    13411352    rc |= VMXReadVMCS(VMX_VMCS_GUEST_INTERRUPTIBILITY_STATE, &val);
     
    13491360    else
    13501361        VM_FF_CLEAR(pVM, VM_FF_INHIBIT_INTERRUPTS);
    1351 
    1352     /* Let's first sync back eip, esp, and eflags. */
    1353     rc = VMXReadVMCS(VMX_VMCS_GUEST_RIP,              &val);
    1354     AssertRC(rc);
    1355     pCtx->eip               = val;
    1356     rc = VMXReadVMCS(VMX_VMCS_GUEST_RSP,              &val);
    1357     AssertRC(rc);
    1358     pCtx->esp               = val;
    1359     rc = VMXReadVMCS(VMX_VMCS_GUEST_RFLAGS,           &val);
    1360     AssertRC(rc);
    1361     pCtx->eflags.u32        = val;
    13621362
    13631363    /* Real mode emulation using v86 mode with CR4.VME (interrupt redirection using the int bitmap in the TSS) */
  • trunk/src/VBox/VMM/VMMSwitcher/AMD64ToPAE.asm

    r8155 r9411  
    453453    lidt    [edx + CPUM.Hyper.idtr]
    454454
    455     ; Setup stack
     455    ; Setup stack; use the lss_esp, ss pair for lss
    456456    DEBUG_CHAR('3')
    457     lss     esp, [edx + CPUM.Hyper.esp]
     457    mov     eax, [edx + CPUM.Hyper.esp]
     458    mov     [edx + CPUM.Hyper.lss_esp], eax
     459    lss     esp, [edx + CPUM.Hyper.lss_esp]
    458460
    459461    ; Restore TSS selector; must mark it as not busy before using ltr (!)
  • trunk/src/VBox/VMM/VMMSwitcher/PAEand32Bit.mac

    r8155 r9411  
    289289    mov     fs, eax
    290290
    291     ; Setup stack
     291    ; Setup stack; use the lss_esp, ss pair for lss
    292292    DEBUG_CHAR('3')
     293    mov     eax, [edx + CPUM.Hyper.esp]
     294    mov     [edx + CPUM.Hyper.lss_esp], eax
    293295    lss     esp, [edx + CPUM.Hyper.esp]
    294296
Note: See TracChangeset for help on using the changeset viewer.

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