static void kvmppc_inject_pf(struct kvm_vcpu *vcpu, ulong eaddr, bool is_store)
{
	u64 dsisr;
	struct kvm_vcpu_arch_shared *shared = vcpu->arch.shared;

	shared->msr = kvmppc_set_field(shared->msr, 33, 36, 0);
	shared->msr = kvmppc_set_field(shared->msr, 42, 47, 0);
	shared->dar = eaddr;
	/* Page Fault */
	dsisr = kvmppc_set_field(0, 33, 33, 1);
	if (is_store)
		shared->dsisr = kvmppc_set_field(dsisr, 38, 38, 1);
	kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_DATA_STORAGE);
}
Beispiel #2
0
static void kvmppc_inject_pf(struct kvm_vcpu *vcpu, ulong eaddr, bool is_store)
{
	u32 dsisr;
	u64 msr = kvmppc_get_msr(vcpu);

	msr = kvmppc_set_field(msr, 33, 36, 0);
	msr = kvmppc_set_field(msr, 42, 47, 0);
	kvmppc_set_msr(vcpu, msr);
	kvmppc_set_dar(vcpu, eaddr);
	/* Page Fault */
	dsisr = kvmppc_set_field(0, 33, 33, 1);
	if (is_store)
		dsisr = kvmppc_set_field(dsisr, 38, 38, 1);
	kvmppc_set_dsisr(vcpu, dsisr);
	kvmppc_book3s_queue_irqprio(vcpu, BOOK3S_INTERRUPT_DATA_STORAGE);
}
/*
 * Replaces inst bits with ordering according to spec.
 */
static inline u32 inst_set_field(u32 inst, int msb, int lsb, int value)
{
	return kvmppc_set_field(inst, msb + 32, lsb + 32, value);
}