Commit ceb985f9 authored by Alexander Graf's avatar Alexander Graf

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
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "booke.h" #include "booke.h"
#include "44x_tlb.h" #include "44x_tlb.h"
#define XOP_MFDCRX 259
#define XOP_MFDCR 323 #define XOP_MFDCR 323
#define XOP_MTDCRX 387 #define XOP_MTDCRX 387
#define XOP_MTDCR 451 #define XOP_MTDCR 451
...@@ -51,23 +52,8 @@ static int emulate_mtdcr(struct kvm_vcpu *vcpu, int rs, int dcrn) ...@@ -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, static int emulate_mfdcr(struct kvm_vcpu *vcpu, int rt, int dcrn)
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:
/* The guest may access CPR0 registers to determine the timebase /* The guest may access CPR0 registers to determine the timebase
* frequency, and it must know the real host frequency because it * frequency, and it must know the real host frequency because it
* can directly access the timebase registers. * can directly access the timebase registers.
...@@ -91,15 +77,41 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu, ...@@ -91,15 +77,41 @@ int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
local_irq_enable(); local_irq_enable();
break; break;
default: default:
run->dcr.dcrn = dcrn; vcpu->run->dcr.dcrn = dcrn;
run->dcr.data = 0; vcpu->run->dcr.data = 0;
run->dcr.is_write = 0; vcpu->run->dcr.is_write = 0;
vcpu->arch.io_gpr = rt; vcpu->arch.io_gpr = rt;
vcpu->arch.dcr_needed = 1; vcpu->arch.dcr_needed = 1;
kvmppc_account_exit(vcpu, DCR_EXITS); 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; break;
case XOP_MTDCR: case XOP_MTDCR:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment