mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-02 16:44:10 +08:00
KVM/riscv changes for 6.11
- Redirect AMO load/store access fault traps to guest - Perf kvm stat support for RISC-V - Use HW IMSIC guest files when available -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEZdn75s5e6LHDQ+f/rUjsVaLHLAcFAmaRDW4ACgkQrUjsVaLH LAcU2Q/+IaL17M8D8ueOcbmCMqZRReyVdR9vH6q87E9NJYRH2dewZ656bNQnnU20 3hkbHOnF+NJAHJ0SfXwqNTVkJcQ8u+F3Xui4DlnFZ/lkpcWpvT/DRI5SCjIjiB/G SS/xWaRoSjvVJ7M8SyQhHUb2Y/tiDRXOOEl59ROGAKjzC3SY5/NJJ6g5FeE5akT8 /Q7WisZmc+ZH+a9EEOnl+Do7AFakrlaFM5KnweamfqSlSFrQB12YNpSsmA16k6X9 fqK/xPQTjeNakdQDPKw8INCbXkt8dsnlrPS6ivL0FCVf38aIJK0jxyLk9JbZGBK8 +dGCJOLVJontEyOVTYheq2oWv40xAlkXDjLNbnz+Nf7Sau8evFBpE2mPnbUBoGZi fu5UCddSw3CFwrFNM+qiBRPz/mNuUpCC4pCh8yJSCDZ374ew9ili2l3Nb2IvBcJ2 36lQuxlPVTPOv1J76/WtYwsSwaYBHHcBshweTJCkAkezp0d/wAE8bpaw3n4YnfSn l4u8/rrnEBb3Cd9cbW1Vk77Vw5e02RlZY5T+JLj7TXWSAFzstYxMpLsf097tqqcn vY1iTrpxTcJuY0Rra3SI05eKgliXI5snh08xlW2NiVxu8NjjZMU73b6tg3JX8FHl DMCafyQUBueV2jCpwbYribpbWv/UuUl92AKyJOwZ76W/e9YVBLA= =atJQ -----END PGP SIGNATURE----- Merge tag 'kvm-riscv-6.11-1' of https://github.com/kvm-riscv/linux into HEAD KVM/riscv changes for 6.11 - Redirect AMO load/store access fault traps to guest - Perf kvm stat support for RISC-V - Use guest files for IMSIC virtualization, when available ONE_REG support for the Zimop, Zcmop, Zca, Zcf, Zcd, Zcb and Zawrs ISA extensions is coming through the RISC-V tree.
This commit is contained in:
commit
60d2b2f3c4
@ -1,58 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (C) 2021 Western Digital Corporation or its affiliates.
|
||||
* Copyright (C) 2022 Ventana Micro Systems Inc.
|
||||
*/
|
||||
#ifndef __KVM_RISCV_AIA_IMSIC_H
|
||||
#define __KVM_RISCV_AIA_IMSIC_H
|
||||
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#define APLIC_MAX_IDC BIT(14)
|
||||
#define APLIC_MAX_SOURCE 1024
|
||||
|
||||
#define APLIC_DOMAINCFG 0x0000
|
||||
#define APLIC_DOMAINCFG_RDONLY 0x80000000
|
||||
#define APLIC_DOMAINCFG_IE BIT(8)
|
||||
#define APLIC_DOMAINCFG_DM BIT(2)
|
||||
#define APLIC_DOMAINCFG_BE BIT(0)
|
||||
|
||||
#define APLIC_SOURCECFG_BASE 0x0004
|
||||
#define APLIC_SOURCECFG_D BIT(10)
|
||||
#define APLIC_SOURCECFG_CHILDIDX_MASK 0x000003ff
|
||||
#define APLIC_SOURCECFG_SM_MASK 0x00000007
|
||||
#define APLIC_SOURCECFG_SM_INACTIVE 0x0
|
||||
#define APLIC_SOURCECFG_SM_DETACH 0x1
|
||||
#define APLIC_SOURCECFG_SM_EDGE_RISE 0x4
|
||||
#define APLIC_SOURCECFG_SM_EDGE_FALL 0x5
|
||||
#define APLIC_SOURCECFG_SM_LEVEL_HIGH 0x6
|
||||
#define APLIC_SOURCECFG_SM_LEVEL_LOW 0x7
|
||||
|
||||
#define APLIC_IRQBITS_PER_REG 32
|
||||
|
||||
#define APLIC_SETIP_BASE 0x1c00
|
||||
#define APLIC_SETIPNUM 0x1cdc
|
||||
|
||||
#define APLIC_CLRIP_BASE 0x1d00
|
||||
#define APLIC_CLRIPNUM 0x1ddc
|
||||
|
||||
#define APLIC_SETIE_BASE 0x1e00
|
||||
#define APLIC_SETIENUM 0x1edc
|
||||
|
||||
#define APLIC_CLRIE_BASE 0x1f00
|
||||
#define APLIC_CLRIENUM 0x1fdc
|
||||
|
||||
#define APLIC_SETIPNUM_LE 0x2000
|
||||
#define APLIC_SETIPNUM_BE 0x2004
|
||||
|
||||
#define APLIC_GENMSI 0x3000
|
||||
|
||||
#define APLIC_TARGET_BASE 0x3004
|
||||
#define APLIC_TARGET_HART_IDX_SHIFT 18
|
||||
#define APLIC_TARGET_HART_IDX_MASK 0x3fff
|
||||
#define APLIC_TARGET_GUEST_IDX_SHIFT 12
|
||||
#define APLIC_TARGET_GUEST_IDX_MASK 0x3f
|
||||
#define APLIC_TARGET_IPRIO_MASK 0xff
|
||||
#define APLIC_TARGET_EIID_MASK 0x7ff
|
||||
|
||||
#endif
|
@ -1,38 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (C) 2021 Western Digital Corporation or its affiliates.
|
||||
* Copyright (C) 2022 Ventana Micro Systems Inc.
|
||||
*/
|
||||
#ifndef __KVM_RISCV_AIA_IMSIC_H
|
||||
#define __KVM_RISCV_AIA_IMSIC_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <asm/csr.h>
|
||||
|
||||
#define IMSIC_MMIO_PAGE_SHIFT 12
|
||||
#define IMSIC_MMIO_PAGE_SZ (1UL << IMSIC_MMIO_PAGE_SHIFT)
|
||||
#define IMSIC_MMIO_PAGE_LE 0x00
|
||||
#define IMSIC_MMIO_PAGE_BE 0x04
|
||||
|
||||
#define IMSIC_MIN_ID 63
|
||||
#define IMSIC_MAX_ID 2048
|
||||
|
||||
#define IMSIC_EIDELIVERY 0x70
|
||||
|
||||
#define IMSIC_EITHRESHOLD 0x72
|
||||
|
||||
#define IMSIC_EIP0 0x80
|
||||
#define IMSIC_EIP63 0xbf
|
||||
#define IMSIC_EIPx_BITS 32
|
||||
|
||||
#define IMSIC_EIE0 0xc0
|
||||
#define IMSIC_EIE63 0xff
|
||||
#define IMSIC_EIEx_BITS 32
|
||||
|
||||
#define IMSIC_FIRST IMSIC_EIDELIVERY
|
||||
#define IMSIC_LAST IMSIC_EIE63
|
||||
|
||||
#define IMSIC_MMIO_SETIPNUM_LE 0x00
|
||||
#define IMSIC_MMIO_SETIPNUM_BE 0x04
|
||||
|
||||
#endif
|
@ -10,12 +10,12 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/irqchip/riscv-imsic.h>
|
||||
#include <linux/irqdomain.h>
|
||||
#include <linux/kvm_host.h>
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <asm/cpufeature.h>
|
||||
#include <asm/kvm_aia_imsic.h>
|
||||
|
||||
struct aia_hgei_control {
|
||||
raw_spinlock_t lock;
|
||||
@ -394,6 +394,8 @@ int kvm_riscv_aia_alloc_hgei(int cpu, struct kvm_vcpu *owner,
|
||||
{
|
||||
int ret = -ENOENT;
|
||||
unsigned long flags;
|
||||
const struct imsic_global_config *gc;
|
||||
const struct imsic_local_config *lc;
|
||||
struct aia_hgei_control *hgctrl = per_cpu_ptr(&aia_hgei, cpu);
|
||||
|
||||
if (!kvm_riscv_aia_available() || !hgctrl)
|
||||
@ -409,11 +411,14 @@ int kvm_riscv_aia_alloc_hgei(int cpu, struct kvm_vcpu *owner,
|
||||
|
||||
raw_spin_unlock_irqrestore(&hgctrl->lock, flags);
|
||||
|
||||
/* TODO: To be updated later by AIA IMSIC HW guest file support */
|
||||
if (hgei_va)
|
||||
*hgei_va = NULL;
|
||||
if (hgei_pa)
|
||||
*hgei_pa = 0;
|
||||
gc = imsic_get_global_config();
|
||||
lc = (gc) ? per_cpu_ptr(gc->local, cpu) : NULL;
|
||||
if (lc && ret > 0) {
|
||||
if (hgei_va)
|
||||
*hgei_va = lc->msi_va + (ret * IMSIC_MMIO_PAGE_SZ);
|
||||
if (hgei_pa)
|
||||
*hgei_pa = lc->msi_pa + (ret * IMSIC_MMIO_PAGE_SZ);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -605,9 +610,11 @@ void kvm_riscv_aia_disable(void)
|
||||
int kvm_riscv_aia_init(void)
|
||||
{
|
||||
int rc;
|
||||
const struct imsic_global_config *gc;
|
||||
|
||||
if (!riscv_isa_extension_available(NULL, SxAIA))
|
||||
return -ENODEV;
|
||||
gc = imsic_get_global_config();
|
||||
|
||||
/* Figure-out number of bits in HGEIE */
|
||||
csr_write(CSR_HGEIE, -1UL);
|
||||
@ -619,17 +626,17 @@ int kvm_riscv_aia_init(void)
|
||||
/*
|
||||
* Number of usable HGEI lines should be minimum of per-HART
|
||||
* IMSIC guest files and number of bits in HGEIE
|
||||
*
|
||||
* TODO: To be updated later by AIA IMSIC HW guest file support
|
||||
*/
|
||||
kvm_riscv_aia_nr_hgei = 0;
|
||||
if (gc)
|
||||
kvm_riscv_aia_nr_hgei = min((ulong)kvm_riscv_aia_nr_hgei,
|
||||
BIT(gc->guest_index_bits) - 1);
|
||||
else
|
||||
kvm_riscv_aia_nr_hgei = 0;
|
||||
|
||||
/*
|
||||
* Find number of guest MSI IDs
|
||||
*
|
||||
* TODO: To be updated later by AIA IMSIC HW guest file support
|
||||
*/
|
||||
/* Find number of guest MSI IDs */
|
||||
kvm_riscv_aia_max_ids = IMSIC_MAX_ID;
|
||||
if (gc && kvm_riscv_aia_nr_hgei)
|
||||
kvm_riscv_aia_max_ids = gc->nr_guest_ids + 1;
|
||||
|
||||
/* Initialize guest external interrupt line management */
|
||||
rc = aia_hgei_init();
|
||||
|
@ -7,12 +7,12 @@
|
||||
* Anup Patel <apatel@ventanamicro.com>
|
||||
*/
|
||||
|
||||
#include <linux/irqchip/riscv-aplic.h>
|
||||
#include <linux/kvm_host.h>
|
||||
#include <linux/math.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/swab.h>
|
||||
#include <kvm/iodev.h>
|
||||
#include <asm/kvm_aia_aplic.h>
|
||||
|
||||
struct aplic_irq {
|
||||
raw_spinlock_t lock;
|
||||
|
@ -8,9 +8,9 @@
|
||||
*/
|
||||
|
||||
#include <linux/bits.h>
|
||||
#include <linux/irqchip/riscv-imsic.h>
|
||||
#include <linux/kvm_host.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/kvm_aia_imsic.h>
|
||||
|
||||
static void unlock_vcpus(struct kvm *kvm, int vcpu_lock_idx)
|
||||
{
|
||||
|
@ -9,13 +9,13 @@
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/irqchip/riscv-imsic.h>
|
||||
#include <linux/kvm_host.h>
|
||||
#include <linux/math.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/swab.h>
|
||||
#include <kvm/iodev.h>
|
||||
#include <asm/csr.h>
|
||||
#include <asm/kvm_aia_imsic.h>
|
||||
|
||||
#define IMSIC_MAX_EIX (IMSIC_MAX_ID / BITS_PER_TYPE(u64))
|
||||
|
||||
|
67
arch/riscv/kvm/trace.h
Normal file
67
arch/riscv/kvm/trace.h
Normal file
@ -0,0 +1,67 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Tracepoints for RISC-V KVM
|
||||
*
|
||||
* Copyright 2024 Beijing ESWIN Computing Technology Co., Ltd.
|
||||
*
|
||||
*/
|
||||
#if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
|
||||
#define _TRACE_KVM_H
|
||||
|
||||
#include <linux/tracepoint.h>
|
||||
|
||||
#undef TRACE_SYSTEM
|
||||
#define TRACE_SYSTEM kvm
|
||||
|
||||
TRACE_EVENT(kvm_entry,
|
||||
TP_PROTO(struct kvm_vcpu *vcpu),
|
||||
TP_ARGS(vcpu),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned long, pc)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->pc = vcpu->arch.guest_context.sepc;
|
||||
),
|
||||
|
||||
TP_printk("PC: 0x016%lx", __entry->pc)
|
||||
);
|
||||
|
||||
TRACE_EVENT(kvm_exit,
|
||||
TP_PROTO(struct kvm_cpu_trap *trap),
|
||||
TP_ARGS(trap),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned long, sepc)
|
||||
__field(unsigned long, scause)
|
||||
__field(unsigned long, stval)
|
||||
__field(unsigned long, htval)
|
||||
__field(unsigned long, htinst)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->sepc = trap->sepc;
|
||||
__entry->scause = trap->scause;
|
||||
__entry->stval = trap->stval;
|
||||
__entry->htval = trap->htval;
|
||||
__entry->htinst = trap->htinst;
|
||||
),
|
||||
|
||||
TP_printk("SEPC:0x%lx, SCAUSE:0x%lx, STVAL:0x%lx, HTVAL:0x%lx, HTINST:0x%lx",
|
||||
__entry->sepc,
|
||||
__entry->scause,
|
||||
__entry->stval,
|
||||
__entry->htval,
|
||||
__entry->htinst)
|
||||
);
|
||||
|
||||
#endif /* _TRACE_RSICV_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>
|
@ -21,6 +21,9 @@
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/kvm_vcpu_vector.h>
|
||||
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include "trace.h"
|
||||
|
||||
const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
|
||||
KVM_GENERIC_VCPU_STATS(),
|
||||
STATS_DESC_COUNTER(VCPU, ecall_exit_stat),
|
||||
@ -831,6 +834,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
|
||||
*/
|
||||
kvm_riscv_local_tlb_sanitize(vcpu);
|
||||
|
||||
trace_kvm_entry(vcpu);
|
||||
|
||||
guest_timing_enter_irqoff();
|
||||
|
||||
kvm_riscv_vcpu_enter_exit(vcpu);
|
||||
@ -869,6 +874,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
|
||||
|
||||
local_irq_enable();
|
||||
|
||||
trace_kvm_exit(&trap);
|
||||
|
||||
preempt_enable();
|
||||
|
||||
kvm_vcpu_srcu_read_lock(vcpu);
|
||||
|
@ -185,6 +185,8 @@ int kvm_riscv_vcpu_exit(struct kvm_vcpu *vcpu, struct kvm_run *run,
|
||||
case EXC_INST_ILLEGAL:
|
||||
case EXC_LOAD_MISALIGNED:
|
||||
case EXC_STORE_MISALIGNED:
|
||||
case EXC_LOAD_ACCESS:
|
||||
case EXC_STORE_ACCESS:
|
||||
if (vcpu->arch.guest_context.hstatus & HSTATUS_SPV) {
|
||||
kvm_riscv_vcpu_trap_redirect(vcpu, trap);
|
||||
ret = 1;
|
||||
|
@ -3,3 +3,4 @@ PERF_HAVE_DWARF_REGS := 1
|
||||
endif
|
||||
PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1
|
||||
PERF_HAVE_JITDUMP := 1
|
||||
HAVE_KVM_STAT_SUPPORT := 1
|
||||
|
@ -1,5 +1,6 @@
|
||||
perf-y += perf_regs.o
|
||||
perf-y += header.o
|
||||
|
||||
perf-$(CONFIG_LIBTRACEEVENT) += kvm-stat.o
|
||||
perf-$(CONFIG_DWARF) += dwarf-regs.o
|
||||
perf-$(CONFIG_LIBDW_DWARF_UNWIND) += unwind-libdw.o
|
||||
|
78
tools/perf/arch/riscv/util/kvm-stat.c
Normal file
78
tools/perf/arch/riscv/util/kvm-stat.c
Normal file
@ -0,0 +1,78 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Arch specific functions for perf kvm stat.
|
||||
*
|
||||
* Copyright 2024 Beijing ESWIN Computing Technology Co., Ltd.
|
||||
*
|
||||
*/
|
||||
#include <errno.h>
|
||||
#include <memory.h>
|
||||
#include "../../../util/evsel.h"
|
||||
#include "../../../util/kvm-stat.h"
|
||||
#include "riscv_exception_types.h"
|
||||
#include "debug.h"
|
||||
|
||||
define_exit_reasons_table(riscv_exit_reasons, kvm_riscv_exception_class);
|
||||
|
||||
const char *vcpu_id_str = "id";
|
||||
const char *kvm_exit_reason = "scause";
|
||||
const char *kvm_entry_trace = "kvm:kvm_entry";
|
||||
const char *kvm_exit_trace = "kvm:kvm_exit";
|
||||
|
||||
const char *kvm_events_tp[] = {
|
||||
"kvm:kvm_entry",
|
||||
"kvm:kvm_exit",
|
||||
NULL,
|
||||
};
|
||||
|
||||
static void event_get_key(struct evsel *evsel,
|
||||
struct perf_sample *sample,
|
||||
struct event_key *key)
|
||||
{
|
||||
key->info = 0;
|
||||
key->key = evsel__intval(evsel, sample, kvm_exit_reason);
|
||||
key->exit_reasons = riscv_exit_reasons;
|
||||
}
|
||||
|
||||
static bool event_begin(struct evsel *evsel,
|
||||
struct perf_sample *sample __maybe_unused,
|
||||
struct event_key *key __maybe_unused)
|
||||
{
|
||||
return evsel__name_is(evsel, kvm_entry_trace);
|
||||
}
|
||||
|
||||
static bool event_end(struct evsel *evsel,
|
||||
struct perf_sample *sample,
|
||||
struct event_key *key)
|
||||
{
|
||||
if (evsel__name_is(evsel, kvm_exit_trace)) {
|
||||
event_get_key(evsel, sample, key);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static struct kvm_events_ops exit_events = {
|
||||
.is_begin_event = event_begin,
|
||||
.is_end_event = event_end,
|
||||
.decode_key = exit_event_decode_key,
|
||||
.name = "VM-EXIT"
|
||||
};
|
||||
|
||||
struct kvm_reg_events_ops kvm_reg_events_ops[] = {
|
||||
{
|
||||
.name = "vmexit",
|
||||
.ops = &exit_events,
|
||||
},
|
||||
{ NULL, NULL },
|
||||
};
|
||||
|
||||
const char * const kvm_skip_events[] = {
|
||||
NULL,
|
||||
};
|
||||
|
||||
int cpu_isa_init(struct perf_kvm_stat *kvm, const char *cpuid __maybe_unused)
|
||||
{
|
||||
kvm->exit_reasons_isa = "riscv64";
|
||||
return 0;
|
||||
}
|
35
tools/perf/arch/riscv/util/riscv_exception_types.h
Normal file
35
tools/perf/arch/riscv/util/riscv_exception_types.h
Normal file
@ -0,0 +1,35 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#ifndef ARCH_PERF_RISCV_EXCEPTION_TYPES_H
|
||||
#define ARCH_PERF_RISCV_EXCEPTION_TYPES_H
|
||||
|
||||
#define EXC_INST_MISALIGNED 0
|
||||
#define EXC_INST_ACCESS 1
|
||||
#define EXC_INST_ILLEGAL 2
|
||||
#define EXC_BREAKPOINT 3
|
||||
#define EXC_LOAD_MISALIGNED 4
|
||||
#define EXC_LOAD_ACCESS 5
|
||||
#define EXC_STORE_MISALIGNED 6
|
||||
#define EXC_STORE_ACCESS 7
|
||||
#define EXC_SYSCALL 8
|
||||
#define EXC_HYPERVISOR_SYSCALL 9
|
||||
#define EXC_SUPERVISOR_SYSCALL 10
|
||||
#define EXC_INST_PAGE_FAULT 12
|
||||
#define EXC_LOAD_PAGE_FAULT 13
|
||||
#define EXC_STORE_PAGE_FAULT 15
|
||||
#define EXC_INST_GUEST_PAGE_FAULT 20
|
||||
#define EXC_LOAD_GUEST_PAGE_FAULT 21
|
||||
#define EXC_VIRTUAL_INST_FAULT 22
|
||||
#define EXC_STORE_GUEST_PAGE_FAULT 23
|
||||
|
||||
#define EXC(x) {EXC_##x, #x }
|
||||
|
||||
#define kvm_riscv_exception_class \
|
||||
EXC(INST_MISALIGNED), EXC(INST_ACCESS), EXC(INST_ILLEGAL), \
|
||||
EXC(BREAKPOINT), EXC(LOAD_MISALIGNED), EXC(LOAD_ACCESS), \
|
||||
EXC(STORE_MISALIGNED), EXC(STORE_ACCESS), EXC(SYSCALL), \
|
||||
EXC(HYPERVISOR_SYSCALL), EXC(SUPERVISOR_SYSCALL), \
|
||||
EXC(INST_PAGE_FAULT), EXC(LOAD_PAGE_FAULT), EXC(STORE_PAGE_FAULT), \
|
||||
EXC(INST_GUEST_PAGE_FAULT), EXC(LOAD_GUEST_PAGE_FAULT), \
|
||||
EXC(VIRTUAL_INST_FAULT), EXC(STORE_GUEST_PAGE_FAULT)
|
||||
|
||||
#endif /* ARCH_PERF_RISCV_EXCEPTION_TYPES_H */
|
@ -9,6 +9,7 @@
|
||||
|
||||
#include "kvm_util.h"
|
||||
#include "processor.h"
|
||||
#include "sbi.h"
|
||||
|
||||
void *ucall_arch_get_ucall(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
|
@ -6,6 +6,7 @@
|
||||
*
|
||||
*/
|
||||
#include "kvm_util.h"
|
||||
#include "ucall_common.h"
|
||||
|
||||
#define LABEL_ADDRESS(v) ((uint64_t)&(v))
|
||||
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include "processor.h"
|
||||
#include "sbi.h"
|
||||
#include "arch_timer.h"
|
||||
#include "ucall_common.h"
|
||||
|
||||
/* Maximum counters(firmware + hardware) */
|
||||
#define RISCV_MAX_PMU_COUNTERS 64
|
||||
|
Loading…
Reference in New Issue
Block a user