Skip to content

Commit 0cdcc99

Browse files
committed
Merge tag 'kvm-riscv-6.12-1' of https://github.com/kvm-riscv/linux into HEAD
KVM/riscv changes for 6.12 - Fix sbiret init before forwarding to userspace - Don't zero-out PMU snapshot area before freeing data - Allow legacy PMU access from guest - Fix to allow hpmcounter31 from the guest
2 parents 1a37119 + 5aa0929 commit 0cdcc99

File tree

3 files changed

+21
-18
lines changed

3 files changed

+21
-18
lines changed

arch/riscv/include/asm/kvm_vcpu_pmu.h

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#define __KVM_VCPU_RISCV_PMU_H
1111

1212
#include <linux/perf/riscv_pmu.h>
13+
#include <asm/kvm_vcpu_insn.h>
1314
#include <asm/sbi.h>
1415

1516
#ifdef CONFIG_RISCV_PMU_SBI
@@ -64,11 +65,11 @@ struct kvm_pmu {
6465

6566
#if defined(CONFIG_32BIT)
6667
#define KVM_RISCV_VCPU_HPMCOUNTER_CSR_FUNCS \
67-
{.base = CSR_CYCLEH, .count = 31, .func = kvm_riscv_vcpu_pmu_read_hpm }, \
68-
{.base = CSR_CYCLE, .count = 31, .func = kvm_riscv_vcpu_pmu_read_hpm },
68+
{.base = CSR_CYCLEH, .count = 32, .func = kvm_riscv_vcpu_pmu_read_hpm }, \
69+
{.base = CSR_CYCLE, .count = 32, .func = kvm_riscv_vcpu_pmu_read_hpm },
6970
#else
7071
#define KVM_RISCV_VCPU_HPMCOUNTER_CSR_FUNCS \
71-
{.base = CSR_CYCLE, .count = 31, .func = kvm_riscv_vcpu_pmu_read_hpm },
72+
{.base = CSR_CYCLE, .count = 32, .func = kvm_riscv_vcpu_pmu_read_hpm },
7273
#endif
7374

7475
int kvm_riscv_vcpu_pmu_incr_fw(struct kvm_vcpu *vcpu, unsigned long fid);
@@ -104,8 +105,20 @@ void kvm_riscv_vcpu_pmu_reset(struct kvm_vcpu *vcpu);
104105
struct kvm_pmu {
105106
};
106107

108+
static inline int kvm_riscv_vcpu_pmu_read_legacy(struct kvm_vcpu *vcpu, unsigned int csr_num,
109+
unsigned long *val, unsigned long new_val,
110+
unsigned long wr_mask)
111+
{
112+
if (csr_num == CSR_CYCLE || csr_num == CSR_INSTRET) {
113+
*val = 0;
114+
return KVM_INSN_CONTINUE_NEXT_SEPC;
115+
} else {
116+
return KVM_INSN_ILLEGAL_TRAP;
117+
}
118+
}
119+
107120
#define KVM_RISCV_VCPU_HPMCOUNTER_CSR_FUNCS \
108-
{.base = 0, .count = 0, .func = NULL },
121+
{.base = CSR_CYCLE, .count = 3, .func = kvm_riscv_vcpu_pmu_read_legacy },
109122

110123
static inline void kvm_riscv_vcpu_pmu_init(struct kvm_vcpu *vcpu) {}
111124
static inline int kvm_riscv_vcpu_pmu_incr_fw(struct kvm_vcpu *vcpu, unsigned long fid)

arch/riscv/kvm/vcpu_pmu.c

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -391,19 +391,9 @@ int kvm_riscv_vcpu_pmu_read_hpm(struct kvm_vcpu *vcpu, unsigned int csr_num,
391391
static void kvm_pmu_clear_snapshot_area(struct kvm_vcpu *vcpu)
392392
{
393393
struct kvm_pmu *kvpmu = vcpu_to_pmu(vcpu);
394-
int snapshot_area_size = sizeof(struct riscv_pmu_snapshot_data);
395394

396-
if (kvpmu->sdata) {
397-
if (kvpmu->snapshot_addr != INVALID_GPA) {
398-
memset(kvpmu->sdata, 0, snapshot_area_size);
399-
kvm_vcpu_write_guest(vcpu, kvpmu->snapshot_addr,
400-
kvpmu->sdata, snapshot_area_size);
401-
} else {
402-
pr_warn("snapshot address invalid\n");
403-
}
404-
kfree(kvpmu->sdata);
405-
kvpmu->sdata = NULL;
406-
}
395+
kfree(kvpmu->sdata);
396+
kvpmu->sdata = NULL;
407397
kvpmu->snapshot_addr = INVALID_GPA;
408398
}
409399

arch/riscv/kvm/vcpu_sbi.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,8 @@ void kvm_riscv_vcpu_sbi_forward(struct kvm_vcpu *vcpu, struct kvm_run *run)
127127
run->riscv_sbi.args[3] = cp->a3;
128128
run->riscv_sbi.args[4] = cp->a4;
129129
run->riscv_sbi.args[5] = cp->a5;
130-
run->riscv_sbi.ret[0] = cp->a0;
131-
run->riscv_sbi.ret[1] = cp->a1;
130+
run->riscv_sbi.ret[0] = SBI_ERR_NOT_SUPPORTED;
131+
run->riscv_sbi.ret[1] = 0;
132132
}
133133

134134
void kvm_riscv_vcpu_sbi_system_reset(struct kvm_vcpu *vcpu,

0 commit comments

Comments
 (0)