From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (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 457EF37B3ED for ; Sun, 15 Mar 2026 18:59:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773601150; cv=none; b=fIF+IxqkhaBuCgqDca1sWV0zxR898eIonqQnSOgIahA3XO+diczM3CsFYHEY5mL+/V4ugRmK+1bhQbLcXKKPcmoqJe/4KZK2mCiUeh3854Nrc49cj8jEnZ/fhJiz8q74mYuRksy5iybJvugcKljB+aAC9+VA1GqKUido8FakRuQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773601150; c=relaxed/simple; bh=fmuaFd/ZcDvkm+qEv3lmbGDXfIkpLVGEW9W2Nj+zlc8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ORvip4fSi9tgUSl5FxvJ3h1sfBwICSe7MTRiUdzikr+NtqKX/f8zLdPF6llfbrSOAXsFWCjvcZq89P3LVZppuxESIWY4Eja9kR3doaT4nAki3JlzEL8rgYr5vQCLS3rSHoOE/WpgPFP/29qF71nBZkM/CDN/kpb7KVPBsbWI02w= 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=TcdYdkYG; arc=none smtp.client-ip=209.85.128.44 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="TcdYdkYG" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-4838c15e3cbso33433595e9.3 for ; Sun, 15 Mar 2026 11:59:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773601147; x=1774205947; 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=KRDUs4BWADg7nfaNsLeDM12+oofqV/wURPpxTTROHAs=; b=TcdYdkYGIwEft5QAJBh7N6+5//i79SKq3vrZlMJ5ExtKhrYCiLXJC+7Gkef4yfJ6PH YiyHXPFfgte1p9xMCqY7a5j5M4iqaZuhwwvFSBpGk3HP7myHHs8p+oA5/q1G5+pUWb81 /bnMN2g87nholBMkDTrrMurGqwfOrzL0XaA/E3bnbo5tMI7pMz1cy6m2vMPBnUyp2MnB VBqv4Uka4DSmLW10tXGmfcRYLw0RsSSQ4lT1gab1XlOQ56bCSI8fw82i3oC8+jqE9cgE PCF1IyBaVv+TWexPmr1M9HX1g2+i7E/b8IQCfthGf2S1fBYbWLRonOZkObuzjqKTpCpY D+Jw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773601147; x=1774205947; 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=KRDUs4BWADg7nfaNsLeDM12+oofqV/wURPpxTTROHAs=; b=i5afotW5xFmxE8MqvlyD7/aeYADOcLPUIoBkTEnPcThDfpVUW4xTgsOPLxfmkAkmlv suqrjQynGNUHUZueDOJKvduadNtwwgn39tkCCb+icAO+MAYj+Pcw3+YJDRSdSOT6zUck l+enbcfjSUaNQkzQOpjdyoFl7Aqvqj02oMpUP9mvOof8lV7o7PFXUbq4WEuV9qZoT/Jh 0nks1wIg2BmEOqwi4ceyVNo+aTT4unMcP3UeIv0xQi83uU652FlGj46uhOq6WkKGIG9/ c0+CFBBYN81/7hKGVbDj1ZH49ege2TC3SIP+h0zNbrdOGXWYynYnmOkl6I4qK3nyk8qR k+UA== X-Forwarded-Encrypted: i=1; AJvYcCXVjPfLKEb46fAEWNFuo0Qp7uAPW5B53/1Hdyodh6dqBvOO8UjhLrS/ThDQFIELSX8PKxaBXbtypCC+NWo=@vger.kernel.org X-Gm-Message-State: AOJu0Yy3VcVqkGE2oIeZSOQia9uxlIKvaeUNFGy+AcUEG8y0KSdUQEyU +kMQZlcibghdOeKAwWRKdlvXXxz8z201Ai/z56NCwoDkZpnNF6HSbYc5 X-Gm-Gg: ATEYQzwIrChId4nqqLWpRlmC/T/Ois//SFo+IbWF8ytCtB5kfB7L1o2lGeVeXufkRx/ XHo7vaBfFPKEmiV76dgg8G2j0L7qQ37KI+PktNvexV5PVfxEBCEGpdMVBQa0OsaUiXrGACDvne/ PjGTyab+PiaA4I+f9tzdWbrJPsG0Zsylj77FMhgXkQak5DIptz3mGg5FMfjsspcCygQfdoNqqML CcrCX9B+Ey7Ro3jATkk+Nfc5sx5fHeCgY+7Qez5zxSM1Jdp5ewINRq5OzgZtu/FXg59FPPvz/gF BBXg8hlUWgMRCjT5uS8d9nknXcrTJ5sL+uoQL1PDv77nbO12vpXLETRE1Rq5/j6SLDz8EvBq6YC vK6AeTgRULZcyDaSh6QuYAWuIKxPfBPVj48v4z7qIw8icY5ETGGkT4Dz9pJLiJwGmqVvKFoZXU0 TYD9YOTdRQHt3VDwPCXVfoWBeVumozGcodTIE0p9A/iAmTKtuA1fertD5MGr3wrn8uo3LleOKMu jpuFhQqirhyUn3WvJEeNDBqZ2U5rix6sotZ1kIaERHH X-Received: by 2002:a05:600c:8b41:b0:483:c35d:3659 with SMTP id 5b1f17b1804b1-485566fd0d4mr175399285e9.18.1773601147449; Sun, 15 Mar 2026 11:59:07 -0700 (PDT) Received: from fedora ([46.248.82.114]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-439fe1a76e5sm34881965f8f.12.2026.03.15.11.59.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 15 Mar 2026 11:59:07 -0700 (PDT) From: Uros Bizjak To: x86@kernel.org, linux-kernel@vger.kernel.org Cc: Uros Bizjak , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , "H. Peter Anvin" , "Peter Zijlstra (Intel)" Subject: [PATCH -tip v4 4/4] x86/segment: Implement loadsegment()/savesegment() macros with static inline helpers Date: Sun, 15 Mar 2026 19:51:45 +0100 Message-ID: <20260315185248.16615-4-ubizjak@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260315185248.16615-1-ubizjak@gmail.com> References: <20260315185248.16615-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 Convert the __loadsegment_simple() and savesegment() macro implementations into static inline helper functions generated via small helper macros. Historically loadsegment() and savesegment() relied on macros that embedded inline assembly. This approach obscures types, complicates debugging, and makes the call sites harder for the compiler and static analysis tools to reason about. This change is purely mechanical and does not alter the generated code, but improves readability, type safety, and compiler visibility of the helpers. Signed-off-by: Uros Bizjak Cc: Thomas Gleixner Cc: Ingo Molnar Cc: Borislav Petkov Cc: Dave Hansen Cc: "H. Peter Anvin" Cc: "Peter Zijlstra (Intel)" --- v3: New patch in series. v4: Use u16 instead of unsigned short. --- arch/x86/include/asm/segment.h | 57 +++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/arch/x86/include/asm/segment.h b/arch/x86/include/asm/segment.h index 0f4283dcd0c4..dbd90fede5e7 100644 --- a/arch/x86/include/asm/segment.h +++ b/arch/x86/include/asm/segment.h @@ -302,19 +302,17 @@ extern const char xen_early_idt_handler_array[NUM_EXCEPTION_VECTORS][XEN_EARLY_I * failure to fully clear the cached descriptor is only observable for * FS and GS. */ -#define __loadsegment_simple(seg, value) \ -do { \ - unsigned short __val = (value); \ - \ - asm volatile(" \n" \ - "1: movl %k0,%%" #seg " \n" \ +#define LOAD_SEGMENT(seg) \ +static inline void __loadsegment_##seg(u16 value) \ +{ \ + asm volatile("1: movl %k0,%%" #seg "\n" \ _ASM_EXTABLE_TYPE_REG(1b, 1b, EX_TYPE_ZERO_REG, %k0)\ - : "+r" (__val) : : "memory"); \ -} while (0) + : "+r" (value) : : "memory"); \ +} -#define __loadsegment_ss(value) __loadsegment_simple(ss, (value)) -#define __loadsegment_ds(value) __loadsegment_simple(ds, (value)) -#define __loadsegment_es(value) __loadsegment_simple(es, (value)) +LOAD_SEGMENT(ss) +LOAD_SEGMENT(ds) +LOAD_SEGMENT(es) #ifdef CONFIG_X86_32 @@ -322,19 +320,16 @@ do { \ * On 32-bit systems, the hidden parts of FS and GS are unobservable if * the selector is NULL, so there's no funny business here. */ -#define __loadsegment_fs(value) __loadsegment_simple(fs, (value)) -#define __loadsegment_gs(value) __loadsegment_simple(gs, (value)) +LOAD_SEGMENT(fs) +LOAD_SEGMENT(gs) #else -static inline void __loadsegment_fs(unsigned short value) +static inline void __loadsegment_fs(u16 value) { - asm volatile(" \n" - "1: movw %0, %%fs \n" - "2: \n" - + asm volatile("1: movw %0, %%fs\n" + "2:\n" _ASM_EXTABLE_TYPE(1b, 2b, EX_TYPE_CLEAR_FS) - : : ASM_INPUT_RM (value) : "memory"); } @@ -342,13 +337,31 @@ static inline void __loadsegment_fs(unsigned short value) #endif -#define loadsegment(seg, value) __loadsegment_ ## seg (value) +#undef LOAD_SEGMENT + +#define loadsegment(seg, val) __loadsegment_##seg(val) /* * Save a segment register away: */ -#define savesegment(seg, value) \ - asm volatile("movl %%" #seg ",%k0" : "=r" (value)) +#define SAVE_SEGMENT(seg) \ +static inline unsigned long __savesegment_##seg(void) \ +{ \ + unsigned long v; \ + asm volatile("movl %%" #seg ",%k0" : "=r" (v)); \ + return v; \ +} + +SAVE_SEGMENT(cs) +SAVE_SEGMENT(ss) +SAVE_SEGMENT(ds) +SAVE_SEGMENT(es) +SAVE_SEGMENT(fs) +SAVE_SEGMENT(gs) + +#undef SAVE_SEGMENT + +#define savesegment(seg, var) ((var) = __savesegment_##seg()) #endif /* !__ASSEMBLER__ */ #endif /* __KERNEL__ */ -- 2.53.0