x86/paravirt: Move the pv_irq_ops under the PARAVIRT_XXL umbrella
All of the paravirt ops defined in pv_irq_ops are for Xen PV guests or VSMP only. Define them only if CONFIG_PARAVIRT_XXL is set. Signed-off-by: Juergen Gross <jgross@suse.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: xen-devel@lists.xenproject.org Cc: virtualization@lists.linux-foundation.org Cc: akataria@vmware.com Cc: rusty@rustcorp.com.au Cc: boris.ostrovsky@oracle.com Cc: hpa@zytor.com Link: https://lkml.kernel.org/r/20180828074026.820-14-jgross@suse.com
This commit is contained in:
parent
9bad5658ea
commit
6da63eb241
@ -64,7 +64,7 @@ static inline __cpuidle void native_halt(void)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_PARAVIRT
|
#ifdef CONFIG_PARAVIRT_XXL
|
||||||
#include <asm/paravirt.h>
|
#include <asm/paravirt.h>
|
||||||
#else
|
#else
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
@ -126,13 +126,7 @@ static inline notrace unsigned long arch_local_irq_save(void)
|
|||||||
#ifdef CONFIG_DEBUG_ENTRY
|
#ifdef CONFIG_DEBUG_ENTRY
|
||||||
#define SAVE_FLAGS(x) pushfq; popq %rax
|
#define SAVE_FLAGS(x) pushfq; popq %rax
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
#endif /* __ASSEMBLY__ */
|
|
||||||
#endif /* CONFIG_PARAVIRT */
|
|
||||||
|
|
||||||
#ifndef CONFIG_PARAVIRT_XXL
|
|
||||||
#ifdef __ASSEMBLY__
|
|
||||||
#ifdef CONFIG_X86_64
|
|
||||||
#define SWAPGS swapgs
|
#define SWAPGS swapgs
|
||||||
/*
|
/*
|
||||||
* Currently paravirt can't handle swapgs nicely when we
|
* Currently paravirt can't handle swapgs nicely when we
|
||||||
|
@ -91,7 +91,6 @@ static inline void write_cr8(unsigned long x)
|
|||||||
PVOP_VCALL1(cpu.write_cr8, x);
|
PVOP_VCALL1(cpu.write_cr8, x);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
static inline void arch_safe_halt(void)
|
static inline void arch_safe_halt(void)
|
||||||
{
|
{
|
||||||
@ -103,7 +102,6 @@ static inline void halt(void)
|
|||||||
PVOP_VCALL0(irq.halt);
|
PVOP_VCALL0(irq.halt);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PARAVIRT_XXL
|
|
||||||
static inline void wbinvd(void)
|
static inline void wbinvd(void)
|
||||||
{
|
{
|
||||||
PVOP_VCALL0(cpu.wbinvd);
|
PVOP_VCALL0(cpu.wbinvd);
|
||||||
@ -770,6 +768,7 @@ bool __raw_callee_save___native_vcpu_is_preempted(long cpu);
|
|||||||
#define __PV_IS_CALLEE_SAVE(func) \
|
#define __PV_IS_CALLEE_SAVE(func) \
|
||||||
((struct paravirt_callee_save) { func })
|
((struct paravirt_callee_save) { func })
|
||||||
|
|
||||||
|
#ifdef CONFIG_PARAVIRT_XXL
|
||||||
static inline notrace unsigned long arch_local_save_flags(void)
|
static inline notrace unsigned long arch_local_save_flags(void)
|
||||||
{
|
{
|
||||||
return PVOP_CALLEE0(unsigned long, irq.save_fl);
|
return PVOP_CALLEE0(unsigned long, irq.save_fl);
|
||||||
@ -798,6 +797,7 @@ static inline notrace unsigned long arch_local_irq_save(void)
|
|||||||
arch_local_irq_disable();
|
arch_local_irq_disable();
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/* Make sure as little as possible of this mess escapes. */
|
/* Make sure as little as possible of this mess escapes. */
|
||||||
@ -884,7 +884,6 @@ extern void default_banner(void);
|
|||||||
PARA_SITE(PARA_PATCH(PV_CPU_iret), \
|
PARA_SITE(PARA_PATCH(PV_CPU_iret), \
|
||||||
ANNOTATE_RETPOLINE_SAFE; \
|
ANNOTATE_RETPOLINE_SAFE; \
|
||||||
jmp PARA_INDIRECT(pv_ops+PV_CPU_iret);)
|
jmp PARA_INDIRECT(pv_ops+PV_CPU_iret);)
|
||||||
#endif
|
|
||||||
|
|
||||||
#define DISABLE_INTERRUPTS(clobbers) \
|
#define DISABLE_INTERRUPTS(clobbers) \
|
||||||
PARA_SITE(PARA_PATCH(PV_IRQ_irq_disable), \
|
PARA_SITE(PARA_PATCH(PV_IRQ_irq_disable), \
|
||||||
@ -899,6 +898,7 @@ extern void default_banner(void);
|
|||||||
ANNOTATE_RETPOLINE_SAFE; \
|
ANNOTATE_RETPOLINE_SAFE; \
|
||||||
call PARA_INDIRECT(pv_ops+PV_IRQ_irq_enable); \
|
call PARA_INDIRECT(pv_ops+PV_IRQ_irq_enable); \
|
||||||
PV_RESTORE_REGS(clobbers | CLBR_CALLEE_SAVE);)
|
PV_RESTORE_REGS(clobbers | CLBR_CALLEE_SAVE);)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
#ifdef CONFIG_PARAVIRT_XXL
|
#ifdef CONFIG_PARAVIRT_XXL
|
||||||
|
@ -184,6 +184,7 @@ struct pv_cpu_ops {
|
|||||||
} __no_randomize_layout;
|
} __no_randomize_layout;
|
||||||
|
|
||||||
struct pv_irq_ops {
|
struct pv_irq_ops {
|
||||||
|
#ifdef CONFIG_PARAVIRT_XXL
|
||||||
/*
|
/*
|
||||||
* Get/set interrupt state. save_fl and restore_fl are only
|
* Get/set interrupt state. save_fl and restore_fl are only
|
||||||
* expected to use X86_EFLAGS_IF; all other bits
|
* expected to use X86_EFLAGS_IF; all other bits
|
||||||
@ -200,7 +201,7 @@ struct pv_irq_ops {
|
|||||||
|
|
||||||
void (*safe_halt)(void);
|
void (*safe_halt)(void);
|
||||||
void (*halt)(void);
|
void (*halt)(void);
|
||||||
|
#endif
|
||||||
} __no_randomize_layout;
|
} __no_randomize_layout;
|
||||||
|
|
||||||
struct pv_mmu_ops {
|
struct pv_mmu_ops {
|
||||||
|
@ -66,9 +66,9 @@ void common(void) {
|
|||||||
|
|
||||||
#ifdef CONFIG_PARAVIRT
|
#ifdef CONFIG_PARAVIRT
|
||||||
BLANK();
|
BLANK();
|
||||||
|
#ifdef CONFIG_PARAVIRT_XXL
|
||||||
OFFSET(PV_IRQ_irq_disable, paravirt_patch_template, irq.irq_disable);
|
OFFSET(PV_IRQ_irq_disable, paravirt_patch_template, irq.irq_disable);
|
||||||
OFFSET(PV_IRQ_irq_enable, paravirt_patch_template, irq.irq_enable);
|
OFFSET(PV_IRQ_irq_enable, paravirt_patch_template, irq.irq_enable);
|
||||||
#ifdef CONFIG_PARAVIRT_XXL
|
|
||||||
OFFSET(PV_CPU_iret, paravirt_patch_template, cpu.iret);
|
OFFSET(PV_CPU_iret, paravirt_patch_template, cpu.iret);
|
||||||
#endif
|
#endif
|
||||||
OFFSET(PV_MMU_read_cr2, paravirt_patch_template, mmu.read_cr2);
|
OFFSET(PV_MMU_read_cr2, paravirt_patch_template, mmu.read_cr2);
|
||||||
|
@ -25,9 +25,9 @@ int main(void)
|
|||||||
OFFSET(PV_CPU_usergs_sysret64, paravirt_patch_template,
|
OFFSET(PV_CPU_usergs_sysret64, paravirt_patch_template,
|
||||||
cpu.usergs_sysret64);
|
cpu.usergs_sysret64);
|
||||||
OFFSET(PV_CPU_swapgs, paravirt_patch_template, cpu.swapgs);
|
OFFSET(PV_CPU_swapgs, paravirt_patch_template, cpu.swapgs);
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_DEBUG_ENTRY
|
#ifdef CONFIG_DEBUG_ENTRY
|
||||||
OFFSET(PV_IRQ_save_fl, paravirt_patch_template, irq.save_fl);
|
OFFSET(PV_IRQ_save_fl, paravirt_patch_template, irq.save_fl);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
BLANK();
|
BLANK();
|
||||||
#endif
|
#endif
|
||||||
|
@ -373,7 +373,6 @@ struct paravirt_patch_template pv_ops = {
|
|||||||
|
|
||||||
.cpu.start_context_switch = paravirt_nop,
|
.cpu.start_context_switch = paravirt_nop,
|
||||||
.cpu.end_context_switch = paravirt_nop,
|
.cpu.end_context_switch = paravirt_nop,
|
||||||
#endif /* CONFIG_PARAVIRT_XXL */
|
|
||||||
|
|
||||||
/* Irq ops. */
|
/* Irq ops. */
|
||||||
.irq.save_fl = __PV_IS_CALLEE_SAVE(native_save_fl),
|
.irq.save_fl = __PV_IS_CALLEE_SAVE(native_save_fl),
|
||||||
@ -382,6 +381,7 @@ struct paravirt_patch_template pv_ops = {
|
|||||||
.irq.irq_enable = __PV_IS_CALLEE_SAVE(native_irq_enable),
|
.irq.irq_enable = __PV_IS_CALLEE_SAVE(native_irq_enable),
|
||||||
.irq.safe_halt = native_safe_halt,
|
.irq.safe_halt = native_safe_halt,
|
||||||
.irq.halt = native_halt,
|
.irq.halt = native_halt,
|
||||||
|
#endif /* CONFIG_PARAVIRT_XXL */
|
||||||
|
|
||||||
/* Mmu ops. */
|
/* Mmu ops. */
|
||||||
.mmu.read_cr2 = native_read_cr2,
|
.mmu.read_cr2 = native_read_cr2,
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
#include <asm/paravirt.h>
|
#include <asm/paravirt.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_PARAVIRT_XXL
|
||||||
DEF_NATIVE(irq, irq_disable, "cli");
|
DEF_NATIVE(irq, irq_disable, "cli");
|
||||||
DEF_NATIVE(irq, irq_enable, "sti");
|
DEF_NATIVE(irq, irq_enable, "sti");
|
||||||
DEF_NATIVE(irq, restore_fl, "push %eax; popf");
|
DEF_NATIVE(irq, restore_fl, "push %eax; popf");
|
||||||
DEF_NATIVE(irq, save_fl, "pushf; pop %eax");
|
DEF_NATIVE(irq, save_fl, "pushf; pop %eax");
|
||||||
#ifdef CONFIG_PARAVIRT_XXL
|
|
||||||
DEF_NATIVE(cpu, iret, "iret");
|
DEF_NATIVE(cpu, iret, "iret");
|
||||||
#endif
|
#endif
|
||||||
DEF_NATIVE(mmu, read_cr2, "mov %cr2, %eax");
|
DEF_NATIVE(mmu, read_cr2, "mov %cr2, %eax");
|
||||||
@ -43,11 +43,11 @@ unsigned native_patch(u8 type, void *ibuf, unsigned long addr, unsigned len)
|
|||||||
end = end_##ops##_##x; \
|
end = end_##ops##_##x; \
|
||||||
goto patch_site
|
goto patch_site
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
#ifdef CONFIG_PARAVIRT_XXL
|
||||||
PATCH_SITE(irq, irq_disable);
|
PATCH_SITE(irq, irq_disable);
|
||||||
PATCH_SITE(irq, irq_enable);
|
PATCH_SITE(irq, irq_enable);
|
||||||
PATCH_SITE(irq, restore_fl);
|
PATCH_SITE(irq, restore_fl);
|
||||||
PATCH_SITE(irq, save_fl);
|
PATCH_SITE(irq, save_fl);
|
||||||
#ifdef CONFIG_PARAVIRT_XXL
|
|
||||||
PATCH_SITE(cpu, iret);
|
PATCH_SITE(cpu, iret);
|
||||||
#endif
|
#endif
|
||||||
PATCH_SITE(mmu, read_cr2);
|
PATCH_SITE(mmu, read_cr2);
|
||||||
|
@ -3,10 +3,12 @@
|
|||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
#include <linux/stringify.h>
|
#include <linux/stringify.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_PARAVIRT_XXL
|
||||||
DEF_NATIVE(irq, irq_disable, "cli");
|
DEF_NATIVE(irq, irq_disable, "cli");
|
||||||
DEF_NATIVE(irq, irq_enable, "sti");
|
DEF_NATIVE(irq, irq_enable, "sti");
|
||||||
DEF_NATIVE(irq, restore_fl, "pushq %rdi; popfq");
|
DEF_NATIVE(irq, restore_fl, "pushq %rdi; popfq");
|
||||||
DEF_NATIVE(irq, save_fl, "pushfq; popq %rax");
|
DEF_NATIVE(irq, save_fl, "pushfq; popq %rax");
|
||||||
|
#endif
|
||||||
DEF_NATIVE(mmu, read_cr2, "movq %cr2, %rax");
|
DEF_NATIVE(mmu, read_cr2, "movq %cr2, %rax");
|
||||||
DEF_NATIVE(mmu, read_cr3, "movq %cr3, %rax");
|
DEF_NATIVE(mmu, read_cr3, "movq %cr3, %rax");
|
||||||
DEF_NATIVE(mmu, write_cr3, "movq %rdi, %cr3");
|
DEF_NATIVE(mmu, write_cr3, "movq %rdi, %cr3");
|
||||||
@ -51,11 +53,11 @@ unsigned native_patch(u8 type, void *ibuf, unsigned long addr, unsigned len)
|
|||||||
end = end_##ops##_##x; \
|
end = end_##ops##_##x; \
|
||||||
goto patch_site
|
goto patch_site
|
||||||
switch(type) {
|
switch(type) {
|
||||||
|
#ifdef CONFIG_PARAVIRT_XXL
|
||||||
PATCH_SITE(irq, restore_fl);
|
PATCH_SITE(irq, restore_fl);
|
||||||
PATCH_SITE(irq, save_fl);
|
PATCH_SITE(irq, save_fl);
|
||||||
PATCH_SITE(irq, irq_enable);
|
PATCH_SITE(irq, irq_enable);
|
||||||
PATCH_SITE(irq, irq_disable);
|
PATCH_SITE(irq, irq_disable);
|
||||||
#ifdef CONFIG_PARAVIRT_XXL
|
|
||||||
PATCH_SITE(cpu, usergs_sysret64);
|
PATCH_SITE(cpu, usergs_sysret64);
|
||||||
PATCH_SITE(cpu, swapgs);
|
PATCH_SITE(cpu, swapgs);
|
||||||
PATCH_SITE(cpu, wbinvd);
|
PATCH_SITE(cpu, wbinvd);
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
#define TOPOLOGY_REGISTER_OFFSET 0x10
|
#define TOPOLOGY_REGISTER_OFFSET 0x10
|
||||||
|
|
||||||
#if defined CONFIG_PCI && defined CONFIG_PARAVIRT
|
#if defined CONFIG_PCI && defined CONFIG_PARAVIRT_XXL
|
||||||
/*
|
/*
|
||||||
* Interrupt control on vSMPowered systems:
|
* Interrupt control on vSMPowered systems:
|
||||||
* ~AC is a shadow of IF. If IF is 'on' AC should be 'off'
|
* ~AC is a shadow of IF. If IF is 'on' AC should be 'off'
|
||||||
|
Loading…
Reference in New Issue
Block a user