Changeset 61538 in vbox for trunk/src/VBox
- Timestamp:
- Jun 7, 2016 1:16:06 PM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 107875
- Location:
- trunk/src/VBox/ValidationKit/bootsectors
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/ValidationKit/bootsectors/Makefile.kmk
r61535 r61538 271 271 272 272 # CPU instruction decoding experiments. 273 #MISCBINS += bs3-cpu-decode-1274 bs3-cpu-decod e-1_TEMPLATE = VBoxBS3KitImg275 bs3-cpu-decod e-1_INCS = .276 bs3-cpu-decod e-1_DEFS = BS3_CMN_INSTANTIATE_FILE1=bs3-cpu-decode-1-template.c277 bs3-cpu-decod e-1_DEFS += BS3_MODE_INSTANTIATE_FILE1=bs3-cpu-decode-1-template.c278 bs3-cpu-decod e-1_SOURCES = \279 bs3kit/bs3-first- rm.asm \280 bs3-cpu-decod e-1.c32 \281 bs3kit/bs3-cmn-instantiate.c16 \ 282 bs3kit/bs3-cmn-instantiate.c32\283 bs3kit/bs3-cmn-instantiate.c64\284 bs3-cpu-decode-1-asm.asm 285 bs3-cpu-decode-1-template.o:: \286 $$(bs3-cpu-decode-1_0_OUTDIR)/bs3kit/bs3-cmn-instantiate.o16 \287 $$(bs3-cpu-decode-1_0_OUTDIR)/bs3kit/bs3-cmn-instantiate.o32 \288 $$(bs3-cpu-decode-1_0_OUTDIR)/bs3kit/bs3-cmn-instantiate.o64 \289 $$(bs3-cpu-decode-1_0_OUTDIR)/bs3-cpu-decode-1-asm.o16273 MISCBINS += bs3-cpu-decoding-1 274 bs3-cpu-decoding-1_TEMPLATE = VBoxBS3KitImg 275 bs3-cpu-decoding-1_INCS = . 276 bs3-cpu-decoding-1_DEFS = BS3_CMN_INSTANTIATE_FILE1=bs3-cpu-decoding-1-template.c 277 bs3-cpu-decoding-1_DEFS += BS3_MODE_INSTANTIATE_FILE1=bs3-cpu-decoding-1-template.c 278 bs3-cpu-decoding-1_SOURCES = \ 279 bs3kit/bs3-first-init-all-pe32.asm \ 280 bs3-cpu-decoding-1.c32 \ 281 bs3-cpu-decoding-1-asm.asm 282 # bs3kit/bs3-cmn-instantiate.c16 \ 283 # bs3kit/bs3-cmn-instantiate.c32 \ 284 # bs3kit/bs3-cmn-instantiate.c64 285 #bs3-cpu-decoding-1-template.o:: \ 286 # $$(bs3-cpu-decoding-1_0_OUTDIR)/bs3kit/bs3-cmn-instantiate.o16 \ 287 # $$(bs3-cpu-decoding-1_0_OUTDIR)/bs3kit/bs3-cmn-instantiate.o32 \ 288 # $$(bs3-cpu-decoding-1_0_OUTDIR)/bs3kit/bs3-cmn-instantiate.o64 \ 289 # $$(bs3-cpu-decoding-1_0_OUTDIR)/bs3-cpu-decoding-1-asm.o16 290 290 291 291 endif # VBOX_WITH_BS3KIT -
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-decoding-1-asm.asm
r61535 r61538 1 1 ; $Id$ 2 2 ;; @file 3 ; BS3Kit - bs3- fpustate-1, assembly helpers and template instantiation.3 ; BS3Kit - bs3-cpu-decoding-1, assembly helpers and template instantiation. 4 4 ; 5 5 … … 32 32 33 33 34 ;*********************************************************************************************************************************35 ;* Global Variables *36 ;*********************************************************************************************************************************37 BS3_BEGIN_DATA1638 ;; @name Floating point constants.39 ; @{40 g_r32_0dot1: dd 0.141 g_r32_3dot2: dd 3.242 g_r32_Zero: dd 0.043 g_r32_One: dd 1.044 g_r32_Two: dd 2.045 g_r32_Three: dd 3.046 g_r32_Ten: dd 10.047 g_r32_Eleven: dd 11.048 g_r32_ThirtyTwo:dd 32.049 g_r32_Min: dd 000800000h50 g_r32_Max: dd 07f7fffffh51 g_r32_Inf: dd 07f800000h52 g_r32_SNaN: dd 07f800001h53 g_r32_SNaNMax: dd 07fbfffffh54 g_r32_QNaN: dd 07fc00000h55 g_r32_QNaNMax: dd 07fffffffh56 g_r32_NegQNaN: dd 0ffc00000h57 58 g_r64_0dot1: dq 0.159 g_r64_6dot9: dq 6.960 g_r64_Zero: dq 0.061 g_r64_One: dq 1.062 g_r64_Two: dq 2.063 g_r64_Three: dq 3.064 g_r64_Ten: dq 10.065 g_r64_Eleven: dq 11.066 g_r64_ThirtyTwo:dq 32.067 g_r64_Min: dq 00010000000000000h68 g_r64_Max: dq 07fefffffffffffffh69 g_r64_Inf: dq 07ff0000000000000h70 g_r64_SNaN: dq 07ff0000000000001h71 g_r64_SNaNMax: dq 07ff7ffffffffffffh72 g_r64_NegQNaN: dq 0fff8000000000000h73 g_r64_QNaN: dq 07ff8000000000000h74 g_r64_QNaNMax: dq 07fffffffffffffffh75 g_r64_DnMin: dq 00000000000000001h76 g_r64_DnMax: dq 0000fffffffffffffh77 78 79 g_r80_0dot1: dt 0.180 g_r80_3dot2: dt 3.281 g_r80_Zero: dt 0.082 g_r80_One: dt 1.083 g_r80_Two: dt 2.084 g_r80_Three: dt 3.085 g_r80_Ten: dt 10.086 g_r80_Eleven: dt 11.087 g_r80_ThirtyTwo:dt 32.088 %ifdef __NASM__89 g_r80_Min: dq 08000000000000000h90 dw 00001h91 g_r80_Max: dq 0ffffffffffffffffh92 dw 07ffeh93 g_r80_Inf: dq 08000000000000000h94 dw 07fffh95 g_r80_QNaN: dq 0c000000000000000h96 dw 07fffh97 g_r80_QNaNMax: dq 0ffffffffffffffffh98 dw 07fffh99 g_r80_NegQNaN: dq 0c000000000000000h100 dw 0ffffh101 g_r80_SNaN: dq 08000000000000001h102 dw 07fffh103 g_r80_SNaNMax: dq 0bfffffffffffffffh104 dw 07fffh105 g_r80_DnMin: dq 00000000000000001h106 dw 00000h107 g_r80_DnMax: dq 07fffffffffffffffh108 dw 00000h109 %else110 g_r80_Min: dt 000018000000000000000h111 g_r80_Max: dt 07ffeffffffffffffffffh112 g_r80_Inf: dt 07fff8000000000000000h113 g_r80_QNaN: dt 07fffc000000000000000h114 g_r80_QNaNMax: dt 07fffffffffffffffffffh115 g_r80_NegQNaN: dt 0ffffc000000000000000h116 g_r80_SNaN: dt 07fff8000000000000001h117 g_r80_SNaNMax: dt 07fffbfffffffffffffffh118 g_r80_DnMin: dt 000000000000000000001h119 g_r80_DnMax: dt 000007fffffffffffffffh120 %endif121 122 g_r32V1: dd 3.2123 g_r32V2: dd -1.9124 g_r64V1: dq 6.4125 g_r80V1: dt 8.0126 127 ; Denormal numbers.128 g_r32D0: dd 000200000h129 ;; @}130 131 ;; @name Upconverted Floating point constants132 ; @{133 ;g_r80_r32_0dot1: dt 0.1134 %ifdef __NASM__135 g_r80_r32_3dot2: dq 0cccccd0000000000h136 dw 04000h137 %else138 g_r80_r32_3dot2: dt 04000cccccd0000000000h139 %endif140 ;g_r80_r32_Zero: dt 0.0141 ;g_r80_r32_One: dt 1.0142 ;g_r80_r32_Two: dt 2.0143 ;g_r80_r32_Three: dt 3.0144 ;g_r80_r32_Ten: dt 10.0145 ;g_r80_r32_Eleven: dt 11.0146 ;g_r80_r32_ThirtyTwo: dt 32.0147 ;; @}148 149 ;; @name Decimal constants.150 ; @{151 g_u64Zero: dd 0152 g_u32Zero: dw 0153 g_u64Two: dd 2154 g_u32Two: dw 2155 ;; @}156 157 158 34 ; 159 35 ; Instantiate code templates. 160 36 ; 161 BS3_INSTANTIATE_TEMPLATE_ESSENTIALS "bs3- fpustate-1-template.mac"37 BS3_INSTANTIATE_TEMPLATE_ESSENTIALS "bs3-cpu-decoding-1-template.mac" 162 38 -
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-decoding-1-template.c
r61535 r61538 1 1 /* $Id$ */ 2 2 /** @file 3 * BS3Kit - bs3- fpustate-1, C code template.3 * BS3Kit - bs3-cpu-decoding-1, C code template. 4 4 */ 5 5 … … 38 38 *********************************************************************************************************************************/ 39 39 40 40 /* 41 * Common code. 42 * Common code. 43 * Common code. 44 */ 41 45 #ifdef BS3_INSTANTIATING_CMN 42 43 /**44 * Displays the differences between the two states.45 */46 # define bs3FpuState1_Diff BS3_CMN_NM(bs3FpuState1_Diff)47 BS3_DECL_NEAR(void) bs3FpuState1_Diff(X86FXSTATE const BS3_FAR *pExpected, X86FXSTATE const BS3_FAR *pChecking)48 {49 unsigned i;50 51 # define CHECK(a_Member, a_Fmt) \52 if (pExpected->a_Member != pChecking->a_Member) \53 Bs3TestPrintf(" " #a_Member ": " a_Fmt ", expected " a_Fmt "\n", pChecking->a_Member, pExpected->a_Member); \54 else do { } while (0)55 CHECK(FCW, "%#RX16");56 CHECK(FSW, "%#RX16");57 CHECK(FTW, "%#RX16");58 CHECK(FOP, "%#RX16");59 CHECK(FPUIP, "%#RX32");60 CHECK(CS, "%#RX16");61 CHECK(Rsrvd1, "%#RX16");62 CHECK(FPUDP, "%#RX32");63 CHECK(DS, "%#RX16");64 CHECK(Rsrvd2, "%#RX16");65 CHECK(MXCSR, "%#RX32");66 CHECK(MXCSR_MASK, "%#RX32");67 # undef CHECK68 for (i = 0; i < RT_ELEMENTS(pExpected->aRegs); i++)69 if ( pChecking->aRegs[i].au64[0] != pExpected->aRegs[i].au64[0]70 || pChecking->aRegs[i].au64[1] != pExpected->aRegs[i].au64[1])71 Bs3TestPrintf("st%u: %.16Rhxs\n"72 "exp: %.16Rhxs\n",73 i, &pChecking->aRegs[i], &pExpected->aRegs[i]);74 for (i = 0; i < RT_ELEMENTS(pExpected->aXMM); i++)75 if ( pChecking->aXMM[i].au64[0] != pExpected->aXMM[i].au64[0]76 || pChecking->aXMM[i].au64[1] != pExpected->aXMM[i].au64[1])77 Bs3TestPrintf("xmm%u: %.16Rhxs\n"78 " %sexp: %.16Rhxs\n",79 i, &pChecking->aRegs[i], &pExpected->aRegs[i], i >= 10 ? " " : "");80 }81 82 46 83 47 #endif /* BS3_INSTANTIATING_CMN */ … … 90 54 */ 91 55 #ifdef BS3_INSTANTIATING_MODE 92 # if TMPL_MODE == BS3_MODE_PE32 \93 || TMPL_MODE == BS3_MODE_PP32 \94 || TMPL_MODE == BS3_MODE_PAE32 \95 || TMPL_MODE == BS3_MODE_LM64 \96 || TMPL_MODE == BS3_MODE_RM97 56 98 /* Assembly helpers: */99 BS3_DECL_NEAR(void) TMPL_NM(bs3FpuState1_InitState)(X86FXSTATE BS3_FAR *pFxState, void BS3_FAR *pvMmioReg);100 BS3_DECL_NEAR(void) TMPL_NM(bs3FpuState1_Restore)(X86FXSTATE const BS3_FAR *pFxState);101 BS3_DECL_NEAR(void) TMPL_NM(bs3FpuState1_Save)(X86FXSTATE BS3_FAR *pFxState);102 103 BS3_DECL_NEAR(void) TMPL_NM(bs3FpuState1_FNStEnv)(void BS3_FAR *pvMmioReg);104 BS3_DECL_NEAR(void) TMPL_NM(bs3FpuState1_MovDQU_Read)(void BS3_FAR *pvMmioReg);105 BS3_DECL_NEAR(void) TMPL_NM(bs3FpuState1_MovDQU_Write)(void BS3_FAR *pvMmioReg);106 BS3_DECL_NEAR(void) TMPL_NM(bs3FpuState1_FMul)(void BS3_FAR *pvMmioReg);107 108 109 /**110 * Tests for FPU state corruption.111 *112 * First we don't do anything to quit guest context for a while.113 * Then we start testing weird MMIO accesses, some which amonger other things114 * forces the use of the FPU state or host FPU to do the emulation. Both are a115 * little complicated in raw-mode and ring-0 contexts.116 *117 * We ASSUME FXSAVE/FXRSTOR support here.118 */119 BS3_DECL_FAR(uint8_t) TMPL_NM(bs3FpuState1_Corruption)(uint8_t bMode)120 {121 /* We don't need to test that many modes, probably. */122 123 uint8_t abBuf[sizeof(X86FXSTATE)*2 + 32];124 uint8_t BS3_FAR *pbTmp = &abBuf[0x10 - (((uintptr_t)abBuf) & 0x0f)];125 X86FXSTATE BS3_FAR *pExpected = (X86FXSTATE BS3_FAR *)pbTmp;126 X86FXSTATE BS3_FAR *pChecking = pExpected + 1;127 uint32_t iLoop;128 uint32_t uStartTick;129 bool fMmioReadback;130 bool fReadBackError = false;131 BS3PTRUNION MmioReg;132 133 134 # undef CHECK_STATE135 # define CHECK_STATE(a_Instr) \136 do { \137 TMPL_NM(bs3FpuState1_Save)(pChecking); \138 if (Bs3MemCmp(pExpected, pChecking, sizeof(*pExpected)) != 0) \139 { \140 Bs3TestFailedF("State differs after " #a_Instr " (write) in loop #%RU32\n", iLoop); \141 bs3FpuState1_Diff(pExpected, pChecking); \142 Bs3PitDisable(); \143 return 1; \144 } \145 } while (0)146 147 /*148 * Setup the test.149 */150 151 /* Make this code executable in raw-mode. A bit tricky. */152 ASMSetCR0(ASMGetCR0() | X86_CR0_WP);153 Bs3PitSetupAndEnablePeriodTimer(20);154 ASMIntEnable();155 # if ARCH_BITS != 64156 ASMHalt();157 # endif158 159 /* Figure out which MMIO region we'll be using so we can correctly initialize FPUDS. */160 # if BS3_MODE_IS_RM_OR_V86(TMPL_MODE)161 MmioReg.pv = BS3_FP_MAKE(0xffff, VMMDEV_TESTING_MMIO_BASE - _1M + 16);162 # elif BS3_MODE_IS_16BIT_CODE(TMPL_MODE)163 MmioReg.pv = BS3_FP_MAKE(BS3_SEL_VMMDEV_MMIO16, VMMDEV_TESTING_MMIO_BASE - _1M);164 # else165 MmioReg.pv = (uint8_t *)VMMDEV_TESTING_MMIO_BASE;166 # endif167 if (MmioReg.pu32[VMMDEV_TESTING_MMIO_OFF_NOP / sizeof(uint32_t)] == VMMDEV_TESTING_NOP_RET)168 {169 fMmioReadback = true;170 MmioReg.pb += VMMDEV_TESTING_MMIO_OFF_READBACK;171 }172 else173 {174 Bs3TestPrintf("VMMDev MMIO not found, using VGA instead\n");175 fMmioReadback = false;176 MmioReg.pv = Bs3XptrFlatToCurrent(0xa7800);177 }178 179 /* Make 100% sure we don't trap accessing the FPU state and that we can use fxsave/fxrstor. */180 g_usBs3TestStep = 1;181 ASMSetCR0((ASMGetCR0() & ~(X86_CR0_TS | X86_CR0_EM)) | X86_CR0_MP);182 ASMSetCR4(ASMGetCR4() | X86_CR4_OSFXSR /*| X86_CR4_OSXMMEEXCPT*/);183 184 /* Come up with a distinct state. We do that from assembly (will do FPU in R0/RC). */185 g_usBs3TestStep = 2;186 Bs3MemSet(abBuf, 0x42, sizeof(abBuf));187 TMPL_NM(bs3FpuState1_InitState)(pExpected, MmioReg.pb);188 189 190 /*191 * Test #1: Check that we can keep it consistent for a while.192 */193 g_usBs3TestStep = 3;194 uStartTick = g_cBs3PitTicks;195 for (iLoop = 0; iLoop < _16M; iLoop++)196 {197 CHECK_STATE(nop);198 if ( (iLoop & 0xffff) == 0xffff199 && g_cBs3PitTicks - uStartTick >= 20 * 20) /* 20 seconds*/200 break;201 }202 203 /*204 * Test #2: Use various FPU, SSE and weird instructions to do MMIO writes.205 *206 * We'll use the VMMDev readback register if possible, but make do207 * with VGA if not configured.208 */209 g_usBs3TestStep = 4;210 uStartTick = g_cBs3PitTicks;211 for (iLoop = 0; iLoop < _1M; iLoop++)212 {213 unsigned off;214 uint8_t abCompare[64];215 uint8_t abReadback[64];216 217 /* Macros */218 # undef CHECK_READBACK_WRITE_RUN219 # define CHECK_READBACK_WRITE_RUN(a_Instr, a_Worker, a_Type) \220 do { \221 off = (unsigned)(iLoop & (VMMDEV_TESTING_READBACK_SIZE / 2 - 1)); \222 if (off + sizeof(a_Type) > VMMDEV_TESTING_READBACK_SIZE) \223 off = VMMDEV_TESTING_READBACK_SIZE - sizeof(a_Type); \224 a_Worker((a_Type *)&MmioReg.pb[off]); \225 if (fMmioReadback && (!fReadBackError || iLoop == 0)) \226 { \227 a_Worker((a_Type *)&abCompare[0]); \228 Bs3MemCpy(abReadback, &MmioReg.pb[off], sizeof(a_Type)); \229 if (Bs3MemCmp(abReadback, abCompare, sizeof(a_Type)) != 0) \230 { \231 Bs3TestFailedF("Read back error for " #a_Instr " in loop #%RU32:\n%.*Rhxs expected:\n%.*Rhxs\n", \232 iLoop, sizeof(a_Type), abReadback, sizeof(a_Type), abCompare); \233 fReadBackError = true; \234 } \235 } \236 } while (0)237 238 # undef CHECK_READBACK_WRITE239 # define CHECK_READBACK_WRITE(a_Instr, a_Worker, a_Type) \240 CHECK_READBACK_WRITE_RUN(a_Instr, a_Worker, a_Type); \241 CHECK_STATE(a_Instr)242 # undef CHECK_READBACK_WRITE_Z243 # define CHECK_READBACK_WRITE_Z(a_Instr, a_Worker, a_Type) \244 do { \245 if (fMmioReadback && (!fReadBackError || iLoop == 0)) \246 { \247 Bs3MemZero(&abCompare[0], sizeof(a_Type)); \248 off = (unsigned)(iLoop & (VMMDEV_TESTING_READBACK_SIZE / 2 - 1)); \249 if (off + sizeof(a_Type) > VMMDEV_TESTING_READBACK_SIZE) \250 off = VMMDEV_TESTING_READBACK_SIZE - sizeof(a_Type); \251 Bs3MemZero(&MmioReg.pb[off], sizeof(a_Type)); \252 } \253 CHECK_READBACK_WRITE(a_Instr, a_Worker, a_Type); \254 } while (0)255 256 # undef CHECK_READBACK_READ_RUN257 # define CHECK_READBACK_READ_RUN(a_Instr, a_Worker, a_Type) \258 do { \259 off = (unsigned)(iLoop & (VMMDEV_TESTING_READBACK_SIZE / 2 - 1)); \260 if (off + sizeof(a_Type) > VMMDEV_TESTING_READBACK_SIZE) \261 off = VMMDEV_TESTING_READBACK_SIZE - sizeof(a_Type); \262 a_Worker((a_Type *)&MmioReg.pb[off]); \263 TMPL_NM(bs3FpuState1_Save)(pChecking); \264 } while (0)265 # undef CHECK_READBACK_READ266 # define CHECK_READBACK_READ(a_Instr, a_Worker, a_Type) \267 CHECK_READBACK_READ_RUN(a_Instr, a_Worker, a_Type); \268 CHECK_STATE(a_Instr)269 270 271 /* The tests. */272 CHECK_READBACK_WRITE_Z(SIDT, ASMGetIDTR, RTIDTR);273 CHECK_READBACK_WRITE_Z(FNSTENV, TMPL_NM(bs3FpuState1_FNStEnv), X86FSTENV32P); /** @todo x86.h is missing types */274 CHECK_READBACK_WRITE( MOVDQU, TMPL_NM(bs3FpuState1_MovDQU_Write), X86XMMREG);275 CHECK_READBACK_READ( MOVDQU, TMPL_NM(bs3FpuState1_MovDQU_Read), X86XMMREG);276 277 /* Using the FPU is a little complicated, but we really need to check these things. */278 CHECK_READBACK_READ_RUN(FMUL, TMPL_NM(bs3FpuState1_FMul), uint64_t);279 pExpected->FOP = 0x7dc;280 # if ARCH_BITS == 64281 pExpected->FPUDP = (uint32_t) (uintptr_t)&MmioReg.pb[off];282 pExpected->DS = (uint16_t)((uintptr_t)&MmioReg.pb[off] >> 32);283 pExpected->Rsrvd2 = (uint16_t)((uintptr_t)&MmioReg.pb[off] >> 48);284 # elif BS3_MODE_IS_RM_OR_V86(TMPL_MODE)285 pExpected->FPUDP = Bs3SelPtrToFlat(&MmioReg.pb[off]);286 # else287 pExpected->FPUDP = BS3_FP_OFF(&MmioReg.pb[off]);288 # endif289 CHECK_STATE(FMUL);290 291 /* check for timeout every now an then. */292 if ( (iLoop & 0xfff) == 0xfff293 && g_cBs3PitTicks - uStartTick >= 20 * 20) /* 20 seconds*/294 break;295 }296 297 Bs3PitDisable();298 return 0;299 }300 # endif301 57 #endif /* BS3_INSTANTIATING_MODE */ 302 58 -
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-decoding-1-template.mac
r61535 r61538 1 1 ; $Id$ 2 2 ;; @file 3 ; BS3Kit - bs3- fpustate-1, assembly template.3 ; BS3Kit - bs3-cpu-decoding-1, assembly template. 4 4 ; 5 5 … … 38 38 39 39 40 ;;41 ; Initializes the FPU state and saves it to pFxState.42 ;43 ; BS3_DECL_NEAR(void) TMPL_NM(bs3FpuState1_InitState)(X86FXSTATE BS3_FAR *pFxState, void *pvMmioReg);44 ;45 BS3_PROC_BEGIN_MODE bs3FpuState1_InitState, BS3_PBC_NEAR46 BS3_CALL_CONV_PROLOG 247 push xBP48 mov xBP, xSP49 push xBX50 TONLY16 push ds51 pushf52 TONLY64 sub xSP, 20h53 54 ;55 ; x87 state.56 ;57 fninit58 fld dword [TMPL_DATA16_WRT(g_r32V1)]59 fld qword [TMPL_DATA16_WRT(g_r64V1)]60 fld tword [TMPL_DATA16_WRT(g_r80V1)]61 fld qword [TMPL_DATA16_WRT(g_r64V1)]62 fld dword [TMPL_DATA16_WRT(g_r32V2)]63 fld dword [TMPL_DATA16_WRT(g_r80_QNaNMax)]64 fld tword [TMPL_DATA16_WRT(g_r80_SNaNMax)]65 fld tword [TMPL_DATA16_WRT(g_r80_ThirtyTwo)]66 67 ;68 ; We'll later be using FMUL to test actually using the FPU in RC & R0,69 ; so for everything to line up correctly with FPU CS:IP and FPU DS:DP,70 ; we'll call the function here too. This has the benefitial side effect71 ; of loading correct FPU DS/DS values so we can check that they don't72 ; get lost either. Also, we now don't have to guess whether the CPU73 ; emulation sets CS/DS or not.74 ;75 TONLY16 push xPRE [xBP + xCB + cbCurRetAddr + sCB + 2]76 push xPRE [xBP + xCB + cbCurRetAddr + sCB]77 BS3_CALL TMPL_NM(bs3FpuState1_FMul), 178 add xSP, sCB79 80 ;81 ; SSE state82 ;83 movdqu xmm0, [TMPL_DATA16_WRT(g_r32_0dot1)]84 movdqu xmm1, [TMPL_DATA16_WRT(g_r32_Two)]85 movdqu xmm2, [TMPL_DATA16_WRT(g_r32_ThirtyTwo)]86 movdqu xmm3, [TMPL_DATA16_WRT(g_r32_ThirtyTwo)]87 movdqu xmm4, [TMPL_DATA16_WRT(g_r32_SNaN)]88 movdqu xmm5, [TMPL_DATA16_WRT(g_r32_NegQNaN)]89 movdqu xmm6, [TMPL_DATA16_WRT(g_r64_Zero)]90 movdqu xmm7, [TMPL_DATA16_WRT(g_r64_Two)]91 %if TMPL_BITS == 6492 movdqu xmm8, [TMPL_DATA16_WRT(g_r64_Ten)]93 movdqu xmm9, [TMPL_DATA16_WRT(g_r64_ThirtyTwo)]94 movdqu xmm10, [TMPL_DATA16_WRT(g_r64_Max)]95 movdqu xmm11, [TMPL_DATA16_WRT(g_r64_SNaN)]96 movdqu xmm12, [TMPL_DATA16_WRT(g_r64_NegQNaN)]97 movdqu xmm13, [TMPL_DATA16_WRT(g_r64_QNaNMax)]98 movdqu xmm14, [TMPL_DATA16_WRT(g_r64_DnMax)]99 movdqu xmm15, [TMPL_DATA16_WRT(g_r80_Eleven)]100 %endif101 102 ;; @todo status regs103 104 ;105 ; Save it. Note that DS is no longer valid in 16-bit code.106 ; To be on the safe side, we load and save the state once again.107 ;108 TONLY16 mov ds, [xBP + xCB + cbCurRetAddr + 2]109 mov xBX, [xBP + xCB + cbCurRetAddr]110 cli111 %if TMPL_BITS == 64112 o64 fxsave [xBX]113 fninit114 o64 fxrstor [xBX]115 o64 fxsave [xBX]116 %else117 fxsave [xBX]118 fninit119 fxrstor [xBX]120 fxsave [xBX]121 %endif122 123 .return:124 TONLY64 add xSP, 20h125 popf126 TONLY16 pop ds127 pop xBX128 mov xSP, xBP129 pop xBP130 BS3_CALL_CONV_EPILOG 2131 BS3_HYBRID_RET132 BS3_PROC_END_MODE bs3FpuState1_InitState133 134 135 ;;136 ; BS3_DECL_NEAR(void) TMPL_NM(bs3FpuState1_Restore)(X86FXSTATE const BS3_FAR *pFxState);137 ;138 BS3_PROC_BEGIN_MODE bs3FpuState1_Restore, BS3_PBC_NEAR139 push xBP140 mov xBP, xSP141 142 %if TMPL_BITS == 64143 o64 fxrstor [rcx]144 145 %elif TMPL_BITS == 32146 mov eax, [xBP + xCB*2]147 fxrstor [eax]148 149 %elif TMPL_BITS == 16150 mov ax, ds151 mov ds, [xBP + xCB + cbCurRetAddr + 2]152 mov xBX, [xBP + xCB + cbCurRetAddr]153 fxrstor [bx]154 mov ds, ax155 %else156 %error TMPL_BITS157 %endif158 159 mov xSP, xBP160 pop xBP161 BS3_HYBRID_RET162 BS3_PROC_END_MODE bs3FpuState1_Restore163 164 ;;165 ; BS3_DECL_NEAR(void) TMPL_NM(bs3FpuState1_Save)(X86FXSTATE BS3_FAR *pFxState);166 ;167 BS3_PROC_BEGIN_MODE bs3FpuState1_Save, BS3_PBC_NEAR168 push xBP169 mov xBP, xSP170 171 %if TMPL_BITS == 64172 o64 fxsave [rcx]173 174 %elif TMPL_BITS == 32175 mov eax, [xBP + xCB*2]176 fxsave [eax]177 178 %elif TMPL_BITS == 16179 push bx180 push ds181 mov ds, [xBP + xCB + cbCurRetAddr + 2]182 mov bx, [xBP + xCB + cbCurRetAddr]183 fxsave [bx]184 pop ds185 pop bx186 %else187 %error TMPL_BITS188 %endif189 190 mov xSP, xBP191 pop xBP192 BS3_HYBRID_RET193 BS3_PROC_END_MODE bs3FpuState1_Save194 195 196 ;;197 ; Performs a MOVDQU write on the specified memory.198 ;199 ; BS3_DECL_NEAR(void) TMPL_NM(bs3FpuState1_MovDQU_Write)(void *pvMmioReg);200 ;201 BS3_PROC_BEGIN_MODE bs3FpuState1_MovDQU_Write, BS3_PBC_NEAR202 BS3_CALL_CONV_PROLOG 1203 push xBP204 mov xBP, xSP205 push xBX206 TONLY16 push ds207 208 ; Load the register pointer.209 mov xBX, [xBP + xCB + cbCurRetAddr]210 TONLY16 mov ds, [xBP + xCB + cbCurRetAddr + 2]211 212 ; Do read.213 movdqu [xBX], xmm3214 215 TONLY16 pop ds216 pop xBX217 leave218 BS3_CALL_CONV_EPILOG 1219 BS3_HYBRID_RET220 BS3_PROC_END_MODE bs3FpuState1_MovDQU_Write221 222 223 ;;224 ; Performs a MOVDQU write to the specified memory.225 ;226 ; BS3_DECL_NEAR(void) TMPL_NM(bs3FpuState1_MovDQU_Read)(void *pvMmioReg);227 ;228 BS3_PROC_BEGIN_MODE bs3FpuState1_MovDQU_Read, BS3_PBC_NEAR229 BS3_CALL_CONV_PROLOG 1230 push xBP231 mov xBP, xSP232 push xBX233 TONLY16 push ds234 sub xSP, 20h235 %if TMPL_BITS == 16236 movdqu [xBP - xCB - xCB - 2 - 18h], xmm2237 %else238 movdqu [xSP], xmm2239 %endif240 241 ; Load the register pointer.242 mov xBX, [xBP + xCB + cbCurRetAddr]243 TONLY16 mov ds, [xBP + xCB + cbCurRetAddr + 2]244 245 246 ; Do read.247 movdqu xmm2, [xBX]248 249 %if TMPL_BITS == 16250 movdqu xmm2, [xBP - xCB - xCB - 2 - 18h]251 %else252 movdqu xmm2, [xSP]253 %endif254 add xSP, 20h255 TONLY16 pop ds256 pop xBX257 mov xSP, xBP258 pop xBP259 BS3_CALL_CONV_EPILOG 1260 BS3_HYBRID_RET261 BS3_PROC_END_MODE bs3FpuState1_MovDQU_Read262 263 264 ;;265 ; Performs a FNSTENV write on the specified memory.266 ;267 ; BS3_DECL_NEAR(void) TMPL_NM(bs3FpuState1_FNStEnv)(void *pvMmioReg);268 ;269 BS3_PROC_BEGIN_MODE bs3FpuState1_FNStEnv, BS3_PBC_NEAR270 BS3_CALL_CONV_PROLOG 1271 push xBP272 mov xBP, xSP273 push xBX274 TONLY16 push ds275 276 ; Load the register pointer.277 mov xBX, [xBP + xCB + cbCurRetAddr]278 TONLY16 mov ds, [xBP + xCB + cbCurRetAddr + 2]279 280 ; Just write.281 fnstenv [xBX]282 283 TONLY16 pop ds284 pop xBX285 mov xSP, xBP286 pop xBP287 BS3_CALL_CONV_EPILOG 1288 BS3_HYBRID_RET289 BS3_PROC_END_MODE bs3FpuState1_FNStEnv290 291 292 ;;293 ; Performs a FMUL on the specified memory, after writing a 64-bit value to it first.294 ;295 ; BS3_DECL_NEAR(void) TMPL_NM(bs3FpuState1_FMul)(void *pvMmioReg);296 ;297 BS3_PROC_BEGIN_MODE bs3FpuState1_FMul, BS3_PBC_NEAR298 BS3_CALL_CONV_PROLOG 1299 push xBP300 mov xBP, xSP301 push xBX302 TONLY16 push ds303 304 ; Load the value we'll be multiplying with into register(s) while ds is DATA16.305 mov sAX, [TMPL_DATA16_WRT(g_r64_One)]306 TNOT64 mov edx, [4 + TMPL_DATA16_WRT(g_r64_One)]307 308 ; Load the register pointer.309 mov xBX, [xBP + xCB + cbCurRetAddr]310 TONLY16 mov ds, [xBP + xCB + cbCurRetAddr + 2]311 312 ; Just write.313 mov [xBX], sAX314 TNOT64 mov [xBX + 4], edx315 call .do_it316 317 TONLY16 pop ds318 pop xBX319 mov xSP, xBP320 pop xBP321 BS3_CALL_CONV_EPILOG 1322 BS3_HYBRID_RET323 .do_it:324 fmul qword [xBX]325 ret326 BS3_PROC_END_MODE bs3FpuState1_FMul327 328 329 40 %include "bs3kit-template-footer.mac" ; reset environment 330 41 -
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-decoding-1.c32
r61535 r61538 1 1 /* $Id$ */ 2 2 /** @file 3 * BS3Kit - bs3- fpustate-1, 16-bit C code.3 * BS3Kit - bs3-cpu-decoding-1, 32-bit C code. 4 4 */ 5 5 … … 32 32 #include <iprt/asm-amd64-x86.h> 33 33 34 /** 35 * Simple test. 36 */ 37 typedef struct CPUDECODE1TST 38 { 39 uint8_t fFlags; 40 uint8_t cbUd; 41 uint8_t cbOpcodes; 42 uint8_t abOpcodes[21]; 43 } CPUDECODE1TST; 44 typedef CPUDECODE1TST BS3_FAR *PCPUDECODE1TST; 45 46 #define P_CS X86_OP_PRF_CS 47 #define P_SS X86_OP_PRF_SS 48 #define P_DS X86_OP_PRF_DS 49 #define P_ES X86_OP_PRF_ES 50 #define P_FS X86_OP_PRF_FS 51 #define P_GS X86_OP_PRF_GS 52 #define P_OZ X86_OP_PRF_SIZE_OP 53 #define P_AZ X86_OP_PRF_SIZE_ADDR 54 #define P_LK X86_OP_PRF_LOCK 55 #define P_RZ X86_OP_PRF_REPZ 56 #define P_RN X86_OP_PRF_REPNZ 57 58 59 CPUDECODE1TST const g_aSimpleTests[] = 60 { 61 { 0, 2, 2, { 0x0f, 0x38, } }, 62 { 0, 3, 3, { P_LK, 0x0f, 0x38, } }, 63 }; 64 65 void DecodeEdgeTest(void) 66 { 67 /* 68 * Allocate and initialize a page pair 69 */ 70 uint8_t BS3_FAR *pbPages = Bs3MemGuardedTestPageAlloc(BS3MEMKIND_FLAT32); 71 if (pbPages) 72 { 73 unsigned i; 74 BS3REGCTX Ctx; 75 BS3TRAPFRAME TrapFrame; 76 bs3kit.h 77 //BS3_CMN_PROTO_STUB(void, Bs3TrapSetJmpAndRestore,(PCBS3REGCTX pCtxRestore, PBS3TRAPFRAME pTrapFrame)); 78 79 for (i = 0; i < RT_ELEMENTS(g_aSimpleTests); i++) 80 { 81 unsigned off = g_aSimpleTests[i].cbOpcodes; 82 while (off-- > 0) 83 { 84 Bs3MemCpy(&pbPages[X86_PAGE_SIZE - off], &g_aSimpleTests[i].abOpcodes[0], off); 85 86 } 87 } 88 89 Bs3MemGuardedTestPageFree(pbPages); 90 } 91 else 92 Bs3TestFailed("Failed to allocate two pages!\n"); 93 94 /* 95 * Test instruction sequences. 96 */ 97 98 99 } 100 34 101 35 102 BS3_DECL(void) Main_pe32() … … 43 110 } 44 111 45
Note:
See TracChangeset
for help on using the changeset viewer.