diff options
Diffstat (limited to 'arch/powerpc/kvm/booke.h')
| -rw-r--r-- | arch/powerpc/kvm/booke.h | 62 | 
1 files changed, 59 insertions, 3 deletions
diff --git a/arch/powerpc/kvm/booke.h b/arch/powerpc/kvm/booke.h index 2fe202705a3..ba61974c1e2 100644 --- a/arch/powerpc/kvm/booke.h +++ b/arch/powerpc/kvm/booke.h @@ -23,6 +23,7 @@  #include <linux/types.h>  #include <linux/kvm_host.h>  #include <asm/kvm_ppc.h> +#include <asm/switch_to.h>  #include "timing.h"  /* interrupt priortity ordering */ @@ -48,7 +49,20 @@  #define BOOKE_IRQPRIO_PERFORMANCE_MONITOR 19  /* Internal pseudo-irqprio for level triggered externals */  #define BOOKE_IRQPRIO_EXTERNAL_LEVEL 20 -#define BOOKE_IRQPRIO_MAX 20 +#define BOOKE_IRQPRIO_DBELL 21 +#define BOOKE_IRQPRIO_DBELL_CRIT 22 +#define BOOKE_IRQPRIO_MAX 23 + +#define BOOKE_IRQMASK_EE ((1 << BOOKE_IRQPRIO_EXTERNAL_LEVEL) | \ +			  (1 << BOOKE_IRQPRIO_PERFORMANCE_MONITOR) | \ +			  (1 << BOOKE_IRQPRIO_DBELL) | \ +			  (1 << BOOKE_IRQPRIO_DECREMENTER) | \ +			  (1 << BOOKE_IRQPRIO_FIT) | \ +			  (1 << BOOKE_IRQPRIO_EXTERNAL)) + +#define BOOKE_IRQMASK_CE ((1 << BOOKE_IRQPRIO_DBELL_CRIT) | \ +			  (1 << BOOKE_IRQPRIO_WATCHDOG) | \ +			  (1 << BOOKE_IRQPRIO_CRITICAL))  extern unsigned long kvmppc_booke_handlers; @@ -61,8 +75,8 @@ void kvmppc_clr_tsr_bits(struct kvm_vcpu *vcpu, u32 tsr_bits);  int kvmppc_booke_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,                              unsigned int inst, int *advance); -int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, int rt); -int kvmppc_booke_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs); +int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val); +int kvmppc_booke_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val);  /* low-level asm code to transfer guest state */  void kvmppc_load_guest_spe(struct kvm_vcpu *vcpu); @@ -71,4 +85,46 @@ void kvmppc_save_guest_spe(struct kvm_vcpu *vcpu);  /* high-level function, manages flags, host state */  void kvmppc_vcpu_disable_spe(struct kvm_vcpu *vcpu); +void kvmppc_booke_vcpu_load(struct kvm_vcpu *vcpu, int cpu); +void kvmppc_booke_vcpu_put(struct kvm_vcpu *vcpu); + +enum int_class { +	INT_CLASS_NONCRIT, +	INT_CLASS_CRIT, +	INT_CLASS_MC, +	INT_CLASS_DBG, +}; + +void kvmppc_set_pending_interrupt(struct kvm_vcpu *vcpu, enum int_class type); + +/* + * Load up guest vcpu FP state if it's needed. + * It also set the MSR_FP in thread so that host know + * we're holding FPU, and then host can help to save + * guest vcpu FP state if other threads require to use FPU. + * This simulates an FP unavailable fault. + * + * It requires to be called with preemption disabled. + */ +static inline void kvmppc_load_guest_fp(struct kvm_vcpu *vcpu) +{ +#ifdef CONFIG_PPC_FPU +	if (vcpu->fpu_active && !(current->thread.regs->msr & MSR_FP)) { +		load_up_fpu(); +		current->thread.regs->msr |= MSR_FP; +	} +#endif +} + +/* + * Save guest vcpu FP state into thread. + * It requires to be called with preemption disabled. + */ +static inline void kvmppc_save_guest_fp(struct kvm_vcpu *vcpu) +{ +#ifdef CONFIG_PPC_FPU +	if (vcpu->fpu_active && (current->thread.regs->msr & MSR_FP)) +		giveup_fpu(current); +#endif +}  #endif /* __KVM_BOOKE_H__ */  |