aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXiao Guangrong <guangrong.xiao@linux.intel.com>2016-03-22 04:51:17 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2016-03-22 11:21:05 -0400
commit9e90199c25aec31b4509213881511948f6c763c8 (patch)
treee2cf6063637ff350c97664d1f1fc4075584b67f4
parent17a511f878505d31f298de443269b3070c134163 (diff)
x86: pkey: introduce write_pkru() for KVM
KVM will use it to switch pkru between guest and host. CC: Ingo Molnar <mingo@redhat.com> CC: Dave Hansen <dave.hansen@linux.intel.com> Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com> Signed-off-by: Huaitong Han <huaitong.han@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--arch/x86/include/asm/pgtable.h6
-rw-r--r--arch/x86/include/asm/special_insns.h16
2 files changed, 22 insertions, 0 deletions
diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
index 1ff49ec29ece..97f3242e133c 100644
--- a/arch/x86/include/asm/pgtable.h
+++ b/arch/x86/include/asm/pgtable.h
@@ -107,6 +107,12 @@ static inline u32 read_pkru(void)
107 return 0; 107 return 0;
108} 108}
109 109
110static inline void write_pkru(u32 pkru)
111{
112 if (boot_cpu_has(X86_FEATURE_OSPKE))
113 __write_pkru(pkru);
114}
115
110static inline int pte_young(pte_t pte) 116static inline int pte_young(pte_t pte)
111{ 117{
112 return pte_flags(pte) & _PAGE_ACCESSED; 118 return pte_flags(pte) & _PAGE_ACCESSED;
diff --git a/arch/x86/include/asm/special_insns.h b/arch/x86/include/asm/special_insns.h
index aee6e76e561e..d96d04377765 100644
--- a/arch/x86/include/asm/special_insns.h
+++ b/arch/x86/include/asm/special_insns.h
@@ -113,11 +113,27 @@ static inline u32 __read_pkru(void)
113 : "c" (ecx)); 113 : "c" (ecx));
114 return pkru; 114 return pkru;
115} 115}
116
117static inline void __write_pkru(u32 pkru)
118{
119 u32 ecx = 0, edx = 0;
120
121 /*
122 * "wrpkru" instruction. Loads contents in EAX to PKRU,
123 * requires that ecx = edx = 0.
124 */
125 asm volatile(".byte 0x0f,0x01,0xef\n\t"
126 : : "a" (pkru), "c"(ecx), "d"(edx));
127}
116#else 128#else
117static inline u32 __read_pkru(void) 129static inline u32 __read_pkru(void)
118{ 130{
119 return 0; 131 return 0;
120} 132}
133
134static inline void __write_pkru(u32 pkru)
135{
136}
121#endif 137#endif
122 138
123static inline void native_wbinvd(void) 139static inline void native_wbinvd(void)