Changeset 54896 in vbox
- Timestamp:
- Mar 22, 2015 6:54:38 PM (10 years ago)
- svn:sync-xref-src-repo-rev:
- 99111
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/iprt/x86.h
r54894 r54896 2251 2251 uint8_t reg[10]; 2252 2252 } X86FPUMMX; 2253 #ifndef VBOX_FOR_DTRACE_LIB 2254 AssertCompileSize(X86FPUMMX, 10); 2255 #endif 2253 2256 /** Pointer to a 80-bit MMX/FPU register type. */ 2254 2257 typedef X86FPUMMX *PX86FPUMMX; 2255 2258 /** Pointer to a const 80-bit MMX/FPU register type. */ 2256 2259 typedef const X86FPUMMX *PCX86FPUMMX; 2260 2261 /** FPU (x87) register. */ 2262 typedef union X86FPUREG 2263 { 2264 /** MMX view. */ 2265 uint64_t mmx; 2266 /** FPU view - todo. */ 2267 X86FPUMMX fpu; 2268 /** Extended precision floating point view. */ 2269 RTFLOAT80U r80; 2270 /** Extended precision floating point view v2 */ 2271 RTFLOAT80U2 r80Ex; 2272 /** 8-bit view. */ 2273 uint8_t au8[16]; 2274 /** 16-bit view. */ 2275 uint16_t au16[8]; 2276 /** 32-bit view. */ 2277 uint32_t au32[4]; 2278 /** 64-bit view. */ 2279 uint64_t au64[2]; 2280 /** 128-bit view. (yeah, very helpful) */ 2281 uint128_t au128[1]; 2282 } X86FPUREG; 2283 #ifndef VBOX_FOR_DTRACE_LIB 2284 AssertCompileSize(X86FPUREG, 16); 2285 #endif 2286 /** Pointer to a FPU register. */ 2287 typedef X86FPUREG *PX86FPUREG; 2288 /** Pointer to a const FPU register. */ 2289 typedef X86FPUREG const *PCX86FPUREG; 2290 2291 /** 2292 * XMM register union. 2293 */ 2294 typedef union X86XMMREG 2295 { 2296 /** XMM Register view *. */ 2297 uint128_t xmm; 2298 /** 8-bit view. */ 2299 uint8_t au8[16]; 2300 /** 16-bit view. */ 2301 uint16_t au16[8]; 2302 /** 32-bit view. */ 2303 uint32_t au32[4]; 2304 /** 64-bit view. */ 2305 uint64_t au64[2]; 2306 /** 128-bit view. (yeah, very helpful) */ 2307 uint128_t au128[1]; 2308 } X86XMMREG; 2309 #ifndef VBOX_FOR_DTRACE_LIB 2310 AssertCompileSize(X86XMMREG, 16); 2311 #endif 2312 /** Pointer to an XMM register state. */ 2313 typedef X86XMMREG *PX86XMMREG; 2314 /** Pointer to a const XMM register state. */ 2315 typedef X86XMMREG const *PCX86XMMREG; 2316 2317 /** 2318 * YMM register union. 2319 */ 2320 typedef union X86YMMREG 2321 { 2322 /** 8-bit view. */ 2323 uint8_t au8[32]; 2324 /** 16-bit view. */ 2325 uint16_t au16[16]; 2326 /** 32-bit view. */ 2327 uint32_t au32[8]; 2328 /** 64-bit view. */ 2329 uint64_t au64[4]; 2330 /** 128-bit view. (yeah, very helpful) */ 2331 uint128_t au128[2]; 2332 /** XMM sub register view. */ 2333 X86XMMREG aXmm[2]; 2334 } X86YMMREG; 2335 #ifndef VBOX_FOR_DTRACE_LIB 2336 AssertCompileSize(X86YMMREG, 32); 2337 #endif 2338 /** Pointer to an YMM register state. */ 2339 typedef X86YMMREG *PX86YMMREG; 2340 /** Pointer to a const YMM register state. */ 2341 typedef X86YMMREG const *PCX86YMMREG; 2342 2343 /** 2344 * ZMM register union. 2345 */ 2346 typedef union X86ZMMREG 2347 { 2348 /** 8-bit view. */ 2349 uint8_t au8[64]; 2350 /** 16-bit view. */ 2351 uint16_t au16[32]; 2352 /** 32-bit view. */ 2353 uint32_t au32[16]; 2354 /** 64-bit view. */ 2355 uint64_t au64[8]; 2356 /** 128-bit view. (yeah, very helpful) */ 2357 uint128_t au128[4]; 2358 /** XMM sub register view. */ 2359 X86XMMREG aXmm[4]; 2360 /** YMM sub register view. */ 2361 X86YMMREG aYmm[2]; 2362 } X86ZMMREG; 2363 #ifndef VBOX_FOR_DTRACE_LIB 2364 AssertCompileSize(X86ZMMREG, 64); 2365 #endif 2366 /** Pointer to an ZMM register state. */ 2367 typedef X86ZMMREG *PX86ZMMREG; 2368 /** Pointer to a const ZMM register state. */ 2369 typedef X86ZMMREG const *PCX86ZMMREG; 2370 2257 2371 2258 2372 /** … … 2286 2400 /** 0x18 - FOS. */ 2287 2401 uint32_t FPUOS; 2288 /** 0x1c */ 2289 union 2290 { 2291 /** MMX view. */ 2292 uint64_t mmx; 2293 /** FPU view - todo. */ 2294 X86FPUMMX fpu; 2295 /** Extended precision floating point view. */ 2296 RTFLOAT80U r80; 2297 /** Extended precision floating point view v2. */ 2298 RTFLOAT80U2 r80Ex; 2299 /** 8-bit view. */ 2300 uint8_t au8[16]; 2301 /** 16-bit view. */ 2302 uint16_t au16[8]; 2303 /** 32-bit view. */ 2304 uint32_t au32[4]; 2305 /** 64-bit view. */ 2306 uint64_t au64[2]; 2307 /** 128-bit view. (yeah, very helpful) */ 2308 uint128_t au128[1]; 2309 } regs[8]; 2402 /** 0x1c - FPU register. */ 2403 X86FPUREG regs[8]; 2310 2404 } X86FPUSTATE; 2311 2405 #pragma pack() … … 2344 2438 /** 0x1c */ 2345 2439 uint32_t MXCSR_MASK; 2346 /** 0x20 */ 2347 union 2348 { 2349 /** MMX view. */ 2350 uint64_t mmx; 2351 /** FPU view - todo. */ 2352 X86FPUMMX fpu; 2353 /** Extended precision floating point view. */ 2354 RTFLOAT80U r80; 2355 /** Extended precision floating point view v2 */ 2356 RTFLOAT80U2 r80Ex; 2357 /** 8-bit view. */ 2358 uint8_t au8[16]; 2359 /** 16-bit view. */ 2360 uint16_t au16[8]; 2361 /** 32-bit view. */ 2362 uint32_t au32[4]; 2363 /** 64-bit view. */ 2364 uint64_t au64[2]; 2365 /** 128-bit view. (yeah, very helpful) */ 2366 uint128_t au128[1]; 2367 } aRegs[8]; 2368 /* - offset 160 - */ 2369 union 2370 { 2371 /** XMM Register view *. */ 2372 uint128_t xmm; 2373 /** 8-bit view. */ 2374 uint8_t au8[16]; 2375 /** 16-bit view. */ 2376 uint16_t au16[8]; 2377 /** 32-bit view. */ 2378 uint32_t au32[4]; 2379 /** 64-bit view. */ 2380 uint64_t au64[2]; 2381 /** 128-bit view. (yeah, very helpful) */ 2382 uint128_t au128[1]; 2383 } aXMM[16]; /* 8 registers in 32 bits mode; 16 in long mode */ 2440 /** 0x20 - FPU registers. */ 2441 X86FPUREG aRegs[8]; 2442 /** 0xA0 - XMM registers - 8 registers in 32 bits mode, 16 in long mode. */ 2443 X86XMMREG aXMM[16]; 2384 2444 /* - offset 416 - */ 2385 2445 uint32_t au32RsrvdRest[(464 - 416) / sizeof(uint32_t)]; … … 2540 2600 #define X86_MXSCR_MM RT_BIT(17) 2541 2601 /** @} */ 2602 2603 /** 2604 * XSAVE header. 2605 */ 2606 typedef struct X86XSAVEHDR 2607 { 2608 /** XTATE_BV - Bitmap indicating whether a component is in the state. */ 2609 uint64_t bmXState; 2610 /** XCOMP_BC - Bitmap used by instructions applying structure compaction. */ 2611 uint64_t bmXComp; 2612 /** Reserved for furture extensions, probably MBZ. */ 2613 uint64_t au64Reserved[6]; 2614 } X86XSAVEHDR; 2615 #ifndef VBOX_FOR_DTRACE_LIB 2616 AssertCompileSize(X86XSAVEHDR, 64); 2617 #endif 2618 /** Pointer to an XSAVE header. */ 2619 typedef X86XSAVEHDR *PX86XSAVEHDR; 2620 /** Pointer to a const XSAVE header. */ 2621 typedef X86XSAVEHDR const *PCX86XSAVEHDR; 2622 2623 2624 /** 2625 * The high 128-bit YMM register state (XSAVE_C_YMM). 2626 * (The lower 128-bits being in X86FXSTATE.) 2627 */ 2628 typedef struct X86XSAVEYMMHI 2629 { 2630 /** 16 registers in 64-bit mode, 8 in 32-bit mode. */ 2631 X86XMMREG aYmmHi[16]; 2632 } X86XSAVEYMMHI; 2633 #ifndef VBOX_FOR_DTRACE_LIB 2634 AssertCompileSize(X86XSAVEYMMHI, 256); 2635 #endif 2636 /** Pointer to a high 128-bit YMM register state. */ 2637 typedef X86XSAVEYMMHI *PX86XSAVEYMMHI; 2638 /** Pointer to a const high 128-bit YMM register state. */ 2639 typedef X86XSAVEYMMHI const *PCX86XSAVEYMMHI; 2640 2641 /** 2642 * Intel MPX bound registers state (XSAVE_C_BNDREGS). 2643 */ 2644 typedef struct X86XSAVEBNDREGS 2645 { 2646 /** Array of registers (BND0...BND3). */ 2647 struct 2648 { 2649 /** Lower bound. */ 2650 uint64_t uLowerBound; 2651 /** Upper bound. */ 2652 uint64_t uUpperBound; 2653 } aRegs[4]; 2654 } X86XSAVEBNDREGS; 2655 #ifndef VBOX_FOR_DTRACE_LIB 2656 AssertCompileSize(X86XSAVEBNDREGS, 64); 2657 #endif 2658 /** Pointer to a MPX bound register state. */ 2659 typedef X86XSAVEBNDREGS *PX86XSAVEBNDREGS; 2660 /** Pointer to a const MPX bound register state. */ 2661 typedef X86XSAVEBNDREGS const *PCX86XSAVEBNDREGS; 2662 2663 /** 2664 * Intel MPX bound config and status register state (XSAVE_C_BNDCSR). 2665 */ 2666 typedef struct X86XSAVEBNDCFG 2667 { 2668 uint64_t fConfig; 2669 uint64_t fStatus; 2670 } X86XSAVEBNDCFG; 2671 #ifndef VBOX_FOR_DTRACE_LIB 2672 AssertCompileSize(X86XSAVEBNDCFG, 16); 2673 #endif 2674 /** Pointer to a MPX bound config and status register state. */ 2675 typedef X86XSAVEBNDCFG *PX86XSAVEBNDCFG; 2676 /** Pointer to a const MPX bound config and status register state. */ 2677 typedef X86XSAVEBNDCFG *PCX86XSAVEBNDCFG; 2678 2679 /** 2680 * AVX-512 opmask state (XSAVE_C_OPMASK). 2681 */ 2682 typedef struct X86XSAVEOPMASK 2683 { 2684 /** The K0..K7 values. */ 2685 uint64_t aKRegs[8]; 2686 } X86XSAVEOPMASK; 2687 #ifndef VBOX_FOR_DTRACE_LIB 2688 AssertCompileSize(X86XSAVEOPMASK, 64); 2689 #endif 2690 /** Pointer to a AVX-512 opmask state. */ 2691 typedef X86XSAVEOPMASK *PX86XSAVEOPMASK; 2692 /** Pointer to a const AVX-512 opmask state. */ 2693 typedef X86XSAVEOPMASK const *PCX86XSAVEOPMASK; 2694 2695 /** 2696 * ZMM0-15 upper 256 bits introduced in AVX-512 (XSAVE_C_ZMM_HI256). 2697 */ 2698 typedef struct X86XSAVEZMMHI256 2699 { 2700 /** Upper 256-bits of ZMM0-15. */ 2701 X86YMMREG aHi256Regs[16]; 2702 } X86XSAVEZMMHI256; 2703 #ifndef VBOX_FOR_DTRACE_LIB 2704 AssertCompileSize(X86XSAVEZMMHI256, 512); 2705 #endif 2706 /** Pointer to a state comprising the upper 256-bits of ZMM0-15. */ 2707 typedef X86XSAVEZMMHI256 *PX86XSAVEZMMHI256; 2708 /** Pointer to a const state comprising the upper 256-bits of ZMM0-15. */ 2709 typedef X86XSAVEZMMHI256 const *PCX86XSAVEZMMHI256; 2710 2711 /** 2712 * ZMM16-31 register state introduced in AVX-512 (XSAVE_C_ZMM_16HI). 2713 */ 2714 typedef struct X86XSAVEZMM16HI 2715 { 2716 /** ZMM16 thru ZMM31. */ 2717 X86ZMMREG aRegs[16]; 2718 } X86XSAVEZMM16HI; 2719 #ifndef VBOX_FOR_DTRACE_LIB 2720 AssertCompileSize(X86XSAVEZMM16HI, 1024); 2721 #endif 2722 /** Pointer to a state comprising ZMM16-32. */ 2723 typedef X86XSAVEZMM16HI *PX86XSAVEZMM16HI; 2724 /** Pointer to a const state comprising ZMM16-32. */ 2725 typedef X86XSAVEZMM16HI const *PCX86XSAVEZMM16HI; 2726 2727 /** 2728 * AMD Light weight profiling state (XSAVE_C_LWP). 2729 * 2730 * We probably won't play with this as AMD seems to be dropping from their "zen" 2731 * processor micro architecture. 2732 */ 2733 typedef struct X86XSAVELWP 2734 { 2735 /** Details when needed. */ 2736 uint64_t auLater[128/8]; 2737 } X86XSAVELWP; 2738 #ifndef VBOX_FOR_DTRACE_LIB 2739 AssertCompileSize(X86XSAVELWP, 128); 2740 #endif 2741 2742 2743 2744 typedef struct X86XSAVEAREA 2745 { 2746 /** The x87 and SSE region (or legacy region if you like). */ 2747 X86FXSTATE x87; 2748 /** The XSAVE header. */ 2749 X86XSAVEHDR Hdr; 2750 /** Beyond the header, there isn't really a fixed layout, but we can 2751 generally assume the YMM (AVX) register extensions are present and 2752 follows immediately. */ 2753 union 2754 { 2755 /** This is a typical layout on intel CPUs (good for debuggers). */ 2756 struct 2757 { 2758 X86XSAVEYMMHI YmmHi; 2759 X86XSAVEBNDREGS BndRegs; 2760 X86XSAVEBNDCFG BndCfg; 2761 uint8_t abFudgeToMatchDocs[0xB0]; 2762 X86XSAVEOPMASK Opmask; 2763 X86XSAVEZMMHI256 ZmmHi256; 2764 X86XSAVEZMM16HI Zmm16Hi; 2765 } Intel; 2766 2767 /** This is a typical layout on AMD Bulldozer type CPUs (good for debuggers). */ 2768 struct 2769 { 2770 X86XSAVEYMMHI YmmHi; 2771 X86XSAVELWP Lwp; 2772 } AmdBd; 2773 2774 /** Reserved 8K here for current and future state info. */ 2775 uint8_t ab[8192 - 512 - 64]; 2776 } u; 2777 } X86XSAVEAREA; 2778 #ifndef VBOX_FOR_DTRACE_LIB 2779 AssertCompileSize(X86XSAVEAREA, 8192); 2780 AssertCompileMemberOffset(X86XSAVEAREA, Hdr, 0x200); 2781 AssertCompileMemberOffset(X86XSAVEAREA, u.Intel.YmmHi, 0x240); 2782 AssertCompileMemberOffset(X86XSAVEAREA, u.Intel.BndRegs, 0x340); 2783 AssertCompileMemberOffset(X86XSAVEAREA, u.Intel.BndCfg, 0x380); 2784 AssertCompileMemberOffset(X86XSAVEAREA, u.Intel.Opmask, 0x440 /* 1088 */); 2785 AssertCompileMemberOffset(X86XSAVEAREA, u.Intel.ZmmHi256, 0x480 /* 1152 */); 2786 AssertCompileMemberOffset(X86XSAVEAREA, u.Intel.Zmm16Hi, 0x680 /* 1664 */); 2787 #endif 2788 2789 2790 /** @name XSAVE_C_XXX - XSAVE State Components Bits. 2791 * @{ */ 2792 /** Bit 0 - x87 - Legacy FPU state. */ 2793 #define XSAVE_C_X87 RT_BIT_64(0) 2794 /** Bit 1 - SSE - 128-bit SSE state. */ 2795 #define XSAVE_C_SSE RT_BIT_64(1) 2796 /** Bit 2 - YMM_Hi128 - Upper 128 bits of YMM0-15 (AVX). */ 2797 #define XSAVE_C_YMM RT_BIT_64(2) 2798 /** Bit 3 - BNDREGS - MPX bound register state. */ 2799 #define XSAVE_C_BNDREGS RT_BIT_64(3) 2800 /** Bit 4 - BNDCSR - MPX bound config and status state. */ 2801 #define XSAVE_C_BNDCSR RT_BIT_64(4) 2802 /** Bit 5 - Opmask - opmask state. */ 2803 #define XSAVE_C_OPMASK RT_BIT_64(5) 2804 /** Bit 6 - ZMM_Hi256 - Upper 256 bits of ZMM0-15 (AVX-512). */ 2805 #define XSAVE_C_ZMM_HI256 RT_BIT_64(6) 2806 /** Bit 7 - Hi16_ZMM - 512-bits ZMM16-31 state (AVX-512). */ 2807 #define XSAVE_C_ZMM_16HI RT_BIT_64(7) 2808 /** Bit 62 - LWP - Lightweight Profiling (AMD). */ 2809 #define XSAVE_C_LWP RT_BIT_64(62) 2810 /** @} */ 2811 2542 2812 2543 2813 -
trunk/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp
r54894 r54896 4805 4805 DBGFREGSUBFIELD_RO("SSE\0" "128-bit SSE state", 1, 1, 0), 4806 4806 DBGFREGSUBFIELD_RO("YMM_Hi128\0" "Upper 128 bits of YMM0-15 (AVX)", 2, 1, 0), 4807 DBGFREGSUBFIELD_RO(" AVX\0" "256-bit AVX state",3, 1, 0),4808 DBGFREGSUBFIELD_RO("BND REGS\0" "MPX bound register state",4, 1, 0),4809 DBGFREGSUBFIELD_RO(" BNDCSR\0" "MPX bound config and status state",5, 1, 0),4810 DBGFREGSUBFIELD_RO(" Opmask\0" "opmask state",6, 1, 0),4811 DBGFREGSUBFIELD_RO(" ZMM_Hi256\0" "Upper 256 bits of ZMM0-15 (AVX-512)",7, 1, 0),4812 DBGFREGSUBFIELD_RO(" Hi16_ZMM\0" "512-bits ZMM16-31 state (AVX-512)", 8, 1, 0),4807 DBGFREGSUBFIELD_RO("BNDREGS\0" "MPX bound register state", 3, 1, 0), 4808 DBGFREGSUBFIELD_RO("BNDCSR\0" "MPX bound config and status state", 4, 1, 0), 4809 DBGFREGSUBFIELD_RO("Opmask\0" "opmask state", 5, 1, 0), 4810 DBGFREGSUBFIELD_RO("ZMM_Hi256\0" "Upper 256 bits of ZMM0-15 (AVX-512)", 6, 1, 0), 4811 DBGFREGSUBFIELD_RO("Hi16_ZMM\0" "512-bits ZMM16-31 state (AVX-512)", 7, 1, 0), 4812 DBGFREGSUBFIELD_RO("LWP\0" "Lightweight Profiling (AMD)", 62, 1, 0), 4813 4813 DBGFREGSUBFIELD_TERMINATOR() 4814 4814 };
Note:
See TracChangeset
for help on using the changeset viewer.