Revision d362e757 target-i386/kvm.c
b/target-i386/kvm.c | ||
---|---|---|
1635 | 1635 |
} |
1636 | 1636 |
|
1637 | 1637 |
if (!kvm_irqchip_in_kernel()) { |
1638 |
/* Force the VCPU out of its inner loop to process the INIT request */ |
|
1639 |
if (env->interrupt_request & CPU_INTERRUPT_INIT) { |
|
1638 |
/* Force the VCPU out of its inner loop to process any INIT requests |
|
1639 |
* or pending TPR access reports. */ |
|
1640 |
if (env->interrupt_request & |
|
1641 |
(CPU_INTERRUPT_INIT | CPU_INTERRUPT_TPR)) { |
|
1640 | 1642 |
env->exit_request = 1; |
1641 | 1643 |
} |
1642 | 1644 |
|
... | ... | |
1730 | 1732 |
kvm_cpu_synchronize_state(env); |
1731 | 1733 |
do_cpu_sipi(env); |
1732 | 1734 |
} |
1735 |
if (env->interrupt_request & CPU_INTERRUPT_TPR) { |
|
1736 |
env->interrupt_request &= ~CPU_INTERRUPT_TPR; |
|
1737 |
kvm_cpu_synchronize_state(env); |
|
1738 |
apic_handle_tpr_access_report(env->apic_state, env->eip, |
|
1739 |
env->tpr_access_type); |
|
1740 |
} |
|
1733 | 1741 |
|
1734 | 1742 |
return env->halted; |
1735 | 1743 |
} |
... | ... | |
1746 | 1754 |
return 0; |
1747 | 1755 |
} |
1748 | 1756 |
|
1757 |
static int kvm_handle_tpr_access(CPUState *env) |
|
1758 |
{ |
|
1759 |
struct kvm_run *run = env->kvm_run; |
|
1760 |
|
|
1761 |
apic_handle_tpr_access_report(env->apic_state, run->tpr_access.rip, |
|
1762 |
run->tpr_access.is_write ? TPR_ACCESS_WRITE |
|
1763 |
: TPR_ACCESS_READ); |
|
1764 |
return 1; |
|
1765 |
} |
|
1766 |
|
|
1749 | 1767 |
int kvm_arch_insert_sw_breakpoint(CPUState *env, struct kvm_sw_breakpoint *bp) |
1750 | 1768 |
{ |
1751 | 1769 |
static const uint8_t int3 = 0xcc; |
... | ... | |
1950 | 1968 |
case KVM_EXIT_SET_TPR: |
1951 | 1969 |
ret = 0; |
1952 | 1970 |
break; |
1971 |
case KVM_EXIT_TPR_ACCESS: |
|
1972 |
ret = kvm_handle_tpr_access(env); |
|
1973 |
break; |
|
1953 | 1974 |
case KVM_EXIT_FAIL_ENTRY: |
1954 | 1975 |
code = run->fail_entry.hardware_entry_failure_reason; |
1955 | 1976 |
fprintf(stderr, "KVM: entry failed, hardware error 0x%" PRIx64 "\n", |
Also available in: Unified diff