forked from luck/tmp_suning_uos_patched
KVM: arm64: Move virt/kvm/arm to arch/arm64
Now that the 32bit KVM/arm host is a distant memory, let's move the whole of the KVM/arm64 code into the arm64 tree. As they said in the song: Welcome Home (Sanitarium). Signed-off-by: Marc Zyngier <maz@kernel.org> Acked-by: Will Deacon <will@kernel.org> Link: https://lore.kernel.org/r/20200513104034.74741-1-maz@kernel.org
This commit is contained in:
parent
2ef96a5bb1
commit
9ed24f4b71
|
@ -9295,7 +9295,6 @@ F: arch/arm64/include/asm/kvm*
|
||||||
F: arch/arm64/include/uapi/asm/kvm*
|
F: arch/arm64/include/uapi/asm/kvm*
|
||||||
F: arch/arm64/kvm/
|
F: arch/arm64/kvm/
|
||||||
F: include/kvm/arm_*
|
F: include/kvm/arm_*
|
||||||
F: virt/kvm/arm/
|
|
||||||
|
|
||||||
KERNEL VIRTUAL MACHINE FOR MIPS (KVM/mips)
|
KERNEL VIRTUAL MACHINE FOR MIPS (KVM/mips)
|
||||||
L: linux-mips@vger.kernel.org
|
L: linux-mips@vger.kernel.org
|
||||||
|
|
|
@ -3,37 +3,37 @@
|
||||||
# Makefile for Kernel-based Virtual Machine module
|
# Makefile for Kernel-based Virtual Machine module
|
||||||
#
|
#
|
||||||
|
|
||||||
ccflags-y += -I $(srctree)/$(src) -I $(srctree)/virt/kvm/arm/vgic
|
ccflags-y += -I $(srctree)/$(src)
|
||||||
|
|
||||||
KVM=../../../virt/kvm
|
KVM=../../../virt/kvm
|
||||||
|
|
||||||
obj-$(CONFIG_KVM_ARM_HOST) += kvm.o
|
obj-$(CONFIG_KVM_ARM_HOST) += kvm.o
|
||||||
obj-$(CONFIG_KVM_ARM_HOST) += hyp/
|
obj-$(CONFIG_KVM_ARM_HOST) += hyp/
|
||||||
|
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o $(KVM)/eventfd.o $(KVM)/vfio.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/kvm_main.o $(KVM)/coalesced_mmio.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/arm.o $(KVM)/arm/mmu.o $(KVM)/arm/mmio.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/eventfd.o $(KVM)/vfio.o $(KVM)/irqchip.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/psci.o $(KVM)/arm/perf.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += arm.o mmu.o mmio.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/hypercalls.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += psci.o perf.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/pvtime.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += hypercalls.o
|
||||||
|
kvm-$(CONFIG_KVM_ARM_HOST) += pvtime.o
|
||||||
|
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += inject_fault.o regmap.o va_layout.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += inject_fault.o regmap.o va_layout.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += hyp.o hyp-init.o handle_exit.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += hyp.o hyp-init.o handle_exit.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += guest.o debug.o reset.o sys_regs.o sys_regs_generic_v8.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += guest.o debug.o reset.o sys_regs.o sys_regs_generic_v8.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += vgic-sys-reg-v3.o fpsimd.o pmu.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += vgic-sys-reg-v3.o fpsimd.o pmu.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/aarch32.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += aarch32.o
|
||||||
|
kvm-$(CONFIG_KVM_ARM_HOST) += arch_timer.o
|
||||||
|
kvm-$(CONFIG_KVM_ARM_PMU) += pmu-emul.o
|
||||||
|
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += vgic/vgic.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic-init.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += vgic/vgic-init.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic-irqfd.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += vgic/vgic-irqfd.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic-v2.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += vgic/vgic-v2.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic-v3.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += vgic/vgic-v3.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic-v4.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += vgic/vgic-v4.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic-mmio.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += vgic/vgic-mmio.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic-mmio-v2.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += vgic/vgic-mmio-v2.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic-mmio-v3.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += vgic/vgic-mmio-v3.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic-kvm-device.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += vgic/vgic-kvm-device.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic-its.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += vgic/vgic-its.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/vgic/vgic-debug.o
|
kvm-$(CONFIG_KVM_ARM_HOST) += vgic/vgic-debug.o
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/irqchip.o
|
|
||||||
kvm-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/arch_timer.o
|
|
||||||
kvm-$(CONFIG_KVM_ARM_PMU) += $(KVM)/arm/pmu.o
|
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
#include <trace/events/kvm.h>
|
#include <trace/events/kvm.h>
|
||||||
|
|
||||||
#define CREATE_TRACE_POINTS
|
#define CREATE_TRACE_POINTS
|
||||||
#include "trace.h"
|
#include "trace_arm.h"
|
||||||
|
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
|
@ -23,7 +23,7 @@
|
||||||
#include <kvm/arm_hypercalls.h>
|
#include <kvm/arm_hypercalls.h>
|
||||||
|
|
||||||
#define CREATE_TRACE_POINTS
|
#define CREATE_TRACE_POINTS
|
||||||
#include "trace.h"
|
#include "trace_handle_exit.h"
|
||||||
|
|
||||||
typedef int (*exit_handle_fn)(struct kvm_vcpu *, struct kvm_run *);
|
typedef int (*exit_handle_fn)(struct kvm_vcpu *, struct kvm_run *);
|
||||||
|
|
||||||
|
|
|
@ -6,12 +6,9 @@
|
||||||
ccflags-y += -fno-stack-protector -DDISABLE_BRANCH_PROFILING \
|
ccflags-y += -fno-stack-protector -DDISABLE_BRANCH_PROFILING \
|
||||||
$(DISABLE_STACKLEAK_PLUGIN)
|
$(DISABLE_STACKLEAK_PLUGIN)
|
||||||
|
|
||||||
KVM=../../../../virt/kvm
|
obj-$(CONFIG_KVM_ARM_HOST) += vgic-v3-sr.o
|
||||||
|
obj-$(CONFIG_KVM_ARM_HOST) += timer-sr.o
|
||||||
obj-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/hyp/vgic-v3-sr.o
|
obj-$(CONFIG_KVM_ARM_HOST) += aarch32.o
|
||||||
obj-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/hyp/timer-sr.o
|
|
||||||
obj-$(CONFIG_KVM_ARM_HOST) += $(KVM)/arm/hyp/aarch32.o
|
|
||||||
|
|
||||||
obj-$(CONFIG_KVM_ARM_HOST) += vgic-v2-cpuif-proxy.o
|
obj-$(CONFIG_KVM_ARM_HOST) += vgic-v2-cpuif-proxy.o
|
||||||
obj-$(CONFIG_KVM_ARM_HOST) += sysreg-sr.o
|
obj-$(CONFIG_KVM_ARM_HOST) += sysreg-sr.o
|
||||||
obj-$(CONFIG_KVM_ARM_HOST) += debug-sr.o
|
obj-$(CONFIG_KVM_ARM_HOST) += debug-sr.o
|
||||||
|
|
|
@ -431,8 +431,6 @@ void __hyp_text __vgic_v3_write_vmcr(u32 vmcr)
|
||||||
write_gicreg(vmcr, ICH_VMCR_EL2);
|
write_gicreg(vmcr, ICH_VMCR_EL2);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ARM64
|
|
||||||
|
|
||||||
static int __hyp_text __vgic_v3_bpr_min(void)
|
static int __hyp_text __vgic_v3_bpr_min(void)
|
||||||
{
|
{
|
||||||
/* See Pseudocode for VPriorityGroup */
|
/* See Pseudocode for VPriorityGroup */
|
||||||
|
@ -1126,5 +1124,3 @@ int __hyp_text __vgic_v3_perform_cpuif_access(struct kvm_vcpu *vcpu)
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,216 +1,8 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
#if !defined(_TRACE_ARM64_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
|
#ifndef _TRACE_ARM64_KVM_H
|
||||||
#define _TRACE_ARM64_KVM_H
|
#define _TRACE_ARM64_KVM_H
|
||||||
|
|
||||||
#include <linux/tracepoint.h>
|
#include "trace_arm.h"
|
||||||
#include "sys_regs.h"
|
#include "trace_handle_exit.h"
|
||||||
|
|
||||||
#undef TRACE_SYSTEM
|
#endif /* _TRACE_ARM64_KVM_H */
|
||||||
#define TRACE_SYSTEM kvm
|
|
||||||
|
|
||||||
TRACE_EVENT(kvm_wfx_arm64,
|
|
||||||
TP_PROTO(unsigned long vcpu_pc, bool is_wfe),
|
|
||||||
TP_ARGS(vcpu_pc, is_wfe),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field(unsigned long, vcpu_pc)
|
|
||||||
__field(bool, is_wfe)
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->vcpu_pc = vcpu_pc;
|
|
||||||
__entry->is_wfe = is_wfe;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("guest executed wf%c at: 0x%08lx",
|
|
||||||
__entry->is_wfe ? 'e' : 'i', __entry->vcpu_pc)
|
|
||||||
);
|
|
||||||
|
|
||||||
TRACE_EVENT(kvm_hvc_arm64,
|
|
||||||
TP_PROTO(unsigned long vcpu_pc, unsigned long r0, unsigned long imm),
|
|
||||||
TP_ARGS(vcpu_pc, r0, imm),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field(unsigned long, vcpu_pc)
|
|
||||||
__field(unsigned long, r0)
|
|
||||||
__field(unsigned long, imm)
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->vcpu_pc = vcpu_pc;
|
|
||||||
__entry->r0 = r0;
|
|
||||||
__entry->imm = imm;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("HVC at 0x%08lx (r0: 0x%08lx, imm: 0x%lx)",
|
|
||||||
__entry->vcpu_pc, __entry->r0, __entry->imm)
|
|
||||||
);
|
|
||||||
|
|
||||||
TRACE_EVENT(kvm_arm_setup_debug,
|
|
||||||
TP_PROTO(struct kvm_vcpu *vcpu, __u32 guest_debug),
|
|
||||||
TP_ARGS(vcpu, guest_debug),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field(struct kvm_vcpu *, vcpu)
|
|
||||||
__field(__u32, guest_debug)
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->vcpu = vcpu;
|
|
||||||
__entry->guest_debug = guest_debug;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("vcpu: %p, flags: 0x%08x", __entry->vcpu, __entry->guest_debug)
|
|
||||||
);
|
|
||||||
|
|
||||||
TRACE_EVENT(kvm_arm_clear_debug,
|
|
||||||
TP_PROTO(__u32 guest_debug),
|
|
||||||
TP_ARGS(guest_debug),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field(__u32, guest_debug)
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->guest_debug = guest_debug;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("flags: 0x%08x", __entry->guest_debug)
|
|
||||||
);
|
|
||||||
|
|
||||||
TRACE_EVENT(kvm_arm_set_dreg32,
|
|
||||||
TP_PROTO(const char *name, __u32 value),
|
|
||||||
TP_ARGS(name, value),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field(const char *, name)
|
|
||||||
__field(__u32, value)
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->name = name;
|
|
||||||
__entry->value = value;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("%s: 0x%08x", __entry->name, __entry->value)
|
|
||||||
);
|
|
||||||
|
|
||||||
TRACE_DEFINE_SIZEOF(__u64);
|
|
||||||
|
|
||||||
TRACE_EVENT(kvm_arm_set_regset,
|
|
||||||
TP_PROTO(const char *type, int len, __u64 *control, __u64 *value),
|
|
||||||
TP_ARGS(type, len, control, value),
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field(const char *, name)
|
|
||||||
__field(int, len)
|
|
||||||
__array(u64, ctrls, 16)
|
|
||||||
__array(u64, values, 16)
|
|
||||||
),
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->name = type;
|
|
||||||
__entry->len = len;
|
|
||||||
memcpy(__entry->ctrls, control, len << 3);
|
|
||||||
memcpy(__entry->values, value, len << 3);
|
|
||||||
),
|
|
||||||
TP_printk("%d %s CTRL:%s VALUE:%s", __entry->len, __entry->name,
|
|
||||||
__print_array(__entry->ctrls, __entry->len, sizeof(__u64)),
|
|
||||||
__print_array(__entry->values, __entry->len, sizeof(__u64)))
|
|
||||||
);
|
|
||||||
|
|
||||||
TRACE_EVENT(trap_reg,
|
|
||||||
TP_PROTO(const char *fn, int reg, bool is_write, u64 write_value),
|
|
||||||
TP_ARGS(fn, reg, is_write, write_value),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field(const char *, fn)
|
|
||||||
__field(int, reg)
|
|
||||||
__field(bool, is_write)
|
|
||||||
__field(u64, write_value)
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->fn = fn;
|
|
||||||
__entry->reg = reg;
|
|
||||||
__entry->is_write = is_write;
|
|
||||||
__entry->write_value = write_value;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("%s %s reg %d (0x%08llx)", __entry->fn, __entry->is_write?"write to":"read from", __entry->reg, __entry->write_value)
|
|
||||||
);
|
|
||||||
|
|
||||||
TRACE_EVENT(kvm_handle_sys_reg,
|
|
||||||
TP_PROTO(unsigned long hsr),
|
|
||||||
TP_ARGS(hsr),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field(unsigned long, hsr)
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->hsr = hsr;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("HSR 0x%08lx", __entry->hsr)
|
|
||||||
);
|
|
||||||
|
|
||||||
TRACE_EVENT(kvm_sys_access,
|
|
||||||
TP_PROTO(unsigned long vcpu_pc, struct sys_reg_params *params, const struct sys_reg_desc *reg),
|
|
||||||
TP_ARGS(vcpu_pc, params, reg),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field(unsigned long, vcpu_pc)
|
|
||||||
__field(bool, is_write)
|
|
||||||
__field(const char *, name)
|
|
||||||
__field(u8, Op0)
|
|
||||||
__field(u8, Op1)
|
|
||||||
__field(u8, CRn)
|
|
||||||
__field(u8, CRm)
|
|
||||||
__field(u8, Op2)
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->vcpu_pc = vcpu_pc;
|
|
||||||
__entry->is_write = params->is_write;
|
|
||||||
__entry->name = reg->name;
|
|
||||||
__entry->Op0 = reg->Op0;
|
|
||||||
__entry->Op0 = reg->Op0;
|
|
||||||
__entry->Op1 = reg->Op1;
|
|
||||||
__entry->CRn = reg->CRn;
|
|
||||||
__entry->CRm = reg->CRm;
|
|
||||||
__entry->Op2 = reg->Op2;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("PC: %lx %s (%d,%d,%d,%d,%d) %s",
|
|
||||||
__entry->vcpu_pc, __entry->name ?: "UNKN",
|
|
||||||
__entry->Op0, __entry->Op1, __entry->CRn,
|
|
||||||
__entry->CRm, __entry->Op2,
|
|
||||||
__entry->is_write ? "write" : "read")
|
|
||||||
);
|
|
||||||
|
|
||||||
TRACE_EVENT(kvm_set_guest_debug,
|
|
||||||
TP_PROTO(struct kvm_vcpu *vcpu, __u32 guest_debug),
|
|
||||||
TP_ARGS(vcpu, guest_debug),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field(struct kvm_vcpu *, vcpu)
|
|
||||||
__field(__u32, guest_debug)
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->vcpu = vcpu;
|
|
||||||
__entry->guest_debug = guest_debug;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("vcpu: %p, flags: 0x%08x", __entry->vcpu, __entry->guest_debug)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* _TRACE_ARM64_KVM_H */
|
|
||||||
|
|
||||||
#undef TRACE_INCLUDE_PATH
|
|
||||||
#define TRACE_INCLUDE_PATH .
|
|
||||||
#undef TRACE_INCLUDE_FILE
|
|
||||||
#define TRACE_INCLUDE_FILE trace
|
|
||||||
|
|
||||||
/* This part must be outside protection */
|
|
||||||
#include <trace/define_trace.h>
|
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
#if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
|
#if !defined(_TRACE_ARM_ARM64_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||||
#define _TRACE_KVM_H
|
#define _TRACE_ARM_ARM64_KVM_H
|
||||||
|
|
||||||
#include <kvm/arm_arch_timer.h>
|
#include <kvm/arm_arch_timer.h>
|
||||||
#include <linux/tracepoint.h>
|
#include <linux/tracepoint.h>
|
||||||
#include <asm/kvm_arm.h>
|
|
||||||
|
|
||||||
#undef TRACE_SYSTEM
|
#undef TRACE_SYSTEM
|
||||||
#define TRACE_SYSTEM kvm
|
#define TRACE_SYSTEM kvm
|
||||||
|
@ -368,12 +367,12 @@ TRACE_EVENT(kvm_timer_emulate,
|
||||||
__entry->timer_idx, __entry->should_fire)
|
__entry->timer_idx, __entry->should_fire)
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif /* _TRACE_KVM_H */
|
#endif /* _TRACE_ARM_ARM64_KVM_H */
|
||||||
|
|
||||||
#undef TRACE_INCLUDE_PATH
|
#undef TRACE_INCLUDE_PATH
|
||||||
#define TRACE_INCLUDE_PATH ../../virt/kvm/arm
|
#define TRACE_INCLUDE_PATH .
|
||||||
#undef TRACE_INCLUDE_FILE
|
#undef TRACE_INCLUDE_FILE
|
||||||
#define TRACE_INCLUDE_FILE trace
|
#define TRACE_INCLUDE_FILE trace_arm
|
||||||
|
|
||||||
/* This part must be outside protection */
|
/* This part must be outside protection */
|
||||||
#include <trace/define_trace.h>
|
#include <trace/define_trace.h>
|
215
arch/arm64/kvm/trace_handle_exit.h
Normal file
215
arch/arm64/kvm/trace_handle_exit.h
Normal file
|
@ -0,0 +1,215 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
#if !defined(_TRACE_HANDLE_EXIT_ARM64_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||||
|
#define _TRACE_HANDLE_EXIT_ARM64_KVM_H
|
||||||
|
|
||||||
|
#include <linux/tracepoint.h>
|
||||||
|
#include "sys_regs.h"
|
||||||
|
|
||||||
|
#undef TRACE_SYSTEM
|
||||||
|
#define TRACE_SYSTEM kvm
|
||||||
|
|
||||||
|
TRACE_EVENT(kvm_wfx_arm64,
|
||||||
|
TP_PROTO(unsigned long vcpu_pc, bool is_wfe),
|
||||||
|
TP_ARGS(vcpu_pc, is_wfe),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(unsigned long, vcpu_pc)
|
||||||
|
__field(bool, is_wfe)
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->vcpu_pc = vcpu_pc;
|
||||||
|
__entry->is_wfe = is_wfe;
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_printk("guest executed wf%c at: 0x%08lx",
|
||||||
|
__entry->is_wfe ? 'e' : 'i', __entry->vcpu_pc)
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT(kvm_hvc_arm64,
|
||||||
|
TP_PROTO(unsigned long vcpu_pc, unsigned long r0, unsigned long imm),
|
||||||
|
TP_ARGS(vcpu_pc, r0, imm),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(unsigned long, vcpu_pc)
|
||||||
|
__field(unsigned long, r0)
|
||||||
|
__field(unsigned long, imm)
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->vcpu_pc = vcpu_pc;
|
||||||
|
__entry->r0 = r0;
|
||||||
|
__entry->imm = imm;
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_printk("HVC at 0x%08lx (r0: 0x%08lx, imm: 0x%lx)",
|
||||||
|
__entry->vcpu_pc, __entry->r0, __entry->imm)
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT(kvm_arm_setup_debug,
|
||||||
|
TP_PROTO(struct kvm_vcpu *vcpu, __u32 guest_debug),
|
||||||
|
TP_ARGS(vcpu, guest_debug),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(struct kvm_vcpu *, vcpu)
|
||||||
|
__field(__u32, guest_debug)
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->vcpu = vcpu;
|
||||||
|
__entry->guest_debug = guest_debug;
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_printk("vcpu: %p, flags: 0x%08x", __entry->vcpu, __entry->guest_debug)
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT(kvm_arm_clear_debug,
|
||||||
|
TP_PROTO(__u32 guest_debug),
|
||||||
|
TP_ARGS(guest_debug),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(__u32, guest_debug)
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->guest_debug = guest_debug;
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_printk("flags: 0x%08x", __entry->guest_debug)
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT(kvm_arm_set_dreg32,
|
||||||
|
TP_PROTO(const char *name, __u32 value),
|
||||||
|
TP_ARGS(name, value),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(const char *, name)
|
||||||
|
__field(__u32, value)
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->name = name;
|
||||||
|
__entry->value = value;
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_printk("%s: 0x%08x", __entry->name, __entry->value)
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_DEFINE_SIZEOF(__u64);
|
||||||
|
|
||||||
|
TRACE_EVENT(kvm_arm_set_regset,
|
||||||
|
TP_PROTO(const char *type, int len, __u64 *control, __u64 *value),
|
||||||
|
TP_ARGS(type, len, control, value),
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(const char *, name)
|
||||||
|
__field(int, len)
|
||||||
|
__array(u64, ctrls, 16)
|
||||||
|
__array(u64, values, 16)
|
||||||
|
),
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->name = type;
|
||||||
|
__entry->len = len;
|
||||||
|
memcpy(__entry->ctrls, control, len << 3);
|
||||||
|
memcpy(__entry->values, value, len << 3);
|
||||||
|
),
|
||||||
|
TP_printk("%d %s CTRL:%s VALUE:%s", __entry->len, __entry->name,
|
||||||
|
__print_array(__entry->ctrls, __entry->len, sizeof(__u64)),
|
||||||
|
__print_array(__entry->values, __entry->len, sizeof(__u64)))
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT(trap_reg,
|
||||||
|
TP_PROTO(const char *fn, int reg, bool is_write, u64 write_value),
|
||||||
|
TP_ARGS(fn, reg, is_write, write_value),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(const char *, fn)
|
||||||
|
__field(int, reg)
|
||||||
|
__field(bool, is_write)
|
||||||
|
__field(u64, write_value)
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->fn = fn;
|
||||||
|
__entry->reg = reg;
|
||||||
|
__entry->is_write = is_write;
|
||||||
|
__entry->write_value = write_value;
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_printk("%s %s reg %d (0x%08llx)", __entry->fn, __entry->is_write?"write to":"read from", __entry->reg, __entry->write_value)
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT(kvm_handle_sys_reg,
|
||||||
|
TP_PROTO(unsigned long hsr),
|
||||||
|
TP_ARGS(hsr),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(unsigned long, hsr)
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->hsr = hsr;
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_printk("HSR 0x%08lx", __entry->hsr)
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT(kvm_sys_access,
|
||||||
|
TP_PROTO(unsigned long vcpu_pc, struct sys_reg_params *params, const struct sys_reg_desc *reg),
|
||||||
|
TP_ARGS(vcpu_pc, params, reg),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(unsigned long, vcpu_pc)
|
||||||
|
__field(bool, is_write)
|
||||||
|
__field(const char *, name)
|
||||||
|
__field(u8, Op0)
|
||||||
|
__field(u8, Op1)
|
||||||
|
__field(u8, CRn)
|
||||||
|
__field(u8, CRm)
|
||||||
|
__field(u8, Op2)
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->vcpu_pc = vcpu_pc;
|
||||||
|
__entry->is_write = params->is_write;
|
||||||
|
__entry->name = reg->name;
|
||||||
|
__entry->Op0 = reg->Op0;
|
||||||
|
__entry->Op0 = reg->Op0;
|
||||||
|
__entry->Op1 = reg->Op1;
|
||||||
|
__entry->CRn = reg->CRn;
|
||||||
|
__entry->CRm = reg->CRm;
|
||||||
|
__entry->Op2 = reg->Op2;
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_printk("PC: %lx %s (%d,%d,%d,%d,%d) %s",
|
||||||
|
__entry->vcpu_pc, __entry->name ?: "UNKN",
|
||||||
|
__entry->Op0, __entry->Op1, __entry->CRn,
|
||||||
|
__entry->CRm, __entry->Op2,
|
||||||
|
__entry->is_write ? "write" : "read")
|
||||||
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT(kvm_set_guest_debug,
|
||||||
|
TP_PROTO(struct kvm_vcpu *vcpu, __u32 guest_debug),
|
||||||
|
TP_ARGS(vcpu, guest_debug),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(struct kvm_vcpu *, vcpu)
|
||||||
|
__field(__u32, guest_debug)
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->vcpu = vcpu;
|
||||||
|
__entry->guest_debug = guest_debug;
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_printk("vcpu: %p, flags: 0x%08x", __entry->vcpu, __entry->guest_debug)
|
||||||
|
);
|
||||||
|
|
||||||
|
#endif /* _TRACE_HANDLE_EXIT_ARM64_KVM_H */
|
||||||
|
|
||||||
|
#undef TRACE_INCLUDE_PATH
|
||||||
|
#define TRACE_INCLUDE_PATH .
|
||||||
|
#undef TRACE_INCLUDE_FILE
|
||||||
|
#define TRACE_INCLUDE_FILE trace_handle_exit
|
||||||
|
|
||||||
|
/* This part must be outside protection */
|
||||||
|
#include <trace/define_trace.h>
|
|
@ -7,7 +7,7 @@
|
||||||
#include <linux/kvm.h>
|
#include <linux/kvm.h>
|
||||||
#include <linux/kvm_host.h>
|
#include <linux/kvm_host.h>
|
||||||
#include <asm/kvm_emulate.h>
|
#include <asm/kvm_emulate.h>
|
||||||
#include "vgic.h"
|
#include "vgic/vgic.h"
|
||||||
#include "sys_regs.h"
|
#include "sys_regs.h"
|
||||||
|
|
||||||
static bool access_gic_ctlr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
|
static bool access_gic_ctlr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
|
||||||
|
|
|
@ -30,7 +30,7 @@ TRACE_EVENT(vgic_update_irq_pending,
|
||||||
#endif /* _TRACE_VGIC_H */
|
#endif /* _TRACE_VGIC_H */
|
||||||
|
|
||||||
#undef TRACE_INCLUDE_PATH
|
#undef TRACE_INCLUDE_PATH
|
||||||
#define TRACE_INCLUDE_PATH ../../virt/kvm/arm/vgic
|
#define TRACE_INCLUDE_PATH ../../arch/arm64/kvm/vgic
|
||||||
#undef TRACE_INCLUDE_FILE
|
#undef TRACE_INCLUDE_FILE
|
||||||
#define TRACE_INCLUDE_FILE trace
|
#define TRACE_INCLUDE_FILE trace
|
||||||
|
|
|
@ -630,12 +630,10 @@ int vgic_v3_probe(const struct gic_kvm_info *info)
|
||||||
if (kvm_vgic_global_state.vcpu_base == 0)
|
if (kvm_vgic_global_state.vcpu_base == 0)
|
||||||
kvm_info("disabling GICv2 emulation\n");
|
kvm_info("disabling GICv2 emulation\n");
|
||||||
|
|
||||||
#ifdef CONFIG_ARM64
|
|
||||||
if (cpus_have_const_cap(ARM64_WORKAROUND_CAVIUM_30115)) {
|
if (cpus_have_const_cap(ARM64_WORKAROUND_CAVIUM_30115)) {
|
||||||
group0_trap = true;
|
group0_trap = true;
|
||||||
group1_trap = true;
|
group1_trap = true;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
if (group0_trap || group1_trap || common_trap) {
|
if (group0_trap || group1_trap || common_trap) {
|
||||||
kvm_info("GICv3 sysreg trapping enabled ([%s%s%s], reduced performance)\n",
|
kvm_info("GICv3 sysreg trapping enabled ([%s%s%s], reduced performance)\n",
|
Loading…
Reference in New Issue
Block a user