2 * Copyright (C) 2008 Freescale Semiconductor, Inc. All rights reserved.
4 * Author: Yu Liu, <yu.liu@freescale.com>
7 * This file is derived from arch/powerpc/kvm/44x_emulate.c,
8 * by Hollis Blanchard <hollisb@us.ibm.com>.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License, version 2, as
12 * published by the Free Software Foundation.
15 #include <asm/kvm_ppc.h>
16 #include <asm/disassemble.h>
17 #include <asm/kvm_e500.h>
22 #define XOP_TLBIVAX 786
27 int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
28 unsigned int inst, int *advance)
30 int emulated = EMULATE_DONE;
36 switch (get_op(inst)) {
38 switch (get_xop(inst)) {
41 emulated = kvmppc_e500_emul_tlbre(vcpu);
45 emulated = kvmppc_e500_emul_tlbwe(vcpu);
50 emulated = kvmppc_e500_emul_tlbsx(vcpu,rb);
56 emulated = kvmppc_e500_emul_tlbivax(vcpu, ra, rb);
60 emulated = EMULATE_FAIL;
66 emulated = EMULATE_FAIL;
69 if (emulated == EMULATE_FAIL)
70 emulated = kvmppc_booke_emulate_op(run, vcpu, inst, advance);
75 int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs)
77 struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu);
78 int emulated = EMULATE_DONE;
82 vcpu_e500->pid[0] = vcpu->arch.shadow_pid =
83 vcpu->arch.pid = vcpu->arch.gpr[rs];
86 vcpu_e500->pid[1] = vcpu->arch.gpr[rs]; break;
88 vcpu_e500->pid[2] = vcpu->arch.gpr[rs]; break;
90 vcpu_e500->mas0 = vcpu->arch.gpr[rs]; break;
92 vcpu_e500->mas1 = vcpu->arch.gpr[rs]; break;
94 vcpu_e500->mas2 = vcpu->arch.gpr[rs]; break;
96 vcpu_e500->mas3 = vcpu->arch.gpr[rs]; break;
98 vcpu_e500->mas4 = vcpu->arch.gpr[rs]; break;
100 vcpu_e500->mas6 = vcpu->arch.gpr[rs]; break;
102 vcpu_e500->mas7 = vcpu->arch.gpr[rs]; break;
104 vcpu_e500->l1csr1 = vcpu->arch.gpr[rs]; break;
106 vcpu_e500->hid0 = vcpu->arch.gpr[rs]; break;
108 vcpu_e500->hid1 = vcpu->arch.gpr[rs]; break;
111 emulated = kvmppc_booke_emulate_mtspr(vcpu, sprn, rs);
117 int kvmppc_core_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, int rt)
119 struct kvmppc_vcpu_e500 *vcpu_e500 = to_e500(vcpu);
120 int emulated = EMULATE_DONE;
124 vcpu->arch.gpr[rt] = vcpu_e500->pid[0]; break;
126 vcpu->arch.gpr[rt] = vcpu_e500->pid[1]; break;
128 vcpu->arch.gpr[rt] = vcpu_e500->pid[2]; break;
130 vcpu->arch.gpr[rt] = vcpu_e500->mas0; break;
132 vcpu->arch.gpr[rt] = vcpu_e500->mas1; break;
134 vcpu->arch.gpr[rt] = vcpu_e500->mas2; break;
136 vcpu->arch.gpr[rt] = vcpu_e500->mas3; break;
138 vcpu->arch.gpr[rt] = vcpu_e500->mas4; break;
140 vcpu->arch.gpr[rt] = vcpu_e500->mas6; break;
142 vcpu->arch.gpr[rt] = vcpu_e500->mas7; break;
145 vcpu->arch.gpr[rt] = mfspr(SPRN_TLB0CFG);
146 vcpu->arch.gpr[rt] &= ~0xfffUL;
147 vcpu->arch.gpr[rt] |= vcpu_e500->guest_tlb_size[0];
151 vcpu->arch.gpr[rt] = mfspr(SPRN_TLB1CFG);
152 vcpu->arch.gpr[rt] &= ~0xfffUL;
153 vcpu->arch.gpr[rt] |= vcpu_e500->guest_tlb_size[1];
157 vcpu->arch.gpr[rt] = vcpu_e500->l1csr1; break;
159 vcpu->arch.gpr[rt] = vcpu_e500->hid0; break;
161 vcpu->arch.gpr[rt] = vcpu_e500->hid1; break;
164 emulated = kvmppc_booke_emulate_mfspr(vcpu, sprn, rt);