From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Cooper Subject: Re: [PATCH v2 2/4] VMX: move various uses of UD2 out of fast paths Date: Mon, 26 Aug 2013 10:09:32 +0100 Message-ID: <521B1B4C.3040505@citrix.com> References: <521786A002000078000EE064@nat28.tlf.novell.com> <5217879D02000078000EE07B@nat28.tlf.novell.com> <5217DD01.9080907@citrix.com> <521B34C402000078000EE476@nat28.tlf.novell.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============7429578506674171665==" Return-path: Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1VDsnn-0006Sj-MQ for xen-devel@lists.xenproject.org; Mon, 26 Aug 2013 09:09:36 +0000 In-Reply-To: <521B34C402000078000EE476@nat28.tlf.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Jan Beulich Cc: xen-devel , Keir Fraser , Eddie Dong , Jun Nakajima List-Id: xen-devel@lists.xenproject.org --===============7429578506674171665== Content-Type: multipart/alternative; boundary="------------070207040602010501070703" --------------070207040602010501070703 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit On 26/08/2013 09:58, Jan Beulich wrote: > ... at once making conditional forward jumps, which are statically > predicted to be not taken, only used for the unlikely (error) cases. > > Signed-off-by: Jan Beulich Reviewed-by: Andrew Cooper > --- > v2: Fix #UD recovery for INVVPID (unintended flow change spotted by Andrew Cooper). > > --- a/xen/include/asm-x86/asm_defns.h > +++ b/xen/include/asm-x86/asm_defns.h > @@ -67,6 +67,30 @@ void ret_from_intr(void); > #define ASSERT_NOT_IN_ATOMIC > #endif > > +#else > + > +#ifdef __clang__ /* clang's builtin assember can't do .subsection */ > + > +#define UNLIKELY_START_SECTION ".pushsection .fixup,\"ax\"" > +#define UNLIKELY_END_SECTION ".popsection" > + > +#else > + > +#define UNLIKELY_START_SECTION ".subsection 1" > +#define UNLIKELY_END_SECTION ".subsection 0" > + > +#endif > + > +#define UNLIKELY_START(cond, tag) \ > + "j" #cond " .Lunlikely%=.tag;\n\t" \ > + UNLIKELY_START_SECTION "\n" \ > + ".Lunlikely%=.tag:" > + > +#define UNLIKELY_END(tag) \ > + "jmp .Llikely%=.tag;\n\t" \ > + UNLIKELY_END_SECTION "\n" \ > + ".Llikely%=.tag:" > + > #endif > > #endif /* __X86_ASM_DEFNS_H__ */ > --- a/xen/include/asm-x86/hvm/vmx/vmx.h > +++ b/xen/include/asm-x86/hvm/vmx/vmx.h > @@ -285,7 +285,9 @@ static inline void __vmptrld(u64 addr) > asm volatile ( VMPTRLD_OPCODE > MODRM_EAX_06 > /* CF==1 or ZF==1 --> crash (ud2) */ > - "ja 1f ; ud2 ; 1:\n" > + UNLIKELY_START(be, vmptrld) > + "\tud2\n" > + UNLIKELY_END_SECTION > : > : "a" (&addr) > : "memory"); > @@ -296,7 +298,9 @@ static inline void __vmpclear(u64 addr) > asm volatile ( VMCLEAR_OPCODE > MODRM_EAX_06 > /* CF==1 or ZF==1 --> crash (ud2) */ > - "ja 1f ; ud2 ; 1:\n" > + UNLIKELY_START(be, vmclear) > + "\tud2\n" > + UNLIKELY_END_SECTION > : > : "a" (&addr) > : "memory"); > @@ -309,7 +313,9 @@ static inline unsigned long __vmread(uns > asm volatile ( VMREAD_OPCODE > MODRM_EAX_ECX > /* CF==1 or ZF==1 --> crash (ud2) */ > - "ja 1f ; ud2 ; 1:\n" > + UNLIKELY_START(be, vmread) > + "\tud2\n" > + UNLIKELY_END_SECTION > : "=c" (ecx) > : "a" (field) > : "memory"); > @@ -322,7 +328,9 @@ static inline void __vmwrite(unsigned lo > asm volatile ( VMWRITE_OPCODE > MODRM_EAX_ECX > /* CF==1 or ZF==1 --> crash (ud2) */ > - "ja 1f ; ud2 ; 1:\n" > + UNLIKELY_START(be, vmwrite) > + "\tud2\n" > + UNLIKELY_END_SECTION > : > : "a" (field) , "c" (value) > : "memory"); > @@ -360,7 +368,9 @@ static inline void __invept(int type, u6 > asm volatile ( INVEPT_OPCODE > MODRM_EAX_08 > /* CF==1 or ZF==1 --> crash (ud2) */ > - "ja 1f ; ud2 ; 1:\n" > + UNLIKELY_START(be, invept) > + "\tud2\n" > + UNLIKELY_END_SECTION > : > : "a" (&operand), "c" (type) > : "memory" ); > @@ -377,7 +387,10 @@ static inline void __invvpid(int type, u > /* Fix up #UD exceptions which occur when TLBs are flushed before VMXON. */ > asm volatile ( "1: " INVVPID_OPCODE MODRM_EAX_08 > /* CF==1 or ZF==1 --> crash (ud2) */ > - "ja 2f ; ud2 ; 2:\n" > + UNLIKELY_START(be, invvpid) > + "\tud2\n" > + UNLIKELY_END_SECTION "\n" > + "2:" > _ASM_EXTABLE(1b, 2b) > : > : "a" (&operand), "c" (type) > > > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel --------------070207040602010501070703 Content-Type: text/html; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit
On 26/08/2013 09:58, Jan Beulich wrote:
... at once making conditional forward jumps, which are statically
predicted to be not taken, only used for the unlikely (error) cases.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>

