2022-10-19 11:59:05

by Li, Xin3

[permalink] [raw]
Subject: [PATCH v4 0/5] x86: Enable LKGS instruction

LKGS instruction is introduced with Intel FRED (flexible return and event
delivery) specification https://cdrdv2.intel.com/v1/dl/getContent/678938.

LKGS is independent of FRED, so we enable it as a standalone CPU feature.

LKGS behaves like the MOV to GS instruction except that it loads the base
address into the IA32_KERNEL_GS_BASE MSR instead of the GS segment’s
descriptor cache, which is exactly what Linux kernel does to load user level
GS base. Thus, with LKGS, there is no need to SWAPGS away from the kernel
GS base.

Changes since v3:
* We want less ASM not more, thus keep local_irq_save/restore() inside
native_load_gs_index() (Thomas Gleixner).
* For paravirt enabled kernels, initialize pv_ops.cpu.load_gs_index to
native_lkgs (Thomas Gleixner).

Changes since V2:
* Add "" not to show "lkgs" in /proc/cpuinfo (Chang S. Bae).
* Mark DI as input and output (+D) as in V1, since the exception handler
modifies it (Brian Gerst).

Changes since V1:
* Use EX_TYPE_ZERO_REG instead of fixup code in the obsolete .fixup code
section (Peter Zijlstra).
* Add a comment that states the LKGS_DI macro will be repalced with "lkgs %di"
once the binutils support the LKGS instruction (Peter Zijlstra).

H. Peter Anvin (Intel) (5):
x86/cpufeature: add the cpu feature bit for LKGS
x86/opcode: add the LKGS instruction to x86-opcode-map
x86/gsseg: make asm_load_gs_index() take an u16
x86/gsseg: move load_gs_index() to its own new header file
x86/gsseg: use the LKGS instruction if available for load_gs_index()

arch/x86/entry/entry_64.S | 2 +-
arch/x86/ia32/ia32_signal.c | 1 +
arch/x86/include/asm/cpufeatures.h | 1 +
arch/x86/include/asm/gsseg.h | 66 ++++++++++++++++++++++++
arch/x86/include/asm/mmu_context.h | 1 +
arch/x86/include/asm/special_insns.h | 21 --------
arch/x86/kernel/cpu/common.c | 1 +
arch/x86/kernel/paravirt.c | 1 +
arch/x86/kernel/tls.c | 1 +
arch/x86/lib/x86-opcode-map.txt | 1 +
tools/arch/x86/include/asm/cpufeatures.h | 1 +
tools/arch/x86/lib/x86-opcode-map.txt | 1 +
12 files changed, 76 insertions(+), 22 deletions(-)
create mode 100644 arch/x86/include/asm/gsseg.h

--
2.34.1


2022-10-19 11:59:07

by Li, Xin3

[permalink] [raw]
Subject: [PATCH v4 2/5] x86/opcode: add the LKGS instruction to x86-opcode-map

From: "H. Peter Anvin (Intel)" <[email protected]>

Add the instruction opcode used by LKGS.
Opcode number is per public FRED draft spec v3.0
https://cdrdv2.intel.com/v1/dl/getContent/678938.

Signed-off-by: H. Peter Anvin (Intel) <[email protected]>
Signed-off-by: Xin Li <[email protected]>
---
arch/x86/lib/x86-opcode-map.txt | 1 +
tools/arch/x86/lib/x86-opcode-map.txt | 1 +
2 files changed, 2 insertions(+)

diff --git a/arch/x86/lib/x86-opcode-map.txt b/arch/x86/lib/x86-opcode-map.txt
index d12d1358f96d..5168ee0360b2 100644
--- a/arch/x86/lib/x86-opcode-map.txt
+++ b/arch/x86/lib/x86-opcode-map.txt
@@ -1047,6 +1047,7 @@ GrpTable: Grp6
3: LTR Ew
4: VERR Ew
5: VERW Ew
+6: LKGS Ew (F2)
EndTable

GrpTable: Grp7
diff --git a/tools/arch/x86/lib/x86-opcode-map.txt b/tools/arch/x86/lib/x86-opcode-map.txt
index d12d1358f96d..5168ee0360b2 100644
--- a/tools/arch/x86/lib/x86-opcode-map.txt
+++ b/tools/arch/x86/lib/x86-opcode-map.txt
@@ -1047,6 +1047,7 @@ GrpTable: Grp6
3: LTR Ew
4: VERR Ew
5: VERW Ew
+6: LKGS Ew (F2)
EndTable

GrpTable: Grp7
--
2.34.1

2022-10-19 12:00:32

by Li, Xin3

[permalink] [raw]
Subject: [PATCH v4 1/5] x86/cpufeature: add the cpu feature bit for LKGS

From: "H. Peter Anvin (Intel)" <[email protected]>

Add the CPU feature bit for LKGS (Load "Kernel" GS).

LKGS instruction is introduced with Intel FRED (flexible return and
event delivery) specificaton
https://cdrdv2.intel.com/v1/dl/getContent/678938.

