[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] x86/pv: Rework TRY_LOAD_SEG() to use asm goto()
 
- To: Jan Beulich <jbeulich@xxxxxxxx>
 
- From: Nicola Vetrini <nicola.vetrini@xxxxxxxxxxx>
 
- Date: Mon, 21 Jul 2025 10:16:01 +0200
 
- Arc-authentication-results: i=1; bugseng.com; arc=none smtp.remote-ip=162.55.131.47
 
- Arc-message-signature: i=1; d=bugseng.com; s=openarc; a=rsa-sha256;	c=relaxed/relaxed; t=1753085761;	h=DKIM-Signature:MIME-Version:Date:From:To:Cc:Subject:In-Reply-To:	 References:Message-ID:X-Sender:Organization:Content-Type:	 Content-Transfer-Encoding;	bh=jNMP2R96hCKypK1inf8fOGNIpBIeNLye0mCnolOcfGM=;	b=qfGyNqhjoVvQXBLnz66bTtXIFiuSYYoyQe8BtAfAY4etx1HuOhctDaklbtl0LLN5YoNC	 BRbmYpjR8RTRn4amPTKMuipyM7SoZGLOo38WkyDrrhrcUBG3FLi/VeaGd5Ax8+iyD/k2a	 /cWe3Nv7enW8ir56rsUOF0HogB9oHcsmQOay7TxmKcSeKsNHZ2FQ+F/XFg3UWRnV30OB7	 Mhjmzv213b1zkhbQsonQzv90xi2tUA8KRkrRRP18I/P/E09DKsN2hJoYpXohz2YAu0NGB	 HoAPeeSISpHVjQYt01NQ/UWcNILkhxpqiaS5EmLKXYqXgXQqRxaQ3QDN6vhGT0aMWK970	 AAP2Ha048Bp7vSmFo408sfeE/edq/bzkln0LL4rtniWDMsjq6uYjDLeZCCRHl3f1kgRKH	 lyTTLt9IgkHjrCRpk2I/UNuHSTEd8ApMb7/W6XZhTd3HOflIcqNMM6+oO6/3CVj3utKQc	 d8XrUJ/fZGJPVXnaUqhpLAT0TUXYxbUoREaPw8gl+8L291a821sfQQzM2gMZAlVnxzRG0	 d5bKJvmjr+BuqY4mPfK5M85EAqExG9LuUjf5uCGYNBN5X7HL+bvY2WBuxN93b/1vIY4ko	 FVfeYI/Xpg/fDv5b4Bu8Xy7QUWamPiytYekqJAsDHY0X84QDIySrM6JyzkxEO5k=
 
- Arc-seal: i=1; d=bugseng.com; s=openarc; a=rsa-sha256; cv=none; t=1753085761;	b=B2XBp0iH0wshcae+Mok7SAloDqTyrHB7PCfkZA6cRix8L6NHTWTpWtDdtEJoksng2ci3	 FZyuhepg76k/DbO700YezbUSYz0Q+CqIhmgFagBxbWw7iY3hY/cO+VM2Ik3sMYJXQGW8s	 JJEhgLFT3ieBdM+7G4EKONciXdWQb/wbbsYRPFuIiznyXsYA/VnfAanNsFzsDqYW3PRbS	 kpuot/sY9lVvaY3FsZ2pj+u3W8WYwwiSNFIXAqPqEUC8NAgVeIG0AKsEtk+qFkPO1HYJo	 EownmMu/E/thNfprCDta+U5leJjhvrv6CZJZ2+m8N65eeK8mlXaKGPuxPg65maZokOau4	 NiUujM48A6120hTQRGKdu9buUQGqRFIlDOqRNSpyTlSlFwPCzttAnaxE+sWsPkrHq7Z0m	 ZzycrOsiSpe5aVTGyN0QyVTnDbSsn+wuIvfgrWostpNu0zqwoAnNnFhESCi/NAZHHEtpv	 A09f67OyxkCMhOMIEAWEP2bYhkPqFmnt+JgoZzDE1A8fDqSezTXmoV5ISgzBHrcBKHKZN	 zL4+jTz8Z47UX3sRTLGVztaAyXMeW7h8iQedjf0sIktH+WeSAiSoQ9hs2b3B3CPDli/l7	 lq244/aIFZgdOh4+t8IK+kk/imU7bkMFnD8mS/YKpKvCusOL8UFRI4YhQDXWUqo=
 
