blob: fed6617a1079b0b94ab65cb214a7865cac8eddda [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
Yu-cheng Yu1499ce22016-06-17 13:07:16 -070021/* Supervisor features */
22#define XFEATURE_MASK_SUPERVISOR (XFEATURE_MASK_PT)
23
Andy Lutomirski2f7fada2016-10-04 20:34:32 -040024/* All currently supported features */
25#define XCNTXT_MASK (XFEATURE_MASK_FP | \
Yu-cheng Yua65050c2016-03-09 16:28:54 -080026 XFEATURE_MASK_SSE | \
yu-cheng yu394db202016-01-06 14:24:54 -080027 XFEATURE_MASK_YMM | \
28 XFEATURE_MASK_OPMASK | \
29 XFEATURE_MASK_ZMM_Hi256 | \
Dave Hansenc8df4002016-02-12 13:02:04 -080030 XFEATURE_MASK_Hi16_ZMM | \
Andy Lutomirski2f7fada2016-10-04 20:34:32 -040031 XFEATURE_MASK_PKRU | \
32 XFEATURE_MASK_BNDREGS | \
33 XFEATURE_MASK_BNDCSR)
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
Ingo Molnar614df7f2015-04-24 09:20:33 +020041extern u64 xfeatures_mask;
Suresh Siddha5b3efd52010-02-11 11:50:59 -080042extern u64 xstate_fx_sw_bytes[USER_XSTATE_FX_SW_WORDS];
Suresh Siddhadc1e35c2008-07-29 10:29:19 -070043
Kees Cook404f6aa2016-08-08 16:29:06 -070044extern void __init update_regset_xstate_info(unsigned int size,
45 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);
Yu-cheng Yu99aa22d2016-05-20 10:47:08 -070050int using_compacted_format(void);
Ingo Molnar56583c92017-09-23 14:59:51 +020051int copy_xstate_to_kernel(void *kbuf, struct xregs_state *xsave, unsigned int offset, unsigned int size);
52int copy_xstate_to_user(void __user *ubuf, struct xregs_state *xsave, unsigned int offset, unsigned int size);
Ingo Molnar656f0832017-09-23 14:59:44 +020053int copy_user_to_xstate(const void *kbuf, const void __user *ubuf,
Yu-cheng Yu91c3dba2016-06-17 13:07:17 -070054 struct xregs_state *xsave);
Suresh Siddhadc1e35c2008-07-29 10:29:19 -070055#endif