LKGS behaves like the MOV to GS instruction except that it loads
the base address into the IA32_KERNEL_GS_BASE MSR instead of the
GS segment’s descriptor cache, which is exactly what Linux kernel
does to load a user level GS base. Thus, with LKGS, there is no
need to SWAPGS away from the kernel GS base.

Signed-off-by: H. Peter Anvin (Intel) <[email protected]>
Signed-off-by: Xin Li <[email protected]>
---

Change since V2:
* add "" not to show "lkgs" in /proc/cpuinfo (Chang S. Bae).
---
arch/x86/include/asm/cpufeatures.h | 1 +
tools/arch/x86/include/asm/cpufeatures.h | 1 +
2 files changed, 2 insertions(+)

diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h
index b71f4f2ecdd5..3dc1a48c2796 100644
--- a/arch/x86/include/asm/cpufeatures.h
+++ b/arch/x86/include/asm/cpufeatures.h
@@ -308,6 +308,7 @@
/* Intel-defined CPU features, CPUID level 0x00000007:1 (EAX), word 12 */
#define X86_FEATURE_AVX_VNNI (12*32+ 4) /* AVX VNNI instructions */
#define X86_FEATURE_AVX512_BF16 (12*32+ 5) /* AVX512 BFLOAT16 instructions */
+#define X86_FEATURE_LKGS (12*32+ 18) /* "" Load "kernel" (userspace) gs */

/* AMD-defined CPU features, CPUID level 0x80000008 (EBX), word 13 */
#define X86_FEATURE_CLZERO (13*32+ 0) /* CLZERO instruction */
diff --git a/tools/arch/x86/include/asm/cpufeatures.h b/tools/arch/x86/include/asm/cpufeatures.h
index ef4775c6db01..9d45071d1730 100644
--- a/tools/arch/x86/include/asm/cpufeatures.h
+++ b/tools/arch/x86/include/asm/cpufeatures.h
@@ -308,6 +308,7 @@
/* Intel-defined CPU features, CPUID level 0x00000007:1 (EAX), word 12 */
#define X86_FEATURE_AVX_VNNI (12*32+ 4) /* AVX VNNI instructions */
#define X86_FEATURE_AVX512_BF16 (12*32+ 5) /* AVX512 BFLOAT16 instructions */
+#define X86_FEATURE_LKGS (12*32+ 18) /* "" Load "kernel" (userspace) gs */

/* AMD-defined CPU features, CPUID level 0x80000008 (EBX), word 13 */
#define X86_FEATURE_CLZERO (13*32+ 0) /* CLZERO instruction */
--
2.34.1

2022-10-19 15:26:35

by Thomas Gleixner

[permalink] [raw]
Subject: Re: [PATCH v4 0/5] x86: Enable LKGS instruction

Xin,

On Wed, Oct 19 2022 at 03:23, Xin Li wrote:
> LKGS instruction is introduced with Intel FRED (flexible return and event
> delivery) specification https://cdrdv2.intel.com/v1/dl/getContent/678938.

So I have two versions of the same thing in my inbox now. What's the
difference?

2022-10-19 17:14:18

by Li, Xin3

[permalink] [raw]
Subject: RE: [PATCH v4 0/5] x86: Enable LKGS instruction

> On Wed, Oct 19 2022 at 03:23, Xin Li wrote:
> > LKGS instruction is introduced with Intel FRED (flexible return and
> > event
> > delivery) specification https://cdrdv2.intel.com/v1/dl/getContent/678938.
>
> So I have two versions of the same thing in my inbox now. What's the
> difference?

No difference at all.

Sorry for the confusion, but maybe I have an excuse. A few days ago,
I sent an email to the LKML and it seems lost. I got to know it until
Nathan Chancellor replied; and my original message doesn't show up here:
https://lore.kernel.org/all/Y02eZ6A%2Fvlj8+B%[email protected]/

Last night I sent this patch set to the LKML and waited half an hour,
they still didn't show up, so I did it again, but this time both worked.

I have sent an email to [email protected] asking for help.

Xin

2022-11-18 07:32:14

by Li, Xin3

[permalink] [raw]
Subject: RE: [PATCH v4 0/5] x86: Enable LKGS instruction

> > On Wed, Oct 19 2022 at 03:23, Xin Li wrote:
> > > LKGS instruction is introduced with Intel FRED (flexible return and
> > > event
> > > delivery) specification https://cdrdv2.intel.com/v1/dl/getContent/678938.
> >
> > So I have two versions of the same thing in my inbox now. What's the
> > difference?

Hi Thomas,

Should I resend it?

Xin


>
> No difference at all.
>
> Sorry for the confusion, but maybe I have an excuse. A few days ago, I sent an
> email to the LKML and it seems lost. I got to know it until Nathan Chancellor
> replied; and my original message doesn't show up here:
> https://lore.kernel.org/all/Y02eZ6A%2Fvlj8+B%[email protected]/
>
> Last night I sent this patch set to the LKML and waited half an hour, they still
> didn't show up, so I did it again, but this time both worked.
>
> I have sent an email to [email protected] asking for help.
>
> Xin