Again not all arches do something for this so default to set MEMTXATTRS_UNSPECIFIED for any potential MMIO we might handle next. Signed-off-by: Alex Bennée --- include/accel/kvm/cpu-ops.h | 8 ++++++++ include/system/kvm.h | 2 -- target/i386/kvm/kvm_i386.h | 1 + accel/kvm/kvm-all.c | 6 +++++- target/arm/kvm.c | 3 ++- target/i386/kvm/kvm-cpu.c | 1 + target/i386/kvm/kvm.c | 2 +- target/loongarch/kvm/kvm.c | 5 ----- target/ppc/kvm.c | 5 ----- target/riscv/kvm/kvm-cpu.c | 5 ----- target/s390x/kvm/kvm.c | 5 ----- 11 files changed, 18 insertions(+), 25 deletions(-) diff --git a/include/accel/kvm/cpu-ops.h b/include/accel/kvm/cpu-ops.h index 2c04fa5adf5..e74081eb133 100644 --- a/include/accel/kvm/cpu-ops.h +++ b/include/accel/kvm/cpu-ops.h @@ -23,9 +23,17 @@ struct kvm_run; * that need to inject pending events (e.g. x86 NMI/SMI) or verify * injected exceptions (e.g. ARM external data aborts). * May be NULL if the target does not require pre-run handling. + * @post_run: Optional callback executed immediately after the KVM_RUN ioctl + * returns in the vCPU thread loop. Used by architectures to + * inspect or process hardware registers/flags (e.g. x86 APIC/TPR + * or ARM timer interrupt synchronization) and return the + * #MemTxAttrs to use for handling MMIO exits. + * May be NULL if the target does not require post-run handling, + * in which case MEMTXATTRS_UNSPECIFIED is assumed. */ typedef struct KVMCPUOps { void (*pre_run)(CPUState *cpu, struct kvm_run *run); + MemTxAttrs (*post_run)(CPUState *cpu, struct kvm_run *run); } KVMCPUOps; #define TYPE_KVM_ACCEL_CPU "kvm-accel-cpu" diff --git a/include/system/kvm.h b/include/system/kvm.h index e9d7b86ea4a..82785d37600 100644 --- a/include/system/kvm.h +++ b/include/system/kvm.h @@ -333,8 +333,6 @@ extern const KVMCapabilityInfo kvm_arch_required_capabilities[]; void kvm_arch_accel_class_init(ObjectClass *oc); -MemTxAttrs kvm_arch_post_run(CPUState *cpu, struct kvm_run *run); - int kvm_arch_handle_exit(CPUState *cpu, struct kvm_run *run); int kvm_arch_process_async_events(CPUState *cpu); diff --git a/target/i386/kvm/kvm_i386.h b/target/i386/kvm/kvm_i386.h index 218ae8f09ce..6fb1da6a40c 100644 --- a/target/i386/kvm/kvm_i386.h +++ b/target/i386/kvm/kvm_i386.h @@ -34,6 +34,7 @@ bool kvm_hyperv_expand_features(X86CPU *cpu, Error **errp); int kvm_get_vm_type(MachineState *ms); void kvm_arch_reset_vcpu(X86CPU *cs); void x86_kvm_pre_run(CPUState *cpu, struct kvm_run *run); +MemTxAttrs x86_kvm_post_run(CPUState *cpu, struct kvm_run *run); void kvm_arch_after_reset_vcpu(X86CPU *cpu); void kvm_arch_do_init_vcpu(X86CPU *cs); uint32_t kvm_arch_get_supported_cpuid(KVMState *env, uint32_t function, diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index 4dca5467f4a..41229774068 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -3500,7 +3500,11 @@ int kvm_cpu_exec(CPUState *cpu) * as true, cpu->exit_request will always read as true. */ - attrs = kvm_arch_post_run(cpu, run); + if (ops->post_run) { + attrs = ops->post_run(cpu, run); + } else { + attrs = MEMTXATTRS_UNSPECIFIED; + } #ifdef KVM_HAVE_MCE_INJECTION if (unlikely(have_sigbus_pending)) { diff --git a/target/arm/kvm.c b/target/arm/kvm.c index 4475fd1a9d9..d5f9b7c088c 100644 --- a/target/arm/kvm.c +++ b/target/arm/kvm.c @@ -1404,7 +1404,7 @@ static void arm_kvm_pre_run(CPUState *cs, struct kvm_run *run) } } -MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run) +static MemTxAttrs arm_kvm_post_run(CPUState *cs, struct kvm_run *run) { ARMCPU *cpu; uint32_t switched_level; @@ -2667,6 +2667,7 @@ void arm_gic_cap_kvm_probe(GICCapability *v2, GICCapability *v3) static const KVMCPUOps arm_kvm_cpu_ops = { .pre_run = arm_kvm_pre_run, + .post_run = arm_kvm_post_run, }; static void kvm_cpu_accel_class_init(ObjectClass *oc, const void *data) diff --git a/target/i386/kvm/kvm-cpu.c b/target/i386/kvm/kvm-cpu.c index eab5ab46d45..64af85cd113 100644 --- a/target/i386/kvm/kvm-cpu.c +++ b/target/i386/kvm/kvm-cpu.c @@ -236,6 +236,7 @@ static void kvm_cpu_instance_init(CPUState *cs) static const KVMCPUOps x86_kvm_cpu_ops = { .pre_run = x86_kvm_pre_run, + .post_run = x86_kvm_post_run, }; static void kvm_cpu_accel_class_init(ObjectClass *oc, const void *data) diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index e9bcda70dac..a1b91d502f0 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -5995,7 +5995,7 @@ static void kvm_rate_limit_on_bus_lock(void) } } -MemTxAttrs kvm_arch_post_run(CPUState *cpu, struct kvm_run *run) +MemTxAttrs x86_kvm_post_run(CPUState *cpu, struct kvm_run *run) { X86CPU *x86_cpu = X86_CPU(cpu); CPUX86State *env = &x86_cpu->env; diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c index b8fb2094062..192538c0aa9 100644 --- a/target/loongarch/kvm/kvm.c +++ b/target/loongarch/kvm/kvm.c @@ -1517,11 +1517,6 @@ int kvm_arch_irqchip_create(KVMState *s) return kvm_check_extension(s, KVM_CAP_DEVICE_CTRL); } -MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run) -{ - return MEMTXATTRS_UNSPECIFIED; -} - int kvm_arch_process_async_events(CPUState *cs) { return cs->halted; diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index 17b16e33881..5ef4722cd6f 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -1336,11 +1336,6 @@ int kvmppc_set_interrupt(PowerPCCPU *cpu, int irq, int level) return 0; } -MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run) -{ - return MEMTXATTRS_UNSPECIFIED; -} - int kvm_arch_process_async_events(CPUState *cs) { return cs->halted; diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c index 8575e673811..9580b6c1b20 100644 --- a/target/riscv/kvm/kvm-cpu.c +++ b/target/riscv/kvm/kvm-cpu.c @@ -1640,11 +1640,6 @@ int kvm_arch_process_async_events(CPUState *cs) return 0; } -MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run) -{ - return MEMTXATTRS_UNSPECIFIED; -} - bool kvm_arch_stop_on_emulation_error(CPUState *cs) { return true; diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c index 827816e5b98..ad1145c4ec1 100644 --- a/target/s390x/kvm/kvm.c +++ b/target/s390x/kvm/kvm.c @@ -984,11 +984,6 @@ void kvm_arch_update_guest_debug(CPUState *cpu, struct kvm_guest_debug *dbg) } } -MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run) -{ - return MEMTXATTRS_UNSPECIFIED; -} - int kvm_arch_process_async_events(CPUState *cs) { return cs->halted; -- 2.47.3