[PATCH v2] x86/fred: Fix 64bit identifier in fred_ss

Andrew Cooper posted 1 patch 1 month ago
arch/x86/entry/entry_fred.c   | 4 ++--
arch/x86/include/asm/fred.h   | 2 +-
arch/x86/include/asm/ptrace.h | 4 ++--
3 files changed, 5 insertions(+), 5 deletions(-)
[PATCH v2] x86/fred: Fix 64bit identifier in fred_ss
Posted by Andrew Cooper 1 month ago
FRED can only be enabled in Long Mode.  This is the 64bit mode (as opposed to
compatibility mode) identifier, rather than being something hard-wired at 1.

No functional change.

Reviewed-by: Xin Li (Intel) <xin@zytor.com>
Reviewed-by: H. Peter Anvin (Intel) <hpa@zytor.com>
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: Xin Li <xin@zytor.com>
CC: "H. Peter Anvin" <hpa@zytor.com>
CC: Andy Lutomirski <luto@kernel.org>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Ingo Molnar <mingo@redhat.com>
CC: Borislav Petkov <bp@alien8.de>
CC: Dave Hansen <dave.hansen@linux.intel.com>
CC: x86@kernel.org
CC: linux-kernel@vger.kernel.org

v2:
 * State no functional change.

IIRC, this was wrong in an older version of the FRED spec.  I made the same
mistake in Xen, and I didn't copy Linux's structure.

I don't thinks this warrants backporting, but the fixes tag is:

