| // Copyright 2016 The Fuchsia Authors |
| // |
| // Use of this source code is governed by a MIT-style |
| // license that can be found in the LICENSE file or at |
| // https://opensource.org/licenses/MIT |
| |
| #pragma once |
| |
| // This header is intended to be included in both C and ASM |
| #define X86_CR0_PE 0x00000001 /* protected mode enable */ |
| #define X86_CR0_MP 0x00000002 /* monitor coprocessor */ |
| #define X86_CR0_EM 0x00000004 /* emulation */ |
| #define X86_CR0_TS 0x00000008 /* task switched */ |
| #define X86_CR0_NE 0x00000020 /* enable x87 exception */ |
| #define X86_CR0_WP 0x00010000 /* supervisor write protect */ |
| #define X86_CR0_NW 0x20000000 /* not write-through */ |
| #define X86_CR0_CD 0x40000000 /* cache disable */ |
| #define X86_CR0_PG 0x80000000 /* enable paging */ |
| #define X86_CR4_PAE 0x00000020 /* PAE paging */ |
| #define X86_CR4_PGE 0x00000080 /* page global enable */ |
| #define X86_CR4_OSFXSR 0x00000200 /* os supports fxsave */ |
| #define X86_CR4_OSXMMEXPT 0x00000400 /* os supports xmm exception */ |
| #define X86_CR4_VMXE 0x00002000 /* enable vmx */ |
| #define X86_CR4_FSGSBASE 0x00010000 /* enable {rd,wr}{fs,gs}base */ |
| #define X86_CR4_OSXSAVE 0x00040000 /* os supports xsave */ |
| #define X86_CR4_SMEP 0x00100000 /* SMEP protection enabling */ |
| #define X86_CR4_SMAP 0x00200000 /* SMAP protection enabling */ |
| #define X86_EFER_SCE 0x00000001 /* enable SYSCALL */ |
| #define X86_EFER_LME 0x00000100 /* long mode enable */ |
| #define X86_EFER_LMA 0x00000400 /* long mode active */ |
| #define X86_EFER_NXE 0x00000800 /* to enable execute disable bit */ |
| #define X86_MSR_IA32_PLATFORM_ID 0x00000017 /* platform id */ |
| #define X86_MSR_IA32_APIC_BASE 0x0000001b /* APIC base physical address */ |
| #define X86_MSR_IA32_SMI_COUNT 0x00000034 /* SMI count */ |
| #define X86_MSR_IA32_TSC_ADJUST 0x0000003b /* TSC adjust */ |
| #define X86_MSR_IA32_PPERF 0x0000064e /* productive performance count */ |
| #define X86_MSR_IA32_BIOS_SIGN_ID 0x0000008b /* BIOS update signature */ |
| #define X86_MSR_IA32_MTRRCAP 0x000000fe /* MTRR capability */ |
| #define X86_MSR_IA32_SYSENTER_CS 0x00000174 /* SYSENTER CS */ |
| #define X86_MSR_IA32_SYSENTER_ESP 0x00000175 /* SYSENTER ESP */ |
| #define X86_MSR_IA32_SYSENTER_EIP 0x00000176 /* SYSENTER EIP */ |
| #define X86_MSR_IA32_MCG_CAP 0x00000179 /* global machine check capability */ |
| #define X86_MSR_IA32_MCG_STATUS 0x0000017a /* global machine check status */ |
| #define X86_MSR_IA32_MISC_ENABLE 0x000001a0 /* enable/disable misc processor features */ |
| #define X86_MSR_IA32_TEMPERATURE_TARGET 0x000001a2 /* temperature target and offset */ |
| #define X86_MSR_IA32_MTRR_PHYSBASE0 0x00000200 /* MTRR PhysBase0 */ |
| #define X86_MSR_IA32_MTRR_PHYSMASK0 0x00000201 /* MTRR PhysMask0 */ |
| #define X86_MSR_IA32_MTRR_PHYSMASK9 0x00000213 /* MTRR PhysMask9 */ |
| #define X86_MSR_IA32_MTRR_DEF_TYPE 0x000002ff /* MTRR default type */ |
| #define X86_MSR_IA32_MTRR_FIX64K_00000 0x00000250 /* MTRR FIX64K_00000 */ |
| #define X86_MSR_IA32_MTRR_FIX16K_80000 0x00000258 /* MTRR FIX16K_80000 */ |
| #define X86_MSR_IA32_MTRR_FIX16K_A0000 0x00000259 /* MTRR FIX16K_A0000 */ |
| #define X86_MSR_IA32_MTRR_FIX4K_C0000 0x00000268 /* MTRR FIX4K_C0000 */ |
| #define X86_MSR_IA32_MTRR_FIX4K_F8000 0x0000026f /* MTRR FIX4K_F8000 */ |
| #define X86_MSR_IA32_PAT 0x00000277 /* PAT */ |
| #define X86_MSR_IA32_RAPL_POWER_UNIT 0x00000606 /* unit multipliers in RAPL interfaces */ |
| #define X86_MSR_IA32_TSC_DEADLINE 0x000006e0 /* TSC deadline */ |
| #define X86_MSR_IA32_EFER 0xc0000080 /* EFER */ |
| #define X86_MSR_IA32_STAR 0xc0000081 /* system call address */ |
| #define X86_MSR_IA32_LSTAR 0xc0000082 /* long mode call address */ |
| #define X86_MSR_IA32_CSTAR 0xc0000083 /* ia32-e compat call address */ |
| #define X86_MSR_IA32_FMASK 0xc0000084 /* system call flag mask */ |
| #define X86_MSR_IA32_FS_BASE 0xc0000100 /* fs base address */ |
| #define X86_MSR_IA32_GS_BASE 0xc0000101 /* gs base address */ |
| #define X86_MSR_IA32_KERNEL_GS_BASE 0xc0000102 /* kernel gs base */ |
| #define X86_MSR_IA32_TSC_AUX 0xc0000103 /* TSC aux */ |
| #define X86_MSR_IA32_PM_ENABLE 0x00000770 /* enable/disable HWP */ |
| #define X86_MSR_IA32_HWP_CAPABILITIES 0x00000771 /* HWP performance range enumeration */ |
| #define X86_MSR_IA32_HWP_REQUEST 0x00000774 /* power manage control hints */ |
| #define X86_CR4_PSE 0xffffffef /* Disabling PSE bit in the CR4 */ |
| |
| /* EFLAGS/RFLAGS */ |
| #define X86_FLAGS_CF (1<<0) |
| #define X86_FLAGS_PF (1<<2) |
| #define X86_FLAGS_AF (1<<4) |
| #define X86_FLAGS_ZF (1<<6) |
| #define X86_FLAGS_SF (1<<7) |
| #define X86_FLAGS_TF (1<<8) |
| #define X86_FLAGS_IF (1<<9) |
| #define X86_FLAGS_DF (1<<10) |
| #define X86_FLAGS_OF (1<<11) |
| #define X86_FLAGS_STATUS_MASK (0xfff) |
| #define X86_FLAGS_IOPL_MASK (3<<12) |
| #define X86_FLAGS_IOPL_SHIFT (12) |
| #define X86_FLAGS_NT (1<<14) |
| #define X86_FLAGS_RF (1<<16) |
| #define X86_FLAGS_VM (1<<17) |
| #define X86_FLAGS_AC (1<<18) |
| #define X86_FLAGS_VIF (1<<19) |
| #define X86_FLAGS_VIP (1<<20) |
| #define X86_FLAGS_ID (1<<21) |
| #define X86_FLAGS_RESERVED_ONES 0x2 |
| #define X86_FLAGS_RESERVED 0xffc0802a |
| #define X86_FLAGS_USER (X86_FLAGS_CF | \ |
| X86_FLAGS_PF | \ |
| X86_FLAGS_AF | \ |
| X86_FLAGS_ZF | \ |
| X86_FLAGS_SF | \ |
| X86_FLAGS_TF | \ |
| X86_FLAGS_DF | \ |
| X86_FLAGS_OF | \ |
| X86_FLAGS_NT | \ |
| X86_FLAGS_AC | \ |
| X86_FLAGS_ID) |
| |
| #ifndef ASSEMBLY |
| |
| #include <zircon/compiler.h> |
| #include <sys/types.h> |
| |
| __BEGIN_CDECLS |
| |
| /* Bit masks for xsave feature states; state components are |
| * enumerated in Intel Vol 1 section 13.1 */ |
| #define X86_XSAVE_STATE_X87 (1<<0) |
| #define X86_XSAVE_STATE_SSE (1<<1) |
| #define X86_XSAVE_STATE_AVX (1<<2) |
| #define X86_XSAVE_STATE_MPX_BNDREG (1<<3) |
| #define X86_XSAVE_STATE_MPX_BNDCSR (1<<4) |
| #define X86_XSAVE_STATE_AVX512_OPMASK (1<<5) |
| #define X86_XSAVE_STATE_AVX512_LOWERZMM_HIGH (1<<6) |
| #define X86_XSAVE_STATE_AVX512_HIGHERZMM (1<<7) |
| #define X86_XSAVE_STATE_PT (1<<8) |
| #define X86_XSAVE_STATE_PKRU (1<<9) |
| |
| #define X86_MAX_EXTENDED_REGISTER_SIZE 1024 |
| |
| enum x86_extended_register_feature { |
| X86_EXTENDED_REGISTER_X87, |
| X86_EXTENDED_REGISTER_SSE, |
| X86_EXTENDED_REGISTER_AVX, |
| X86_EXTENDED_REGISTER_MPX, |
| X86_EXTENDED_REGISTER_AVX512, |
| X86_EXTENDED_REGISTER_PT, |
| X86_EXTENDED_REGISTER_PKRU, |
| }; |
| |
| /* Identify which extended registers are supported. Also initialize |
| * the FPU if present */ |
| void x86_extended_register_init(void); |
| |
| /* Enable the requested feature on this CPU, return true on success. |
| * It is currently assumed that if a feature is enabled on one CPU, the caller |
| * will ensure it is enabled on all CPUs */ |
| bool x86_extended_register_enable_feature(enum x86_extended_register_feature); |
| |
| size_t x86_extended_register_size(void); |
| /* Initialize a state vector */ |
| void x86_extended_register_init_state(void *register_state); |
| /* Save current state to state vector */ |
| void x86_extended_register_save_state(void *register_state); |
| /* Restore a state created by x86_extended_register_init_state or |
| * x86_extended_register_save_state */ |
| void x86_extended_register_restore_state(void *register_state); |
| |
| typedef struct thread thread_t; |
| void x86_extended_register_context_switch( |
| thread_t *old_thread, thread_t *new_thread); |
| |
| void x86_set_extended_register_pt_state(bool threads); |
| |
| uint64_t x86_xgetbv(uint32_t reg); |
| void x86_xsetbv(uint32_t reg, uint64_t val); |
| |
| __END_CDECLS |
| |
| #endif |