[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



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.