Commit 054ac8ad authored by Juergen Gross's avatar Juergen Gross Committed by Borislav Petkov
Browse files

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: default avatarJuergen Gross <jgross@suse.com>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20210311142319.4723-15-jgross@suse.com
parent fafe5e74
Loading
Loading
Loading
Loading
+1 −18
Original line number Diff line number Diff line
@@ -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);

+1 −2
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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);

+2 −18
Original line number Diff line number Diff line
@@ -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,

arch/x86/kernel/paravirt_patch.c

deleted100644 → 0
+0 −11
Original line number Diff line number Diff line
// 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);
}
Loading