From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (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 ECA1A3F99C2 for ; Thu, 12 Mar 2026 21:59:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773352768; cv=none; b=X4CgWeT9/C07bHxeK2zSowm0/Nix+i1N8d2wWyG9IYJu75J0mU77aGWIgnxwDyV2Z9+1Jpkp/DjToKJ/s6CTFgUq3WCXD6hl9r5bAWKZ9OGD5OlmQgQHjMEnx3yINNJRbQ2DyzP4RjCwfrX8rBccklJVBTe1CWMWb9vrooyWk4g= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773352768; c=relaxed/simple; bh=r9XzLAarll45DvgWR4+8H11YvOmNk9eF4vqO04yzPGY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=V81Ot5SY8d2UJMbQAiFiCPXJAczzroCfGKLWYVXvQAuM6dTzxYKm1/Vr8STmHZ8O+eFlmVvr6ScAFrdD5Uz9Asc453vxS2Cslx1ytEQzRUYYWx3YzA01fiep2khOhZpA1oOUPTA0XwVpVq+QHDO/0pATb0wbH3ffmLkXAJ2/PGE= 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=eQUZBTQo; arc=none smtp.client-ip=209.85.128.50 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="eQUZBTQo" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-4852f8ac7e9so17058355e9.1 for ; Thu, 12 Mar 2026 14:59:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773352765; x=1773957565; 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=2o9I3Cc2h6qPyIZG7GAiieB9JxiWxSpCkUMvTRd8Bcs=; b=eQUZBTQoIgT+4KPpFzb/mki2V/t0LALfKqf6QfpmbDFMUoktpV5GgkKxG7hAghylmD MYOQ0mQB5feC7Sruw/dfibQQ/GEWcQH+NK7JdgOeyiL00mLpPOF2rbXQ2JPQ20biA8mJ bvHaz8Qk72CRnaUOlhIVR4ln8edFAtUszxZK6KT1TH2goEC2VyxJ3Wbpf6nGlOav+zCJ MmfuymQAfa63CM7sHmCzRE6bOACibRP8PJdTeZCg8VTNNGvWsO/BIuc1B9jO+yrfP0b1 Mr5XdiFmyJV1i11kxy+jANlOUG9q+8/nafIj3g7rV3waT6FEqm6QIVfBBaIuxZdxKue6 2kgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1773352765; x=1773957565; 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=2o9I3Cc2h6qPyIZG7GAiieB9JxiWxSpCkUMvTRd8Bcs=; b=jfJG0w4vhix4Vav1cm9TyBBcbk8OLoWaqeH2r3wQBDGeQC0pQ6t1JQxcJA42oA1u2P ZxdLYLb3scGbw38QgSMGF3l5CJGRkuxQmh03BloAm+16Qot5BFjqIxGys5eBuBsZWsQw I6W5SR2QiepW8wJWEpiDysLpQdypXcfBr+uDzh1ehK/rx0mCrTahJ3BttZkmp/Lh54x7 rbKfCkGXEn62OnxRmwtpBBDsz8eEal10hChxSAGbwDOQQD3FydvyePNqtfy6VCO5qVy0 pAj/j2keqMQAjVx8n8PlnekmJeWRjuSfHl3Vt+czcFeUH8ohGyTRrnWE17MWbAbFBVJN EDOw== X-Forwarded-Encrypted: i=1; AJvYcCX1UBXf3wenrku22YMbu60Z/GFhFhxq93BPndZxrU0KuZ5ZTFrDxccCrcZxjSpGl922SoXz749qML+NwJ4=@vger.kernel.org X-Gm-Message-State: AOJu0YxMFJoa+fC1eB0BDEX6y/H+LlJj1Zg6uZ2cRoW3a9q8Yiu6ARSF oHrPWgmTcTdsL5vpKX9xU4/473VZqB9Uwrys3fRDBqNs1515Dq0fWIFJ X-Gm-Gg: ATEYQzxxch97lAyXOWn7mmv4wEXEdkh8Yjo6qVu2vJSlbhx9wPyyAzm7w/OKr7zl8fJ 5KTO9ZdZP7gfAhNkJ3lHqi8klxOQ7UZKAPemU2kmSBbNgvEYjvueH7JP5pZ0ccd8GL0OlCrzvTg CMvRs/TbV9Av8MaSq1Z9TQl/jAqiZk1xQhCKdkw7QQM0uSb/VtVeKh5xcpIJG3Hfx8M/3W3M8Zw QkwzFKOgCZARfzWraMMnQdGixBzmewqre6cLgmGSHCCi1aVRXu8SSrQfpDK4t4uOG1DEStny/ug CUvOowJ/y6xtzntWS9mQHDw22HXEC04XU2TDnw6/LVGYGTVzcJcs6Cdg4PKah3DsFVOZYGR4Or0 JV480c6LdzRtZ8Kj89yazbUuMPS0kmERg8kH2C5fKbJF4vFXs5TDwGDdo4PSVvSod+lxHiCTbaM MgRE+QuxWiXySZXRNtxMFM70fGdN+clIJVYqF7+PslyCzGLcMD1KM2fNwhE8h/OIHirQQRE325r H1aeoeBRmpkplbrzJxFMT+AFuOpB8jGqQaDM0C+OlYn X-Received: by 2002:a05:600c:1388:b0:485:3a03:cee1 with SMTP id 5b1f17b1804b1-48556711f7fmr13795335e9.33.1773352765206; Thu, 12 Mar 2026 14:59:25 -0700 (PDT) Received: from fedora ([46.248.82.114]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4854b66ffe2sm148841245e9.13.2026.03.12.14.59.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 14:59:24 -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 v3 4/4] x86/segment: Implement loadsegment()/savesegment() macros with static inline helpers Date: Thu, 12 Mar 2026 22:58:58 +0100 Message-ID: <20260312215916.258176-4-ubizjak@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260312215916.258176-1-ubizjak@gmail.com> References: <20260312215916.258176-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. --- arch/x86/include/asm/segment.h | 54 +++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/arch/x86/include/asm/segment.h b/arch/x86/include/asm/segment.h index 0f4283dcd0c4..6de4118120cb 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(unsigned short 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) { - 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,30 @@ 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(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