mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 21:33:00 +00:00
7cbb39d4d4
Pull kvm updates from Paolo Bonzini: "PPC and ARM do not have much going on this time. Most of the cool stuff, instead, is in s390 and (after a few releases) x86. ARM has some caching fixes and PPC has transactional memory support in guests. MIPS has some fixes, with more probably coming in 3.16 as QEMU will soon get support for MIPS KVM. For x86 there are optimizations for debug registers, which trigger on some Windows games, and other important fixes for Windows guests. We now expose to the guest Broadwell instruction set extensions and also Intel MPX. There's also a fix/workaround for OS X guests, nested virtualization features (preemption timer), and a couple kvmclock refinements. For s390, the main news is asynchronous page faults, together with improvements to IRQs (floating irqs and adapter irqs) that speed up virtio devices" * tag 'kvm-3.15-1' of git://git.kernel.org/pub/scm/virt/kvm/kvm: (96 commits) KVM: PPC: Book3S HV: Save/restore host PMU registers that are new in POWER8 KVM: PPC: Book3S HV: Fix decrementer timeouts with non-zero TB offset KVM: PPC: Book3S HV: Don't use kvm_memslots() in real mode KVM: PPC: Book3S HV: Return ENODEV error rather than EIO KVM: PPC: Book3S: Trim top 4 bits of physical address in RTAS code KVM: PPC: Book3S HV: Add get/set_one_reg for new TM state KVM: PPC: Book3S HV: Add transactional memory support KVM: Specify byte order for KVM_EXIT_MMIO KVM: vmx: fix MPX detection KVM: PPC: Book3S HV: Fix KVM hang with CONFIG_KVM_XICS=n KVM: PPC: Book3S: Introduce hypervisor call H_GET_TCE KVM: PPC: Book3S HV: Fix incorrect userspace exit on ioeventfd write KVM: s390: clear local interrupts at cpu initial reset KVM: s390: Fix possible memory leak in SIGP functions KVM: s390: fix calculation of idle_mask array size KVM: s390: randomize sca address KVM: ioapic: reinject pending interrupts on KVM_SET_IRQCHIP KVM: Bump KVM_MAX_IRQ_ROUTES for s390 KVM: s390: irq routing for adapter interrupts. KVM: s390: adapter interrupt sources ...
152 lines
3.9 KiB
C
152 lines
3.9 KiB
C
#ifndef __ASM_X86_XSAVE_H
|
|
#define __ASM_X86_XSAVE_H
|
|
|
|
#include <linux/types.h>
|
|
#include <asm/processor.h>
|
|
|
|
#define XSTATE_CPUID 0x0000000d
|
|
|
|
#define XSTATE_FP 0x1
|
|
#define XSTATE_SSE 0x2
|
|
#define XSTATE_YMM 0x4
|
|
#define XSTATE_BNDREGS 0x8
|
|
#define XSTATE_BNDCSR 0x10
|
|
#define XSTATE_OPMASK 0x20
|
|
#define XSTATE_ZMM_Hi256 0x40
|
|
#define XSTATE_Hi16_ZMM 0x80
|
|
|
|
#define XSTATE_FPSSE (XSTATE_FP | XSTATE_SSE)
|
|
/* Bit 63 of XCR0 is reserved for future expansion */
|
|
#define XSTATE_EXTEND_MASK (~(XSTATE_FPSSE | (1ULL << 63)))
|
|
|
|
#define FXSAVE_SIZE 512
|
|
|
|
#define XSAVE_HDR_SIZE 64
|
|
#define XSAVE_HDR_OFFSET FXSAVE_SIZE
|
|
|
|
#define XSAVE_YMM_SIZE 256
|
|
#define XSAVE_YMM_OFFSET (XSAVE_HDR_SIZE + XSAVE_HDR_OFFSET)
|
|
|
|
/* Supported features which support lazy state saving */
|
|
#define XSTATE_LAZY (XSTATE_FP | XSTATE_SSE | XSTATE_YMM \
|
|
| XSTATE_OPMASK | XSTATE_ZMM_Hi256 | XSTATE_Hi16_ZMM)
|
|
|
|
/* Supported features which require eager state saving */
|
|
#define XSTATE_EAGER (XSTATE_BNDREGS | XSTATE_BNDCSR)
|
|
|
|
/* All currently supported features */
|
|
#define XCNTXT_MASK (XSTATE_LAZY | XSTATE_EAGER)
|
|
|
|
#ifdef CONFIG_X86_64
|
|
#define REX_PREFIX "0x48, "
|
|
#else
|
|
#define REX_PREFIX
|
|
#endif
|
|
|
|
extern unsigned int xstate_size;
|
|
extern u64 pcntxt_mask;
|
|
extern u64 xstate_fx_sw_bytes[USER_XSTATE_FX_SW_WORDS];
|
|
extern struct xsave_struct *init_xstate_buf;
|
|
|
|
extern void xsave_init(void);
|
|
extern void update_regset_xstate_info(unsigned int size, u64 xstate_mask);
|
|
extern int init_fpu(struct task_struct *child);
|
|
|
|
static inline int fpu_xrstor_checking(struct xsave_struct *fx)
|
|
{
|
|
int err;
|
|
|
|
asm volatile("1: .byte " REX_PREFIX "0x0f,0xae,0x2f\n\t"
|
|
"2:\n"
|
|
".section .fixup,\"ax\"\n"
|
|
"3: movl $-1,%[err]\n"
|
|
" jmp 2b\n"
|
|
".previous\n"
|
|
_ASM_EXTABLE(1b, 3b)
|
|
: [err] "=r" (err)
|
|
: "D" (fx), "m" (*fx), "a" (-1), "d" (-1), "0" (0)
|
|
: "memory");
|
|
|
|
return err;
|
|
}
|
|
|
|
static inline int xsave_user(struct xsave_struct __user *buf)
|
|
{
|
|
int err;
|
|
|
|
/*
|
|
* Clear the xsave header first, so that reserved fields are
|
|
* initialized to zero.
|
|
*/
|
|
err = __clear_user(&buf->xsave_hdr, sizeof(buf->xsave_hdr));
|
|
if (unlikely(err))
|
|
return -EFAULT;
|
|
|
|
__asm__ __volatile__(ASM_STAC "\n"
|
|
"1: .byte " REX_PREFIX "0x0f,0xae,0x27\n"
|
|
"2: " ASM_CLAC "\n"
|
|
".section .fixup,\"ax\"\n"
|
|
"3: movl $-1,%[err]\n"
|
|
" jmp 2b\n"
|
|
".previous\n"
|
|
_ASM_EXTABLE(1b,3b)
|
|
: [err] "=r" (err)
|
|
: "D" (buf), "a" (-1), "d" (-1), "0" (0)
|
|
: "memory");
|
|
return err;
|
|
}
|
|
|
|
static inline int xrestore_user(struct xsave_struct __user *buf, u64 mask)
|
|
{
|
|
int err;
|
|
struct xsave_struct *xstate = ((__force struct xsave_struct *)buf);
|
|
u32 lmask = mask;
|
|
u32 hmask = mask >> 32;
|
|
|
|
__asm__ __volatile__(ASM_STAC "\n"
|
|
"1: .byte " REX_PREFIX "0x0f,0xae,0x2f\n"
|
|
"2: " ASM_CLAC "\n"
|
|
".section .fixup,\"ax\"\n"
|
|
"3: movl $-1,%[err]\n"
|
|
" jmp 2b\n"
|
|
".previous\n"
|
|
_ASM_EXTABLE(1b,3b)
|
|
: [err] "=r" (err)
|
|
: "D" (xstate), "a" (lmask), "d" (hmask), "0" (0)
|
|
: "memory"); /* memory required? */
|
|
return err;
|
|
}
|
|
|
|
static inline void xrstor_state(struct xsave_struct *fx, u64 mask)
|
|
{
|
|
u32 lmask = mask;
|
|
u32 hmask = mask >> 32;
|
|
|
|
asm volatile(".byte " REX_PREFIX "0x0f,0xae,0x2f\n\t"
|
|
: : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
|
|
: "memory");
|
|
}
|
|
|
|
static inline void xsave_state(struct xsave_struct *fx, u64 mask)
|
|
{
|
|
u32 lmask = mask;
|
|
u32 hmask = mask >> 32;
|
|
|
|
asm volatile(".byte " REX_PREFIX "0x0f,0xae,0x27\n\t"
|
|
: : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
|
|
: "memory");
|
|
}
|
|
|
|
static inline void fpu_xsave(struct fpu *fpu)
|
|
{
|
|
/* This, however, we can work around by forcing the compiler to select
|
|
an addressing mode that doesn't require extended registers. */
|
|
alternative_input(
|
|
".byte " REX_PREFIX "0x0f,0xae,0x27",
|
|
".byte " REX_PREFIX "0x0f,0xae,0x37",
|
|
X86_FEATURE_XSAVEOPT,
|
|
[fx] "D" (&fpu->state->xsave), "a" (-1), "d" (-1) :
|
|
"memory");
|
|
}
|
|
#endif
|