1222f3e6fSPaolo Bonzini /* 2222f3e6fSPaolo Bonzini * i386 TCG cpu class initialization functions 3222f3e6fSPaolo Bonzini * 4222f3e6fSPaolo Bonzini * Copyright (c) 2003 Fabrice Bellard 5222f3e6fSPaolo Bonzini * 6222f3e6fSPaolo Bonzini * This library is free software; you can redistribute it and/or 7222f3e6fSPaolo Bonzini * modify it under the terms of the GNU Lesser General Public 8222f3e6fSPaolo Bonzini * License as published by the Free Software Foundation; either 9222f3e6fSPaolo Bonzini * version 2 of the License, or (at your option) any later version. 10222f3e6fSPaolo Bonzini * 11222f3e6fSPaolo Bonzini * This library is distributed in the hope that it will be useful, 12222f3e6fSPaolo Bonzini * but WITHOUT ANY WARRANTY; without even the implied warranty of 13222f3e6fSPaolo Bonzini * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14222f3e6fSPaolo Bonzini * Lesser General Public License for more details. 15222f3e6fSPaolo Bonzini * 16222f3e6fSPaolo Bonzini * You should have received a copy of the GNU Lesser General Public 17222f3e6fSPaolo Bonzini * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18222f3e6fSPaolo Bonzini */ 19222f3e6fSPaolo Bonzini #ifndef TCG_CPU_H 20222f3e6fSPaolo Bonzini #define TCG_CPU_H 21222f3e6fSPaolo Bonzini 22*a522b04bSPhilippe Mathieu-Daudé #include "cpu.h" 23*a522b04bSPhilippe Mathieu-Daudé 2448e5c98aSDavid Edmondson #define XSAVE_FCW_FSW_OFFSET 0x000 2548e5c98aSDavid Edmondson #define XSAVE_FTW_FOP_OFFSET 0x004 2648e5c98aSDavid Edmondson #define XSAVE_CWD_RIP_OFFSET 0x008 2748e5c98aSDavid Edmondson #define XSAVE_CWD_RDP_OFFSET 0x010 2848e5c98aSDavid Edmondson #define XSAVE_MXCSR_OFFSET 0x018 2948e5c98aSDavid Edmondson #define XSAVE_ST_SPACE_OFFSET 0x020 3048e5c98aSDavid Edmondson #define XSAVE_XMM_SPACE_OFFSET 0x0a0 3148e5c98aSDavid Edmondson #define XSAVE_XSTATE_BV_OFFSET 0x200 3248e5c98aSDavid Edmondson #define XSAVE_AVX_OFFSET 0x240 3348e5c98aSDavid Edmondson #define XSAVE_BNDREG_OFFSET 0x3c0 3448e5c98aSDavid Edmondson #define XSAVE_BNDCSR_OFFSET 0x400 3548e5c98aSDavid Edmondson #define XSAVE_OPMASK_OFFSET 0x440 3648e5c98aSDavid Edmondson #define XSAVE_ZMM_HI256_OFFSET 0x480 3748e5c98aSDavid Edmondson #define XSAVE_HI16_ZMM_OFFSET 0x680 3848e5c98aSDavid Edmondson #define XSAVE_PKRU_OFFSET 0xa80 3948e5c98aSDavid Edmondson 4048e5c98aSDavid Edmondson typedef struct X86XSaveArea { 4148e5c98aSDavid Edmondson X86LegacyXSaveArea legacy; 4248e5c98aSDavid Edmondson X86XSaveHeader header; 4348e5c98aSDavid Edmondson 4448e5c98aSDavid Edmondson /* Extended save areas: */ 4548e5c98aSDavid Edmondson 4648e5c98aSDavid Edmondson /* AVX State: */ 4748e5c98aSDavid Edmondson XSaveAVX avx_state; 4848e5c98aSDavid Edmondson 4948e5c98aSDavid Edmondson /* Ensure that XSaveBNDREG is properly aligned. */ 5048e5c98aSDavid Edmondson uint8_t padding[XSAVE_BNDREG_OFFSET 5148e5c98aSDavid Edmondson - sizeof(X86LegacyXSaveArea) 5248e5c98aSDavid Edmondson - sizeof(X86XSaveHeader) 5348e5c98aSDavid Edmondson - sizeof(XSaveAVX)]; 5448e5c98aSDavid Edmondson 5548e5c98aSDavid Edmondson /* MPX State: */ 5648e5c98aSDavid Edmondson XSaveBNDREG bndreg_state; 5748e5c98aSDavid Edmondson XSaveBNDCSR bndcsr_state; 5848e5c98aSDavid Edmondson /* AVX-512 State: */ 5948e5c98aSDavid Edmondson XSaveOpmask opmask_state; 6048e5c98aSDavid Edmondson XSaveZMM_Hi256 zmm_hi256_state; 6148e5c98aSDavid Edmondson XSaveHi16_ZMM hi16_zmm_state; 6248e5c98aSDavid Edmondson /* PKRU State: */ 6348e5c98aSDavid Edmondson XSavePKRU pkru_state; 6448e5c98aSDavid Edmondson } X86XSaveArea; 6548e5c98aSDavid Edmondson 6648e5c98aSDavid Edmondson QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, legacy.fcw) != XSAVE_FCW_FSW_OFFSET); 6748e5c98aSDavid Edmondson QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, legacy.ftw) != XSAVE_FTW_FOP_OFFSET); 6848e5c98aSDavid Edmondson QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, legacy.fpip) != XSAVE_CWD_RIP_OFFSET); 6948e5c98aSDavid Edmondson QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, legacy.fpdp) != XSAVE_CWD_RDP_OFFSET); 7048e5c98aSDavid Edmondson QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, legacy.mxcsr) != XSAVE_MXCSR_OFFSET); 7148e5c98aSDavid Edmondson QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, legacy.fpregs) != XSAVE_ST_SPACE_OFFSET); 7248e5c98aSDavid Edmondson QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, legacy.xmm_regs) != XSAVE_XMM_SPACE_OFFSET); 7348e5c98aSDavid Edmondson QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, avx_state) != XSAVE_AVX_OFFSET); 7448e5c98aSDavid Edmondson QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, bndreg_state) != XSAVE_BNDREG_OFFSET); 7548e5c98aSDavid Edmondson QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, bndcsr_state) != XSAVE_BNDCSR_OFFSET); 7648e5c98aSDavid Edmondson QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, opmask_state) != XSAVE_OPMASK_OFFSET); 7748e5c98aSDavid Edmondson QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, zmm_hi256_state) != XSAVE_ZMM_HI256_OFFSET); 7848e5c98aSDavid Edmondson QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, hi16_zmm_state) != XSAVE_HI16_ZMM_OFFSET); 7948e5c98aSDavid Edmondson QEMU_BUILD_BUG_ON(offsetof(X86XSaveArea, pkru_state) != XSAVE_PKRU_OFFSET); 8048e5c98aSDavid Edmondson 81*a522b04bSPhilippe Mathieu-Daudé extern const TCGCPUOps x86_tcg_ops; 82*a522b04bSPhilippe Mathieu-Daudé 83222f3e6fSPaolo Bonzini bool tcg_cpu_realizefn(CPUState *cs, Error **errp); 84222f3e6fSPaolo Bonzini 858480f7c7SPhilippe Mathieu-Daudé int x86_mmu_index_pl(CPUX86State *env, unsigned pl); 868480f7c7SPhilippe Mathieu-Daudé 87222f3e6fSPaolo Bonzini #endif /* TCG_CPU_H */ 88