From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (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 0D518369985 for ; Wed, 1 Apr 2026 08:58:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775033934; cv=none; b=HFX2kHxiJxSOlbvRfa6ahmhHlHuhtGM0rDa57bRnvUMyJL9z/zS+3zQkzoM3njZHfYTJbHgXZ5O/P1Z6TZaufxVbjsAYtlpbvw6on+y2JyMdXw/OLPmbfiGTXhCMXMIoCpoyqwCnhahqoms/BoqrjXrKNemI3d9a0L8azXnI4Vo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775033934; c=relaxed/simple; bh=pIZe1PaK51aV98mLatA8FWTV40jmWg15KuTt6OZBc04=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=KaNafWQd8gXdkaad4Fp53Sk+LHug86dR56B6NoXI1pb1s4isXNqxriVFZf5Jrxv7JYsGBNx29JCy1IjVda4EZ0vYDzvTG+i7zB9PqZ6BeGptSKcqPjaIq8hzHczDdeGatO8KO3cf0cYWcEnxNG7s/+I2omusCNyrtfOreIxo1t8= 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=Yev6vp75; arc=none smtp.client-ip=209.85.128.49 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="Yev6vp75" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-4888375f735so5896905e9.3 for ; Wed, 01 Apr 2026 01:58:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775033931; x=1775638731; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=IXbQPITQFR4QDvIJDdOjGyDQ9s48ZIS9Wcu844FhZIE=; b=Yev6vp75in8rYiS0UhTvdHBU2OThXHqK+RZCiNu5KPRsSPe75XAMYh2365H+FctYUr I4ZBuQmWV6o33nJj1IlHDj3jtPvBDwfg9eyiC1n5lZgC5mvZA0BnPtXO/ODVpFCQ4Qgl 9iudbLL6+dL6tX2s5ctccAssRyEH05ur/9dQPk8DecK9i5BywMuE/y8oJo+KCGww/+7b fmda2P1hzgEg9Ws/ipV6TohDUWJOd/CqTX/A2h8aCK6mo3k06NQwSNr+JMw1RPN9wgNf DpmjfjrWSIHQ7OUgrDSTV5hfSuHr3GIXHLlUQ8NuNV+9U4fljSG/EK+GI/hLBKRFnCJc OJpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775033931; x=1775638731; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=IXbQPITQFR4QDvIJDdOjGyDQ9s48ZIS9Wcu844FhZIE=; b=R7RrRIPA6q5XBikieFU6T072azu074AIpXlyRSzJZ1ZWXBJyD3V66KjiQDETET2Z1L gkyceFaYhL6n36XB3ALgVZNOlne+CKEyRF5z0YuMeUHJZsUbnzHOyjMtOnkIymWZqVfj c3BwXX302bYqiqLZ4TfB85wc753xNVtd1CsDzGLkR8MAwmh8jQfkp44FPD91s4wLLVHc rj2bnEtOdS3NJ9R1S04qartKcSqaiuFX0iJZwp5lH2FER7DUErnjGInQvoo8rRFDwdrI kbREBiJs7av0KNIGj16W1cCNon1OELHWIg1GtCkH6Y8gbqx9o8FbvLlaoXUDV7z+/03m bopQ== X-Forwarded-Encrypted: i=1; AJvYcCV9QGFHh26tIWGCDyoivH7j9zZGejBv6cYpxln2z5lknnelqsZSOdYiIKqjDTp5OuPX78ZQ6ClcD8pRd4s=@vger.kernel.org X-Gm-Message-State: AOJu0Yzu4QXmKA1PTu8d/icqGESWNqclJleuKIdST2gpfDvWwSTpbLM+ glY0HNHJCc7QpjHJsvf+S6ep4YG27X1yTJeznNzlDUq/r0pX1+IHdGy80V3Plqls X-Gm-Gg: ATEYQzzxvlwOZeP+UDRB9p+jIkTVMRyMHE4c1vGLIAMwU2V+xO9hjBpw3kiflUcH9HU oReBj5D4VyCk15Rai/Ax42Q/9EqptPe9P+s5nchY+I1k0mIhPhsViTqBtAjy6uAvR17p+7qlQak vjdBQJ6DIt+ksrMMbH8e+RBUMnAa0TjV8jI4GhJhdy+y9dfxAgCVlDO/B6ONQkTcniMvT4mnyBw uh5EgQOOx158yDSwhFhgrn2uXWdAXLrIVpWwdnbQlIkf+VSsP7ZKhRUo8MrJo1NiSi5p9NI45lK aQ9iVmM5+86lnpMKx2rIQteUi06Z3Pl47OaMwvOvNL07AUTYMClXIiJbIJp7R73sbmnNmZPRWcu aPxpJOuGv8OL2DmK6RimR+z3K7J6u36RKnc2gkl+bsDn3qmT603rzKTD6/Xu1avybdq1JnK+ZQf VLcZVXyyynVwJlVU9F67Uneyeqko3LdcK2XZ06OXpVZ0hIBN/bb/vPC6N4EGlXbzGBfCy9qIPEl uD/Xvu9OneMhcJ0SA1d6k/reFAu5+AjIqACrnGIyYM9iceS9lo5KhY= X-Received: by 2002:a05:600c:19d3:b0:485:3eba:ab96 with SMTP id 5b1f17b1804b1-48883568990mr43865575e9.3.1775033931240; Wed, 01 Apr 2026 01:58:51 -0700 (PDT) Received: from fedora ([193.77.86.199]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4887e829c43sm92309035e9.5.2026.04.01.01.58.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 01 Apr 2026 01:58:50 -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 -tip v2 1/3] x86/segment: Introduce savesegment_mem16() helper to write segment selectors to memory Date: Wed, 1 Apr 2026 10:58:10 +0200 Message-ID: <20260401085832.285121-1-ubizjak@gmail.com> X-Mailer: git-send-email 2.53.0 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(). --- 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 dbd90fede5e7..5c5b95fda284 100644 --- a/arch/x86/include/asm/segment.h +++ b/arch/x86/include/asm/segment.h @@ -344,7 +344,7 @@ static inline void __loadsegment_fs(u16 value) /* * Save a segment register away: */ -#define SAVE_SEGMENT(seg) \ +#define SAVE_SEGMENT_VAR(seg) \ static inline unsigned long __savesegment_##seg(void) \ { \ unsigned long v; \ @@ -352,6 +352,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) @@ -359,10 +369,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