From: Xin Li <xin3.li@intel.com>
To: linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-edac@vger.kernel.org, linux-hyperv@vger.kernel.org,
kvm@vger.kernel.org, xen-devel@lists.xenproject.org
Cc: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de,
dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com,
luto@kernel.org, pbonzini@redhat.com, seanjc@google.com,
peterz@infradead.org, jgross@suse.com, ravi.v.shankar@intel.com,
mhiramat@kernel.org, andrew.cooper3@citrix.com,
jiangshanlai@gmail.com, nik.borisov@suse.com
Subject: [PATCH v12 29/37] x86/traps: Add sysvec_install() to install a system interrupt handler
Date: Mon, 2 Oct 2023 23:24:50 -0700 [thread overview]
Message-ID: <20231003062458.23552-30-xin3.li@intel.com> (raw)
In-Reply-To: <20231003062458.23552-1-xin3.li@intel.com>
Add sysvec_install() to install a system interrupt handler into the IDT
or the FRED system interrupt handler table.
Tested-by: Shan Kang <shan.kang@intel.com>
Signed-off-by: Xin Li <xin3.li@intel.com>
---
Changes since v8:
* Introduce a macro sysvec_install() to derive the asm handler name from
a C handler, which simplifies the code and avoids an ugly typecast
(Thomas Gleixner).
---
arch/x86/entry/entry_fred.c | 14 ++++++++++++++
arch/x86/include/asm/desc.h | 2 --
arch/x86/include/asm/idtentry.h | 15 +++++++++++++++
arch/x86/kernel/cpu/acrn.c | 4 ++--
arch/x86/kernel/cpu/mshyperv.c | 15 +++++++--------
arch/x86/kernel/idt.c | 4 ++--
arch/x86/kernel/kvm.c | 2 +-
drivers/xen/events/events_base.c | 2 +-
8 files changed, 42 insertions(+), 16 deletions(-)
diff --git a/arch/x86/entry/entry_fred.c b/arch/x86/entry/entry_fred.c
index 215883e90f94..e80e3efbc057 100644
--- a/arch/x86/entry/entry_fred.c
+++ b/arch/x86/entry/entry_fred.c
@@ -126,6 +126,20 @@ static idtentry_t sysvec_table[NR_SYSTEM_VECTORS] __ro_after_init = {
SYSVEC(POSTED_INTR_NESTED_VECTOR, kvm_posted_intr_nested_ipi),
};
+static bool fred_setup_done __initdata;
+
+void __init fred_install_sysvec(unsigned int sysvec, idtentry_t handler)
+{
+ if (WARN_ON_ONCE(sysvec < FIRST_SYSTEM_VECTOR))
+ return;
+
+ if (WARN_ON_ONCE(fred_setup_done))
+ return;
+
+ if (!WARN_ON_ONCE(sysvec_table[sysvec - FIRST_SYSTEM_VECTOR]))
+ sysvec_table[sysvec - FIRST_SYSTEM_VECTOR] = handler;
+}
+
static noinstr void fred_extint(struct pt_regs *regs)
{
unsigned int vector = regs->fred_ss.vector;
diff --git a/arch/x86/include/asm/desc.h b/arch/x86/include/asm/desc.h
index ab97b22ac04a..ec95fe44fa3a 100644
--- a/arch/x86/include/asm/desc.h
+++ b/arch/x86/include/asm/desc.h
@@ -402,8 +402,6 @@ static inline void set_desc_limit(struct desc_struct *desc, unsigned long limit)
desc->limit1 = (limit >> 16) & 0xf;
}
-void alloc_intr_gate(unsigned int n, const void *addr);
-
static inline void init_idt_data(struct idt_data *data, unsigned int n,
const void *addr)
{
diff --git a/arch/x86/include/asm/idtentry.h b/arch/x86/include/asm/idtentry.h
index 4f26ee9b8b74..650c98160152 100644
--- a/arch/x86/include/asm/idtentry.h
+++ b/arch/x86/include/asm/idtentry.h
@@ -459,6 +459,21 @@ __visible noinstr void func(struct pt_regs *regs, \
#define DEFINE_FREDENTRY_DEBUG DEFINE_FREDENTRY_RAW
#endif
+void idt_install_sysvec(unsigned int n, const void *function);
+
+#ifdef CONFIG_X86_FRED
+void fred_install_sysvec(unsigned int vector, const idtentry_t function);
+#else
+static inline void fred_install_sysvec(unsigned int vector, const idtentry_t function) { }
+#endif
+
+#define sysvec_install(vector, function) { \
+ if (cpu_feature_enabled(X86_FEATURE_FRED)) \
+ fred_install_sysvec(vector, function); \
+ else \
+ idt_install_sysvec(vector, asm_##function); \
+}
+
#else /* !__ASSEMBLY__ */
/*
diff --git a/arch/x86/kernel/cpu/acrn.c b/arch/x86/kernel/cpu/acrn.c
index bfeb18fad63f..2c5b51aad91a 100644
--- a/arch/x86/kernel/cpu/acrn.c
+++ b/arch/x86/kernel/cpu/acrn.c
@@ -26,8 +26,8 @@ static u32 __init acrn_detect(void)
static void __init acrn_init_platform(void)
{
- /* Setup the IDT for ACRN hypervisor callback */
- alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, asm_sysvec_acrn_hv_callback);
+ /* Install system interrupt handler for ACRN hypervisor callback */
+ sysvec_install(HYPERVISOR_CALLBACK_VECTOR, sysvec_acrn_hv_callback);
x86_platform.calibrate_tsc = acrn_get_tsc_khz;
x86_platform.calibrate_cpu = acrn_get_tsc_khz;
diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
index e6bba12c759c..3403880c3e09 100644
--- a/arch/x86/kernel/cpu/mshyperv.c
+++ b/arch/x86/kernel/cpu/mshyperv.c
@@ -536,19 +536,18 @@ static void __init ms_hyperv_init_platform(void)
*/
x86_platform.apic_post_init = hyperv_init;
hyperv_setup_mmu_ops();
- /* Setup the IDT for hypervisor callback */
- alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, asm_sysvec_hyperv_callback);
- /* Setup the IDT for reenlightenment notifications */
+ /* Install system interrupt handler for hypervisor callback */
+ sysvec_install(HYPERVISOR_CALLBACK_VECTOR, sysvec_hyperv_callback);
+
+ /* Install system interrupt handler for reenlightenment notifications */
if (ms_hyperv.features & HV_ACCESS_REENLIGHTENMENT) {
- alloc_intr_gate(HYPERV_REENLIGHTENMENT_VECTOR,
- asm_sysvec_hyperv_reenlightenment);
+ sysvec_install(HYPERV_REENLIGHTENMENT_VECTOR, sysvec_hyperv_reenlightenment);
}
- /* Setup the IDT for stimer0 */
+ /* Install system interrupt handler for stimer0 */
if (ms_hyperv.misc_features & HV_STIMER_DIRECT_MODE_AVAILABLE) {
- alloc_intr_gate(HYPERV_STIMER0_VECTOR,
- asm_sysvec_hyperv_stimer0);
+ sysvec_install(HYPERV_STIMER0_VECTOR, sysvec_hyperv_stimer0);
}
# ifdef CONFIG_SMP
diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c
index 8857abc706e4..2b734927eec1 100644
--- a/arch/x86/kernel/idt.c
+++ b/arch/x86/kernel/idt.c
@@ -337,7 +337,7 @@ void idt_invalidate(void)
load_idt(&idt);
}
-void __init alloc_intr_gate(unsigned int n, const void *addr)
+void __init idt_install_sysvec(unsigned int n, const void *function)
{
if (WARN_ON(n < FIRST_SYSTEM_VECTOR))
return;
@@ -346,5 +346,5 @@ void __init alloc_intr_gate(unsigned int n, const void *addr)
return;
if (!WARN_ON(test_and_set_bit(n, system_vectors)))
- set_intr_gate(n, addr);
+ set_intr_gate(n, function);
}
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
index b8ab9ee5896c..eabf03813a5c 100644
--- a/arch/x86/kernel/kvm.c
+++ b/arch/x86/kernel/kvm.c
@@ -829,7 +829,7 @@ static void __init kvm_guest_init(void)
if (kvm_para_has_feature(KVM_FEATURE_ASYNC_PF_INT) && kvmapf) {
static_branch_enable(&kvm_async_pf_enabled);
- alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, asm_sysvec_kvm_asyncpf_interrupt);
+ sysvec_install(HYPERVISOR_CALLBACK_VECTOR, sysvec_kvm_asyncpf_interrupt);
}
#ifdef CONFIG_SMP
diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c
index 0bb86e6c4d0a..4bd1293e666f 100644
--- a/drivers/xen/events/events_base.c
+++ b/drivers/xen/events/events_base.c
@@ -2226,7 +2226,7 @@ static __init void xen_alloc_callback_vector(void)
return;
pr_info("Xen HVM callback vector for event delivery is enabled\n");
- alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, asm_sysvec_xen_hvm_callback);
+ sysvec_install(HYPERVISOR_CALLBACK_VECTOR, sysvec_xen_hvm_callback);
}
#else
void xen_setup_callback_vector(void) {}
--
2.34.1
next prev parent reply other threads:[~2023-10-03 6:56 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-03 6:24 [PATCH v12 00/37] x86: enable FRED for x86-64 Xin Li
2023-10-03 6:24 ` [PATCH v12 01/37] x86/cpufeatures: Add the cpu feature bit for WRMSRNS Xin Li
2023-11-08 12:36 ` Borislav Petkov
2023-11-14 0:43 ` Li, Xin3
2023-11-14 5:02 ` Borislav Petkov
2023-11-14 5:58 ` Li, Xin3
2023-10-03 6:24 ` [PATCH v12 02/37] x86/opcode: Add the WRMSRNS instruction to the x86 opcode map Xin Li
2023-11-30 6:01 ` Li, Xin3
2023-10-03 6:24 ` [PATCH v12 03/37] x86/msr: Add the WRMSRNS instruction support Xin Li
2023-10-03 6:24 ` [PATCH v12 04/37] x86/entry: Remove idtentry_sysvec from entry_{32,64}.S Xin Li
2023-10-03 6:24 ` [PATCH v12 05/37] x86/trapnr: Add event type macros to <asm/trapnr.h> Xin Li
2023-10-03 6:24 ` [PATCH v12 06/37] Documentation/x86/64: Add a documentation for FRED Xin Li
2023-10-03 9:59 ` Bagas Sanjaya
2023-10-05 8:04 ` Li, Xin3
2023-10-03 6:24 ` [PATCH v12 07/37] x86/fred: Add Kconfig option for FRED (CONFIG_X86_FRED) Xin Li
2023-10-03 6:24 ` [PATCH v12 08/37] x86/cpufeatures: Add the cpu feature bit for FRED Xin Li
2023-10-03 6:24 ` [PATCH v12 09/37] x86/fred: Disable FRED support if CONFIG_X86_FRED is disabled Xin Li
2023-10-03 6:24 ` [PATCH v12 10/37] x86/fred: Disable FRED by default in its early stage Xin Li
2023-10-03 6:24 ` [PATCH v12 11/37] x86/opcode: Add ERET[US] instructions to the x86 opcode map Xin Li
2023-10-03 6:24 ` [PATCH v12 12/37] x86/objtool: Teach objtool about ERET[US] Xin Li
2023-10-03 6:24 ` [PATCH v12 13/37] x86/cpu: Add X86_CR4_FRED macro Xin Li
2023-10-03 6:24 ` [PATCH v12 14/37] x86/cpu: Add MSR numbers for FRED configuration Xin Li
2023-10-03 6:24 ` [PATCH v12 15/37] x86/ptrace: Cleanup the definition of the pt_regs structure Xin Li
2023-11-28 8:36 ` Borislav Petkov
2023-10-03 6:24 ` [PATCH v12 16/37] x86/ptrace: Add FRED additional information to " Xin Li
2023-11-28 8:51 ` Borislav Petkov
2023-11-28 17:18 ` H. Peter Anvin
2023-10-03 6:24 ` [PATCH v12 17/37] x86/fred: Add a new header file for FRED definitions Xin Li
2023-10-03 6:24 ` [PATCH v12 18/37] x86/fred: Reserve space for the FRED stack frame Xin Li
2023-10-03 6:24 ` [PATCH v12 19/37] x86/fred: Update MSR_IA32_FRED_RSP0 during task switch Xin Li
2023-11-13 9:37 ` Borislav Petkov
2023-11-13 17:36 ` H. Peter Anvin
2023-11-13 18:29 ` Borislav Petkov
2023-11-13 18:44 ` H. Peter Anvin
2023-10-03 6:24 ` [PATCH v12 20/37] x86/fred: Disallow the swapgs instruction when FRED is enabled Xin Li
2023-11-28 9:53 ` Borislav Petkov
2023-10-03 6:24 ` [PATCH v12 21/37] x86/fred: No ESPFIX needed " Xin Li
2023-10-03 6:24 ` [PATCH v12 22/37] x86/fred: Allow single-step trap and NMI when starting a new task Xin Li
2023-10-03 6:24 ` [PATCH v12 23/37] x86/fred: Make exc_page_fault() work for FRED Xin Li
2023-11-28 10:02 ` Borislav Petkov
2023-10-03 6:24 ` [PATCH v12 24/37] x86/idtentry: Incorporate definitions/declarations of the FRED entries Xin Li
2023-11-28 10:09 ` Borislav Petkov
2023-11-28 18:39 ` Li, Xin3
2023-11-28 18:58 ` H. Peter Anvin
2023-11-28 19:18 ` Borislav Petkov
2023-10-03 6:24 ` [PATCH v12 25/37] x86/fred: Add a debug fault entry stub for FRED Xin Li
2023-10-03 6:24 ` [PATCH v12 26/37] x86/fred: Add a NMI " Xin Li
2023-10-03 6:24 ` [PATCH v12 27/37] x86/fred: Add a machine check " Xin Li
2023-10-03 6:24 ` [PATCH v12 28/37] x86/fred: FRED entry/exit and dispatch code Xin Li
2023-10-03 6:24 ` Xin Li [this message]
2023-10-03 6:24 ` [PATCH v12 30/37] x86/fred: Let ret_from_fork_asm() jmp to asm_fred_exit_user when FRED is enabled Xin Li
2023-10-03 6:24 ` [PATCH v12 31/37] x86/fred: Fixup fault on ERETU by jumping to fred_entrypoint_user Xin Li
2023-10-03 6:24 ` [PATCH v12 32/37] x86/entry/calling: Allow PUSH_AND_CLEAR_REGS being used beyond actual entry code Xin Li
2023-10-03 6:24 ` [PATCH v12 33/37] x86/entry: Add fred_entry_from_kvm() for VMX to handle IRQ/NMI Xin Li
2023-10-03 6:24 ` [PATCH v12 34/37] KVM: VMX: Call fred_entry_from_kvm() for IRQ/NMI handling Xin Li
2023-10-03 6:24 ` [PATCH v12 35/37] x86/syscall: Split IDT syscall setup code into idt_syscall_init() Xin Li
2023-10-03 6:24 ` [PATCH v12 36/37] x86/fred: Add FRED initialization functions Xin Li
2023-10-03 6:24 ` [PATCH v12 37/37] x86/fred: Invoke FRED initialization code to enable FRED Xin Li
2023-10-05 6:18 ` [PATCH v12 00/37] x86: enable FRED for x86-64 Nikolay Borisov
2023-10-05 7:21 ` Li, Xin3
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=20231003062458.23552-30-xin3.li@intel.com \
--to=xin3.li@intel.com \
--cc=andrew.cooper3@citrix.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=hpa@zytor.com \
--cc=jgross@suse.com \
--cc=jiangshanlai@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-edac@vger.kernel.org \
--cc=linux-hyperv@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mhiramat@kernel.org \
--cc=mingo@redhat.com \
--cc=nik.borisov@suse.com \
--cc=pbonzini@redhat.com \
--cc=peterz@infradead.org \
--cc=ravi.v.shankar@intel.com \
--cc=seanjc@google.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
--cc=xen-devel@lists.xenproject.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.