bbd15906900d1791c9137a4b0860ed0e6d65a780
[safe/jmp/linux-2.6] / arch / powerpc / kvm / book3s_64_emulate.c
1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License, version 2, as
4  * published by the Free Software Foundation.
5  *
6  * This program is distributed in the hope that it will be useful,
7  * but WITHOUT ANY WARRANTY; without even the implied warranty of
8  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
9  * GNU General Public License for more details.
10  *
11  * You should have received a copy of the GNU General Public License
12  * along with this program; if not, write to the Free Software
13  * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
14  *
15  * Copyright SUSE Linux Products GmbH 2009
16  *
17  * Authors: Alexander Graf <agraf@suse.de>
18  */
19
20 #include <asm/kvm_ppc.h>
21 #include <asm/disassemble.h>
22 #include <asm/kvm_book3s.h>
23 #include <asm/reg.h>
24
25 #define OP_19_XOP_RFID          18
26 #define OP_19_XOP_RFI           50
27
28 #define OP_31_XOP_MFMSR         83
29 #define OP_31_XOP_MTMSR         146
30 #define OP_31_XOP_MTMSRD        178
31 #define OP_31_XOP_MTSR          210
32 #define OP_31_XOP_MTSRIN        242
33 #define OP_31_XOP_TLBIEL        274
34 #define OP_31_XOP_TLBIE         306
35 #define OP_31_XOP_SLBMTE        402
36 #define OP_31_XOP_SLBIE         434
37 #define OP_31_XOP_SLBIA         498
38 #define OP_31_XOP_MFSR          595
39 #define OP_31_XOP_MFSRIN        659
40 #define OP_31_XOP_SLBMFEV       851
41 #define OP_31_XOP_EIOIO         854
42 #define OP_31_XOP_SLBMFEE       915
43
44 /* DCBZ is actually 1014, but we patch it to 1010 so we get a trap */
45 #define OP_31_XOP_DCBZ          1010
46
47 #define OP_LFS                  48
48 #define OP_LFD                  50
49 #define OP_STFS                 52
50 #define OP_STFD                 54
51
52 #define SPRN_GQR0               912
53 #define SPRN_GQR1               913
54 #define SPRN_GQR2               914
55 #define SPRN_GQR3               915
56 #define SPRN_GQR4               916
57 #define SPRN_GQR5               917
58 #define SPRN_GQR6               918
59 #define SPRN_GQR7               919
60
61 int kvmppc_core_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
62                            unsigned int inst, int *advance)
63 {
64         int emulated = EMULATE_DONE;
65
66         switch (get_op(inst)) {
67         case 19:
68                 switch (get_xop(inst)) {
69                 case OP_19_XOP_RFID:
70                 case OP_19_XOP_RFI:
71                         vcpu->arch.pc = vcpu->arch.srr0;
72                         kvmppc_set_msr(vcpu, vcpu->arch.srr1);
73                         *advance = 0;
74                         break;
75
76                 default:
77                         emulated = EMULATE_FAIL;
78                         break;
79                 }
80                 break;
81         case 31:
82                 switch (get_xop(inst)) {
83                 case OP_31_XOP_MFMSR:
84                         kvmppc_set_gpr(vcpu, get_rt(inst), vcpu->arch.msr);
85                         break;
86                 case OP_31_XOP_MTMSRD:
87                 {
88                         ulong rs = kvmppc_get_gpr(vcpu, get_rs(inst));
89                         if (inst & 0x10000) {
90                                 vcpu->arch.msr &= ~(MSR_RI | MSR_EE);
91                                 vcpu->arch.msr |= rs & (MSR_RI | MSR_EE);
92                         } else
93                                 kvmppc_set_msr(vcpu, rs);
94                         break;
95                 }
96                 case OP_31_XOP_MTMSR:
97                         kvmppc_set_msr(vcpu, kvmppc_get_gpr(vcpu, get_rs(inst)));
98                         break;
99                 case OP_31_XOP_MFSR:
100                 {
101                         int srnum;
102
103                         srnum = kvmppc_get_field(inst, 12 + 32, 15 + 32);
104                         if (vcpu->arch.mmu.mfsrin) {
105                                 u32 sr;
106                                 sr = vcpu->arch.mmu.mfsrin(vcpu, srnum);
107                                 kvmppc_set_gpr(vcpu, get_rt(inst), sr);
108                         }
109                         break;
110                 }
111                 case OP_31_XOP_MFSRIN:
112                 {
113                         int srnum;
114
115                         srnum = (kvmppc_get_gpr(vcpu, get_rb(inst)) >> 28) & 0xf;
116                         if (vcpu->arch.mmu.mfsrin) {
117                                 u32 sr;
118                                 sr = vcpu->arch.mmu.mfsrin(vcpu, srnum);
119                                 kvmppc_set_gpr(vcpu, get_rt(inst), sr);
120                         }
121                         break;
122                 }
123                 case OP_31_XOP_MTSR:
124                         vcpu->arch.mmu.mtsrin(vcpu,
125                                 (inst >> 16) & 0xf,
126                                 kvmppc_get_gpr(vcpu, get_rs(inst)));
127                         break;
128                 case OP_31_XOP_MTSRIN:
129                         vcpu->arch.mmu.mtsrin(vcpu,
130                                 (kvmppc_get_gpr(vcpu, get_rb(inst)) >> 28) & 0xf,
131                                 kvmppc_get_gpr(vcpu, get_rs(inst)));
132                         break;
133                 case OP_31_XOP_TLBIE:
134                 case OP_31_XOP_TLBIEL:
135                 {
136                         bool large = (inst & 0x00200000) ? true : false;
137                         ulong addr = kvmppc_get_gpr(vcpu, get_rb(inst));
138                         vcpu->arch.mmu.tlbie(vcpu, addr, large);
139                         break;
140                 }
141                 case OP_31_XOP_EIOIO:
142                         break;
143                 case OP_31_XOP_SLBMTE:
144                         if (!vcpu->arch.mmu.slbmte)
145                                 return EMULATE_FAIL;
146
147                         vcpu->arch.mmu.slbmte(vcpu,
148                                         kvmppc_get_gpr(vcpu, get_rs(inst)),
149                                         kvmppc_get_gpr(vcpu, get_rb(inst)));
150                         break;
151                 case OP_31_XOP_SLBIE:
152                         if (!vcpu->arch.mmu.slbie)
153                                 return EMULATE_FAIL;
154
155                         vcpu->arch.mmu.slbie(vcpu,
156                                         kvmppc_get_gpr(vcpu, get_rb(inst)));
157                         break;
158                 case OP_31_XOP_SLBIA:
159                         if (!vcpu->arch.mmu.slbia)
160                                 return EMULATE_FAIL;
161
162                         vcpu->arch.mmu.slbia(vcpu);
163                         break;
164                 case OP_31_XOP_SLBMFEE:
165                         if (!vcpu->arch.mmu.slbmfee) {
166                                 emulated = EMULATE_FAIL;
167                         } else {
168                                 ulong t, rb;
169
170                                 rb = kvmppc_get_gpr(vcpu, get_rb(inst));
171                                 t = vcpu->arch.mmu.slbmfee(vcpu, rb);
172                                 kvmppc_set_gpr(vcpu, get_rt(inst), t);
173                         }
174                         break;
175                 case OP_31_XOP_SLBMFEV:
176                         if (!vcpu->arch.mmu.slbmfev) {
177                                 emulated = EMULATE_FAIL;
178                         } else {
179                                 ulong t, rb;
180
181                                 rb = kvmppc_get_gpr(vcpu, get_rb(inst));
182                                 t = vcpu->arch.mmu.slbmfev(vcpu, rb);
183                                 kvmppc_set_gpr(vcpu, get_rt(inst), t);
184                         }
185                         break;
186                 case OP_31_XOP_DCBZ:
187                 {
188                         ulong rb = kvmppc_get_gpr(vcpu, get_rb(inst));
189                         ulong ra = 0;
190                         ulong addr, vaddr;
191                         u32 zeros[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
192                         u32 dsisr;
193                         int r;
194
195                         if (get_ra(inst))
196                                 ra = kvmppc_get_gpr(vcpu, get_ra(inst));
197
198                         addr = (ra + rb) & ~31ULL;
199                         if (!(vcpu->arch.msr & MSR_SF))
200                                 addr &= 0xffffffff;
201                         vaddr = addr;
202
203                         r = kvmppc_st(vcpu, &addr, 32, zeros, true);
204                         if ((r == -ENOENT) || (r == -EPERM)) {
205                                 *advance = 0;
206                                 vcpu->arch.dear = vaddr;
207                                 vcpu->arch.fault_dear = vaddr;
208
209                                 dsisr = DSISR_ISSTORE;
210                                 if (r == -ENOENT)
211                                         dsisr |= DSISR_NOHPTE;
212                                 else if (r == -EPERM)
213                                         dsisr |= DSISR_PROTFAULT;
214
215                                 to_book3s(vcpu)->dsisr = dsisr;
216                                 vcpu->arch.fault_dsisr = dsisr;
217
218                                 kvmppc_book3s_queue_irqprio(vcpu,
219                                         BOOK3S_INTERRUPT_DATA_STORAGE);
220                         }
221
222                         break;
223                 }
224                 default:
225                         emulated = EMULATE_FAIL;
226                 }
227                 break;
228         default:
229                 emulated = EMULATE_FAIL;
230         }
231
232         if (emulated == EMULATE_FAIL)
233                 emulated = kvmppc_emulate_paired_single(run, vcpu);
234
235         return emulated;
236 }
237
238 void kvmppc_set_bat(struct kvm_vcpu *vcpu, struct kvmppc_bat *bat, bool upper,
239                     u32 val)
240 {
241         if (upper) {
242                 /* Upper BAT */
243                 u32 bl = (val >> 2) & 0x7ff;
244                 bat->bepi_mask = (~bl << 17);
245                 bat->bepi = val & 0xfffe0000;
246                 bat->vs = (val & 2) ? 1 : 0;
247                 bat->vp = (val & 1) ? 1 : 0;
248                 bat->raw = (bat->raw & 0xffffffff00000000ULL) | val;
249         } else {
250                 /* Lower BAT */
251                 bat->brpn = val & 0xfffe0000;
252                 bat->wimg = (val >> 3) & 0xf;
253                 bat->pp = val & 3;
254                 bat->raw = (bat->raw & 0x00000000ffffffffULL) | ((u64)val << 32);
255         }
256 }
257
258 static u32 kvmppc_read_bat(struct kvm_vcpu *vcpu, int sprn)
259 {
260         struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu);
261         struct kvmppc_bat *bat;
262
263         switch (sprn) {
264         case SPRN_IBAT0U ... SPRN_IBAT3L:
265                 bat = &vcpu_book3s->ibat[(sprn - SPRN_IBAT0U) / 2];
266                 break;
267         case SPRN_IBAT4U ... SPRN_IBAT7L:
268                 bat = &vcpu_book3s->ibat[4 + ((sprn - SPRN_IBAT4U) / 2)];
269                 break;
270         case SPRN_DBAT0U ... SPRN_DBAT3L:
271                 bat = &vcpu_book3s->dbat[(sprn - SPRN_DBAT0U) / 2];
272                 break;
273         case SPRN_DBAT4U ... SPRN_DBAT7L:
274                 bat = &vcpu_book3s->dbat[4 + ((sprn - SPRN_DBAT4U) / 2)];
275                 break;
276         default:
277                 BUG();
278         }
279
280         if (sprn % 2)
281                 return bat->raw >> 32;
282         else
283                 return bat->raw;
284 }
285
286 static void kvmppc_write_bat(struct kvm_vcpu *vcpu, int sprn, u32 val)
287 {
288         struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu);
289         struct kvmppc_bat *bat;
290
291         switch (sprn) {
292         case SPRN_IBAT0U ... SPRN_IBAT3L:
293                 bat = &vcpu_book3s->ibat[(sprn - SPRN_IBAT0U) / 2];
294                 break;
295         case SPRN_IBAT4U ... SPRN_IBAT7L:
296                 bat = &vcpu_book3s->ibat[4 + ((sprn - SPRN_IBAT4U) / 2)];
297                 break;
298         case SPRN_DBAT0U ... SPRN_DBAT3L:
299                 bat = &vcpu_book3s->dbat[(sprn - SPRN_DBAT0U) / 2];
300                 break;
301         case SPRN_DBAT4U ... SPRN_DBAT7L:
302                 bat = &vcpu_book3s->dbat[4 + ((sprn - SPRN_DBAT4U) / 2)];
303                 break;
304         default:
305                 BUG();
306         }
307
308         kvmppc_set_bat(vcpu, bat, !(sprn % 2), val);
309 }
310
311 int kvmppc_core_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, int rs)
312 {
313         int emulated = EMULATE_DONE;
314         ulong spr_val = kvmppc_get_gpr(vcpu, rs);
315
316         switch (sprn) {
317         case SPRN_SDR1:
318                 to_book3s(vcpu)->sdr1 = spr_val;
319                 break;
320         case SPRN_DSISR:
321                 to_book3s(vcpu)->dsisr = spr_val;
322                 break;
323         case SPRN_DAR:
324                 vcpu->arch.dear = spr_val;
325                 break;
326         case SPRN_HIOR:
327                 to_book3s(vcpu)->hior = spr_val;
328                 break;
329         case SPRN_IBAT0U ... SPRN_IBAT3L:
330         case SPRN_IBAT4U ... SPRN_IBAT7L:
331         case SPRN_DBAT0U ... SPRN_DBAT3L:
332         case SPRN_DBAT4U ... SPRN_DBAT7L:
333                 kvmppc_write_bat(vcpu, sprn, (u32)spr_val);
334                 /* BAT writes happen so rarely that we're ok to flush
335                  * everything here */
336                 kvmppc_mmu_pte_flush(vcpu, 0, 0);
337                 kvmppc_mmu_flush_segments(vcpu);
338                 break;
339         case SPRN_HID0:
340                 to_book3s(vcpu)->hid[0] = spr_val;
341                 break;
342         case SPRN_HID1:
343                 to_book3s(vcpu)->hid[1] = spr_val;
344                 break;
345         case SPRN_HID2:
346                 to_book3s(vcpu)->hid[2] = spr_val;
347                 break;
348         case SPRN_HID2_GEKKO:
349                 to_book3s(vcpu)->hid[2] = spr_val;
350                 /* HID2.PSE controls paired single on gekko */
351                 switch (vcpu->arch.pvr) {
352                 case 0x00080200:        /* lonestar 2.0 */
353                 case 0x00088202:        /* lonestar 2.2 */
354                 case 0x70000100:        /* gekko 1.0 */
355                 case 0x00080100:        /* gekko 2.0 */
356                 case 0x00083203:        /* gekko 2.3a */
357                 case 0x00083213:        /* gekko 2.3b */
358                 case 0x00083204:        /* gekko 2.4 */
359                 case 0x00083214:        /* gekko 2.4e (8SE) - retail HW2 */
360                         if (spr_val & (1 << 29)) { /* HID2.PSE */
361                                 vcpu->arch.hflags |= BOOK3S_HFLAG_PAIRED_SINGLE;
362                                 kvmppc_giveup_ext(vcpu, MSR_FP);
363                         } else {
364                                 vcpu->arch.hflags &= ~BOOK3S_HFLAG_PAIRED_SINGLE;
365                         }
366                         break;
367                 }
368                 break;
369         case SPRN_HID4:
370         case SPRN_HID4_GEKKO:
371                 to_book3s(vcpu)->hid[4] = spr_val;
372                 break;
373         case SPRN_HID5:
374                 to_book3s(vcpu)->hid[5] = spr_val;
375                 /* guest HID5 set can change is_dcbz32 */
376                 if (vcpu->arch.mmu.is_dcbz32(vcpu) &&
377                     (mfmsr() & MSR_HV))
378                         vcpu->arch.hflags |= BOOK3S_HFLAG_DCBZ32;
379                 break;
380         case SPRN_GQR0:
381         case SPRN_GQR1:
382         case SPRN_GQR2:
383         case SPRN_GQR3:
384         case SPRN_GQR4:
385         case SPRN_GQR5:
386         case SPRN_GQR6:
387         case SPRN_GQR7:
388                 to_book3s(vcpu)->gqr[sprn - SPRN_GQR0] = spr_val;
389                 break;
390         case SPRN_ICTC:
391         case SPRN_THRM1:
392         case SPRN_THRM2:
393         case SPRN_THRM3:
394         case SPRN_CTRLF:
395         case SPRN_CTRLT:
396         case SPRN_L2CR:
397         case SPRN_MMCR0_GEKKO:
398         case SPRN_MMCR1_GEKKO:
399         case SPRN_PMC1_GEKKO:
400         case SPRN_PMC2_GEKKO:
401         case SPRN_PMC3_GEKKO:
402         case SPRN_PMC4_GEKKO:
403         case SPRN_WPAR_GEKKO:
404                 break;
405         default:
406                 printk(KERN_INFO "KVM: invalid SPR write: %d\n", sprn);
407 #ifndef DEBUG_SPR
408                 emulated = EMULATE_FAIL;
409 #endif
410                 break;
411         }
412
413         return emulated;
414 }
415
416 int kvmppc_core_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, int rt)
417 {
418         int emulated = EMULATE_DONE;
419
420         switch (sprn) {
421         case SPRN_IBAT0U ... SPRN_IBAT3L:
422         case SPRN_IBAT4U ... SPRN_IBAT7L:
423         case SPRN_DBAT0U ... SPRN_DBAT3L:
424         case SPRN_DBAT4U ... SPRN_DBAT7L:
425                 kvmppc_set_gpr(vcpu, rt, kvmppc_read_bat(vcpu, sprn));
426                 break;
427         case SPRN_SDR1:
428                 kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->sdr1);
429                 break;
430         case SPRN_DSISR:
431                 kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->dsisr);
432                 break;
433         case SPRN_DAR:
434                 kvmppc_set_gpr(vcpu, rt, vcpu->arch.dear);
435                 break;
436         case SPRN_HIOR:
437                 kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->hior);
438                 break;
439         case SPRN_HID0:
440                 kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->hid[0]);
441                 break;
442         case SPRN_HID1:
443                 kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->hid[1]);
444                 break;
445         case SPRN_HID2:
446         case SPRN_HID2_GEKKO:
447                 kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->hid[2]);
448                 break;
449         case SPRN_HID4:
450         case SPRN_HID4_GEKKO:
451                 kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->hid[4]);
452                 break;
453         case SPRN_HID5:
454                 kvmppc_set_gpr(vcpu, rt, to_book3s(vcpu)->hid[5]);
455                 break;
456         case SPRN_GQR0:
457         case SPRN_GQR1:
458         case SPRN_GQR2:
459         case SPRN_GQR3:
460         case SPRN_GQR4:
461         case SPRN_GQR5:
462         case SPRN_GQR6:
463         case SPRN_GQR7:
464                 kvmppc_set_gpr(vcpu, rt,
465                                to_book3s(vcpu)->gqr[sprn - SPRN_GQR0]);
466                 break;
467         case SPRN_THRM1:
468         case SPRN_THRM2:
469         case SPRN_THRM3:
470         case SPRN_CTRLF:
471         case SPRN_CTRLT:
472         case SPRN_L2CR:
473         case SPRN_MMCR0_GEKKO:
474         case SPRN_MMCR1_GEKKO:
475         case SPRN_PMC1_GEKKO:
476         case SPRN_PMC2_GEKKO:
477         case SPRN_PMC3_GEKKO:
478         case SPRN_PMC4_GEKKO:
479         case SPRN_WPAR_GEKKO:
480                 kvmppc_set_gpr(vcpu, rt, 0);
481                 break;
482         default:
483                 printk(KERN_INFO "KVM: invalid SPR read: %d\n", sprn);
484 #ifndef DEBUG_SPR
485                 emulated = EMULATE_FAIL;
486 #endif
487                 break;
488         }
489
490         return emulated;
491 }
492
493 u32 kvmppc_alignment_dsisr(struct kvm_vcpu *vcpu, unsigned int inst)
494 {
495         u32 dsisr = 0;
496
497         /*
498          * This is what the spec says about DSISR bits (not mentioned = 0):
499          *
500          * 12:13                [DS]    Set to bits 30:31
501          * 15:16                [X]     Set to bits 29:30
502          * 17                   [X]     Set to bit 25
503          *                      [D/DS]  Set to bit 5
504          * 18:21                [X]     Set to bits 21:24
505          *                      [D/DS]  Set to bits 1:4
506          * 22:26                        Set to bits 6:10 (RT/RS/FRT/FRS)
507          * 27:31                        Set to bits 11:15 (RA)
508          */
509
510         switch (get_op(inst)) {
511         /* D-form */
512         case OP_LFS:
513         case OP_LFD:
514         case OP_STFD:
515         case OP_STFS:
516                 dsisr |= (inst >> 12) & 0x4000; /* bit 17 */
517                 dsisr |= (inst >> 17) & 0x3c00; /* bits 18:21 */
518                 break;
519         /* X-form */
520         case 31:
521                 dsisr |= (inst << 14) & 0x18000; /* bits 15:16 */
522                 dsisr |= (inst << 8)  & 0x04000; /* bit 17 */
523                 dsisr |= (inst << 3)  & 0x03c00; /* bits 18:21 */
524                 break;
525         default:
526                 printk(KERN_INFO "KVM: Unaligned instruction 0x%x\n", inst);
527                 break;
528         }
529
530         dsisr |= (inst >> 16) & 0x03ff; /* bits 22:31 */
531
532         return dsisr;
533 }
534
535 ulong kvmppc_alignment_dar(struct kvm_vcpu *vcpu, unsigned int inst)
536 {
537         ulong dar = 0;
538         ulong ra;
539
540         switch (get_op(inst)) {
541         case OP_LFS:
542         case OP_LFD:
543         case OP_STFD:
544         case OP_STFS:
545                 ra = get_ra(inst);
546                 if (ra)
547                         dar = kvmppc_get_gpr(vcpu, ra);
548                 dar += (s32)((s16)inst);
549                 break;
550         case 31:
551                 ra = get_ra(inst);
552                 if (ra)
553                         dar = kvmppc_get_gpr(vcpu, ra);
554                 dar += kvmppc_get_gpr(vcpu, get_rb(inst));
555                 break;
556         default:
557                 printk(KERN_INFO "KVM: Unaligned instruction 0x%x\n", inst);
558                 break;
559         }
560
561         return dar;
562 }