From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (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 E6D4238838F for ; Mon, 30 Mar 2026 05:58:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774850333; cv=none; b=TRSmREZ7XfRZ3vm8Aw6fwTfnyKfiEP/7VZgHS/eSLkM9X9rcudDYHFQPRsICbXUZofveBTi305Ff5R7J7+f+rsJ8b7v5S4i8eSBLeRWU+wVKXyXtQvrvUtHMS8rct44REIjQuOYHoCz6bOi+p9D+PKjnfp6RWVJLQGgmkEeErfA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774850333; c=relaxed/simple; bh=JrKbNkjbKoty3y9nOD4nkSNC0uf1s2ydM0jEId7IOCg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Cfx+dkCGKNVw6Y0p8dMQW4L9VwONa3jb4rRclGV0u33Y8rjSOb2T0zYOdHlZDFf+RYbKlR0p88PbsFzesaMjfij+CwDLSCOR6Ry4Sl4ONchwCafAJifzzaVdE4HsNp6KUp48tLWrTAx00aNBgC0QUeul9An3Fpdu1JXk8Zzh924= 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=aW7SrpLG; arc=none smtp.client-ip=209.85.128.51 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="aW7SrpLG" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-48334ee0aeaso33928315e9.1 for ; Sun, 29 Mar 2026 22:58:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774850330; x=1775455130; 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=R9GTbFG3wGsIAxBjR+Jd7c6yw/S6xF/WDxEkq0U/+qY=; b=aW7SrpLGntNGxTsfDDTsrVQfKqpKCgX3/eYFZC91bgk7TzhlzJEwJeCoPdAQgqbyKr LGjYHD1Mrp9gkFFeBTedWVkW7xq+CQLLKA5cUCd3tbfqeJYhC1bkyfAl95FBLTLXFA3p jZZH48Cz0+FfXtu+aWS5+wKOFWj2Pe1L+XpcSMh0YxflVH4qGn8D2YUIO4J43d6Qrs32 d+X3VMR00t2zqZxO18uJoZJ8hc+qkLYqjmmV42LwdZKxfgo555oYBYW4y9393IUIGAbo lzVcNR+QobpGW3Ff3QNJrEighiTXovRte5BLaginJYFFJXkh+Tpbshim5Xy3uNU2ykVV nIXg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774850330; x=1775455130; 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=R9GTbFG3wGsIAxBjR+Jd7c6yw/S6xF/WDxEkq0U/+qY=; b=m6cwfh04YOJMgaPt+HcIKVTcxgTermZS60CcU1+QRCdujA4sTNQxQ4wBriGvbAV3RF 9B8LxvEhSYhf3/iXi0WSUGT6QYtFHbHZVVeq+P4tcmlJOcavcbXQpXI7yGoNBnGVmDvi HFNsJ3kXfs86pjhw7yYGzwOZ5dz+rWYg1v2A/J/pRp6+W4gxA5wg6zNFJXZbjrMk56G3 RILzgD+09MN0vqGuITgNIK2W6NXOkpZTwoXQokdwfofkUWwmaisNOPKMEB3ohFiEJu7l nHJ3gA7O9hcE14DpgjOc1VEmGsOvUATsqvt3FFNfLQ1wuguoK4SW5Tmqa0dK5oRWo4vu bTwA== X-Forwarded-Encrypted: i=1; AJvYcCUiLEtxXeBqaS8x0BiFwIaQuE12CvnqZLKpqzgiL6wjA3fZCwFrziMUxoPW/5xi6F/xfjRvolQm83LVE/E=@vger.kernel.org X-Gm-Message-State: AOJu0YyrfSYQeCFCs+4MGk3V6JOhpWr/QiSkOUlblYOCpvPkycSbfVTf IWcni1/V22i+wIwCLK6NBDeAoRvsQ0VTAEkpZLKdQFbNHlJXgREsjGrV X-Gm-Gg: ATEYQzwFiLc2E0ZR2iGts7ShzBET0i9nFsH6HPWe4Qk5Ky5U4em94gr5bJzxwwWrC8g rOlBxe9bsF/F75h/RUFu1EQxBHdPYFUz112B07aAesRFyL2OPvpPI1h+f7OmtbJNaPpJ+DlgOTc CN9TPrtaMhDoJ16zREydvaM2HQU5pQt4J4pZ1FPjBFIHnjDwopCCBynxxO77EsmeqyhOCfri8tF 0j+5xPEwCI989LGlyA2C5VRvtMzLd3jKt0ulkcegz0UqfqXHcQDuz4uZNNfg/3BHMZq3irHC6W9 Ir+xDb41k2ndYs8/KGwieroICuR4XZUv4oB9sMmOaJ61YyBBx6Zprhlj98g6n+3pPfBSD0DrFux +KnSjqwmjsFGXrmTdJ97/EK+mMZ/DOCgGawLwfTwOHf7APbVvgz9b2gRHw046bAbgHPRKviE3O7 FRuQhy8K013qNzhQPpcwEnmWeFCYbSFFSpJ5FL8z3WvA5KoB21w0PBw2yW0bJbHADIK2Z2fhMGh EeBs60jIx5LflZ3P53aMMJGfBneBCgqq0Esn/qOoMYHKOh5qdzqZ5E= X-Received: by 2002:a05:600c:4f91:b0:485:3f30:6250 with SMTP id 5b1f17b1804b1-48727eda62emr173364915e9.20.1774850330147; Sun, 29 Mar 2026 22:58:50 -0700 (PDT) Received: from fedora ([193.77.86.199]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43cf247079esm16324269f8f.25.2026.03.29.22.58.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Mar 2026 22:58:49 -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 , "Peter Zijlstra (Intel)" Subject: [PATCH RESEND v4 4/4] x86/segment: Implement loadsegment()/savesegment() macros with static inline helpers Date: Mon, 30 Mar 2026 07:57:45 +0200 Message-ID: <20260330055823.5793-4-ubizjak@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260330055823.5793-1-ubizjak@gmail.com> References: <20260330055823.5793-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 Suggested-by: "H. Peter Anvin" Cc: Thomas Gleixner Cc: Ingo Molnar Cc: Borislav Petkov Cc: Dave Hansen 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