VirtualBox

Changeset 103734 in vbox


Ignore:
Timestamp:
Mar 8, 2024 12:36:00 AM (11 months ago)
Author:
vboxsync
Message:

VMM/IEM: Fixed bug in sysret when targeting intel CPUs where SS.ATTR/LIMIT/BASE are all reloaded unlike what AMD does and IEM did. This would cause the init process to #GP on 64-bit knoppix 8.6 (based on linux 5.3). bugref:8109

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp

    r103333 r103734  
    44804480    pVCpu->cpum.GstCtx.cs.fFlags     = CPUMSELREG_FLAGS_VALID;
    44814481
     4482    /* The SS hidden bits remains unchanged says AMD, we presume they set DPL to 3.
     4483       Intel (and presuably VIA) OTOH sets loads valid ring-3 values it seems, see
     4484       X86_BUG_SYSRET_SS_ATTRS in linux 5.3. */
     4485    if (IEM_IS_GUEST_CPU_AMD(pVCpu))
     4486    {
     4487        Log(("sysret: ss:rsp=%04x:%08RX64 attr=%x -> %04x:%08RX64 attr=%#x\n", pVCpu->cpum.GstCtx.ss.Sel, pVCpu->cpum.GstCtx.rsp, pVCpu->cpum.GstCtx.ss.Attr.u, uNewSs | 3, pVCpu->cpum.GstCtx.rsp, pVCpu->cpum.GstCtx.ss.Attr.u | (3 << X86DESCATTR_DPL_SHIFT) ));
     4488        pVCpu->cpum.GstCtx.ss.Attr.u     |= (3 << X86DESCATTR_DPL_SHIFT);
     4489    }
     4490    else
     4491    {
     4492        Log(("sysret: ss:rsp=%04x:%08RX64 attr=%x -> %04x:%08RX64 attr=%#x\n", pVCpu->cpum.GstCtx.ss.Sel, pVCpu->cpum.GstCtx.rsp, pVCpu->cpum.GstCtx.ss.Attr.u, uNewSs | 3, pVCpu->cpum.GstCtx.rsp, X86DESCATTR_P | X86DESCATTR_G | X86DESCATTR_D | X86DESCATTR_DT | X86_SEL_TYPE_RW_ACC | (3 << X86DESCATTR_DPL_SHIFT) ));
     4493        pVCpu->cpum.GstCtx.ss.Attr.u      = X86DESCATTR_P | X86DESCATTR_G | X86DESCATTR_D | X86DESCATTR_DT | X86_SEL_TYPE_RW_ACC
     4494                                          | (3 << X86DESCATTR_DPL_SHIFT);
     4495        pVCpu->cpum.GstCtx.ss.u64Base     = 0;
     4496        pVCpu->cpum.GstCtx.ss.u32Limit    = UINT32_MAX;
     4497    }
    44824498    pVCpu->cpum.GstCtx.ss.Sel        = uNewSs | 3;
    44834499    pVCpu->cpum.GstCtx.ss.ValidSel   = uNewSs | 3;
    44844500    pVCpu->cpum.GstCtx.ss.fFlags     = CPUMSELREG_FLAGS_VALID;
    4485     /* The SS hidden bits remains unchanged says AMD. To that I say "Yeah, right!". */
    4486     pVCpu->cpum.GstCtx.ss.Attr.u    |= (3 << X86DESCATTR_DPL_SHIFT);
    44874501    /** @todo Testcase: verify that SS.u1Long and SS.u1DefBig are left unchanged
    4488      *        on sysret. */
    4489     /** @todo intel documents SS.BASE and SS.LIMIT as being set as well as the
    4490      *        TYPE, S, DPL, P, B and G flag bits. */
     4502     *        on sysret on AMD and not on intel. */
    44914503
    44924504    if (!f32Bit)
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