diff options
author | Alexander Graf <agraf@suse.de> | 2010-08-30 13:49:15 +0200 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2010-09-05 11:50:48 +0200 |
commit | fc87e185302a96c2675a1c3a86ca47c6a2d657ff (patch) | |
tree | 8dbd20e489ab8caf8acc122d134fea3dfe31c8e5 /target-ppc/kvm_ppc.h | |
parent | ba5e7f82169f32ab8163c707d97c799ca09f8924 (diff) |
KVM: PPC: Add level based interrupt logic
KVM on PowerPC used to have completely broken interrupt logic. Usually,
interrupts work by having a PIC that pulls a line up/down, so the CPU knows
that an interrupt is active. This line stays active until some action is
done to the PIC to release the line.
On KVM for PPC, we just checked if there was an interrupt pending and pulled
a line in the kernel module. We never released it though, hoping that kernel
space would just declare an interrupt as released when injected - which is
wrong.
To fix this, we need to completely redesign the interrupt injection logic.
Whenever an interrupt line gets triggered, we need to notify kernel space
that the line is up. Whenever it gets released, we do the same. This way
we can assure that the interrupt state is always known to kernel space.
This fixes random stalls in KVM guests on PowerPC that were waiting for
an interrupt while everyone else thought they received it already.
Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'target-ppc/kvm_ppc.h')
-rw-r--r-- | target-ppc/kvm_ppc.h | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/target-ppc/kvm_ppc.h b/target-ppc/kvm_ppc.h index 65e31c9b9e..911b19e378 100644 --- a/target-ppc/kvm_ppc.h +++ b/target-ppc/kvm_ppc.h @@ -16,5 +16,18 @@ int kvmppc_read_host_property(const char *node_path, const char *prop, uint32_t kvmppc_get_tbfreq(void); int kvmppc_get_hypercall(CPUState *env, uint8_t *buf, int buf_len); +int kvmppc_set_interrupt(CPUState *env, int irq, int level); + +#ifndef KVM_INTERRUPT_SET +#define KVM_INTERRUPT_SET -1 +#endif + +#ifndef KVM_INTERRUPT_UNSET +#define KVM_INTERRUPT_UNSET -2 +#endif + +#ifndef KVM_INTERRUPT_SET_LEVEL +#define KVM_INTERRUPT_SET_LEVEL -3 +#endif #endif /* __KVM_PPC_H__ */ |