Loading arch/powerpc/kvm/44x_emulate.c +43 −31 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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. Loading @@ -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: Loading Loading
arch/powerpc/kvm/44x_emulate.c +43 −31 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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. Loading @@ -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: Loading