diff options
author | Jan Kiszka <jan.kiszka@siemens.com> | 2012-02-17 18:31:17 +0100 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2012-02-18 12:15:55 +0200 |
commit | d362e757d35727c915052974086f8687d3557431 (patch) | |
tree | 4b40ca889cd09a8f0f42b86410a808c6d3a9da1b /target-i386/helper.c | |
parent | d798e97456658ea7605303b7c69b04ec7df95c10 (diff) |
target-i386: Add infrastructure for reporting TPR MMIO accesses
This will allow the APIC core to file a TPR access report. Depending on
the accelerator and kernel irqchip mode, it will either be delivered
right away or queued for later reporting.
In TCG mode, we can restart the triggering instruction and can therefore
forward the event directly. KVM does not allows us to restart, so we
postpone the delivery of events recording in the user space APIC until
the current instruction is completed.
Note that KVM without in-kernel irqchip will report the address after
the instruction that triggered the access.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'target-i386/helper.c')
-rw-r--r-- | target-i386/helper.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/target-i386/helper.c b/target-i386/helper.c index 2586aff700..d12c9621bd 100644 --- a/target-i386/helper.c +++ b/target-i386/helper.c @@ -1189,6 +1189,22 @@ void cpu_x86_inject_mce(Monitor *mon, CPUState *cenv, int bank, } } } + +void cpu_report_tpr_access(CPUState *env, TPRAccess access) +{ + TranslationBlock *tb; + + if (kvm_enabled()) { + env->tpr_access_type = access; + + cpu_interrupt(env, CPU_INTERRUPT_TPR); + } else { + tb = tb_find_pc(env->mem_io_pc); + cpu_restore_state(tb, env, env->mem_io_pc); + + apic_handle_tpr_access_report(env->apic_state, env->eip, access); + } +} #endif /* !CONFIG_USER_ONLY */ static void mce_init(CPUX86State *cenv) |