Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ceb985f9 authored by Alexander Graf's avatar Alexander Graf
Browse files

KVM: PPC: 440: Implement mfdcrx



We need mfdcrx to execute properly on 460 cores.

Signed-off-by: default avatarAlexander Graf <agraf@suse.de>
parent e4dcfe88
Loading
Loading
Loading
Loading
+43 −31
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
#include "booke.h"
#include "44x_tlb.h"

#define XOP_MFDCRX  259
#define XOP_MFDCR   323
#define XOP_MTDCRX  387
#define XOP_MTDCR   451
@@ -51,23 +52,8 @@ static int emulate_mtdcr(struct kvm_vcpu *vcpu, int rs, int dcrn)
	}
}

int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
                           unsigned int inst, int *advance)
static int emulate_mfdcr(struct kvm_vcpu *vcpu, int rt, int dcrn)
{
	int emulated = EMULATE_DONE;
	int dcrn = get_dcrn(inst);
	int ra = get_ra(inst);
	int rb = get_rb(inst);
	int rc = get_rc(inst);
	int rs = get_rs(inst);
	int rt = get_rt(inst);
	int ws = get_ws(inst);

	switch (get_op(inst)) {
	case 31:
		switch (get_xop(inst)) {

		case XOP_MFDCR:
	/* The guest may access CPR0 registers to determine the timebase
	 * frequency, and it must know the real host frequency because it
	 * can directly access the timebase registers.
@@ -91,15 +77,41 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
		local_irq_enable();
		break;
	default:
				run->dcr.dcrn = dcrn;
				run->dcr.data =  0;
				run->dcr.is_write = 0;
		vcpu->run->dcr.dcrn = dcrn;
		vcpu->run->dcr.data =  0;
		vcpu->run->dcr.is_write = 0;
		vcpu->arch.io_gpr = rt;
		vcpu->arch.dcr_needed = 1;
		kvmppc_account_exit(vcpu, DCR_EXITS);
				emulated = EMULATE_DO_DCR;
		return EMULATE_DO_DCR;
	}

	return EMULATE_DONE;
}

int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
                           unsigned int inst, int *advance)
{
	int emulated = EMULATE_DONE;
	int dcrn = get_dcrn(inst);
	int ra = get_ra(inst);
	int rb = get_rb(inst);
	int rc = get_rc(inst);
	int rs = get_rs(inst);
	int rt = get_rt(inst);
	int ws = get_ws(inst);

	switch (get_op(inst)) {
	case 31:
		switch (get_xop(inst)) {

		case XOP_MFDCR:
			emulated = emulate_mfdcr(vcpu, rt, dcrn);
			break;

		case XOP_MFDCRX:
			emulated = emulate_mfdcr(vcpu, rt,
					kvmppc_get_gpr(vcpu, ra));
			break;

		case XOP_MTDCR: