在 2023/12/28 下午4:40, Tianrui Zhao 写道:
> 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>
> Signed-off-by: xianglai li <lixianglai@loongson.cn>
> ---
> target/loongarch/cpu.h | 2 ++
> target/loongarch/kvm.c | 23 +++++++++++++++++++++++
> target/loongarch/trace-events | 2 ++
> 3 files changed, 27 insertions(+)
Reviewed-by: Song Gao <gaosong@loongson.cn>
Thanks.
Song Gao
> diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
> index f4a89bd626..8ebd6fa1a7 100644
> --- a/target/loongarch/cpu.h
> +++ b/target/loongarch/cpu.h
> @@ -381,6 +381,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;
> };
>
> /**
> diff --git a/target/loongarch/kvm.c b/target/loongarch/kvm.c
> index 29944b9ef8..85e7aeb083 100644
> --- a/target/loongarch/kvm.c
> +++ b/target/loongarch/kvm.c
> @@ -617,8 +617,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_set_one_reg(cs, KVM_REG_LOONGARCH_COUNTER,
> + &cpu->kvm_state_counter);
> + if (ret < 0) {
> + trace_kvm_failed_put_counter(strerror(errno));
> + }
> + } else {
> + ret = kvm_get_one_reg(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 6827ab566a..937c3c7c0c 100644
> --- a/target/loongarch/trace-events
> +++ b/target/loongarch/trace-events
> @@ -7,5 +7,7 @@ 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"
> kvm_failed_get_cpucfg(const char *msg) "Failed to get cpucfg from KVM: %s"
> kvm_failed_put_cpucfg(const char *msg) "Failed to put cpucfg into KVM: %s"