zephyr/include/arch/x86/msr.h

85 lines
1.6 KiB
C

/*
* Copyright (c) 2019 Intel Corp.
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_ARCH_X86_MSR_H_
#define ZEPHYR_INCLUDE_ARCH_X86_MSR_H_
/*
* Model specific registers (MSR). Access with z_x86_msr_read/write().
*/
#define X86_TIME_STAMP_COUNTER_MSR 0x00000010
#define X86_SPEC_CTRL_MSR 0x00000048
#define X86_SPEC_CTRL_MSR_IBRS BIT(0)
#define X86_SPEC_CTRL_MSR_SSBD BIT(2)
#define X86_APIC_BASE_MSR 0x0000001b
#define X86_APIC_BASE_MSR_X2APIC BIT(10)
#define X86_MTRR_DEF_TYPE_MSR 0x000002ff
#define X86_MTRR_DEF_TYPE_MSR_ENABLE BIT(11)
#define X86_X2APIC_BASE_MSR 0x00000800 /* .. thru 0x00000BFF */
#define X86_EFER_MSR 0xC0000080
#define X86_EFER_MSR_LME BIT(8)
#define X86_EFER_MSR_NXE BIT(11)
#ifndef _ASMLANGUAGE
#ifdef __cplusplus
extern "C" {
#endif
/*
* z_x86_msr_write() is shared between 32- and 64-bit implementations, but
* due to ABI differences with long return values, z_x86_msr_read() is not.
*/
static inline void z_x86_msr_write(unsigned int msr, u64_t data)
{
u32_t high = data >> 32;
u32_t low = data & 0xFFFFFFFF;
__asm__ volatile ("wrmsr" : : "c"(msr), "a"(low), "d"(high));
}
#ifdef CONFIG_X86_64
static inline u64_t z_x86_msr_read(unsigned int msr)
{
union {
struct {
u32_t lo;
u32_t hi;
};
u64_t value;
} rv;
__asm__ volatile ("rdmsr" : "=a" (rv.lo), "=d" (rv.hi) : "c" (msr));
return rv.value;
}
#else
static inline u64_t z_x86_msr_read(unsigned int msr)
{
u64_t ret;
__asm__ volatile("rdmsr" : "=A" (ret) : "c" (msr));
return ret;
}
#endif
#ifdef __cplusplus
}
#endif
#endif /* _ASMLANGUAGE */
#endif /* ZEPHYR_INCLUDE_ARCH_X86_MSR_H_ */