mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-02-14 07:45:20 +07:00
x86/entry: Convert various hypervisor vectors to IDTENTRY_SYSVEC
Convert various hypervisor vectors to IDTENTRY_SYSVEC: - Implement the C entry point with DEFINE_IDTENTRY_SYSVEC - Emit the ASM stub with DECLARE_IDTENTRY_SYSVEC - Remove the ASM idtentries in 64-bit - Remove the BUILD_INTERRUPT entries in 32-bit - Remove the old prototypes No functional change. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@kernel.org> Acked-by: Andy Lutomirski <luto@kernel.org> Reviewed-by: Wei Liu <wei.liu@kernel.org> Link: https://lore.kernel.org/r/20200521202119.647997594@linutronix.de
This commit is contained in:
parent
9c3b1f4975
commit
a16be368dd
@ -1345,20 +1345,6 @@ BUILD_INTERRUPT3(xen_hvm_callback_vector, HYPERVISOR_CALLBACK_VECTOR,
|
|||||||
xen_evtchn_do_upcall)
|
xen_evtchn_do_upcall)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_HYPERV)
|
|
||||||
|
|
||||||
BUILD_INTERRUPT3(hyperv_callback_vector, HYPERVISOR_CALLBACK_VECTOR,
|
|
||||||
hyperv_vector_handler)
|
|
||||||
|
|
||||||
BUILD_INTERRUPT3(hyperv_reenlightenment_vector, HYPERV_REENLIGHTENMENT_VECTOR,
|
|
||||||
hyperv_reenlightenment_intr)
|
|
||||||
|
|
||||||
BUILD_INTERRUPT3(hv_stimer0_callback_vector, HYPERV_STIMER0_VECTOR,
|
|
||||||
hv_stimer0_vector_handler)
|
|
||||||
|
|
||||||
#endif /* CONFIG_HYPERV */
|
|
||||||
|
|
||||||
SYM_CODE_START_LOCAL_NOALIGN(handle_exception)
|
SYM_CODE_START_LOCAL_NOALIGN(handle_exception)
|
||||||
/* the function address is in %gs's slot on the stack */
|
/* the function address is in %gs's slot on the stack */
|
||||||
SAVE_ALL switch_stacks=1 skip_gs=1 unwind_espfix=1
|
SAVE_ALL switch_stacks=1 skip_gs=1 unwind_espfix=1
|
||||||
|
@ -1116,23 +1116,6 @@ apicinterrupt3 HYPERVISOR_CALLBACK_VECTOR \
|
|||||||
xen_hvm_callback_vector xen_evtchn_do_upcall
|
xen_hvm_callback_vector xen_evtchn_do_upcall
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_HYPERV)
|
|
||||||
apicinterrupt3 HYPERVISOR_CALLBACK_VECTOR \
|
|
||||||
hyperv_callback_vector hyperv_vector_handler
|
|
||||||
|
|
||||||
apicinterrupt3 HYPERV_REENLIGHTENMENT_VECTOR \
|
|
||||||
hyperv_reenlightenment_vector hyperv_reenlightenment_intr
|
|
||||||
|
|
||||||
apicinterrupt3 HYPERV_STIMER0_VECTOR \
|
|
||||||
hv_stimer0_callback_vector hv_stimer0_vector_handler
|
|
||||||
#endif /* CONFIG_HYPERV */
|
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_ACRN_GUEST)
|
|
||||||
apicinterrupt3 HYPERVISOR_CALLBACK_VECTOR \
|
|
||||||
acrn_hv_callback_vector acrn_hv_vector_handler
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Save all registers in pt_regs, and switch gs if needed.
|
* Save all registers in pt_regs, and switch gs if needed.
|
||||||
* Use slow, but surefire "are we in kernel?" check.
|
* Use slow, but surefire "are we in kernel?" check.
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include <asm/hypervisor.h>
|
#include <asm/hypervisor.h>
|
||||||
#include <asm/hyperv-tlfs.h>
|
#include <asm/hyperv-tlfs.h>
|
||||||
#include <asm/mshyperv.h>
|
#include <asm/mshyperv.h>
|
||||||
|
#include <asm/idtentry.h>
|
||||||
#include <linux/version.h>
|
#include <linux/version.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
@ -152,15 +153,11 @@ static inline bool hv_reenlightenment_available(void)
|
|||||||
ms_hyperv.features & HV_X64_ACCESS_REENLIGHTENMENT;
|
ms_hyperv.features & HV_X64_ACCESS_REENLIGHTENMENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
__visible void __irq_entry hyperv_reenlightenment_intr(struct pt_regs *regs)
|
DEFINE_IDTENTRY_SYSVEC(sysvec_hyperv_reenlightenment)
|
||||||
{
|
{
|
||||||
entering_ack_irq();
|
ack_APIC_irq();
|
||||||
|
|
||||||
inc_irq_stat(irq_hv_reenlightenment_count);
|
inc_irq_stat(irq_hv_reenlightenment_count);
|
||||||
|
|
||||||
schedule_delayed_work(&hv_reenlightenment_work, HZ/10);
|
schedule_delayed_work(&hv_reenlightenment_work, HZ/10);
|
||||||
|
|
||||||
exiting_irq();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_hv_tscchange_cb(void (*cb)(void))
|
void set_hv_tscchange_cb(void (*cb)(void))
|
||||||
|
@ -1,11 +0,0 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
|
||||||
#ifndef _ASM_X86_ACRN_H
|
|
||||||
#define _ASM_X86_ACRN_H
|
|
||||||
|
|
||||||
extern void acrn_hv_callback_vector(void);
|
|
||||||
#ifdef CONFIG_TRACING
|
|
||||||
#define trace_acrn_hv_callback_vector acrn_hv_callback_vector
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern void acrn_hv_vector_handler(struct pt_regs *regs);
|
|
||||||
#endif /* _ASM_X86_ACRN_H */
|
|
@ -519,26 +519,6 @@ static inline bool apic_id_is_primary_thread(unsigned int id) { return false; }
|
|||||||
static inline void apic_smt_update(void) { }
|
static inline void apic_smt_update(void) { }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void irq_enter(void);
|
|
||||||
extern void irq_exit(void);
|
|
||||||
|
|
||||||
static inline void entering_irq(void)
|
|
||||||
{
|
|
||||||
irq_enter();
|
|
||||||
kvm_set_cpu_l1tf_flush_l1d();
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void entering_ack_irq(void)
|
|
||||||
{
|
|
||||||
entering_irq();
|
|
||||||
ack_APIC_irq();
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void exiting_irq(void)
|
|
||||||
{
|
|
||||||
irq_exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
extern void ioapic_zap_locks(void);
|
extern void ioapic_zap_locks(void);
|
||||||
|
|
||||||
#endif /* _ASM_X86_APIC_H */
|
#endif /* _ASM_X86_APIC_H */
|
||||||
|
@ -634,6 +634,16 @@ DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_WAKEUP_VECTOR, sysvec_kvm_posted_intr_wakeup
|
|||||||
DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_NESTED_VECTOR, sysvec_kvm_posted_intr_nested_ipi);
|
DECLARE_IDTENTRY_SYSVEC(POSTED_INTR_NESTED_VECTOR, sysvec_kvm_posted_intr_nested_ipi);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if IS_ENABLED(CONFIG_HYPERV)
|
||||||
|
DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR, sysvec_hyperv_callback);
|
||||||
|
DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_REENLIGHTENMENT_VECTOR, sysvec_hyperv_reenlightenment);
|
||||||
|
DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_STIMER0_VECTOR, sysvec_hyperv_stimer0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if IS_ENABLED(CONFIG_ACRN_GUEST)
|
||||||
|
DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR, sysvec_acrn_hv_callback);
|
||||||
|
#endif
|
||||||
|
|
||||||
#undef X86_TRAP_OTHER
|
#undef X86_TRAP_OTHER
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -54,20 +54,8 @@ typedef int (*hyperv_fill_flush_list_func)(
|
|||||||
vclocks_set_used(VDSO_CLOCKMODE_HVCLOCK);
|
vclocks_set_used(VDSO_CLOCKMODE_HVCLOCK);
|
||||||
#define hv_get_raw_timer() rdtsc_ordered()
|
#define hv_get_raw_timer() rdtsc_ordered()
|
||||||
|
|
||||||
void hyperv_callback_vector(void);
|
|
||||||
void hyperv_reenlightenment_vector(void);
|
|
||||||
#ifdef CONFIG_TRACING
|
|
||||||
#define trace_hyperv_callback_vector hyperv_callback_vector
|
|
||||||
#endif
|
|
||||||
void hyperv_vector_handler(struct pt_regs *regs);
|
void hyperv_vector_handler(struct pt_regs *regs);
|
||||||
|
|
||||||
/*
|
|
||||||
* Routines for stimer0 Direct Mode handling.
|
|
||||||
* On x86/x64, there are no percpu actions to take.
|
|
||||||
*/
|
|
||||||
void hv_stimer0_vector_handler(struct pt_regs *regs);
|
|
||||||
void hv_stimer0_callback_vector(void);
|
|
||||||
|
|
||||||
static inline void hv_enable_stimer0_percpu_irq(int irq) {}
|
static inline void hv_enable_stimer0_percpu_irq(int irq) {}
|
||||||
static inline void hv_disable_stimer0_percpu_irq(int irq) {}
|
static inline void hv_disable_stimer0_percpu_irq(int irq) {}
|
||||||
|
|
||||||
@ -226,7 +214,6 @@ void hyperv_setup_mmu_ops(void);
|
|||||||
void *hv_alloc_hyperv_page(void);
|
void *hv_alloc_hyperv_page(void);
|
||||||
void *hv_alloc_hyperv_zeroed_page(void);
|
void *hv_alloc_hyperv_zeroed_page(void);
|
||||||
void hv_free_hyperv_page(unsigned long addr);
|
void hv_free_hyperv_page(unsigned long addr);
|
||||||
void hyperv_reenlightenment_intr(struct pt_regs *regs);
|
|
||||||
void set_hv_tscchange_cb(void (*cb)(void));
|
void set_hv_tscchange_cb(void (*cb)(void));
|
||||||
void clear_hv_tscchange_cb(void);
|
void clear_hv_tscchange_cb(void);
|
||||||
void hyperv_stop_tsc_emulation(void);
|
void hyperv_stop_tsc_emulation(void);
|
||||||
|
@ -10,10 +10,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <asm/acrn.h>
|
|
||||||
#include <asm/apic.h>
|
#include <asm/apic.h>
|
||||||
#include <asm/desc.h>
|
#include <asm/desc.h>
|
||||||
#include <asm/hypervisor.h>
|
#include <asm/hypervisor.h>
|
||||||
|
#include <asm/idtentry.h>
|
||||||
#include <asm/irq_regs.h>
|
#include <asm/irq_regs.h>
|
||||||
|
|
||||||
static uint32_t __init acrn_detect(void)
|
static uint32_t __init acrn_detect(void)
|
||||||
@ -24,7 +24,7 @@ static uint32_t __init acrn_detect(void)
|
|||||||
static void __init acrn_init_platform(void)
|
static void __init acrn_init_platform(void)
|
||||||
{
|
{
|
||||||
/* Setup the IDT for ACRN hypervisor callback */
|
/* Setup the IDT for ACRN hypervisor callback */
|
||||||
alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, acrn_hv_callback_vector);
|
alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, asm_sysvec_acrn_hv_callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool acrn_x2apic_available(void)
|
static bool acrn_x2apic_available(void)
|
||||||
@ -39,7 +39,7 @@ static bool acrn_x2apic_available(void)
|
|||||||
|
|
||||||
static void (*acrn_intr_handler)(void);
|
static void (*acrn_intr_handler)(void);
|
||||||
|
|
||||||
__visible void __irq_entry acrn_hv_vector_handler(struct pt_regs *regs)
|
DEFINE_IDTENTRY_SYSVEC(sysvec_acrn_hv_callback)
|
||||||
{
|
{
|
||||||
struct pt_regs *old_regs = set_irq_regs(regs);
|
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||||
|
|
||||||
@ -50,13 +50,12 @@ __visible void __irq_entry acrn_hv_vector_handler(struct pt_regs *regs)
|
|||||||
* will block the interrupt whose vector is lower than
|
* will block the interrupt whose vector is lower than
|
||||||
* HYPERVISOR_CALLBACK_VECTOR.
|
* HYPERVISOR_CALLBACK_VECTOR.
|
||||||
*/
|
*/
|
||||||
entering_ack_irq();
|
ack_APIC_irq();
|
||||||
inc_irq_stat(irq_hv_callback_count);
|
inc_irq_stat(irq_hv_callback_count);
|
||||||
|
|
||||||
if (acrn_intr_handler)
|
if (acrn_intr_handler)
|
||||||
acrn_intr_handler();
|
acrn_intr_handler();
|
||||||
|
|
||||||
exiting_irq();
|
|
||||||
set_irq_regs(old_regs);
|
set_irq_regs(old_regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include <asm/hyperv-tlfs.h>
|
#include <asm/hyperv-tlfs.h>
|
||||||
#include <asm/mshyperv.h>
|
#include <asm/mshyperv.h>
|
||||||
#include <asm/desc.h>
|
#include <asm/desc.h>
|
||||||
|
#include <asm/idtentry.h>
|
||||||
#include <asm/irq_regs.h>
|
#include <asm/irq_regs.h>
|
||||||
#include <asm/i8259.h>
|
#include <asm/i8259.h>
|
||||||
#include <asm/apic.h>
|
#include <asm/apic.h>
|
||||||
@ -40,11 +41,10 @@ static void (*hv_stimer0_handler)(void);
|
|||||||
static void (*hv_kexec_handler)(void);
|
static void (*hv_kexec_handler)(void);
|
||||||
static void (*hv_crash_handler)(struct pt_regs *regs);
|
static void (*hv_crash_handler)(struct pt_regs *regs);
|
||||||
|
|
||||||
__visible void __irq_entry hyperv_vector_handler(struct pt_regs *regs)
|
DEFINE_IDTENTRY_SYSVEC(sysvec_hyperv_callback)
|
||||||
{
|
{
|
||||||
struct pt_regs *old_regs = set_irq_regs(regs);
|
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||||
|
|
||||||
entering_irq();
|
|
||||||
inc_irq_stat(irq_hv_callback_count);
|
inc_irq_stat(irq_hv_callback_count);
|
||||||
if (vmbus_handler)
|
if (vmbus_handler)
|
||||||
vmbus_handler();
|
vmbus_handler();
|
||||||
@ -52,7 +52,6 @@ __visible void __irq_entry hyperv_vector_handler(struct pt_regs *regs)
|
|||||||
if (ms_hyperv.hints & HV_DEPRECATING_AEOI_RECOMMENDED)
|
if (ms_hyperv.hints & HV_DEPRECATING_AEOI_RECOMMENDED)
|
||||||
ack_APIC_irq();
|
ack_APIC_irq();
|
||||||
|
|
||||||
exiting_irq();
|
|
||||||
set_irq_regs(old_regs);
|
set_irq_regs(old_regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,19 +72,16 @@ EXPORT_SYMBOL_GPL(hv_remove_vmbus_irq);
|
|||||||
* Routines to do per-architecture handling of stimer0
|
* Routines to do per-architecture handling of stimer0
|
||||||
* interrupts when in Direct Mode
|
* interrupts when in Direct Mode
|
||||||
*/
|
*/
|
||||||
|
DEFINE_IDTENTRY_SYSVEC(sysvec_hyperv_stimer0)
|
||||||
__visible void __irq_entry hv_stimer0_vector_handler(struct pt_regs *regs)
|
|
||||||
{
|
{
|
||||||
struct pt_regs *old_regs = set_irq_regs(regs);
|
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||||
|
|
||||||
entering_irq();
|
|
||||||
inc_irq_stat(hyperv_stimer0_count);
|
inc_irq_stat(hyperv_stimer0_count);
|
||||||
if (hv_stimer0_handler)
|
if (hv_stimer0_handler)
|
||||||
hv_stimer0_handler();
|
hv_stimer0_handler();
|
||||||
add_interrupt_randomness(HYPERV_STIMER0_VECTOR, 0);
|
add_interrupt_randomness(HYPERV_STIMER0_VECTOR, 0);
|
||||||
ack_APIC_irq();
|
ack_APIC_irq();
|
||||||
|
|
||||||
exiting_irq();
|
|
||||||
set_irq_regs(old_regs);
|
set_irq_regs(old_regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -331,17 +327,19 @@ static void __init ms_hyperv_init_platform(void)
|
|||||||
x86_platform.apic_post_init = hyperv_init;
|
x86_platform.apic_post_init = hyperv_init;
|
||||||
hyperv_setup_mmu_ops();
|
hyperv_setup_mmu_ops();
|
||||||
/* Setup the IDT for hypervisor callback */
|
/* Setup the IDT for hypervisor callback */
|
||||||
alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, hyperv_callback_vector);
|
alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, asm_sysvec_hyperv_callback);
|
||||||
|
|
||||||
/* Setup the IDT for reenlightenment notifications */
|
/* Setup the IDT for reenlightenment notifications */
|
||||||
if (ms_hyperv.features & HV_X64_ACCESS_REENLIGHTENMENT)
|
if (ms_hyperv.features & HV_X64_ACCESS_REENLIGHTENMENT) {
|
||||||
alloc_intr_gate(HYPERV_REENLIGHTENMENT_VECTOR,
|
alloc_intr_gate(HYPERV_REENLIGHTENMENT_VECTOR,
|
||||||
hyperv_reenlightenment_vector);
|
asm_sysvec_hyperv_reenlightenment);
|
||||||
|
}
|
||||||
|
|
||||||
/* Setup the IDT for stimer0 */
|
/* Setup the IDT for stimer0 */
|
||||||
if (ms_hyperv.misc_features & HV_STIMER_DIRECT_MODE_AVAILABLE)
|
if (ms_hyperv.misc_features & HV_STIMER_DIRECT_MODE_AVAILABLE) {
|
||||||
alloc_intr_gate(HYPERV_STIMER0_VECTOR,
|
alloc_intr_gate(HYPERV_STIMER0_VECTOR,
|
||||||
hv_stimer0_callback_vector);
|
asm_sysvec_hyperv_stimer0);
|
||||||
|
}
|
||||||
|
|
||||||
# ifdef CONFIG_SMP
|
# ifdef CONFIG_SMP
|
||||||
smp_ops.smp_prepare_boot_cpu = hv_smp_prepare_boot_cpu;
|
smp_ops.smp_prepare_boot_cpu = hv_smp_prepare_boot_cpu;
|
||||||
|
Loading…
Reference in New Issue
Block a user