- Authentication-results: bugseng.com; arc=none smtp.remote-ip=162.55.131.47
 
- Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxxx>
 
- Delivery-date: Mon, 21 Jul 2025 08:16:18 +0000
 
- List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
 
 
 
On 2025-07-21 08:41, Jan Beulich wrote:
 
On 18.07.2025 22:25, Andrew Cooper wrote:
 This moves the exception path to being out-of-line within the 
function, rather
than in the .fixup section, which improves backtraces.
 Because the macro is used multiple times, the fault label needs 
declaring as
local.
No functional change.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Roger Pau Monné <roger.pau@xxxxxxxxxx>
 Slightly RFC.  I haven't checked if Eclair will be happy with 
__label__ yet.
 
Even if it is, I guess you'd need to update the list of extensions we
use (docs/misra/C-language-toolchain.rst)?
 
 
 Only for using the __label__ token in 
automation/eclair_analysis/ECLAIR/toolchain.ecl. The extension itself is 
already documented in 5590c7e6590d ("eclair: allow and document use of 
GCC extension for label addresses")
 It is disappointing that, unless we retain the xor/mov for the 
exception path,
GCC decides to emit worse code, notably duplicating the mov %ds 
success path
in mov %es's error path.
  
Is it the pair of XOR/MOV, or merely the MOV (in which case it might be
 nice to try omitting at least the XOR)? Yet then the dual purpose of 
the
zero is likely getting in the way anyway.
 
The "+r" constraint was actually wrong before; the asm only produces
all_segs_okay and does not consume it.
 
 
Yet it only conditionally set it in the old construct. That still needs
expressing with "+r", or else the variable's earlier setting could all
be eliminated. In the new construct using "=r" is okay.
 
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -1738,17 +1738,22 @@ static void load_segments(struct vcpu *n)
      * @all_segs_okay in function scope, and load NUL into @sel.
      */
 #define TRY_LOAD_SEG(seg, val)                          \
-    asm_inline volatile (                               \
-        "1: mov %k[_val], %%" #seg "\n\t"               \
-        "2:\n\t"                                        \
-        ".section .fixup, \"ax\"\n\t"                   \
-        "3: xor %k[ok], %k[ok]\n\t"                     \
-        "   mov %k[ok], %%" #seg "\n\t"                 \
-        "   jmp 2b\n\t"                                 \
-        ".previous\n\t"                                 \
-        _ASM_EXTABLE(1b, 3b)                            \
-        : [ok] "+r" (all_segs_okay)                     \
-        : [_val] "rm" (val) )
+    ({                                                  \
+        __label__ fault;                                \
+        asm_inline volatile goto (                      \
+            "1: mov %k[_val], %%" #seg "\n\t"           \
+            _ASM_EXTABLE(1b, %l[fault])                 \
+            :: [_val] "rm" (val)                        \
 
Thoughts on replacing "_val" by "sel" on this occasion?
 
+            :: fault );                                 \
+        if ( 0 )                                        \
+        {                                               \
+        fault: __attribute__((cold));                   \
+            asm_inline volatile (                       \
+                "xor %k[ok], %k[ok]\n\t"                \
+                "mov %k[ok], %%" #seg                   \
+                : [ok] "=r" (all_segs_okay) );          \
 
Purely formally I think you need "=&r" here now.
Jan
 
 
--
Nicola Vetrini, B.Sc.
Software Engineer
BUGSENG (https://bugseng.com)
LinkedIn: https://www.linkedin.com/in/nicola-vetrini-a42471253
 
 
    
     |