VirtualBox

Changeset 39993 in vbox for trunk/src/VBox/VMM/testcase


Ignore:
Timestamp:
Feb 3, 2012 7:30:47 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
76104
Message:

tstX86-1: Some fxsave and fxrstor tests.

Location:
trunk/src/VBox/VMM/testcase
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • 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.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette