Changeset 103734 in vbox
- Timestamp:
- Mar 8, 2024 12:36:00 AM (11 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp
r103333 r103734 4480 4480 pVCpu->cpum.GstCtx.cs.fFlags = CPUMSELREG_FLAGS_VALID; 4481 4481 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 } 4482 4498 pVCpu->cpum.GstCtx.ss.Sel = uNewSs | 3; 4483 4499 pVCpu->cpum.GstCtx.ss.ValidSel = uNewSs | 3; 4484 4500 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);4487 4501 /** @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. */ 4491 4503 4492 4504 if (!f32Bit)
Note:
See TracChangeset
for help on using the changeset viewer.