VirtualBox

Changeset 40072 in vbox for trunk/src


Ignore:
Timestamp:
Feb 10, 2012 9:49:12 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
76206
Message:

hacking in progress...

Location:
trunk/src/VBox/VMM
Files:
4 edited

Legend:

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

    r40042 r40072  
    32483248
    32493249
     3250/** @name   FPU access and helpers.
     3251 *
     3252 * @{
     3253 */
     3254
     3255
     3256/**
     3257 * Hook for preparing to use the host FPU.
     3258 *
     3259 * This is necessary in ring-0 and raw-mode context.
     3260 *
     3261 * @param   pIemCpu             The IEM per CPU data.
     3262 */
     3263DECLINLINE(void) iemFpuPrepareUsage(PIEMCPU pIemCpu)
     3264{
     3265#ifdef IN_RING3
     3266    NOREF(pIemCpu);
     3267#else
     3268# error "Implement me"
     3269#endif
     3270}
     3271
     3272
     3273/**
     3274 * Pushes a FPU result onto the FPU stack after inspecting the resulting
     3275 * statuses.
     3276 *
     3277 * @param   pIemCpu             The IEM per CPU data.
     3278 * @param   pResult             The FPU operation result to push.
     3279 */
     3280static void iemFpuPushResult(PIEMCPU pIemCpu, PIEMFPURESULT pResult)
     3281{
     3282    PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
     3283
     3284    if (pResult->u16FSW & (1))
     3285    {
     3286        /** @todo continue here later... */
     3287    }
     3288
     3289}
     3290
     3291
     3292/** @}  */
     3293
     3294
    32503295/** @name   Memory access.
    32513296 *
     
    49755020#define IEM_MC_REF_LOCAL(a_pRefArg, a_Local)            (a_pRefArg) = &(a_Local)
    49765021#define IEM_MC_ARG(a_Type, a_Name, a_iArg)              a_Type a_Name
    4977 #define IEM_MC_ARG_CONST(a_Type, a_Name, a_Value, a_iArg)   a_Type const a_Name = (a_Value)
     5022#define IEM_MC_ARG_CONST(a_Type, a_Name, a_Value, a_iArg)       a_Type const a_Name = (a_Value)
     5023#define IEM_MC_ARG_LOCAL_REF(a_Type, a_Name, a_Local, a_iArg)   a_Type const a_Name = &(a_Local)
    49785024#define IEM_MC_ARG_LOCAL_EFLAGS(a_pName, a_Name, a_iArg) \
    49795025    uint32_t a_Name; \
     
    53715417 */
    53725418#define IEM_MC_DEFER_TO_CIMPL_3(a_pfnCImpl, a0, a1, a2) (a_pfnCImpl)(pIemCpu, pIemCpu->offOpcode, a0, a1, a2)
     5419
     5420/**
     5421 * Calls a FPU assembly implementation taking two visible arguments.
     5422 *
     5423 * This shall be used without any IEM_MC_BEGIN or IEM_END macro surrounding it.
     5424 *
     5425 * @param   a_pfnAImpl      Pointer to the assembly FPU routine.
     5426 * @param   a0              The first extra argument.
     5427 * @param   a1              The second extra argument.
     5428 */
     5429#define IEM_MC_CALL_FPU_AIMPL_2(a_pfnAImpl, a0, a1) \
     5430    do { \
     5431        iemFpuPrepareUsage(pIemCpu); \
     5432        a_pfnAImpl(&pIemCpu->CTX_SUFF(pCtx)->fpu, (a0), (a1)); \
     5433    } while (0)
     5434/** Pushes FPU result onto the stack. */
     5435#define IEM_MC_PUSH_FPU_RESULT(a_FpuData) iemFpuPushResult(pIemCpu, &a_FpuData)
     5436
    53735437
    53745438#define IEM_MC_IF_EFL_BIT_SET(a_fBit)                   if (pIemCpu->CTX_SUFF(pCtx)->eflags.u & (a_fBit)) {
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r40042 r40072  
    1039010390    IEMOP_MNEMONIC("fld m32r");
    1039110391    IEMOP_HLP_NO_LOCK_PREFIX();
    10392 #if 0
    10393 
    10394     IEM_MC_BEGIN(3, 2);
    10395     IEM_MC_LOCAL(RTFLOAT32U,    r32Tmp);
    10396     IEM_MC_LOCAL(RTGCPTR,       GCPtrEffSrc);
     10392
     10393    IEM_MC_BEGIN(2, 2);
     10394    IEM_MC_LOCAL(RTGCPTR,               GCPtrEffSrc);
     10395    IEM_MC_LOCAL(IEMFPURESULT,          FpuRes);
     10396    IEM_MC_ARG_LOCAL_REF(PIEMFPURESULT, pFpuRes,    FpuRes, 0);
     10397    IEM_MC_ARG(RTFLOAT32U,              r32Val,             1);
    1039710398
    1039810399    IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffSrc, bRm);
    10399     IEM_MC_FETCH_MEM_R32(r32Tmp, pIemCpu->iEffSeg, GCPtrEffSrc);
    10400 
    10401 
    1040210400    IEM_MC_MAYBE_RAISE_DEVICE_NOT_AVAILABLE();
    1040310401    IEM_MC_MAYBE_RAISE_FPU_XCPT();
    10404 
    10405 
     10402    IEM_MC_FETCH_MEM_R32(r32Val, pIemCpu->iEffSeg, GCPtrEffSrc);
     10403//    IEM_MC_CALL_FPU_AIMPL_2(iemAImpl_fpu_r32_to_r80, pFpuRes, r32Val);
     10404
     10405    IEM_MC_PUSH_FPU_RESULT(FpuRes);
    1040610406    IEM_MC_ADVANCE_RIP();
     10407
    1040710408    IEM_MC_END();
    1040810409    return VINF_SUCCESS;
    10409 #else
    10410     AssertFailedReturn(VERR_NOT_IMPLEMENTED);
    10411 #endif
    1041210410}
    1041310411
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r40042 r40072  
    6868} IEMMODEX;
    6969AssertCompileSize(IEMMODEX, 4);
     70
     71
     72/**
     73 * A FPU result.
     74 */
     75typedef struct IEMFPURESULT
     76{
     77    /** The output value. */
     78    RTFLOAT80U      r80Result;
     79    /** The output status. */
     80    uint16_t        u16FSW;
     81} IEMFPURESULT;
     82/** Pointer to a FPU result. */
     83typedef IEMFPURESULT *PIEMFPURESULT;
     84/** Pointer to a const FPU result. */
     85typedef IEMFPURESULT const *PCIEMFPURESULT;
    7086
    7187
     
    688704
    689705
     706/** @name FPU operations taking a 32-bit float argument
     707 * @{ */
     708typedef IEM_DECL_IMPL_TYPE(void, FNIEMAIMPLFPUR32,(PCX86FXSTATE pFpuState, PIEMFPURESULT pFpuRes, RTFLOAT32U r32Val));
     709typedef FNIEMAIMPLFPUR32  *PFNIEMAIMPLFPUR32;
     710FNIEMAIMPLFPUR32 iemAImpl_fpu_r32_to_r80;
     711/** @} */
     712
     713
    690714/** @name Function tables.
    691715 * @{
  • trunk/src/VBox/VMM/testcase/tstIEMCheckMc.cpp

    r40001 r40072  
    222222    AssertCompile((a_iArg) < cArgs); \
    223223    a_Type const a_Name = (a_Value); \
     224    NOREF(a_Name)
     225#define IEM_MC_ARG_LOCAL_REF(a_Type, a_Name, a_Local, a_iArg) \
     226    RT_CONCAT(iArgCheck_, a_iArg) = 1; NOREF(RT_CONCAT(iArgCheck_,a_iArg)); \
     227    int RT_CONCAT3(iArgCheck_,a_iArg,a_Name); NOREF(RT_CONCAT3(iArgCheck_,a_iArg,a_Name)); \
     228    AssertCompile((a_iArg) < cArgs); \
     229    a_Type const a_Name = &(a_Local); \
    224230    NOREF(a_Name)
    225231#define IEM_MC_ARG_LOCAL_EFLAGS(a_pName, a_Name, a_iArg) \
     
    347353    do { CHK_GCPTR(a_GCPtrMem); CHK_CONST(uint8_t, a_offDisp); CHK_TYPE(uint64_t, a_u64Dst); } while (0)
    348354
     355#define IEM_MC_FETCH_MEM_R32(a_r32Dst, a_iSeg, a_GCPtrMem)              do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(RTFLOAT32U, a_r32Dst);} while (0)
     356#define IEM_MC_FETCH_MEM_R64(a_r64Dst, a_iSeg, a_GCPtrMem)              do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(RTFLOAT64U, a_r64Dst);} while (0)
     357#define IEM_MC_FETCH_MEM_R80(a_r80Dst, a_iSeg, a_GCPtrMem)              do { CHK_GCPTR(a_GCPtrMem); CHK_TYPE(RTFLOAT80U, a_r80Dst);} while (0)
     358
    349359#define IEM_MC_FETCH_MEM_U8_ZX_U16(a_u16Dst, a_iSeg, a_GCPtrMem)        do { CHK_GCPTR(a_GCPtrMem); } while (0)
    350360#define IEM_MC_FETCH_MEM_U8_ZX_U32(a_u32Dst, a_iSeg, a_GCPtrMem)        do { CHK_GCPTR(a_GCPtrMem); } while (0)
     
    390400#define IEM_MC_DEFER_TO_CIMPL_3(a_pfnCImpl, a0, a1, a2)                 (VINF_SUCCESS)
    391401
     402#define IEM_MC_CALL_FPU_AIMPL_2(a_pfnAImpl, a0, a1)                     do { } while (0)
     403#define IEM_MC_PUSH_FPU_RESULT(a_FpuData)                               do { } while (0)
     404
    392405#define IEM_MC_IF_EFL_BIT_SET(a_fBit)                                   if (g_fRandom) {
    393406#define IEM_MC_IF_EFL_BIT_NOT_SET(a_fBit)                               if (g_fRandom) {
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