Changeset 96491 in vbox
- Timestamp:
- Aug 25, 2022 2:22:17 PM (2 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r96407 r96491 8266 8266 * @returns Strict VBox status code. 8267 8267 * @param pVCpu The cross context virtual CPU structure of the calling thread. 8268 * @param off Offset from the top of the stack. This is zero 8269 * except in the retf case. 8268 8270 * @param cbMem The number of bytes to pop from the stack. 8269 8271 * @param ppvMem Where to return the pointer to the stack memory. … … 8273 8275 * called. 8274 8276 */ 8275 VBOXSTRICTRC iemMemStackPopContinueSpecial(PVMCPUCC pVCpu, size_t cbMem, void const **ppvMem, uint64_t *puNewRsp) RT_NOEXCEPT 8277 VBOXSTRICTRC iemMemStackPopContinueSpecial(PVMCPUCC pVCpu, size_t off, size_t cbMem, 8278 void const **ppvMem, uint64_t *puNewRsp) RT_NOEXCEPT 8276 8279 { 8277 8280 Assert(cbMem < UINT8_MAX); 8278 8281 RTUINT64U NewRsp; 8279 8282 NewRsp.u = *puNewRsp; 8280 RTGCPTR GCPtrTop = iemRegGetRspForPopEx(pVCpu, &NewRsp, 8); 8283 RTGCPTR GCPtrTop = iemRegGetRspForPopEx(pVCpu, &NewRsp, off + cbMem); 8284 /** @todo The *puNewRsp value is never used by any of callers, so dispense 8285 * with it or convert it to a value-in-only parameter? */ 8281 8286 *puNewRsp = NewRsp.u; 8282 return iemMemMap(pVCpu, (void **)ppvMem, cbMem, X86_SREG_SS, GCPtrTop , IEM_ACCESS_STACK_R,8287 return iemMemMap(pVCpu, (void **)ppvMem, cbMem, X86_SREG_SS, GCPtrTop + off, IEM_ACCESS_STACK_R, 8283 8288 0 /* checked in iemMemStackPopBeginSpecial */); 8284 8289 } -
trunk/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp
r96407 r96491 2362 2362 { 2363 2363 /* Read the outer stack pointer stored *after* the parameters. */ 2364 rcStrict = iemMemStackPopContinueSpecial(pVCpu, cbPop +cbRetPtr, &uPtrFrame.pv, &uNewRsp);2364 rcStrict = iemMemStackPopContinueSpecial(pVCpu, cbPop /*off*/, cbRetPtr, &uPtrFrame.pv, &uNewRsp); 2365 2365 if (rcStrict != VINF_SUCCESS) 2366 2366 return rcStrict; 2367 2368 uPtrFrame.pu8 += cbPop; /* Skip the parameters. */2369 2367 2370 2368 uint16_t uNewOuterSs; … … 2385 2383 uNewOuterSs = uPtrFrame.pu16[4]; 2386 2384 } 2387 uPtrFrame.pu8 -= cbPop; /* Put uPtrFrame back the way it was. */2388 2385 rcStrict = iemMemStackPopDoneSpecial(pVCpu, uPtrFrame.pv); 2389 2386 if (RT_LIKELY(rcStrict == VINF_SUCCESS)) … … 3091 3088 VBOXSTRICTRC rcStrict; 3092 3089 RTCPTRUNION uFrame; 3093 rcStrict = iemMemStackPopContinueSpecial(pVCpu, 24, &uFrame.pv, &uNewRsp);3090 rcStrict = iemMemStackPopContinueSpecial(pVCpu, 0 /*off*/, 24 /*cbMem*/, &uFrame.pv, &uNewRsp); 3094 3091 if (rcStrict != VINF_SUCCESS) 3095 3092 return rcStrict; … … 3330 3327 if (enmEffOpSize == IEMMODE_32BIT) 3331 3328 { 3332 rcStrict = iemMemStackPopContinueSpecial(pVCpu, 8, &uFrame.pv, &uNewRsp);3329 rcStrict = iemMemStackPopContinueSpecial(pVCpu, 0/*off*/, 8 /*cbMem*/, &uFrame.pv, &uNewRsp); 3333 3330 if (rcStrict != VINF_SUCCESS) 3334 3331 return rcStrict; … … 3341 3338 else 3342 3339 { 3343 rcStrict = iemMemStackPopContinueSpecial(pVCpu, 4, &uFrame.pv, &uNewRsp);3340 rcStrict = iemMemStackPopContinueSpecial(pVCpu, 0 /*off*/, 4 /*cbMem*/, &uFrame.pv, &uNewRsp); 3344 3341 if (rcStrict != VINF_SUCCESS) 3345 3342 return rcStrict; -
trunk/src/VBox/VMM/include/IEMInternal.h
r96454 r96491 3631 3631 VBOXSTRICTRC iemMemStackPopBeginSpecial(PVMCPUCC pVCpu, size_t cbMem, uint32_t cbAlign, 3632 3632 void const **ppvMem, uint64_t *puNewRsp) RT_NOEXCEPT; 3633 VBOXSTRICTRC iemMemStackPopContinueSpecial(PVMCPUCC pVCpu, size_t cbMem, void const **ppvMem, uint64_t *puNewRsp) RT_NOEXCEPT; 3633 VBOXSTRICTRC iemMemStackPopContinueSpecial(PVMCPUCC pVCpu, size_t off, size_t cbMem, 3634 void const **ppvMem, uint64_t *puNewRsp) RT_NOEXCEPT; 3634 3635 VBOXSTRICTRC iemMemStackPopDoneSpecial(PVMCPUCC pVCpu, void const *pvMem) RT_NOEXCEPT; 3635 3636 VBOXSTRICTRC iemMemStackPopU16(PVMCPUCC pVCpu, uint16_t *pu16Value) RT_NOEXCEPT;
Note:
See TracChangeset
for help on using the changeset viewer.