From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0623643CEF4 for ; Tue, 28 Apr 2026 16:05:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.54 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777392314; cv=none; b=jCzChgtJQTeUYaqU72sUlyfy7SYOS54zyIKbhHglGUdw7KTlH9l1ZLQx38VomrhjuVHYdbJjkAhuila+98r/22w/24D8xRNQkeURBY4Af333IfYPU1R0U0UdvslkD519GFYMOARl7Jb+56qhD8a7yg2NKsFjsz6Kc9r0G4256oo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777392314; c=relaxed/simple; bh=GjhS0BqelwsF5zECPr+k+PTL6Ta6fKEGS4YCy4/s6hQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Cns1AW93Di5vIDxgzOs3EVpvGetzwogWs2QYcKxwvE2VfqbZvr7jnBUUThpnUTPUX/mzofTzNk2yXKcZVhYMZEu9PYZ7KkmoYFHxzL25V78olOw7dZR5cLYjSNcdxo4qkk5z9l94e/yh2xlXb291rYcy61cc+htsZqGMwMdiT3c= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=hLWz00EX; arc=none smtp.client-ip=209.85.221.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="hLWz00EX" Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-43d73352cf2so9763533f8f.1 for ; Tue, 28 Apr 2026 09:05:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777392311; x=1777997111; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=/9eIeUKeLvKlg4jq7n3uEnNwMSdRdwZV/mr0b7cj6U4=; b=hLWz00EXw2I8u1l2bRFvhGQNd8ME61bDTQfCuC2n2GwAXVfQyQWpIT/MDjOvVtFcbb tzHnqvmhL2L41Dd21n+7okdDQjfXLK5eYWFJHcashNlYRxQBLYHY72De4S555Htd8caN Ft/y6HIP8cYcWhCYbhemC+Oz4FKyd/Ok25Xq3Ooi0i72fZFWusmz0/0sQ+5mTcFvK22i 2HBg/jkUEGRlWySd5bhHKvr/Y+m4nh3Jj3uuKv9WRvSoBrdKMfLKONmgZFwAqkixyTHk k/60b4GbZ3wkgKiAoS4OHCL0P8dVYY+oa4+oWW4hhAGc1x9xWXPyJ38AE96mJvkg+Kce 3DlA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777392311; x=1777997111; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=/9eIeUKeLvKlg4jq7n3uEnNwMSdRdwZV/mr0b7cj6U4=; b=IiqXFYsH+IRs46WHF3GrUuWDeucoWSGM/3GmW1BESeIwesgPz39Sspp0c9caI8OQ15 F5GckOZPZ1aFdqDv+UbYb011KJrtqJrZ4Uc4cn3xFyKs4baNfP6KoHyvrvw5B1M8Rocs Ws6aeEZYheDjqDJd/LiBskfanlcIjd2gzLtWT0Ora8H2fJSTHl1QHPhoYjX9ym3jvlSN l4M94u6glE7Pm7y7sVTrgTXrqZm2iu4h07R8FJ3+sZFUlX9Hb/1+8MZjpt4+6AuUwEV/ BrRyjqqTZwaj5HwAwdr7iZ4xRe8L3uylKkY0DtU3T9prhUxjqwY+4lgyFpTS3fuzd4sl NAiQ== X-Forwarded-Encrypted: i=1; AFNElJ9vbP/S2A/BQjIpCp9och0VHHW8UZ6bq1cfOxH/xsBUiWsC8d3m8TsqV9KMRY/tnB1UoEf9gtAB9+RUN/Y=@vger.kernel.org X-Gm-Message-State: AOJu0Yxv2VjtQ8piNdkx2DkSjRit8etDqkneN5Wmgevge1d2PNZLXPzw UgJKbgJtxciUSpYf9bfOz39zY+b7Q/BedfIYaW8uExY7pwi2cvr23S9R X-Gm-Gg: AeBDiev0sz759rtJrVL1JyAwKMGXUATTMq4LTAxLZqKMVp8CRWBV053zqeMQ2AIFizq DDcooti2LlEiZa+Q7tZY3208jH0AIn6TQKANoAlXFH/OXJJuVyshTdv4SXl9HbXrgML/+HST5ei Mi1tFCKRozOn8/wNGO0wrRNk0vQDOiPoMGdFJQa96/1UYhbAAnHZG1mCNcFL6Y88eGNsiQ2m9Lu MRgjHfg6Ft/hNIBqUvrbEdrt3NaIG3vDuldsEeIZ7O9yMFW274waTPpVZu3wcWrGJVSdkcsK8x9 NjwWZzSJKWy1T3I7PBu91Q420esj5tsVRvBpXlP6BIC8TSRZER73fA+zEzlQ+2qzqwr06D5dxgk T+D7tk4llvYYu9xS3gThUcNSWJqCb9SCY7wI+H5cuyeeyjVHp5hvXAw7/oWJMunk2AMBzbH4wSF TNCDcHd9RXWRU2EN9LG7QAzcw0H44fUROowNWQlcq8sys7fqjok52/aK29agotTUtztgK6vv2D0 RWrZlFasMFgfioKEtk5L9ZxmvIvXIUcHRTwT6G1dNYKyF0x67gMDYE= X-Received: by 2002:a05:6000:24ca:b0:43d:20e9:b0e1 with SMTP id ffacd0b85a97d-4464839c811mr6597425f8f.7.1777392311288; Tue, 28 Apr 2026 09:05:11 -0700 (PDT) Received: from fedora ([46.248.82.114]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4464004edc8sm7532923f8f.37.2026.04.28.09.05.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Apr 2026 09:05:10 -0700 (PDT) From: Uros Bizjak To: x86@kernel.org, linux-kernel@vger.kernel.org Cc: Uros Bizjak , "H. Peter Anvin" , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen Subject: [PATCH RESEND -tip v2 6/7] x86/segment: Introduce savesegment_mem16() helper to write segment selectors to memory Date: Tue, 28 Apr 2026 18:03:40 +0200 Message-ID: <20260428160443.3593331-6-ubizjak@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260428160443.3593331-1-ubizjak@gmail.com> References: <20260428160443.3593331-1-ubizjak@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Introduce a new helper, savesegment_mem16(), that stores a segment selector directly into a u16 (or compatible) memory location without using an intermediate general-purpose register. To support this, split the existing SAVE_SEGMENT macro into two parts: SAVE_SEGMENT_VAR(): retains the current behavior of reading a segment register into an unsigned long via a register. SAVE_SEGMENT_PTR(): adds a new variant that writes the 16-bit selector directly to memory. The combined SAVE_SEGMENT() macro now generates both helpers for each segment register. The new savesegment_mem16() interface is preferred over savesegment() when the value only needs to be stored (e.g. into a struct field), avoiding an unnecessary register move and making the intent clearer. No functional change for existing users of savesegment(). Signed-off-by: Uros Bizjak Suggested-by: "H. Peter Anvin" Cc: Thomas Gleixner Cc: Ingo Molnar Cc: Borislav Petkov Cc: Dave Hansen --- v2: Rename storesegment() to savesegment_mem16() (Ingo). --- arch/x86/include/asm/segment.h | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/segment.h b/arch/x86/include/asm/segment.h index 070ed87063e0..51a1fcdc7215 100644 --- a/arch/x86/include/asm/segment.h +++ b/arch/x86/include/asm/segment.h @@ -354,7 +354,7 @@ typedef unsigned long __seg_return_t; /* * Save a segment register away: */ -#define SAVE_SEGMENT(seg) \ +#define SAVE_SEGMENT_VAR(seg) \ static inline unsigned long __savesegment_##seg(void) \ { \ __seg_return_t v; \ @@ -362,6 +362,16 @@ static inline unsigned long __savesegment_##seg(void) \ return v; \ } +#define SAVE_SEGMENT_PTR(seg) \ +static inline void __savesegment_##seg##_ptr(u16 *p) \ +{ \ + asm volatile("movw %%" #seg ",%0" : "=m" (*p)); \ +} + +#define SAVE_SEGMENT(seg) \ + SAVE_SEGMENT_VAR(seg) \ + SAVE_SEGMENT_PTR(seg) + SAVE_SEGMENT(cs) SAVE_SEGMENT(ss) SAVE_SEGMENT(ds) @@ -369,10 +379,29 @@ SAVE_SEGMENT(es) SAVE_SEGMENT(fs) SAVE_SEGMENT(gs) +#undef SAVE_SEGMENT_VAR +#undef SAVE_SEGMENT_PTR #undef SAVE_SEGMENT +/* + * savesegment(seg, var) - Read a segment register into an unsigned long. + * + * Reads the segment selector via a general-purpose register into an + * unsigned long. Preferred when the value is needed in a register for + * subsequent arithmetic or comparison. + */ #define savesegment(seg, var) ((var) = __savesegment_##seg()) +/* + * savesegment_mem16(seg, loc) - Store a segment register directly + * to u16 (or compatible) location. + * + * Writes the 16-bit segment selector directly to memory, bypassing any + * intermediate general-purpose register. Preferred over savesegment() + * for simply saving a segment register to a u16 (or compatible) location. + */ +#define savesegment_mem16(seg, loc) __savesegment_##seg##_ptr(&(loc)) + #endif /* !__ASSEMBLER__ */ #endif /* __KERNEL__ */ -- 2.53.0