Skip to content

Commit 60d2b2f

Browse files
committed
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.
2 parents f3996d4 + e325618 commit 60d2b2f

File tree

16 files changed

+218
-113
lines changed

16 files changed

+218
-113
lines changed

arch/riscv/include/asm/kvm_aia_aplic.h

Lines changed: 0 additions & 58 deletions
This file was deleted.

arch/riscv/include/asm/kvm_aia_imsic.h

Lines changed: 0 additions & 38 deletions
This file was deleted.

arch/riscv/kvm/aia.c

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010
#include <linux/kernel.h>
1111
#include <linux/bitops.h>
1212
#include <linux/irq.h>
13+
#include <linux/irqchip/riscv-imsic.h>
1314
#include <linux/irqdomain.h>
1415
#include <linux/kvm_host.h>
1516
#include <linux/percpu.h>
1617
#include <linux/spinlock.h>
1718
#include <asm/cpufeature.h>
18-
#include <asm/kvm_aia_imsic.h>
1919

2020
struct aia_hgei_control {
2121
raw_spinlock_t lock;
@@ -394,6 +394,8 @@ int kvm_riscv_aia_alloc_hgei(int cpu, struct kvm_vcpu *owner,
394394
{
395395
int ret = -ENOENT;
396396
unsigned long flags;
397+
const struct imsic_global_config *gc;
398+
const struct imsic_local_config *lc;
397399
struct aia_hgei_control *hgctrl = per_cpu_ptr(&aia_hgei, cpu);
398400

399401
if (!kvm_riscv_aia_available() || !hgctrl)
@@ -409,11 +411,14 @@ int kvm_riscv_aia_alloc_hgei(int cpu, struct kvm_vcpu *owner,
409411

410412
raw_spin_unlock_irqrestore(&hgctrl->lock, flags);
411413

412-
/* TODO: To be updated later by AIA IMSIC HW guest file support */
413-
if (hgei_va)
414-
*hgei_va = NULL;
415-
if (hgei_pa)
416-
*hgei_pa = 0;
414+
gc = imsic_get_global_config();
415+
lc = (gc) ? per_cpu_ptr(gc->local, cpu) : NULL;
416+
if (lc && ret > 0) {
417+
if (hgei_va)
418+
*hgei_va = lc->msi_va + (ret * IMSIC_MMIO_PAGE_SZ);
419+
if (hgei_pa)
420+
*hgei_pa = lc->msi_pa + (ret * IMSIC_MMIO_PAGE_SZ);
421+
}
417422

418423
return ret;
419424
}
@@ -605,9 +610,11 @@ void kvm_riscv_aia_disable(void)
605610
int kvm_riscv_aia_init(void)
606611
{
607612
int rc;
613+
const struct imsic_global_config *gc;
608614

609615
if (!riscv_isa_extension_available(NULL, SxAIA))
610616
return -ENODEV;
617+
gc = imsic_get_global_config();
611618

612619
/* Figure-out number of bits in HGEIE */
613620
csr_write(CSR_HGEIE, -1UL);
@@ -619,17 +626,17 @@ int kvm_riscv_aia_init(void)
619626
/*
620627
* Number of usable HGEI lines should be minimum of per-HART
621628
* IMSIC guest files and number of bits in HGEIE
622-
*
623-
* TODO: To be updated later by AIA IMSIC HW guest file support
624629
*/
625-
kvm_riscv_aia_nr_hgei = 0;
630+
if (gc)
631+
kvm_riscv_aia_nr_hgei = min((ulong)kvm_riscv_aia_nr_hgei,
632+
BIT(gc->guest_index_bits) - 1);
633+
else
634+
kvm_riscv_aia_nr_hgei = 0;
626635

627-
/*
628-
* Find number of guest MSI IDs
629-
*
630-
* TODO: To be updated later by AIA IMSIC HW guest file support
631-
*/
636+
/* Find number of guest MSI IDs */
632637
kvm_riscv_aia_max_ids = IMSIC_MAX_ID;
638+
if (gc && kvm_riscv_aia_nr_hgei)
639+
kvm_riscv_aia_max_ids = gc->nr_guest_ids + 1;
633640

634641
/* Initialize guest external interrupt line management */
635642
rc = aia_hgei_init();

arch/riscv/kvm/aia_aplic.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77
* Anup Patel <[email protected]>
88
*/
99

10+
#include <linux/irqchip/riscv-aplic.h>
1011
#include <linux/kvm_host.h>
1112
#include <linux/math.h>
1213
#include <linux/spinlock.h>
1314
#include <linux/swab.h>
1415
#include <kvm/iodev.h>
15-
#include <asm/kvm_aia_aplic.h>
1616

1717
struct aplic_irq {
1818
raw_spinlock_t lock;

arch/riscv/kvm/aia_device.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
*/
99

1010
#include <linux/bits.h>
11+
#include <linux/irqchip/riscv-imsic.h>
1112
#include <linux/kvm_host.h>
1213
#include <linux/uaccess.h>
13-
#include <asm/kvm_aia_imsic.h>
1414

1515
static void unlock_vcpus(struct kvm *kvm, int vcpu_lock_idx)
1616
{

arch/riscv/kvm/aia_imsic.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@
99

1010
#include <linux/atomic.h>
1111
#include <linux/bitmap.h>
12+
#include <linux/irqchip/riscv-imsic.h>
1213
#include <linux/kvm_host.h>
1314
#include <linux/math.h>
1415
#include <linux/spinlock.h>
1516
#include <linux/swab.h>
1617
#include <kvm/iodev.h>
1718
#include <asm/csr.h>
18-
#include <asm/kvm_aia_imsic.h>
1919

2020
#define IMSIC_MAX_EIX (IMSIC_MAX_ID / BITS_PER_TYPE(u64))
2121

arch/riscv/kvm/trace.h

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
/*
3+
* Tracepoints for RISC-V KVM
4+
*
5+
* Copyright 2024 Beijing ESWIN Computing Technology Co., Ltd.
6+
*
7+
*/
8+
#if !defined(_TRACE_KVM_H) || defined(TRACE_HEADER_MULTI_READ)
9+
#define _TRACE_KVM_H
10+
11+
#include <linux/tracepoint.h>
12+
13+
#undef TRACE_SYSTEM
14+
#define TRACE_SYSTEM kvm
15+
16+
TRACE_EVENT(kvm_entry,
17+
TP_PROTO(struct kvm_vcpu *vcpu),
18+
TP_ARGS(vcpu),
19+
20+
TP_STRUCT__entry(
21+
__field(unsigned long, pc)
22+
),
23+
24+
TP_fast_assign(
25+
__entry->pc = vcpu->arch.guest_context.sepc;
26+
),
27+
28+
TP_printk("PC: 0x016%lx", __entry->pc)
29+
);
30+
31+
TRACE_EVENT(kvm_exit,
32+
TP_PROTO(struct kvm_cpu_trap *trap),
33+
TP_ARGS(trap),
34+
35+
TP_STRUCT__entry(
36+
__field(unsigned long, sepc)
37+
__field(unsigned long, scause)
38+
__field(unsigned long, stval)
39+
__field(unsigned long, htval)
40+
__field(unsigned long, htinst)
41+
),
42+
43+
TP_fast_assign(
44+
__entry->sepc = trap->sepc;
45+
__entry->scause = trap->scause;
46+
__entry->stval = trap->stval;
47+
__entry->htval = trap->htval;
48+
__entry->htinst = trap->htinst;
49+
),
50+
51+
TP_printk("SEPC:0x%lx, SCAUSE:0x%lx, STVAL:0x%lx, HTVAL:0x%lx, HTINST:0x%lx",
52+
__entry->sepc,
53+
__entry->scause,
54+
__entry->stval,
55+
__entry->htval,
56+
__entry->htinst)
57+
);
58+
59+
#endif /* _TRACE_RSICV_KVM_H */
60+
61+
#undef TRACE_INCLUDE_PATH
62+
#define TRACE_INCLUDE_PATH .
63+
#undef TRACE_INCLUDE_FILE
64+
#define TRACE_INCLUDE_FILE trace
65+
66+
/* This part must be outside protection */
67+
#include <trace/define_trace.h>

arch/riscv/kvm/vcpu.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
#include <asm/cacheflush.h>
2222
#include <asm/kvm_vcpu_vector.h>
2323

24+
#define CREATE_TRACE_POINTS
25+
#include "trace.h"
26+
2427
const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
2528
KVM_GENERIC_VCPU_STATS(),
2629
STATS_DESC_COUNTER(VCPU, ecall_exit_stat),
@@ -831,6 +834,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
831834
*/
832835
kvm_riscv_local_tlb_sanitize(vcpu);
833836

837+
trace_kvm_entry(vcpu);
838+
834839
guest_timing_enter_irqoff();
835840

836841
kvm_riscv_vcpu_enter_exit(vcpu);
@@ -869,6 +874,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
869874

870875
local_irq_enable();
871876

877+
trace_kvm_exit(&trap);
878+
872879
preempt_enable();
873880

874881
kvm_vcpu_srcu_read_lock(vcpu);

arch/riscv/kvm/vcpu_exit.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,8 @@ int kvm_riscv_vcpu_exit(struct kvm_vcpu *vcpu, struct kvm_run *run,
185185
case EXC_INST_ILLEGAL:
186186
case EXC_LOAD_MISALIGNED:
187187
case EXC_STORE_MISALIGNED:
188+
case EXC_LOAD_ACCESS:
189+
case EXC_STORE_ACCESS:
188190
if (vcpu->arch.guest_context.hstatus & HSTATUS_SPV) {
189191
kvm_riscv_vcpu_trap_redirect(vcpu, trap);
190192
ret = 1;

tools/perf/arch/riscv/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ PERF_HAVE_DWARF_REGS := 1
33
endif
44
PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET := 1
55
PERF_HAVE_JITDUMP := 1
6+
HAVE_KVM_STAT_SUPPORT := 1

0 commit comments

Comments
 (0)