[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH RFC v3 6/9] target/loongarch: Implement kvm_arch_init_vcpu
|
From: |
Tianrui Zhao |
|
Subject: |
[PATCH RFC v3 6/9] target/loongarch: Implement kvm_arch_init_vcpu |
|
Date: |
Sat, 6 May 2023 10:24:19 +0800 |
Implement kvm_arch_init_vcpu interface for loongarch,
in this function, we register VM change state handler.
And when VM state changes to running, the counter value
should be put into kvm to keep consistent with kvm,
and when state change to stop, counter value should be
refreshed from kvm.
Signed-off-by: Tianrui Zhao <zhaotianrui@loongson.cn>
---
target/loongarch/cpu.h | 2 ++
target/loongarch/kvm.c | 23 +++++++++++++++++++++++
target/loongarch/trace-events | 2 ++
3 files changed, 27 insertions(+)
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
index cf3fce4577..beb070de25 100644
--- a/target/loongarch/cpu.h
+++ b/target/loongarch/cpu.h
@@ -350,6 +350,8 @@ struct ArchCPU {
/* 'compatible' string for this CPU for Linux device trees */
const char *dtb_compatible;
+ /* used by KVM_REG_LOONGARCH_COUNTER ioctl to access guest time counters */
+ uint64_t kvm_state_counter;
};
#define TYPE_LOONGARCH_CPU "loongarch-cpu"
diff --git a/target/loongarch/kvm.c b/target/loongarch/kvm.c
index dac65f546e..5a07cc58c8 100644
--- a/target/loongarch/kvm.c
+++ b/target/loongarch/kvm.c
@@ -399,8 +399,31 @@ int kvm_arch_put_registers(CPUState *cs, int level)
return ret;
}
+static void kvm_loongarch_vm_stage_change(void *opaque, bool running,
+ RunState state)
+{
+ int ret;
+ CPUState *cs = opaque;
+ LoongArchCPU *cpu = LOONGARCH_CPU(cs);
+
+ if (running) {
+ ret = kvm_larch_putq(cs, KVM_REG_LOONGARCH_COUNTER,
+ &cpu->kvm_state_counter);
+ if (ret < 0) {
+ trace_kvm_failed_put_counter(strerror(errno));
+ }
+ } else {
+ ret = kvm_larch_getq(cs, KVM_REG_LOONGARCH_COUNTER,
+ &cpu->kvm_state_counter);
+ if (ret < 0) {
+ trace_kvm_failed_get_counter(strerror(errno));
+ }
+ }
+}
+
int kvm_arch_init_vcpu(CPUState *cs)
{
+ qemu_add_vm_change_state_handler(kvm_loongarch_vm_stage_change, cs);
return 0;
}
diff --git a/target/loongarch/trace-events b/target/loongarch/trace-events
index 67817fee67..6926bbe399 100644
--- a/target/loongarch/trace-events
+++ b/target/loongarch/trace-events
@@ -9,3 +9,5 @@ kvm_failed_get_fpu(const char *msg) "Failed to get fpu from
KVM: %s"
kvm_failed_put_fpu(const char *msg) "Failed to put fpu into KVM: %s"
kvm_failed_get_mpstate(const char *msg) "Failed to get mp_state from KVM: %s"
kvm_failed_put_mpstate(const char *msg) "Failed to put mp_state into KVM: %s"
+kvm_failed_get_counter(const char *msg) "Failed to get counter from KVM: %s"
+kvm_failed_put_counter(const char *msg) "Failed to put counter into KVM: %s"
--
2.31.1
- [PATCH RFC v3 0/9] Add loongarch kvm accel support, Tianrui Zhao, 2023/05/05
- [PATCH RFC v3 2/9] target/loongarch: Define some kvm_arch interfaces, Tianrui Zhao, 2023/05/05
- [PATCH RFC v3 1/9] linux-headers: Add KVM headers for loongarch, Tianrui Zhao, 2023/05/05
- [PATCH RFC v3 9/9] target/loongarch: Add loongarch kvm into meson build, Tianrui Zhao, 2023/05/05
- [PATCH RFC v3 5/9] target/loongarch: Implement kvm_arch_init function, Tianrui Zhao, 2023/05/05
- [PATCH RFC v3 6/9] target/loongarch: Implement kvm_arch_init_vcpu,
Tianrui Zhao <=
- [PATCH RFC v3 4/9] target/loongarch: Implement kvm get/set registers, Tianrui Zhao, 2023/05/05
- [PATCH RFC v3 3/9] target/loongarch: Supplement vcpu env initial when vcpu reset, Tianrui Zhao, 2023/05/05
- [PATCH RFC v3 8/9] target/loongarch: Implement set vcpu intr for kvm, Tianrui Zhao, 2023/05/05
- [PATCH RFC v3 7/9] target/loongarch: Implement kvm_arch_handle_exit, Tianrui Zhao, 2023/05/05