---
v2: Fix #UD recovery for INVVPID (unintended flow change spotted by Andrew Cooper).

--- a/xen/include/asm-x86/asm_defns.h
+++ b/xen/include/asm-x86/asm_defns.h
@@ -67,6 +67,30 @@ void ret_from_intr(void);
 #define ASSERT_NOT_IN_ATOMIC
 #endif
 
+#else
+
+#ifdef __clang__ /* clang's builtin assember can't do .subsection */
+
+#define UNLIKELY_START_SECTION ".pushsection .fixup,\"ax\""
+#define UNLIKELY_END_SECTION   ".popsection"
+
+#else
+
+#define UNLIKELY_START_SECTION ".subsection 1"
+#define UNLIKELY_END_SECTION   ".subsection 0"
+
+#endif
+
+#define UNLIKELY_START(cond, tag)          \
+        "j" #cond " .Lunlikely%=.tag;\n\t" \
+        UNLIKELY_START_SECTION "\n"        \
+        ".Lunlikely%=.tag:"
+
+#define UNLIKELY_END(tag)                  \
+        "jmp .Llikely%=.tag;\n\t"          \
+        UNLIKELY_END_SECTION "\n"          \
+        ".Llikely%=.tag:"
+
 #endif
 
 #endif /* __X86_ASM_DEFNS_H__ */
--- a/xen/include/asm-x86/hvm/vmx/vmx.h
+++ b/xen/include/asm-x86/hvm/vmx/vmx.h
@@ -285,7 +285,9 @@ static inline void __vmptrld(u64 addr)
     asm volatile ( VMPTRLD_OPCODE
                    MODRM_EAX_06
                    /* CF==1 or ZF==1 --> crash (ud2) */
-                   "ja 1f ; ud2 ; 1:\n"
+                   UNLIKELY_START(be, vmptrld)
+                   "\tud2\n"
+                   UNLIKELY_END_SECTION
                    :
                    : "a" (&addr)
                    : "memory");
@@ -296,7 +298,9 @@ static inline void __vmpclear(u64 addr)
     asm volatile ( VMCLEAR_OPCODE
                    MODRM_EAX_06
                    /* CF==1 or ZF==1 --> crash (ud2) */
-                   "ja 1f ; ud2 ; 1:\n"
+                   UNLIKELY_START(be, vmclear)
+                   "\tud2\n"
+                   UNLIKELY_END_SECTION
                    :
                    : "a" (&addr)
                    : "memory");
@@ -309,7 +313,9 @@ static inline unsigned long __vmread(uns
     asm volatile ( VMREAD_OPCODE
                    MODRM_EAX_ECX
                    /* CF==1 or ZF==1 --> crash (ud2) */
-                   "ja 1f ; ud2 ; 1:\n"
+                   UNLIKELY_START(be, vmread)
+                   "\tud2\n"
+                   UNLIKELY_END_SECTION
                    : "=c" (ecx)
                    : "a" (field)
                    : "memory");
@@ -322,7 +328,9 @@ static inline void __vmwrite(unsigned lo
     asm volatile ( VMWRITE_OPCODE
                    MODRM_EAX_ECX
                    /* CF==1 or ZF==1 --> crash (ud2) */
-                   "ja 1f ; ud2 ; 1:\n"
+                   UNLIKELY_START(be, vmwrite)
+                   "\tud2\n"
+                   UNLIKELY_END_SECTION
                    : 
                    : "a" (field) , "c" (value)
                    : "memory");
@@ -360,7 +368,9 @@ static inline void __invept(int type, u6
     asm volatile ( INVEPT_OPCODE
                    MODRM_EAX_08
                    /* CF==1 or ZF==1 --> crash (ud2) */
-                   "ja 1f ; ud2 ; 1:\n"
+                   UNLIKELY_START(be, invept)
+                   "\tud2\n"
+                   UNLIKELY_END_SECTION
                    :
                    : "a" (&operand), "c" (type)
                    : "memory" );
@@ -377,7 +387,10 @@ static inline void __invvpid(int type, u
     /* Fix up #UD exceptions which occur when TLBs are flushed before VMXON. */
     asm volatile ( "1: " INVVPID_OPCODE MODRM_EAX_08
                    /* CF==1 or ZF==1 --> crash (ud2) */
-                   "ja 2f ; ud2 ; 2:\n"
+                   UNLIKELY_START(be, invvpid)
+                   "\tud2\n"
+                   UNLIKELY_END_SECTION "\n"
+                   "2:"
                    _ASM_EXTABLE(1b, 2b)
                    :
                    : "a" (&operand), "c" (type)





_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

--------------070207040602010501070703-- --===============7429578506674171665== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel --===============7429578506674171665==--