From: "tip-bot2 for Xin Li" <tip-bot2@linutronix.de>
To: linux-tip-commits@vger.kernel.org
Cc: "H. Peter Anvin (Intel)" <hpa@zytor.com>,
Xin Li <xin3.li@intel.com>, Thomas Gleixner <tglx@linutronix.de>,
"Borislav Petkov (AMD)" <bp@alien8.de>,
Shan Kang <shan.kang@intel.com>,
x86@kernel.org, linux-kernel@vger.kernel.org
Subject: [tip: x86/fred] x86/fred: Fixup fault on ERETU by jumping to fred_entrypoint_user
Date: Wed, 31 Jan 2024 21:14:42 -0000 [thread overview]
Message-ID: <170673568259.398.13788198953979010060.tip-bot2@tip-bot2> (raw)
In-Reply-To: <20231205105030.8698-30-xin3.li@intel.com>
The following commit has been merged into the x86/fred branch of tip:
Commit-ID: 5105e7687ad3dffde77f6e4393b5530e83d672dc
Gitweb: https://git.kernel.org/tip/5105e7687ad3dffde77f6e4393b5530e83d672dc
Author: Xin Li <xin3.li@intel.com>
AuthorDate: Tue, 05 Dec 2023 02:50:18 -08:00
Committer: Borislav Petkov (AMD) <bp@alien8.de>
CommitterDate: Wed, 31 Jan 2024 22:03:04 +01:00
x86/fred: Fixup fault on ERETU by jumping to fred_entrypoint_user
If the stack frame contains an invalid user context (e.g. due to invalid SS,
a non-canonical RIP, etc.) the ERETU instruction will trap (#SS or #GP).
>From a Linux point of view, this really should be considered a user space
failure, so use the standard fault fixup mechanism to intercept the fault,
fix up the exception frame, and redirect execution to fred_entrypoint_user.
The end result is that it appears just as if the hardware had taken the
exception immediately after completing the transition to user space.
Suggested-by: H. Peter Anvin (Intel) <hpa@zytor.com>
Signed-off-by: Xin Li <xin3.li@intel.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Tested-by: Shan Kang <shan.kang@intel.com>
Link: https://lore.kernel.org/r/20231205105030.8698-30-xin3.li@intel.com
---
arch/x86/entry/entry_64_fred.S | 5 +-
arch/x86/include/asm/extable_fixup_types.h | 4 +-
arch/x86/mm/extable.c | 78 +++++++++++++++++++++-
3 files changed, 85 insertions(+), 2 deletions(-)
diff --git a/arch/x86/entry/entry_64_fred.S b/arch/x86/entry/entry_64_fred.S
index 2271a1c..7fe2722 100644
--- a/arch/x86/entry/entry_64_fred.S
+++ b/arch/x86/entry/entry_64_fred.S
@@ -3,6 +3,7 @@
* The actual FRED entry points.
*/
+#include <asm/asm.h>
#include <asm/fred.h>
#include "calling.h"
@@ -34,7 +35,9 @@ SYM_CODE_START_NOALIGN(asm_fred_entrypoint_user)
call fred_entry_from_user
SYM_INNER_LABEL(asm_fred_exit_user, SYM_L_GLOBAL)
FRED_EXIT
- ERETU
+1: ERETU
+
+ _ASM_EXTABLE_TYPE(1b, asm_fred_entrypoint_user, EX_TYPE_ERETU)
SYM_CODE_END(asm_fred_entrypoint_user)
/*
diff --git a/arch/x86/include/asm/extable_fixup_types.h b/arch/x86/include/asm/extable_fixup_types.h
index fe63120..7acf038 100644
--- a/arch/x86/include/asm/extable_fixup_types.h
+++ b/arch/x86/include/asm/extable_fixup_types.h
@@ -64,6 +64,8 @@
#define EX_TYPE_UCOPY_LEN4 (EX_TYPE_UCOPY_LEN | EX_DATA_IMM(4))
#define EX_TYPE_UCOPY_LEN8 (EX_TYPE_UCOPY_LEN | EX_DATA_IMM(8))
-#define EX_TYPE_ZEROPAD 20 /* longword load with zeropad on fault */
+#define EX_TYPE_ZEROPAD 20 /* longword load with zeropad on fault */
+
+#define EX_TYPE_ERETU 21
#endif
diff --git a/arch/x86/mm/extable.c b/arch/x86/mm/extable.c
index 271dcb2..b522933 100644
--- a/arch/x86/mm/extable.c
+++ b/arch/x86/mm/extable.c
@@ -6,6 +6,7 @@
#include <xen/xen.h>
#include <asm/fpu/api.h>
+#include <asm/fred.h>
#include <asm/sev.h>
#include <asm/traps.h>
#include <asm/kdebug.h>
@@ -223,6 +224,79 @@ static bool ex_handler_ucopy_len(const struct exception_table_entry *fixup,
return ex_handler_uaccess(fixup, regs, trapnr, fault_address);
}
+#ifdef CONFIG_X86_FRED
+static bool ex_handler_eretu(const struct exception_table_entry *fixup,
+ struct pt_regs *regs, unsigned long error_code)
+{
+ struct pt_regs *uregs = (struct pt_regs *)(regs->sp - offsetof(struct pt_regs, orig_ax));
+ unsigned short ss = uregs->ss;
+ unsigned short cs = uregs->cs;
+
+ /*
+ * Move the NMI bit from the invalid stack frame, which caused ERETU
+ * to fault, to the fault handler's stack frame, thus to unblock NMI
+ * with the fault handler's ERETS instruction ASAP if NMI is blocked.
+ */
+ regs->fred_ss.nmi = uregs->fred_ss.nmi;
+
+ /*
+ * Sync event information to uregs, i.e., the ERETU return frame, but
+ * is it safe to write to the ERETU return frame which is just above
+ * current event stack frame?
+ *
+ * The RSP used by FRED to push a stack frame is not the value in %rsp,
+ * it is calculated from %rsp with the following 2 steps:
+ * 1) RSP = %rsp - (IA32_FRED_CONFIG & 0x1c0) // Reserve N*64 bytes
+ * 2) RSP = RSP & ~0x3f // Align to a 64-byte cache line
+ * when an event delivery doesn't trigger a stack level change.
+ *
+ * Here is an example with N*64 (N=1) bytes reserved:
+ *
+ * 64-byte cache line ==> ______________
+ * |___Reserved___|
+ * |__Event_data__|
+ * |_____SS_______|
+ * |_____RSP______|
+ * |_____FLAGS____|
+ * |_____CS_______|
+ * |_____IP_______|
+ * 64-byte cache line ==> |__Error_code__| <== ERETU return frame
+ * |______________|
+ * |______________|
+ * |______________|
+ * |______________|
+ * |______________|
+ * |______________|
+ * |______________|
+ * 64-byte cache line ==> |______________| <== RSP after step 1) and 2)
+ * |___Reserved___|
+ * |__Event_data__|
+ * |_____SS_______|
+ * |_____RSP______|
+ * |_____FLAGS____|
+ * |_____CS_______|
+ * |_____IP_______|
+ * 64-byte cache line ==> |__Error_code__| <== ERETS return frame
+ *
+ * Thus a new FRED stack frame will always be pushed below a previous
+ * FRED stack frame ((N*64) bytes may be reserved between), and it is
+ * safe to write to a previous FRED stack frame as they never overlap.
+ */
+ fred_info(uregs)->edata = fred_event_data(regs);
+ uregs->ssx = regs->ssx;
+ uregs->fred_ss.ss = ss;
+ /* The NMI bit was moved away above */
+ uregs->fred_ss.nmi = 0;
+ uregs->csx = regs->csx;
+ uregs->fred_cs.sl = 0;
+ uregs->fred_cs.wfe = 0;
+ uregs->cs = cs;
+ uregs->orig_ax = error_code;
+
+ return ex_handler_default(fixup, regs);
+}
+#endif
+
int ex_get_fixup_type(unsigned long ip)
{
const struct exception_table_entry *e = search_exception_tables(ip);
@@ -300,6 +374,10 @@ int fixup_exception(struct pt_regs *regs, int trapnr, unsigned long error_code,
return ex_handler_ucopy_len(e, regs, trapnr, fault_addr, reg, imm);
case EX_TYPE_ZEROPAD:
return ex_handler_zeropad(e, regs, fault_addr);
+#ifdef CONFIG_X86_FRED
+ case EX_TYPE_ERETU:
+ return ex_handler_eretu(e, regs, error_code);
+#endif
}
BUG();
}
next prev parent reply other threads:[~2024-01-31 21:14 UTC|newest]
Thread overview: 150+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-05 10:49 [PATCH v13 00/35] x86: enable FRED for x86-64 Xin Li
2023-12-05 10:49 ` [PATCH v13 01/35] x86/cpufeatures,opcode,msr: Add the WRMSRNS instruction support Xin Li
2023-12-11 5:14 ` Masami Hiramatsu
2024-01-02 15:34 ` Borislav Petkov
2024-01-02 22:06 ` Li, Xin3
2024-01-03 11:10 ` Borislav Petkov
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for Xin Li
2023-12-05 10:49 ` [PATCH v13 02/35] x86/entry: Remove idtentry_sysvec from entry_{32,64}.S Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for Xin Li
2023-12-05 10:49 ` [PATCH v13 03/35] x86/trapnr: Add event type macros to <asm/trapnr.h> Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for Xin Li
2023-12-05 10:49 ` [PATCH v13 04/35] Documentation/x86/64: Add a documentation for FRED Xin Li
2024-01-25 18:21 ` [tip: x86/fred] Documentation/x86/64: Add " tip-bot2 for Xin Li
2023-12-05 10:49 ` [PATCH v13 05/35] x86/fred: Add Kconfig option for FRED (CONFIG_X86_FRED) Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:49 ` [PATCH v13 06/35] x86/cpufeatures: Add the CPU feature bit for FRED Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:49 ` [PATCH v13 07/35] x86/fred: Disable FRED support if CONFIG_X86_FRED is disabled Xin Li
2024-01-22 13:08 ` Borislav Petkov
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:49 ` [PATCH v13 08/35] x86/fred: Disable FRED by default in its early stage Xin Li
2024-01-22 13:19 ` Borislav Petkov
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31 7:21 ` [tip: x86/fred] x86/fred: Add a fred= cmdline param tip-bot2 for Xin Li
2023-12-05 10:49 ` [PATCH v13 09/35] x86/opcode: Add ERET[US] instructions to the x86 opcode map Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 7:21 ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14 ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:49 ` [PATCH v13 10/35] x86/objtool: Teach objtool about ERET[US] Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 7:21 ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14 ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 11/35] x86/cpu: Add X86_CR4_FRED macro Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 7:21 ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14 ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 12/35] x86/cpu: Add MSR numbers for FRED configuration Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 7:21 ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14 ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 13/35] x86/ptrace: Cleanup the definition of the pt_regs structure Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31 7:21 ` tip-bot2 for Xin Li
2024-01-31 21:14 ` tip-bot2 for Xin Li
2024-02-03 23:52 ` H. Peter Anvin
2024-02-06 19:04 ` Xin Li
2024-02-06 20:45 ` H. Peter Anvin
2024-02-06 21:10 ` H.J. Lu
2023-12-05 10:50 ` [PATCH v13 14/35] x86/ptrace: Add FRED additional information to " Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31 7:21 ` tip-bot2 for Xin Li
2024-01-31 21:14 ` tip-bot2 for Xin Li
2023-12-05 10:50 ` [PATCH v13 15/35] x86/fred: Add a new header file for FRED definitions Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 7:21 ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14 ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 16/35] x86/fred: Reserve space for the FRED stack frame Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 7:21 ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14 ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 17/35] x86/fred: Update MSR_IA32_FRED_RSP0 during task switch Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 7:21 ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14 ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 18/35] x86/fred: Disallow the swapgs instruction when FRED is enabled Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 7:21 ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14 ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 19/35] x86/fred: No ESPFIX needed " Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 7:21 ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14 ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 20/35] x86/fred: Allow single-step trap and NMI when starting a new task Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 7:21 ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14 ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 21/35] x86/fred: Make exc_page_fault() work for FRED Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 7:21 ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14 ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 22/35] x86/idtentry: Incorporate definitions/declarations of the FRED entries Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31 7:21 ` tip-bot2 for Xin Li
2024-01-31 21:14 ` tip-bot2 for Xin Li
2023-12-05 10:50 ` [PATCH v13 23/35] x86/fred: Add a debug fault entry stub for FRED Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 7:21 ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14 ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 24/35] x86/fred: Add a NMI " Xin Li
2023-12-15 1:51 ` H. Peter Anvin
2023-12-15 18:37 ` Li, Xin3
2023-12-16 6:31 ` [PATCH v13A " Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 7:21 ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14 ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 25/35] x86/fred: Add a machine check " Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31 7:21 ` tip-bot2 for Xin Li
2024-01-31 21:14 ` tip-bot2 for Xin Li
2023-12-05 10:50 ` [PATCH v13 26/35] x86/fred: FRED entry/exit and dispatch code Xin Li
2023-12-05 12:25 ` Andrew Cooper
2023-12-05 19:03 ` Li, Xin3
2023-12-06 7:45 ` Li, Xin3
2023-12-06 14:11 ` Andrew Cooper
2023-12-06 19:19 ` Li, Xin3
2023-12-06 19:26 ` H. Peter Anvin
2023-12-06 19:58 ` Brian Gerst
2023-12-07 9:43 ` Li, Xin3
2023-12-09 21:42 ` [PATCH v13A " Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-26 10:00 ` Borislav Petkov
2024-01-26 10:05 ` [PATCH v13A 26/35] " Borislav Petkov
2024-01-31 7:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14 ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 27/35] x86/traps: Add sysvec_install() to install a system interrupt handler Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31 7:21 ` tip-bot2 for Xin Li
2024-01-31 21:14 ` tip-bot2 for Xin Li
2023-12-05 10:50 ` [PATCH v13 28/35] x86/fred: Let ret_from_fork_asm() jmp to asm_fred_exit_user when FRED is enabled Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 7:21 ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14 ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 29/35] x86/fred: Fixup fault on ERETU by jumping to fred_entrypoint_user Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31 7:21 ` tip-bot2 for Xin Li
2024-01-31 21:14 ` tip-bot2 for Xin Li [this message]
2023-12-05 10:50 ` [PATCH v13 30/35] x86/entry/calling: Allow PUSH_AND_CLEAR_REGS being used beyond actual entry code Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for Peter Zijlstra (Intel)
2024-01-31 7:21 ` tip-bot2 for Peter Zijlstra (Intel)
2024-01-31 21:14 ` tip-bot2 for Peter Zijlstra (Intel)
2023-12-05 10:50 ` [PATCH v13 31/35] x86/entry: Add fred_entry_from_kvm() for VMX to handle IRQ/NMI Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31 7:21 ` tip-bot2 for Xin Li
2024-01-31 21:14 ` tip-bot2 for Xin Li
2023-12-05 10:50 ` [PATCH v13 32/35] KVM: VMX: Call fred_entry_from_kvm() for IRQ/NMI handling Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31 7:21 ` tip-bot2 for Xin Li
2024-01-31 21:14 ` tip-bot2 for Xin Li
2023-12-05 10:50 ` [PATCH v13 33/35] x86/syscall: Split IDT syscall setup code into idt_syscall_init() Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for Xin Li
2024-01-31 7:21 ` tip-bot2 for Xin Li
2024-01-31 21:14 ` tip-bot2 for Xin Li
2023-12-05 10:50 ` [PATCH v13 34/35] x86/fred: Add FRED initialization functions Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 7:21 ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14 ` tip-bot2 for H. Peter Anvin (Intel)
2023-12-05 10:50 ` [PATCH v13 35/35] x86/fred: Invoke FRED initialization code to enable FRED Xin Li
2024-01-25 18:21 ` [tip: x86/fred] " tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 7:21 ` tip-bot2 for H. Peter Anvin (Intel)
2024-01-31 21:14 ` tip-bot2 for H. Peter Anvin (Intel)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=170673568259.398.13788198953979010060.tip-bot2@tip-bot2 \
--to=tip-bot2@linutronix.de \
--cc=bp@alien8.de \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=shan.kang@intel.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
--cc=xin3.li@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox