x86/paravirt: Have only one paravirt patch function
There is no need any longer to have different paravirt patch functions for native and Xen. Eliminate native_patch() and rename paravirt_patch_default() to paravirt_patch(). Signed-off-by: Juergen Gross <jgross@suse.com> Signed-off-by: Borislav Petkov <bp@suse.de> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lkml.kernel.org/r/20210311142319.4723-15-jgross@suse.com
This commit is contained in:
parent
fafe5e7422
commit
054ac8ad5e
|
@ -68,19 +68,6 @@ struct pv_info {
|
|||
const char *name;
|
||||
};
|
||||
|
||||
struct pv_init_ops {
|
||||
/*
|
||||
* Patch may replace one of the defined code sequences with
|
||||
* arbitrary code, subject to the same register constraints.
|
||||
* This generally means the code is not free to clobber any
|
||||
* registers other than EAX. The patch function should return
|
||||
* the number of bytes of code generated, as we nop pad the
|
||||
* rest in generic code.
|
||||
*/
|
||||
unsigned (*patch)(u8 type, void *insn_buff,
|
||||
unsigned long addr, unsigned len);
|
||||
} __no_randomize_layout;
|
||||
|
||||
#ifdef CONFIG_PARAVIRT_XXL
|
||||
struct pv_lazy_ops {
|
||||
/* Set deferred update mode, used for batching operations. */
|
||||
|
@ -276,7 +263,6 @@ struct pv_lock_ops {
|
|||
* number for each function using the offset which we use to indicate
|
||||
* what to patch. */
|
||||
struct paravirt_patch_template {
|
||||
struct pv_init_ops init;
|
||||
struct pv_cpu_ops cpu;
|
||||
struct pv_irq_ops irq;
|
||||
struct pv_mmu_ops mmu;
|
||||
|
@ -317,10 +303,7 @@ extern void (*paravirt_iret)(void);
|
|||
/* Simple instruction patching code. */
|
||||
#define NATIVE_LABEL(a,x,b) "\n\t.globl " a #x "_" #b "\n" a #x "_" #b ":\n\t"
|
||||
|
||||
unsigned paravirt_patch_default(u8 type, void *insn_buff, unsigned long addr, unsigned len);
|
||||
unsigned paravirt_patch_insns(void *insn_buff, unsigned len, const char *start, const char *end);
|
||||
|
||||
unsigned native_patch(u8 type, void *insn_buff, unsigned long addr, unsigned len);
|
||||
unsigned int paravirt_patch(u8 type, void *insn_buff, unsigned long addr, unsigned int len);
|
||||
|
||||
int paravirt_disable_iospace(void);
|
||||
|
||||
|
|
|
@ -35,7 +35,6 @@ KASAN_SANITIZE_sev-es.o := n
|
|||
KCSAN_SANITIZE := n
|
||||
|
||||
OBJECT_FILES_NON_STANDARD_test_nx.o := y
|
||||
OBJECT_FILES_NON_STANDARD_paravirt_patch.o := y
|
||||
|
||||
ifdef CONFIG_FRAME_POINTER
|
||||
OBJECT_FILES_NON_STANDARD_ftrace_$(BITS).o := y
|
||||
|
@ -121,7 +120,7 @@ obj-$(CONFIG_AMD_NB) += amd_nb.o
|
|||
obj-$(CONFIG_DEBUG_NMI_SELFTEST) += nmi_selftest.o
|
||||
|
||||
obj-$(CONFIG_KVM_GUEST) += kvm.o kvmclock.o
|
||||
obj-$(CONFIG_PARAVIRT) += paravirt.o paravirt_patch.o
|
||||
obj-$(CONFIG_PARAVIRT) += paravirt.o
|
||||
obj-$(CONFIG_PARAVIRT_SPINLOCKS)+= paravirt-spinlocks.o
|
||||
obj-$(CONFIG_PARAVIRT_CLOCK) += pvclock.o
|
||||
obj-$(CONFIG_X86_PMEM_LEGACY_DEVICE) += pmem.o
|
||||
|
|
|
@ -616,7 +616,7 @@ void __init_or_module apply_paravirt(struct paravirt_patch_site *start,
|
|||
BUG_ON(p->len > MAX_PATCH_LEN);
|
||||
/* prep the buffer with the original instructions */
|
||||
memcpy(insn_buff, p->instr, p->len);
|
||||
used = pv_ops.init.patch(p->type, insn_buff, (unsigned long)p->instr, p->len);
|
||||
used = paravirt_patch(p->type, insn_buff, (unsigned long)p->instr, p->len);
|
||||
|
||||
BUG_ON(used > p->len);
|
||||
|
||||
|
|
|
@ -99,8 +99,8 @@ void __init native_pv_lock_init(void)
|
|||
static_branch_disable(&virt_spin_lock_key);
|
||||
}
|
||||
|
||||
unsigned paravirt_patch_default(u8 type, void *insn_buff,
|
||||
unsigned long addr, unsigned len)
|
||||
unsigned int paravirt_patch(u8 type, void *insn_buff, unsigned long addr,
|
||||
unsigned int len)
|
||||
{
|
||||
/*
|
||||
* Neat trick to map patch type back to the call within the
|
||||
|
@ -121,19 +121,6 @@ unsigned paravirt_patch_default(u8 type, void *insn_buff,
|
|||
return ret;
|
||||
}
|
||||
|
||||
unsigned paravirt_patch_insns(void *insn_buff, unsigned len,
|
||||
const char *start, const char *end)
|
||||
{
|
||||
unsigned insn_len = end - start;
|
||||
|
||||
/* Alternative instruction is too large for the patch site and we cannot continue: */
|
||||
BUG_ON(insn_len > len || start == NULL);
|
||||
|
||||
memcpy(insn_buff, start, insn_len);
|
||||
|
||||
return insn_len;
|
||||
}
|
||||
|
||||
struct static_key paravirt_steal_enabled;
|
||||
struct static_key paravirt_steal_rq_enabled;
|
||||
|
||||
|
@ -252,9 +239,6 @@ struct pv_info pv_info = {
|
|||
#define PTE_IDENT __PV_IS_CALLEE_SAVE(_paravirt_ident_64)
|
||||
|
||||
struct paravirt_patch_template pv_ops = {
|
||||
/* Init ops. */
|
||||
.init.patch = native_patch,
|
||||
|
||||
/* Cpu ops. */
|
||||
.cpu.io_delay = native_io_delay,
|
||||
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <linux/stringify.h>
|
||||
|
||||
#include <asm/paravirt.h>
|
||||
#include <asm/asm-offsets.h>
|
||||
|
||||
unsigned int native_patch(u8 type, void *insn_buff, unsigned long addr,
|
||||
unsigned int len)
|
||||
{
|
||||
return paravirt_patch_default(type, insn_buff, addr, len);
|
||||
}
|
|
@ -1231,7 +1231,6 @@ asmlinkage __visible void __init xen_start_kernel(void)
|
|||
|
||||
/* Install Xen paravirt ops */
|
||||
pv_info = xen_info;
|
||||
pv_ops.init.patch = paravirt_patch_default;
|
||||
pv_ops.cpu = xen_cpu_ops;
|
||||
paravirt_iret = xen_iret;
|
||||
xen_init_irq_ops();
|
||||
|
|
Loading…
Reference in New Issue