VirtualBox

Changeset 39993 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Feb 3, 2012 7:30:47 PM (13 years ago)
Author:
vboxsync
Message:

tstX86-1: Some fxsave and fxrstor tests.

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

Legend:

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

    r39990 r39993  
    32663266
    32673267/** Opcode 0x0f 0xae. */
    3268 FNIEMOP_STUB(iemOp_Grp15); /** @todo next up: fxrstor */
     3268FNIEMOP_DEF(iemOp_Grp15)
     3269{
     3270    uint8_t bRm; IEM_OPCODE_GET_NEXT_U8(&bRm);
     3271    IEMOP_HLP_NO_LOCK_PREFIX(); /** @todo should probably not be raised until we've fetched all the opcode bytes? */
     3272    if ((bRm & X86_MODRM_MOD_MASK) != (3 << X86_MODRM_MOD_SHIFT))
     3273    {
     3274        ////
     3275    }
     3276    else
     3277    {
     3278
     3279        if (pIemCpu->offOpcode == 2 || )
     3280        {
     3281        }
     3282        pIemCpu->
     3283        switch (pIemCpu->fPrefixes & (IEM_OP_PRF_REPZ | IEM_OP_PRF_REPNZ | IEM_OP_PRF_SIZE_OP))
     3284        {
     3285            case IEM_OP_PRF_SIZE_OP:
     3286
     3287
     3288            case IEM_OP_PRF_REPZ:
     3289        }
     3290    }
     3291
     3292
     3293
     3294    if ((bRm & X86_MODRM_REG_MASK) != (0 << X86_MODRM_REG_SHIFT)) /* only mov Eb,Ib in this group. */
     3295        return IEMOP_RAISE_INVALID_LOCK_PREFIX();
     3296    IEMOP_MNEMONIC("mov Eb,Ib");
     3297
     3298    if ((bRm & X86_MODRM_MOD_MASK) == (3 << X86_MODRM_MOD_SHIFT))
     3299    {
     3300        /* register access */
     3301        uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
     3302        IEM_MC_BEGIN(0, 0);
     3303        IEM_MC_STORE_GREG_U8((bRm & X86_MODRM_RM_MASK) | pIemCpu->uRexB, u8Imm);
     3304        IEM_MC_ADVANCE_RIP();
     3305        IEM_MC_END();
     3306    }
     3307    else
     3308    {
     3309        /* memory access. */
     3310        IEM_MC_BEGIN(0, 1);
     3311        IEM_MC_LOCAL(RTGCPTR, GCPtrEffDst);
     3312        IEM_MC_CALC_RM_EFF_ADDR(GCPtrEffDst, bRm);
     3313        uint8_t u8Imm; IEM_OPCODE_GET_NEXT_U8(&u8Imm);
     3314        IEM_MC_STORE_MEM_U8(pIemCpu->iEffSeg, GCPtrEffDst, u8Imm);
     3315        IEM_MC_ADVANCE_RIP();
     3316        IEM_MC_END();
     3317    }
     3318    return VINF_SUCCESS;
     3319}
    32693320
    32703321
  • trunk/src/VBox/VMM/testcase/tstX86-1.cpp

    r39989 r39993  
    6767DECLASM(int32_t) x861_Test1(void);
    6868DECLASM(int32_t) x861_Test2(void);
     69DECLASM(int32_t) x861_Test3(void);
    6970
    7071
     
    159160#endif
    160161
     162
    161163int main()
    162164{
     
    198200         * Do the testing.
    199201         */
    200         RTTestSub(hTest, "part 1");
    201         int32_t rc = x861_Test1();
     202        int32_t rc;
     203#if 1
     204        RTTestSub(hTest, "Misc 1");
     205        rc = x861_Test1();
    202206        if (rc != 0)
    203207            RTTestFailed(hTest, "x861_Test1 -> %d", rc);
    204208
    205         RTTestSub(hTest, "part 2");
     209        RTTestSub(hTest, "Prefixes and groups");
    206210        rc = x861_Test2();
    207211        if (rc != 0)
    208212            RTTestFailed(hTest, "x861_Test2 -> %d", rc);
     213
     214#endif
     215        RTTestSub(hTest, "fxsave / fxrstor and #PFs");
     216        rc = x861_Test3();
     217        if (rc != 0)
     218            RTTestFailed(hTest, "x861_Test3 -> %d", rc);
    209219    }
    210220
  • trunk/src/VBox/VMM/testcase/tstX86-1A.asm

    r39989 r39993  
    5454;   Defined Constants And Macros                                              ;
    5555;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    56 %define X86_XCPT_UD 6
    57 %define X86_XCPT_GP 13
    58 %define X86_XCPT_PF 14
     56%define X86_XCPT_UD     6
     57%define X86_XCPT_GP     13
     58%define X86_XCPT_PF     14
     59
     60%define PAGE_SIZE       0x1000
    5961
    6062;; Reference a global variable
     
    7577%%trap_end:
    7678        mov     eax, __LINE__
    77         jmp     .failed
     79        jmp     .return
    7880BEGINDATA
    7981%%trapinfo: istruc TRAPINFO
     
    930932        SAVE_ALL_EPILOGUE
    931933        ret
    932 .failed2:
    933         mov     eax, -1
    934 .failed:
    935         jmp     .return
    936934
    937935.check_xmm0_zero_and_mm0_nz:
     
    10071005
    10081006;;
     1007; Tests how much fxsave and fxrstor actually accesses of their 512 memory
     1008; operand.
     1009;
     1010BEGINPROC   x861_Test3
     1011        SAVE_ALL_PROLOGUE
     1012
     1013        call    x861_LoadUniqueRegValuesSSE
     1014        mov     xDI, REF_GLOBAL(g_pbEfExecPage)
     1015
     1016        ; Check testcase preconditions.
     1017        fxsave  [xDI]
     1018        fxrstor [xDI]
     1019
     1020        add     xDI, PAGE_SIZE - 512
     1021        mov     xSI, xDI
     1022        fxsave  [xDI]
     1023        fxrstor [xDI]
     1024
     1025        ; 464:511 are available to software use.  Check that they are left
     1026        ; untouched by fxsave.
     1027        mov     eax, 0aabbccddh
     1028        mov     ecx, 512 / 4
     1029        cld
     1030        rep stosd
     1031        mov     xDI, xSI
     1032        fxsave  [xDI]
     1033
     1034        mov     ebx, 512
     1035.chech_software_area_loop:
     1036        cmp     [xDI + xBX - 4], eax
     1037        jne     .chech_software_area_done
     1038        sub     ebx, 4
     1039        jmp     .chech_software_area_loop
     1040.chech_software_area_done:
     1041        cmp     ebx, 464
     1042        mov     eax, __LINE__
     1043        ja      .return
     1044
     1045        ; Check that a save + restore + save cycle yield the same results.
     1046        mov     xBX, REF_GLOBAL(g_pbEfExecPage)
     1047        mov     xDI, xBX
     1048        mov     eax, 066778899h
     1049        mov     ecx, 512 * 2 / 4
     1050        cld
     1051        rep stosd
     1052        fxsave  [xBX]
     1053
     1054        call    x861_ClearRegistersSSE
     1055        mov     xBX, REF_GLOBAL(g_pbEfExecPage)
     1056        fxrstor [xBX]
     1057
     1058        fxsave  [xBX + 512]
     1059        mov     xSI, xBX
     1060        lea     xDI, [xBX + 512]
     1061        mov     ecx, 512
     1062        cld
     1063        repe cmpsb
     1064        mov     eax, __LINE__
     1065        jnz     .return
     1066
     1067
     1068        ; 464:511 are available to software use.  Let see how carefully access
     1069        ; to the full 512 bytes are checked...
     1070        call    x861_LoadUniqueRegValuesSSE
     1071        mov     xDI, REF_GLOBAL(g_pbEfExecPage)
     1072        add     xDI, PAGE_SIZE - 512
     1073        ShouldTrap X86_XCPT_PF, fxsave  [xDI + 16]
     1074        ShouldTrap X86_XCPT_PF, fxsave  [xDI + 32]
     1075        ShouldTrap X86_XCPT_PF, fxsave  [xDI + 48]
     1076        ShouldTrap X86_XCPT_PF, fxsave  [xDI + 64]
     1077        ShouldTrap X86_XCPT_PF, fxsave  [xDI + 80]
     1078        ShouldTrap X86_XCPT_PF, fxsave  [xDI + 96]
     1079        ShouldTrap X86_XCPT_PF, fxsave  [xDI + 128]
     1080        ShouldTrap X86_XCPT_PF, fxsave  [xDI + 144]
     1081        ShouldTrap X86_XCPT_PF, fxsave  [xDI + 160]
     1082        ShouldTrap X86_XCPT_PF, fxsave  [xDI + 176]
     1083        ShouldTrap X86_XCPT_PF, fxsave  [xDI + 192]
     1084        ShouldTrap X86_XCPT_PF, fxsave  [xDI + 208]
     1085        ShouldTrap X86_XCPT_PF, fxsave  [xDI + 224]
     1086        ShouldTrap X86_XCPT_PF, fxsave  [xDI + 240]
     1087        ShouldTrap X86_XCPT_PF, fxsave  [xDI + 256]
     1088        ShouldTrap X86_XCPT_PF, fxsave  [xDI + 384]
     1089        ShouldTrap X86_XCPT_PF, fxsave  [xDI + 432]
     1090        ShouldTrap X86_XCPT_PF, fxsave  [xDI + 496]
     1091
     1092        ShouldTrap X86_XCPT_PF, fxrstor [xDI + 16]
     1093        ShouldTrap X86_XCPT_PF, fxrstor [xDI + 32]
     1094        ShouldTrap X86_XCPT_PF, fxrstor [xDI + 48]
     1095        ShouldTrap X86_XCPT_PF, fxrstor [xDI + 64]
     1096        ShouldTrap X86_XCPT_PF, fxrstor [xDI + 80]
     1097        ShouldTrap X86_XCPT_PF, fxrstor [xDI + 96]
     1098        ShouldTrap X86_XCPT_PF, fxrstor [xDI + 128]
     1099        ShouldTrap X86_XCPT_PF, fxrstor [xDI + 144]
     1100        ShouldTrap X86_XCPT_PF, fxrstor [xDI + 160]
     1101        ShouldTrap X86_XCPT_PF, fxrstor [xDI + 176]
     1102        ShouldTrap X86_XCPT_PF, fxrstor [xDI + 192]
     1103        ShouldTrap X86_XCPT_PF, fxrstor [xDI + 208]
     1104        ShouldTrap X86_XCPT_PF, fxrstor [xDI + 224]
     1105        ShouldTrap X86_XCPT_PF, fxrstor [xDI + 240]
     1106        ShouldTrap X86_XCPT_PF, fxrstor [xDI + 256]
     1107        ShouldTrap X86_XCPT_PF, fxrstor [xDI + 384]
     1108        ShouldTrap X86_XCPT_PF, fxrstor [xDI + 432]
     1109        ShouldTrap X86_XCPT_PF, fxrstor [xDI + 496]
     1110
     1111        ; Unaligned accesses will cause #GP(0). This takes precedence over #PF.
     1112        ShouldTrap X86_XCPT_GP, fxsave  [xDI + 1]
     1113        ShouldTrap X86_XCPT_GP, fxsave  [xDI + 2]
     1114        ShouldTrap X86_XCPT_GP, fxsave  [xDI + 3]
     1115        ShouldTrap X86_XCPT_GP, fxsave  [xDI + 4]
     1116        ShouldTrap X86_XCPT_GP, fxsave  [xDI + 5]
     1117        ShouldTrap X86_XCPT_GP, fxsave  [xDI + 6]
     1118        ShouldTrap X86_XCPT_GP, fxsave  [xDI + 7]
     1119        ShouldTrap X86_XCPT_GP, fxsave  [xDI + 8]
     1120        ShouldTrap X86_XCPT_GP, fxsave  [xDI + 9]
     1121        ShouldTrap X86_XCPT_GP, fxsave  [xDI + 10]
     1122        ShouldTrap X86_XCPT_GP, fxsave  [xDI + 11]
     1123        ShouldTrap X86_XCPT_GP, fxsave  [xDI + 12]
     1124        ShouldTrap X86_XCPT_GP, fxsave  [xDI + 13]
     1125        ShouldTrap X86_XCPT_GP, fxsave  [xDI + 14]
     1126        ShouldTrap X86_XCPT_GP, fxsave  [xDI + 15]
     1127
     1128        ShouldTrap X86_XCPT_GP, fxrstor [xDI + 1]
     1129        ShouldTrap X86_XCPT_GP, fxrstor [xDI + 2]
     1130        ShouldTrap X86_XCPT_GP, fxrstor [xDI + 3]
     1131        ShouldTrap X86_XCPT_GP, fxrstor [xDI + 4]
     1132        ShouldTrap X86_XCPT_GP, fxrstor [xDI + 5]
     1133        ShouldTrap X86_XCPT_GP, fxrstor [xDI + 6]
     1134        ShouldTrap X86_XCPT_GP, fxrstor [xDI + 7]
     1135        ShouldTrap X86_XCPT_GP, fxrstor [xDI + 8]
     1136        ShouldTrap X86_XCPT_GP, fxrstor [xDI + 9]
     1137        ShouldTrap X86_XCPT_GP, fxrstor [xDI + 10]
     1138        ShouldTrap X86_XCPT_GP, fxrstor [xDI + 11]
     1139        ShouldTrap X86_XCPT_GP, fxrstor [xDI + 12]
     1140        ShouldTrap X86_XCPT_GP, fxrstor [xDI + 13]
     1141        ShouldTrap X86_XCPT_GP, fxrstor [xDI + 14]
     1142        ShouldTrap X86_XCPT_GP, fxrstor [xDI + 15]
     1143
     1144
     1145.success:
     1146        xor     eax, eax
     1147.return:
     1148        SAVE_ALL_EPILOGUE
     1149        ret
     1150ENDPROC     x861_Test3
     1151
     1152
     1153;;
    10091154; Terminate the trap info array with a NIL entry.
    10101155BEGINDATA
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