blob: 3a6c89b7030757e707a77be75a5a4d3a30e2982f [file] [log] [blame]
Suresh Siddhadc1e35c2008-07-29 10:29:19 -07001#ifndef __ASM_X86_XSAVE_H
2#define __ASM_X86_XSAVE_H
3
H. Peter Anvin6152e4b2008-07-29 17:23:16 -07004#include <linux/types.h>
Suresh Siddhadc1e35c2008-07-29 10:29:19 -07005#include <asm/processor.h>
Ingo Molnar59a36d12015-04-30 08:53:18 +02006#include <linux/uaccess.h>
Suresh Siddhadc1e35c2008-07-29 10:29:19 -07007
Liu, Jinsong56c103e2014-02-21 17:39:02 +00008/* Bit 63 of XCR0 is reserved for future expansion */
Dave Hansend91cab72015-09-02 16:31:26 -07009#define XFEATURE_MASK_EXTEND (~(XFEATURE_MASK_FPSSE | (1ULL << 63)))
Suresh Siddhadc1e35c2008-07-29 10:29:19 -070010
Ingo Molnar677b98b2015-04-28 09:40:26 +020011#define XSTATE_CPUID 0x0000000d
12
Suresh Siddhadc1e35c2008-07-29 10:29:19 -070013#define FXSAVE_SIZE 512
14
Sheng Yang2d5b5a62010-06-13 17:29:39 +080015#define XSAVE_HDR_SIZE 64
16#define XSAVE_HDR_OFFSET FXSAVE_SIZE
17
18#define XSAVE_YMM_SIZE 256
19#define XSAVE_YMM_OFFSET (XSAVE_HDR_SIZE + XSAVE_HDR_OFFSET)
Sheng Yang5ee481d2010-05-17 17:22:23 +080020
Qiaowei Rene7d820a2013-12-05 17:15:34 +080021/* Supported features which support lazy state saving */
Dave Hansend91cab72015-09-02 16:31:26 -070022#define XFEATURE_MASK_LAZY (XFEATURE_MASK_FP | \
23 XFEATURE_MASK_SSE | \
24 XFEATURE_MASK_YMM | \
25 XFEATURE_MASK_OPMASK | \
26 XFEATURE_MASK_ZMM_Hi256 | \
27 XFEATURE_MASK_Hi16_ZMM)
Qiaowei Rene7d820a2013-12-05 17:15:34 +080028
29/* Supported features which require eager state saving */
Dave Hansend91cab72015-09-02 16:31:26 -070030#define XFEATURE_MASK_EAGER (XFEATURE_MASK_BNDREGS | XFEATURE_MASK_BNDCSR)
Qiaowei Rene7d820a2013-12-05 17:15:34 +080031
32/* All currently supported features */
Dave Hansend91cab72015-09-02 16:31:26 -070033#define XCNTXT_MASK (XFEATURE_MASK_LAZY | XFEATURE_MASK_EAGER)
Suresh Siddhadc1e35c2008-07-29 10:29:19 -070034
Suresh Siddhab359e8a2008-07-29 10:29:20 -070035#ifdef CONFIG_X86_64
36#define REX_PREFIX "0x48, "
37#else
38#define REX_PREFIX
39#endif
40
H. Peter Anvin6152e4b2008-07-29 17:23:16 -070041extern unsigned int xstate_size;
Ingo Molnar614df7f2015-04-24 09:20:33 +020042extern u64 xfeatures_mask;
Suresh Siddha5b3efd52010-02-11 11:50:59 -080043extern u64 xstate_fx_sw_bytes[USER_XSTATE_FX_SW_WORDS];
Suresh Siddhadc1e35c2008-07-29 10:29:19 -070044
Suresh Siddha5b3efd52010-02-11 11:50:59 -080045extern void update_regset_xstate_info(unsigned int size, u64 xstate_mask);
Suresh Siddhadc1e35c2008-07-29 10:29:19 -070046
Dave Hansen0a265372015-09-02 16:31:24 -070047void fpu__xstate_clear_all_cpu_caps(void);
Ingo Molnarc47ada32015-04-30 17:15:32 +020048void *get_xsave_addr(struct xregs_state *xsave, int xstate);
Dave Hansen04cd0272015-06-07 11:37:00 -070049const void *get_xsave_field_ptr(int xstate_field);
Fenghua Yu7496d642014-05-29 11:12:44 -070050
Suresh Siddhadc1e35c2008-07-29 10:29:19 -070051#endif