[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 4/6] x86/vmx: Replace unqualified ud2 instructions with BUG frames
Using new _ASM_BUGFRAME* internals. A side effect of complicating the ASM statements is that GCC now chooses to out-of-line the stub functions, resulting in identical copies being present in all translation units. As with the stac()/clac() stubs, force them always inline. No functional change, other than the failure cases, which now produce a far more clear error message. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- CC: Jan Beulich <JBeulich@xxxxxxxx> CC: Jun Nakajima <jun.nakajima@xxxxxxxxx> CC: Kevin Tian <kevin.tian@xxxxxxxxx> --- xen/include/asm-x86/hvm/vmx/vmx.h | 70 ++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/xen/include/asm-x86/hvm/vmx/vmx.h b/xen/include/asm-x86/hvm/vmx/vmx.h index e750a76..f16a306 100644 --- a/xen/include/asm-x86/hvm/vmx/vmx.h +++ b/xen/include/asm-x86/hvm/vmx/vmx.h @@ -281,7 +281,7 @@ extern uint8_t posted_intr_vector; #define INVVPID_ALL_CONTEXT 2 #define INVVPID_SINGLE_CONTEXT_RETAINING_GLOBAL 3 -static inline void __vmptrld(u64 addr) +static always_inline void __vmptrld(u64 addr) { asm volatile ( #ifdef HAVE_GAS_VMX @@ -289,20 +289,21 @@ static inline void __vmptrld(u64 addr) #else VMPTRLD_OPCODE MODRM_EAX_06 #endif - /* CF==1 or ZF==1 --> crash (ud2) */ + /* CF==1 or ZF==1 --> BUG() */ UNLIKELY_START(be, vmptrld) - "\tud2\n" + _ASM_BUGFRAME_TEXT(0) UNLIKELY_END_SECTION : #ifdef HAVE_GAS_VMX - : "m" (addr) + : "m" (addr), #else - : "a" (&addr) + : "a" (&addr), #endif + _ASM_BUGFRAME_INFO(BUGFRAME_bug, __LINE__, __FILE__, 0) : "memory"); } -static inline void __vmpclear(u64 addr) +static always_inline void __vmpclear(u64 addr) { asm volatile ( #ifdef HAVE_GAS_VMX @@ -310,20 +311,21 @@ static inline void __vmpclear(u64 addr) #else VMCLEAR_OPCODE MODRM_EAX_06 #endif - /* CF==1 or ZF==1 --> crash (ud2) */ + /* CF==1 or ZF==1 --> BUG() */ UNLIKELY_START(be, vmclear) - "\tud2\n" + _ASM_BUGFRAME_TEXT(0) UNLIKELY_END_SECTION : #ifdef HAVE_GAS_VMX - : "m" (addr) + : "m" (addr), #else - : "a" (&addr) + : "a" (&addr), #endif + _ASM_BUGFRAME_INFO(BUGFRAME_bug, __LINE__, __FILE__, 0) : "memory"); } -static inline void __vmread(unsigned long field, unsigned long *value) +static always_inline void __vmread(unsigned long field, unsigned long *value) { asm volatile ( #ifdef HAVE_GAS_VMX @@ -331,20 +333,22 @@ static inline void __vmread(unsigned long field, unsigned long *value) #else VMREAD_OPCODE MODRM_EAX_ECX #endif - /* CF==1 or ZF==1 --> crash (ud2) */ + /* CF==1 or ZF==1 --> BUG() */ UNLIKELY_START(be, vmread) - "\tud2\n" + _ASM_BUGFRAME_TEXT(0) UNLIKELY_END_SECTION #ifdef HAVE_GAS_VMX : "=rm" (*value) - : "r" (field)); + : "r" (field), #else : "=c" (*value) - : "a" (field)); + : "a" (field), #endif + _ASM_BUGFRAME_INFO(BUGFRAME_bug, __LINE__, __FILE__, 0) + ); } -static inline void __vmwrite(unsigned long field, unsigned long value) +static always_inline void __vmwrite(unsigned long field, unsigned long value) { asm volatile ( #ifdef HAVE_GAS_VMX @@ -352,16 +356,18 @@ static inline void __vmwrite(unsigned long field, unsigned long value) #else VMWRITE_OPCODE MODRM_EAX_ECX #endif - /* CF==1 or ZF==1 --> crash (ud2) */ + /* CF==1 or ZF==1 --> BUG() */ UNLIKELY_START(be, vmwrite) - "\tud2\n" + _ASM_BUGFRAME_TEXT(0) UNLIKELY_END_SECTION - : + : #ifdef HAVE_GAS_VMX - : "r" (field) , "rm" (value)); + : "r" (field) , "rm" (value), #else - : "a" (field) , "c" (value)); + : "a" (field) , "c" (value), #endif + _ASM_BUGFRAME_INFO(BUGFRAME_bug, __LINE__, __FILE__, 0) + ); } static inline bool_t __vmread_safe(unsigned long field, unsigned long *value) @@ -387,7 +393,7 @@ static inline bool_t __vmread_safe(unsigned long field, unsigned long *value) return okay; } -static inline void __invept(unsigned long type, u64 eptp, u64 gpa) +static always_inline void __invept(unsigned long type, u64 eptp, u64 gpa) { struct { u64 eptp, gpa; @@ -407,20 +413,21 @@ static inline void __invept(unsigned long type, u64 eptp, u64 gpa) #else INVEPT_OPCODE MODRM_EAX_08 #endif - /* CF==1 or ZF==1 --> crash (ud2) */ + /* CF==1 or ZF==1 --> BUG() */ UNLIKELY_START(be, invept) - "\tud2\n" + _ASM_BUGFRAME_TEXT(0) UNLIKELY_END_SECTION : #ifdef HAVE_GAS_EPT - : "m" (operand), "r" (type) + : "m" (operand), "r" (type), #else - : "a" (&operand), "c" (type) + : "a" (&operand), "c" (type), #endif + _ASM_BUGFRAME_INFO(BUGFRAME_bug, __LINE__, __FILE__, 0) : "memory" ); } -static inline void __invvpid(unsigned long type, u16 vpid, u64 gva) +static always_inline void __invvpid(unsigned long type, u16 vpid, u64 gva) { struct __packed { u64 vpid:16; @@ -435,18 +442,19 @@ static inline void __invvpid(unsigned long type, u16 vpid, u64 gva) #else INVVPID_OPCODE MODRM_EAX_08 #endif - /* CF==1 or ZF==1 --> crash (ud2) */ + /* CF==1 or ZF==1 --> BUG() */ UNLIKELY_START(be, invvpid) - "\tud2\n" + _ASM_BUGFRAME_TEXT(0) UNLIKELY_END_SECTION "\n" "2:" _ASM_EXTABLE(1b, 2b) : #ifdef HAVE_GAS_EPT - : "m" (operand), "r" (type) + : "m" (operand), "r" (type), #else - : "a" (&operand), "c" (type) + : "a" (&operand), "c" (type), #endif + _ASM_BUGFRAME_INFO(BUGFRAME_bug, __LINE__, __FILE__, 0) : "memory" ); } -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |