KVM: PPC: Provide functions for queueing up FP/VEC/VSX unavailable interrupts
This provides functions that can be used for generating interrupts indicating that a given functional unit (floating point, vector, or VSX) is unavailable. These functions will be used in instruction emulation code. Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
This commit is contained in:
@@ -132,6 +132,9 @@ extern void kvmppc_core_vcpu_put(struct kvm_vcpu *vcpu);
|
|||||||
extern int kvmppc_core_prepare_to_enter(struct kvm_vcpu *vcpu);
|
extern int kvmppc_core_prepare_to_enter(struct kvm_vcpu *vcpu);
|
||||||
extern int kvmppc_core_pending_dec(struct kvm_vcpu *vcpu);
|
extern int kvmppc_core_pending_dec(struct kvm_vcpu *vcpu);
|
||||||
extern void kvmppc_core_queue_program(struct kvm_vcpu *vcpu, ulong flags);
|
extern void kvmppc_core_queue_program(struct kvm_vcpu *vcpu, ulong flags);
|
||||||
|
extern void kvmppc_core_queue_fpunavail(struct kvm_vcpu *vcpu);
|
||||||
|
extern void kvmppc_core_queue_vec_unavail(struct kvm_vcpu *vcpu);
|
||||||
|
extern void kvmppc_core_queue_vsx_unavail(struct kvm_vcpu *vcpu);
|
||||||
extern void kvmppc_core_queue_dec(struct kvm_vcpu *vcpu);
|
extern void kvmppc_core_queue_dec(struct kvm_vcpu *vcpu);
|
||||||
extern void kvmppc_core_dequeue_dec(struct kvm_vcpu *vcpu);
|
extern void kvmppc_core_dequeue_dec(struct kvm_vcpu *vcpu);
|
||||||
extern void kvmppc_core_queue_external(struct kvm_vcpu *vcpu,
|
extern void kvmppc_core_queue_external(struct kvm_vcpu *vcpu,
|
||||||
|
|||||||
@@ -197,6 +197,24 @@ void kvmppc_core_queue_program(struct kvm_vcpu *vcpu, ulong flags)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(kvmppc_core_queue_program);
|
EXPORT_SYMBOL_GPL(kvmppc_core_queue_program);
|
||||||
|
|
||||||
|
void kvmppc_core_queue_fpunavail(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
/* might as well deliver this straight away */
|
||||||
|
kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_FP_UNAVAIL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void kvmppc_core_queue_vec_unavail(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
/* might as well deliver this straight away */
|
||||||
|
kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_ALTIVEC, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void kvmppc_core_queue_vsx_unavail(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
/* might as well deliver this straight away */
|
||||||
|
kvmppc_inject_interrupt(vcpu, BOOK3S_INTERRUPT_VSX, 0);
|
||||||
|
}
|
||||||
|
|
||||||
void kvmppc_core_queue_dec(struct kvm_vcpu *vcpu)
|
void kvmppc_core_queue_dec(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_DECREMENTER);
|
kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_DECREMENTER);
|
||||||
|
|||||||
@@ -300,6 +300,11 @@ void kvmppc_core_queue_program(struct kvm_vcpu *vcpu, ulong esr_flags)
|
|||||||
kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_PROGRAM);
|
kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_PROGRAM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void kvmppc_core_queue_fpunavail(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_FP_UNAVAIL);
|
||||||
|
}
|
||||||
|
|
||||||
void kvmppc_core_queue_dec(struct kvm_vcpu *vcpu)
|
void kvmppc_core_queue_dec(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_DECREMENTER);
|
kvmppc_booke_queue_irqprio(vcpu, BOOKE_IRQPRIO_DECREMENTER);
|
||||||
|
|||||||
Reference in New Issue
Block a user