Fixes: 3c77bf02d0c0 ("x86/ptrace: Add FRED additional information to the pt_regs structure")
---
 arch/x86/entry/entry_fred.c   | 4 ++--
 arch/x86/include/asm/fred.h   | 2 +-
 arch/x86/include/asm/ptrace.h | 4 ++--
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/arch/x86/entry/entry_fred.c b/arch/x86/entry/entry_fred.c
index f004a4dc74c2..94e626cc6a07 100644
--- a/arch/x86/entry/entry_fred.c
+++ b/arch/x86/entry/entry_fred.c
@@ -78,13 +78,13 @@ static noinstr void fred_intx(struct pt_regs *regs)
 static __always_inline void fred_other(struct pt_regs *regs)
 {
 	/* The compiler can fold these conditions into a single test */
-	if (likely(regs->fred_ss.vector == FRED_SYSCALL && regs->fred_ss.lm)) {
+	if (likely(regs->fred_ss.vector == FRED_SYSCALL && regs->fred_ss.l)) {
 		regs->orig_ax = regs->ax;
 		regs->ax = -ENOSYS;
 		do_syscall_64(regs, regs->orig_ax);
 		return;
 	} else if (ia32_enabled() &&
-		   likely(regs->fred_ss.vector == FRED_SYSENTER && !regs->fred_ss.lm)) {
+		   likely(regs->fred_ss.vector == FRED_SYSENTER && !regs->fred_ss.l)) {
 		regs->orig_ax = regs->ax;
 		regs->ax = -ENOSYS;
 		do_fast_syscall_32(regs);
diff --git a/arch/x86/include/asm/fred.h b/arch/x86/include/asm/fred.h
index 12b34d5b2953..2bb65677c079 100644
--- a/arch/x86/include/asm/fred.h
+++ b/arch/x86/include/asm/fred.h
@@ -79,7 +79,7 @@ static __always_inline void fred_entry_from_kvm(unsigned int type, unsigned int
 		.type   = type,
 		.vector = vector,
 		.nmi    = type == EVENT_TYPE_NMI,
-		.lm     = 1,
+		.l      = 1,
 	};
 
 	asm_fred_entry_from_kvm(ss);
diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h
index 50f75467f73d..37370c3b1ffd 100644
--- a/arch/x86/include/asm/ptrace.h
+++ b/arch/x86/include/asm/ptrace.h
@@ -84,8 +84,8 @@ struct fred_ss {
 			:  4,
 		/* Event was incident to enclave execution */
 		enclave	:  1,
-		/* CPU was in long mode */
-		lm	:  1,
+		/* CPU was in 64-bit mode */
+		l	:  1,
 		/*
 		 * Nested exception during FRED delivery, not set
 		 * for #DF.

base-commit: e6b9dce0aeeb91dfc0974ab87f02454e24566182
-- 
2.39.5
Re: [PATCH v2] x86/fred: Fix 64bit identifier in fred_ss
Posted by H. Peter Anvin 1 month ago
On September 2, 2025 4:01:17 PM PDT, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
>FRED can only be enabled in Long Mode.  This is the 64bit mode (as opposed to
>compatibility mode) identifier, rather than being something hard-wired at 1.
>
>No functional change.
>
>Reviewed-by: Xin Li (Intel) <xin@zytor.com>
>Reviewed-by: H. Peter Anvin (Intel) <hpa@zytor.com>
>Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
>---
>CC: Xin Li <xin@zytor.com>
>CC: "H. Peter Anvin" <hpa@zytor.com>
>CC: Andy Lutomirski <luto@kernel.org>
>CC: Thomas Gleixner <tglx@linutronix.de>
>CC: Ingo Molnar <mingo@redhat.com>
>CC: Borislav Petkov <bp@alien8.de>
>CC: Dave Hansen <dave.hansen@linux.intel.com>
>CC: x86@kernel.org
>CC: linux-kernel@vger.kernel.org
>
>v2:
> * State no functional change.
>
>IIRC, this was wrong in an older version of the FRED spec.  I made the same
>mistake in Xen, and I didn't copy Linux's structure.
>
>I don't thinks this warrants backporting, but the fixes tag is:
>
>Fixes: 3c77bf02d0c0 ("x86/ptrace: Add FRED additional information to the pt_regs structure")
>---
> arch/x86/entry/entry_fred.c   | 4 ++--
> arch/x86/include/asm/fred.h   | 2 +-
> arch/x86/include/asm/ptrace.h | 4 ++--
> 3 files changed, 5 insertions(+), 5 deletions(-)
>
>diff --git a/arch/x86/entry/entry_fred.c b/arch/x86/entry/entry_fred.c
>index f004a4dc74c2..94e626cc6a07 100644
>--- a/arch/x86/entry/entry_fred.c
>+++ b/arch/x86/entry/entry_fred.c
>@@ -78,13 +78,13 @@ static noinstr void fred_intx(struct pt_regs *regs)
> static __always_inline void fred_other(struct pt_regs *regs)
> {
> 	/* The compiler can fold these conditions into a single test */
>-	if (likely(regs->fred_ss.vector == FRED_SYSCALL && regs->fred_ss.lm)) {
>+	if (likely(regs->fred_ss.vector == FRED_SYSCALL && regs->fred_ss.l)) {
> 		regs->orig_ax = regs->ax;
> 		regs->ax = -ENOSYS;
> 		do_syscall_64(regs, regs->orig_ax);
> 		return;
> 	} else if (ia32_enabled() &&
>-		   likely(regs->fred_ss.vector == FRED_SYSENTER && !regs->fred_ss.lm)) {
>+		   likely(regs->fred_ss.vector == FRED_SYSENTER && !regs->fred_ss.l)) {
> 		regs->orig_ax = regs->ax;
> 		regs->ax = -ENOSYS;
> 		do_fast_syscall_32(regs);
>diff --git a/arch/x86/include/asm/fred.h b/arch/x86/include/asm/fred.h
>index 12b34d5b2953..2bb65677c079 100644
>--- a/arch/x86/include/asm/fred.h
>+++ b/arch/x86/include/asm/fred.h
>@@ -79,7 +79,7 @@ static __always_inline void fred_entry_from_kvm(unsigned int type, unsigned int
> 		.type   = type,
> 		.vector = vector,
> 		.nmi    = type == EVENT_TYPE_NMI,
>-		.lm     = 1,
>+		.l      = 1,
> 	};
> 
> 	asm_fred_entry_from_kvm(ss);
>diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h
>index 50f75467f73d..37370c3b1ffd 100644
>--- a/arch/x86/include/asm/ptrace.h
>+++ b/arch/x86/include/asm/ptrace.h
>@@ -84,8 +84,8 @@ struct fred_ss {
> 			:  4,
> 		/* Event was incident to enclave execution */
> 		enclave	:  1,
>-		/* CPU was in long mode */
>-		lm	:  1,
>+		/* CPU was in 64-bit mode */
>+		l	:  1,
> 		/*
> 		 * Nested exception during FRED delivery, not set
> 		 * for #DF.
>
>base-commit: e6b9dce0aeeb91dfc0974ab87f02454e24566182

Acked-by: H. Peter Anvin (Intel) <hpa@zytor.com>