x86/entry: Convert XEN hypercall vector to IDTENTRY_SYSVEC
Convert the last oldstyle defined vector 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 Fixup the related XEN code by providing the primary C entry point in x86 to avoid cluttering the generic code with X86'isms. 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> Link: https://lore.kernel.org/r/20200521202119.741950104@linutronix.de
This commit is contained in:
Родитель
a16be368dd
Коммит
cb09ea2924
|
@ -1340,11 +1340,6 @@ SYM_FUNC_START(xen_failsafe_callback)
|
||||||
SYM_FUNC_END(xen_failsafe_callback)
|
SYM_FUNC_END(xen_failsafe_callback)
|
||||||
#endif /* CONFIG_XEN_PV */
|
#endif /* CONFIG_XEN_PV */
|
||||||
|
|
||||||
#ifdef CONFIG_XEN_PVHVM
|
|
||||||
BUILD_INTERRUPT3(xen_hvm_callback_vector, HYPERVISOR_CALLBACK_VECTOR,
|
|
||||||
xen_evtchn_do_upcall)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
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
|
||||||
|
|
|
@ -1111,11 +1111,6 @@ SYM_CODE_START(xen_failsafe_callback)
|
||||||
SYM_CODE_END(xen_failsafe_callback)
|
SYM_CODE_END(xen_failsafe_callback)
|
||||||
#endif /* CONFIG_XEN_PV */
|
#endif /* CONFIG_XEN_PV */
|
||||||
|
|
||||||
#ifdef CONFIG_XEN_PVHVM
|
|
||||||
apicinterrupt3 HYPERVISOR_CALLBACK_VECTOR \
|
|
||||||
xen_hvm_callback_vector xen_evtchn_do_upcall
|
|
||||||
#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.
|
||||||
|
|
|
@ -644,6 +644,10 @@ DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_STIMER0_VECTOR, sysvec_hyperv_stimer0);
|
||||||
DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR, sysvec_acrn_hv_callback);
|
DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR, sysvec_acrn_hv_callback);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_XEN_PVHVM
|
||||||
|
DECLARE_IDTENTRY_SYSVEC(HYPERVISOR_CALLBACK_VECTOR, sysvec_xen_hvm_callback);
|
||||||
|
#endif
|
||||||
|
|
||||||
#undef X86_TRAP_OTHER
|
#undef X86_TRAP_OTHER
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <asm/smp.h>
|
#include <asm/smp.h>
|
||||||
#include <asm/reboot.h>
|
#include <asm/reboot.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
|
#include <asm/idtentry.h>
|
||||||
#include <asm/hypervisor.h>
|
#include <asm/hypervisor.h>
|
||||||
#include <asm/e820/api.h>
|
#include <asm/e820/api.h>
|
||||||
#include <asm/early_ioremap.h>
|
#include <asm/early_ioremap.h>
|
||||||
|
@ -118,6 +119,17 @@ static void __init init_hvm_pv_info(void)
|
||||||
this_cpu_write(xen_vcpu_id, smp_processor_id());
|
this_cpu_write(xen_vcpu_id, smp_processor_id());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFINE_IDTENTRY_SYSVEC(sysvec_xen_hvm_callback)
|
||||||
|
{
|
||||||
|
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||||
|
|
||||||
|
inc_irq_stat(irq_hv_callback_count);
|
||||||
|
|
||||||
|
xen_hvm_evtchn_do_upcall();
|
||||||
|
|
||||||
|
set_irq_regs(old_regs);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_KEXEC_CORE
|
#ifdef CONFIG_KEXEC_CORE
|
||||||
static void xen_hvm_shutdown(void)
|
static void xen_hvm_shutdown(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#ifdef CONFIG_X86
|
#ifdef CONFIG_X86
|
||||||
#include <asm/desc.h>
|
#include <asm/desc.h>
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
|
#include <asm/idtentry.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/io_apic.h>
|
#include <asm/io_apic.h>
|
||||||
#include <asm/i8259.h>
|
#include <asm/i8259.h>
|
||||||
|
@ -1236,9 +1237,6 @@ void xen_evtchn_do_upcall(struct pt_regs *regs)
|
||||||
struct pt_regs *old_regs = set_irq_regs(regs);
|
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||||
|
|
||||||
irq_enter();
|
irq_enter();
|
||||||
#ifdef CONFIG_X86
|
|
||||||
inc_irq_stat(irq_hv_callback_count);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
__xen_evtchn_do_upcall();
|
__xen_evtchn_do_upcall();
|
||||||
|
|
||||||
|
@ -1658,7 +1656,7 @@ static __init void xen_alloc_callback_vector(void)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pr_info("Xen HVM callback vector for event delivery is enabled\n");
|
pr_info("Xen HVM callback vector for event delivery is enabled\n");
|
||||||
alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, xen_hvm_callback_vector);
|
alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, asm_sysvec_xen_hvm_callback);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void xen_setup_callback_vector(void) {}
|
void xen_setup_callback_vector(void) {}
|
||||||
|
|
|
@ -90,13 +90,6 @@ unsigned int irq_from_evtchn(evtchn_port_t evtchn);
|
||||||
int irq_from_virq(unsigned int cpu, unsigned int virq);
|
int irq_from_virq(unsigned int cpu, unsigned int virq);
|
||||||
evtchn_port_t evtchn_from_irq(unsigned irq);
|
evtchn_port_t evtchn_from_irq(unsigned irq);
|
||||||
|
|
||||||
#ifdef CONFIG_XEN_PVHVM
|
|
||||||
/* Xen HVM evtchn vector callback */
|
|
||||||
void xen_hvm_callback_vector(void);
|
|
||||||
#ifdef CONFIG_TRACING
|
|
||||||
#define trace_xen_hvm_callback_vector xen_hvm_callback_vector
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
int xen_set_callback_via(uint64_t via);
|
int xen_set_callback_via(uint64_t via);
|
||||||
void xen_evtchn_do_upcall(struct pt_regs *regs);
|
void xen_evtchn_do_upcall(struct pt_regs *regs);
|
||||||
void xen_hvm_evtchn_do_upcall(void);
|
void xen_hvm_evtchn_do_upcall(void);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче