book3s_emulate.c (25213B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * 4 * Copyright SUSE Linux Products GmbH 2009 5 * 6 * Authors: Alexander Graf <agraf@suse.de> 7 */ 8 9#include <asm/kvm_ppc.h> 10#include <asm/disassemble.h> 11#include <asm/kvm_book3s.h> 12#include <asm/reg.h> 13#include <asm/switch_to.h> 14#include <asm/time.h> 15#include <asm/tm.h> 16#include "book3s.h" 17#include <asm/asm-prototypes.h> 18 19#define OP_19_XOP_RFID 18 20#define OP_19_XOP_RFI 50 21 22#define OP_31_XOP_MFMSR 83 23#define OP_31_XOP_MTMSR 146 24#define OP_31_XOP_MTMSRD 178 25#define OP_31_XOP_MTSR 210 26#define OP_31_XOP_MTSRIN 242 27#define OP_31_XOP_TLBIEL 274 28/* Opcode is officially reserved, reuse it as sc 1 when sc 1 doesn't trap */ 29#define OP_31_XOP_FAKE_SC1 308 30#define OP_31_XOP_SLBMTE 402 31#define OP_31_XOP_SLBIE 434 32#define OP_31_XOP_SLBIA 498 33#define OP_31_XOP_MFSR 595 34#define OP_31_XOP_MFSRIN 659 35#define OP_31_XOP_DCBA 758 36#define OP_31_XOP_SLBMFEV 851 37#define OP_31_XOP_EIOIO 854 38#define OP_31_XOP_SLBMFEE 915 39#define OP_31_XOP_SLBFEE 979 40 41#define OP_31_XOP_TBEGIN 654 42#define OP_31_XOP_TABORT 910 43 44#define OP_31_XOP_TRECLAIM 942 45#define OP_31_XOP_TRCHKPT 1006 46 47/* DCBZ is actually 1014, but we patch it to 1010 so we get a trap */ 48#define OP_31_XOP_DCBZ 1010 49 50#define OP_LFS 48 51#define OP_LFD 50 52#define OP_STFS 52 53#define OP_STFD 54 54 55#define SPRN_GQR0 912 56#define SPRN_GQR1 913 57#define SPRN_GQR2 914 58#define SPRN_GQR3 915 59#define SPRN_GQR4 916 60#define SPRN_GQR5 917 61#define SPRN_GQR6 918 62#define SPRN_GQR7 919 63 64enum priv_level { 65 PRIV_PROBLEM = 0, 66 PRIV_SUPER = 1, 67 PRIV_HYPER = 2, 68}; 69 70static bool spr_allowed(struct kvm_vcpu *vcpu, enum priv_level level) 71{ 72 /* PAPR VMs only access supervisor SPRs */ 73 if (vcpu->arch.papr_enabled && (level > PRIV_SUPER)) 74 return false; 75 76 /* Limit user space to its own small SPR set */ 77 if ((kvmppc_get_msr(vcpu) & MSR_PR) && level > PRIV_PROBLEM) 78 return false; 79 80 return true; 81} 82 83#ifdef CONFIG_PPC_TRANSACTIONAL_MEM 84static inline void kvmppc_copyto_vcpu_tm(struct kvm_vcpu *vcpu) 85{ 86 memcpy(&vcpu->arch.gpr_tm[0], &vcpu->arch.regs.gpr[0], 87 sizeof(vcpu->arch.gpr_tm)); 88 memcpy(&vcpu->arch.fp_tm, &vcpu->arch.fp, 89 sizeof(struct thread_fp_state)); 90 memcpy(&vcpu->arch.vr_tm, &vcpu->arch.vr, 91 sizeof(struct thread_vr_state)); 92 vcpu->arch.ppr_tm = vcpu->arch.ppr; 93 vcpu->arch.dscr_tm = vcpu->arch.dscr; 94 vcpu->arch.amr_tm = vcpu->arch.amr; 95 vcpu->arch.ctr_tm = vcpu->arch.regs.ctr; 96 vcpu->arch.tar_tm = vcpu->arch.tar; 97 vcpu->arch.lr_tm = vcpu->arch.regs.link; 98 vcpu->arch.cr_tm = vcpu->arch.regs.ccr; 99 vcpu->arch.xer_tm = vcpu->arch.regs.xer; 100 vcpu->arch.vrsave_tm = vcpu->arch.vrsave; 101} 102 103static inline void kvmppc_copyfrom_vcpu_tm(struct kvm_vcpu *vcpu) 104{ 105 memcpy(&vcpu->arch.regs.gpr[0], &vcpu->arch.gpr_tm[0], 106 sizeof(vcpu->arch.regs.gpr)); 107 memcpy(&vcpu->arch.fp, &vcpu->arch.fp_tm, 108 sizeof(struct thread_fp_state)); 109 memcpy(&vcpu->arch.vr, &vcpu->arch.vr_tm, 110 sizeof(struct thread_vr_state)); 111 vcpu->arch.ppr = vcpu->arch.ppr_tm; 112 vcpu->arch.dscr = vcpu->arch.dscr_tm; 113 vcpu->arch.amr = vcpu->arch.amr_tm; 114 vcpu->arch.regs.ctr = vcpu->arch.ctr_tm; 115 vcpu->arch.tar = vcpu->arch.tar_tm; 116 vcpu->arch.regs.link = vcpu->arch.lr_tm; 117 vcpu->arch.regs.ccr = vcpu->arch.cr_tm; 118 vcpu->arch.regs.xer = vcpu->arch.xer_tm; 119 vcpu->arch.vrsave = vcpu->arch.vrsave_tm; 120} 121 122static void kvmppc_emulate_treclaim(struct kvm_vcpu *vcpu, int ra_val) 123{ 124 unsigned long guest_msr = kvmppc_get_msr(vcpu); 125 int fc_val = ra_val ? ra_val : 1; 126 uint64_t texasr; 127 128 /* CR0 = 0 | MSR[TS] | 0 */ 129 vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & ~(CR0_MASK << CR0_SHIFT)) | 130 (((guest_msr & MSR_TS_MASK) >> (MSR_TS_S_LG - 1)) 131 << CR0_SHIFT); 132 133 preempt_disable(); 134 tm_enable(); 135 texasr = mfspr(SPRN_TEXASR); 136 kvmppc_save_tm_pr(vcpu); 137 kvmppc_copyfrom_vcpu_tm(vcpu); 138 139 /* failure recording depends on Failure Summary bit */ 140 if (!(texasr & TEXASR_FS)) { 141 texasr &= ~TEXASR_FC; 142 texasr |= ((u64)fc_val << TEXASR_FC_LG) | TEXASR_FS; 143 144 texasr &= ~(TEXASR_PR | TEXASR_HV); 145 if (kvmppc_get_msr(vcpu) & MSR_PR) 146 texasr |= TEXASR_PR; 147 148 if (kvmppc_get_msr(vcpu) & MSR_HV) 149 texasr |= TEXASR_HV; 150 151 vcpu->arch.texasr = texasr; 152 vcpu->arch.tfiar = kvmppc_get_pc(vcpu); 153 mtspr(SPRN_TEXASR, texasr); 154 mtspr(SPRN_TFIAR, vcpu->arch.tfiar); 155 } 156 tm_disable(); 157 /* 158 * treclaim need quit to non-transactional state. 159 */ 160 guest_msr &= ~(MSR_TS_MASK); 161 kvmppc_set_msr(vcpu, guest_msr); 162 preempt_enable(); 163 164 if (vcpu->arch.shadow_fscr & FSCR_TAR) 165 mtspr(SPRN_TAR, vcpu->arch.tar); 166} 167 168static void kvmppc_emulate_trchkpt(struct kvm_vcpu *vcpu) 169{ 170 unsigned long guest_msr = kvmppc_get_msr(vcpu); 171 172 preempt_disable(); 173 /* 174 * need flush FP/VEC/VSX to vcpu save area before 175 * copy. 176 */ 177 kvmppc_giveup_ext(vcpu, MSR_VSX); 178 kvmppc_giveup_fac(vcpu, FSCR_TAR_LG); 179 kvmppc_copyto_vcpu_tm(vcpu); 180 kvmppc_save_tm_sprs(vcpu); 181 182 /* 183 * as a result of trecheckpoint. set TS to suspended. 184 */ 185 guest_msr &= ~(MSR_TS_MASK); 186 guest_msr |= MSR_TS_S; 187 kvmppc_set_msr(vcpu, guest_msr); 188 kvmppc_restore_tm_pr(vcpu); 189 preempt_enable(); 190} 191 192/* emulate tabort. at guest privilege state */ 193void kvmppc_emulate_tabort(struct kvm_vcpu *vcpu, int ra_val) 194{ 195 /* currently we only emulate tabort. but no emulation of other 196 * tabort variants since there is no kernel usage of them at 197 * present. 198 */ 199 unsigned long guest_msr = kvmppc_get_msr(vcpu); 200 uint64_t org_texasr; 201 202 preempt_disable(); 203 tm_enable(); 204 org_texasr = mfspr(SPRN_TEXASR); 205 tm_abort(ra_val); 206 207 /* CR0 = 0 | MSR[TS] | 0 */ 208 vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & ~(CR0_MASK << CR0_SHIFT)) | 209 (((guest_msr & MSR_TS_MASK) >> (MSR_TS_S_LG - 1)) 210 << CR0_SHIFT); 211 212 vcpu->arch.texasr = mfspr(SPRN_TEXASR); 213 /* failure recording depends on Failure Summary bit, 214 * and tabort will be treated as nops in non-transactional 215 * state. 216 */ 217 if (!(org_texasr & TEXASR_FS) && 218 MSR_TM_ACTIVE(guest_msr)) { 219 vcpu->arch.texasr &= ~(TEXASR_PR | TEXASR_HV); 220 if (guest_msr & MSR_PR) 221 vcpu->arch.texasr |= TEXASR_PR; 222 223 if (guest_msr & MSR_HV) 224 vcpu->arch.texasr |= TEXASR_HV; 225 226 vcpu->arch.tfiar = kvmppc_get_pc(vcpu); 227 } 228 tm_disable(); 229 preempt_enable(); 230} 231 232#endif 233 234int kvmppc_core_emulate_op_pr(struct kvm_vcpu *vcpu, 235 unsigned int inst, int *advance) 236{ 237 int emulated = EMULATE_DONE; 238 int rt = get_rt(inst); 239 int rs = get_rs(inst); 240 int ra = get_ra(inst); 241 int rb = get_rb(inst); 242 u32 inst_sc = 0x44000002; 243 244 switch (get_op(inst)) { 245 case 0: 246 emulated = EMULATE_FAIL; 247 if ((kvmppc_get_msr(vcpu) & MSR_LE) && 248 (inst == swab32(inst_sc))) { 249 /* 250 * This is the byte reversed syscall instruction of our 251 * hypercall handler. Early versions of LE Linux didn't 252 * swap the instructions correctly and ended up in 253 * illegal instructions. 254 * Just always fail hypercalls on these broken systems. 255 */ 256 kvmppc_set_gpr(vcpu, 3, EV_UNIMPLEMENTED); 257 kvmppc_set_pc(vcpu, kvmppc_get_pc(vcpu) + 4); 258 emulated = EMULATE_DONE; 259 } 260 break; 261 case 19: 262 switch (get_xop(inst)) { 263 case OP_19_XOP_RFID: 264 case OP_19_XOP_RFI: { 265 unsigned long srr1 = kvmppc_get_srr1(vcpu); 266#ifdef CONFIG_PPC_TRANSACTIONAL_MEM 267 unsigned long cur_msr = kvmppc_get_msr(vcpu); 268 269 /* 270 * add rules to fit in ISA specification regarding TM 271 * state transition in TM disable/Suspended state, 272 * and target TM state is TM inactive(00) state. (the 273 * change should be suppressed). 274 */ 275 if (((cur_msr & MSR_TM) == 0) && 276 ((srr1 & MSR_TM) == 0) && 277 MSR_TM_SUSPENDED(cur_msr) && 278 !MSR_TM_ACTIVE(srr1)) 279 srr1 |= MSR_TS_S; 280#endif 281 kvmppc_set_pc(vcpu, kvmppc_get_srr0(vcpu)); 282 kvmppc_set_msr(vcpu, srr1); 283 *advance = 0; 284 break; 285 } 286 287 default: 288 emulated = EMULATE_FAIL; 289 break; 290 } 291 break; 292 case 31: 293 switch (get_xop(inst)) { 294 case OP_31_XOP_MFMSR: 295 kvmppc_set_gpr(vcpu, rt, kvmppc_get_msr(vcpu)); 296 break; 297 case OP_31_XOP_MTMSRD: 298 { 299 ulong rs_val = kvmppc_get_gpr(vcpu, rs); 300 if (inst & 0x10000) { 301 ulong new_msr = kvmppc_get_msr(vcpu); 302 new_msr &= ~(MSR_RI | MSR_EE); 303 new_msr |= rs_val & (MSR_RI | MSR_EE); 304 kvmppc_set_msr_fast(vcpu, new_msr); 305 } else 306 kvmppc_set_msr(vcpu, rs_val); 307 break; 308 } 309 case OP_31_XOP_MTMSR: 310 kvmppc_set_msr(vcpu, kvmppc_get_gpr(vcpu, rs)); 311 break; 312 case OP_31_XOP_MFSR: 313 { 314 int srnum; 315 316 srnum = kvmppc_get_field(inst, 12 + 32, 15 + 32); 317 if (vcpu->arch.mmu.mfsrin) { 318 u32 sr; 319 sr = vcpu->arch.mmu.mfsrin(vcpu, srnum); 320 kvmppc_set_gpr(vcpu, rt, sr); 321 } 322 break; 323 } 324 case OP_31_XOP_MFSRIN: 325 { 326 int srnum; 327 328 srnum = (kvmppc_get_gpr(vcpu, rb) >> 28) & 0xf; 329 if (vcpu->arch.mmu.mfsrin) { 330 u32 sr; 331 sr = vcpu->arch.mmu.mfsrin(vcpu, srnum); 332 kvmppc_set_gpr(vcpu, rt, sr); 333 } 334 break; 335 } 336 case OP_31_XOP_MTSR: 337 vcpu->arch.mmu.mtsrin(vcpu, 338 (inst >> 16) & 0xf, 339 kvmppc_get_gpr(vcpu, rs)); 340 break; 341 case OP_31_XOP_MTSRIN: 342 vcpu->arch.mmu.mtsrin(vcpu, 343 (kvmppc_get_gpr(vcpu, rb) >> 28) & 0xf, 344 kvmppc_get_gpr(vcpu, rs)); 345 break; 346 case OP_31_XOP_TLBIE: 347 case OP_31_XOP_TLBIEL: 348 { 349 bool large = (inst & 0x00200000) ? true : false; 350 ulong addr = kvmppc_get_gpr(vcpu, rb); 351 vcpu->arch.mmu.tlbie(vcpu, addr, large); 352 break; 353 } 354#ifdef CONFIG_PPC_BOOK3S_64 355 case OP_31_XOP_FAKE_SC1: 356 { 357 /* SC 1 papr hypercalls */ 358 ulong cmd = kvmppc_get_gpr(vcpu, 3); 359 int i; 360 361 if ((kvmppc_get_msr(vcpu) & MSR_PR) || 362 !vcpu->arch.papr_enabled) { 363 emulated = EMULATE_FAIL; 364 break; 365 } 366 367 if (kvmppc_h_pr(vcpu, cmd) == EMULATE_DONE) 368 break; 369 370 vcpu->run->papr_hcall.nr = cmd; 371 for (i = 0; i < 9; ++i) { 372 ulong gpr = kvmppc_get_gpr(vcpu, 4 + i); 373 vcpu->run->papr_hcall.args[i] = gpr; 374 } 375 376 vcpu->run->exit_reason = KVM_EXIT_PAPR_HCALL; 377 vcpu->arch.hcall_needed = 1; 378 emulated = EMULATE_EXIT_USER; 379 break; 380 } 381#endif 382 case OP_31_XOP_EIOIO: 383 break; 384 case OP_31_XOP_SLBMTE: 385 if (!vcpu->arch.mmu.slbmte) 386 return EMULATE_FAIL; 387 388 vcpu->arch.mmu.slbmte(vcpu, 389 kvmppc_get_gpr(vcpu, rs), 390 kvmppc_get_gpr(vcpu, rb)); 391 break; 392 case OP_31_XOP_SLBIE: 393 if (!vcpu->arch.mmu.slbie) 394 return EMULATE_FAIL; 395 396 vcpu->arch.mmu.slbie(vcpu, 397 kvmppc_get_gpr(vcpu, rb)); 398 break; 399 case OP_31_XOP_SLBIA: 400 if (!vcpu->arch.mmu.slbia) 401 return EMULATE_FAIL; 402 403 vcpu->arch.mmu.slbia(vcpu); 404 break; 405 case OP_31_XOP_SLBFEE: 406 if (!(inst & 1) || !vcpu->arch.mmu.slbfee) { 407 return EMULATE_FAIL; 408 } else { 409 ulong b, t; 410 ulong cr = kvmppc_get_cr(vcpu) & ~CR0_MASK; 411 412 b = kvmppc_get_gpr(vcpu, rb); 413 if (!vcpu->arch.mmu.slbfee(vcpu, b, &t)) 414 cr |= 2 << CR0_SHIFT; 415 kvmppc_set_gpr(vcpu, rt, t); 416 /* copy XER[SO] bit to CR0[SO] */ 417 cr |= (vcpu->arch.regs.xer & 0x80000000) >> 418 (31 - CR0_SHIFT); 419 kvmppc_set_cr(vcpu, cr); 420 } 421 break; 422 case OP_31_XOP_SLBMFEE: 423 if (!vcpu->arch.mmu.slbmfee) { 424 emulated = EMULATE_FAIL; 425 } else { 426 ulong t, rb_val; 427 428 rb_val = kvmppc_get_gpr(vcpu, rb); 429 t = vcpu->arch.mmu.slbmfee(vcpu, rb_val); 430 kvmppc_set_gpr(vcpu, rt, t); 431 } 432 break; 433 case OP_31_XOP_SLBMFEV: 434 if (!vcpu->arch.mmu.slbmfev) { 435 emulated = EMULATE_FAIL; 436 } else { 437 ulong t, rb_val; 438 439 rb_val = kvmppc_get_gpr(vcpu, rb); 440 t = vcpu->arch.mmu.slbmfev(vcpu, rb_val); 441 kvmppc_set_gpr(vcpu, rt, t); 442 } 443 break; 444 case OP_31_XOP_DCBA: 445 /* Gets treated as NOP */ 446 break; 447 case OP_31_XOP_DCBZ: 448 { 449 ulong rb_val = kvmppc_get_gpr(vcpu, rb); 450 ulong ra_val = 0; 451 ulong addr, vaddr; 452 u32 zeros[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; 453 u32 dsisr; 454 int r; 455 456 if (ra) 457 ra_val = kvmppc_get_gpr(vcpu, ra); 458 459 addr = (ra_val + rb_val) & ~31ULL; 460 if (!(kvmppc_get_msr(vcpu) & MSR_SF)) 461 addr &= 0xffffffff; 462 vaddr = addr; 463 464 r = kvmppc_st(vcpu, &addr, 32, zeros, true); 465 if ((r == -ENOENT) || (r == -EPERM)) { 466 *advance = 0; 467 kvmppc_set_dar(vcpu, vaddr); 468 vcpu->arch.fault_dar = vaddr; 469 470 dsisr = DSISR_ISSTORE; 471 if (r == -ENOENT) 472 dsisr |= DSISR_NOHPTE; 473 else if (r == -EPERM) 474 dsisr |= DSISR_PROTFAULT; 475 476 kvmppc_set_dsisr(vcpu, dsisr); 477 vcpu->arch.fault_dsisr = dsisr; 478 479 kvmppc_book3s_queue_irqprio(vcpu, 480 BOOK3S_INTERRUPT_DATA_STORAGE); 481 } 482 483 break; 484 } 485#ifdef CONFIG_PPC_TRANSACTIONAL_MEM 486 case OP_31_XOP_TBEGIN: 487 { 488 if (!cpu_has_feature(CPU_FTR_TM)) 489 break; 490 491 if (!(kvmppc_get_msr(vcpu) & MSR_TM)) { 492 kvmppc_trigger_fac_interrupt(vcpu, FSCR_TM_LG); 493 emulated = EMULATE_AGAIN; 494 break; 495 } 496 497 if (!(kvmppc_get_msr(vcpu) & MSR_PR)) { 498 preempt_disable(); 499 vcpu->arch.regs.ccr = (CR0_TBEGIN_FAILURE | 500 (vcpu->arch.regs.ccr & ~(CR0_MASK << CR0_SHIFT))); 501 502 vcpu->arch.texasr = (TEXASR_FS | TEXASR_EXACT | 503 (((u64)(TM_CAUSE_EMULATE | TM_CAUSE_PERSISTENT)) 504 << TEXASR_FC_LG)); 505 506 if ((inst >> 21) & 0x1) 507 vcpu->arch.texasr |= TEXASR_ROT; 508 509 if (kvmppc_get_msr(vcpu) & MSR_HV) 510 vcpu->arch.texasr |= TEXASR_HV; 511 512 vcpu->arch.tfhar = kvmppc_get_pc(vcpu) + 4; 513 vcpu->arch.tfiar = kvmppc_get_pc(vcpu); 514 515 kvmppc_restore_tm_sprs(vcpu); 516 preempt_enable(); 517 } else 518 emulated = EMULATE_FAIL; 519 break; 520 } 521 case OP_31_XOP_TABORT: 522 { 523 ulong guest_msr = kvmppc_get_msr(vcpu); 524 unsigned long ra_val = 0; 525 526 if (!cpu_has_feature(CPU_FTR_TM)) 527 break; 528 529 if (!(kvmppc_get_msr(vcpu) & MSR_TM)) { 530 kvmppc_trigger_fac_interrupt(vcpu, FSCR_TM_LG); 531 emulated = EMULATE_AGAIN; 532 break; 533 } 534 535 /* only emulate for privilege guest, since problem state 536 * guest can run with TM enabled and we don't expect to 537 * trap at here for that case. 538 */ 539 WARN_ON(guest_msr & MSR_PR); 540 541 if (ra) 542 ra_val = kvmppc_get_gpr(vcpu, ra); 543 544 kvmppc_emulate_tabort(vcpu, ra_val); 545 break; 546 } 547 case OP_31_XOP_TRECLAIM: 548 { 549 ulong guest_msr = kvmppc_get_msr(vcpu); 550 unsigned long ra_val = 0; 551 552 if (!cpu_has_feature(CPU_FTR_TM)) 553 break; 554 555 if (!(kvmppc_get_msr(vcpu) & MSR_TM)) { 556 kvmppc_trigger_fac_interrupt(vcpu, FSCR_TM_LG); 557 emulated = EMULATE_AGAIN; 558 break; 559 } 560 561 /* generate interrupts based on priorities */ 562 if (guest_msr & MSR_PR) { 563 /* Privileged Instruction type Program Interrupt */ 564 kvmppc_core_queue_program(vcpu, SRR1_PROGPRIV); 565 emulated = EMULATE_AGAIN; 566 break; 567 } 568 569 if (!MSR_TM_ACTIVE(guest_msr)) { 570 /* TM bad thing interrupt */ 571 kvmppc_core_queue_program(vcpu, SRR1_PROGTM); 572 emulated = EMULATE_AGAIN; 573 break; 574 } 575 576 if (ra) 577 ra_val = kvmppc_get_gpr(vcpu, ra); 578 kvmppc_emulate_treclaim(vcpu, ra_val); 579 break; 580 } 581 case OP_31_XOP_TRCHKPT: 582 { 583 ulong guest_msr = kvmppc_get_msr(vcpu); 584 unsigned long texasr; 585 586 if (!cpu_has_feature(CPU_FTR_TM)) 587 break; 588 589 if (!(kvmppc_get_msr(vcpu) & MSR_TM)) { 590 kvmppc_trigger_fac_interrupt(vcpu, FSCR_TM_LG); 591 emulated = EMULATE_AGAIN; 592 break; 593 } 594 595 /* generate interrupt based on priorities */ 596 if (guest_msr & MSR_PR) { 597 /* Privileged Instruction type Program Intr */ 598 kvmppc_core_queue_program(vcpu, SRR1_PROGPRIV); 599 emulated = EMULATE_AGAIN; 600 break; 601 } 602 603 tm_enable(); 604 texasr = mfspr(SPRN_TEXASR); 605 tm_disable(); 606 607 if (MSR_TM_ACTIVE(guest_msr) || 608 !(texasr & (TEXASR_FS))) { 609 /* TM bad thing interrupt */ 610 kvmppc_core_queue_program(vcpu, SRR1_PROGTM); 611 emulated = EMULATE_AGAIN; 612 break; 613 } 614 615 kvmppc_emulate_trchkpt(vcpu); 616 break; 617 } 618#endif 619 default: 620 emulated = EMULATE_FAIL; 621 } 622 break; 623 default: 624 emulated = EMULATE_FAIL; 625 } 626 627 if (emulated == EMULATE_FAIL) 628 emulated = kvmppc_emulate_paired_single(vcpu); 629 630 return emulated; 631} 632 633void kvmppc_set_bat(struct kvm_vcpu *vcpu, struct kvmppc_bat *bat, bool upper, 634 u32 val) 635{ 636 if (upper) { 637 /* Upper BAT */ 638 u32 bl = (val >> 2) & 0x7ff; 639 bat->bepi_mask = (~bl << 17); 640 bat->bepi = val & 0xfffe0000; 641 bat->vs = (val & 2) ? 1 : 0; 642 bat->vp = (val & 1) ? 1 : 0; 643 bat->raw = (bat->raw & 0xffffffff00000000ULL) | val; 644 } else { 645 /* Lower BAT */ 646 bat->brpn = val & 0xfffe0000; 647 bat->wimg = (val >> 3) & 0xf; 648 bat->pp = val & 3; 649 bat->raw = (bat->raw & 0x00000000ffffffffULL) | ((u64)val << 32); 650 } 651} 652 653static struct kvmppc_bat *kvmppc_find_bat(struct kvm_vcpu *vcpu, int sprn) 654{ 655 struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu); 656 struct kvmppc_bat *bat; 657 658 switch (sprn) { 659 case SPRN_IBAT0U ... SPRN_IBAT3L: 660 bat = &vcpu_book3s->ibat[(sprn - SPRN_IBAT0U) / 2]; 661 break; 662 case SPRN_IBAT4U ... SPRN_IBAT7L: 663 bat = &vcpu_book3s->ibat[4 + ((sprn - SPRN_IBAT4U) / 2)]; 664 break; 665 case SPRN_DBAT0U ... SPRN_DBAT3L: 666 bat = &vcpu_book3s->dbat[(sprn - SPRN_DBAT0U) / 2]; 667 break; 668 case SPRN_DBAT4U ... SPRN_DBAT7L: 669 bat = &vcpu_book3s->dbat[4 + ((sprn - SPRN_DBAT4U) / 2)]; 670 break; 671 default: 672 BUG(); 673 } 674 675 return bat; 676} 677 678int kvmppc_core_emulate_mtspr_pr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val) 679{ 680 int emulated = EMULATE_DONE; 681 682 switch (sprn) { 683 case SPRN_SDR1: 684 if (!spr_allowed(vcpu, PRIV_HYPER)) 685 goto unprivileged; 686 to_book3s(vcpu)->sdr1 = spr_val; 687 break; 688 case SPRN_DSISR: 689 kvmppc_set_dsisr(vcpu, spr_val); 690 break; 691 case SPRN_DAR: 692 kvmppc_set_dar(vcpu, spr_val); 693 break; 694 case SPRN_HIOR: 695 to_book3s(vcpu)->hior = spr_val; 696 break; 697 case SPRN_IBAT0U ... SPRN_IBAT3L: 698 case SPRN_IBAT4U ... SPRN_IBAT7L: 699 case SPRN_DBAT0U ... SPRN_DBAT3L: 700 case SPRN_DBAT4U ... SPRN_DBAT7L: 701 { 702 struct kvmppc_bat *bat = kvmppc_find_bat(vcpu, sprn); 703 704 kvmppc_set_bat(vcpu, bat, !(sprn % 2), (u32)spr_val); 705 /* BAT writes happen so rarely that we're ok to flush 706 * everything here */ 707 kvmppc_mmu_pte_flush(vcpu, 0, 0); 708 kvmppc_mmu_flush_segments(vcpu); 709 break; 710 } 711 case SPRN_HID0: 712 to_book3s(vcpu)->hid[0] = spr_val; 713 break; 714 case SPRN_HID1: 715 to_book3s(vcpu)->hid[1] = spr_val; 716 break; 717 case SPRN_HID2: 718 to_book3s(vcpu)->hid[2] = spr_val; 719 break; 720 case SPRN_HID2_GEKKO: 721 to_book3s(vcpu)->hid[2] = spr_val; 722 /* HID2.PSE controls paired single on gekko */ 723 switch (vcpu->arch.pvr) { 724 case 0x00080200: /* lonestar 2.0 */ 725 case 0x00088202: /* lonestar 2.2 */ 726 case 0x70000100: /* gekko 1.0 */ 727 case 0x00080100: /* gekko 2.0 */ 728 case 0x00083203: /* gekko 2.3a */ 729 case 0x00083213: /* gekko 2.3b */ 730 case 0x00083204: /* gekko 2.4 */ 731 case 0x00083214: /* gekko 2.4e (8SE) - retail HW2 */ 732 case 0x00087200: /* broadway */ 733 if (vcpu->arch.hflags & BOOK3S_HFLAG_NATIVE_PS) { 734 /* Native paired singles */ 735 } else if (spr_val & (1 << 29)) { /* HID2.PSE */ 736 vcpu->arch.hflags |= BOOK3S_HFLAG_PAIRED_SINGLE; 737 kvmppc_giveup_ext(vcpu, MSR_FP); 738 } else { 739 vcpu->arch.hflags &= ~BOOK3S_HFLAG_PAIRED_SINGLE; 740 } 741 break; 742 } 743 break; 744 case SPRN_HID4: 745 case SPRN_HID4_GEKKO: 746 to_book3s(vcpu)->hid[4] = spr_val; 747 break; 748 case SPRN_HID5: 749 to_book3s(vcpu)->hid[5] = spr_val; 750 /* guest HID5 set can change is_dcbz32 */ 751 if (vcpu->arch.mmu.is_dcbz32(vcpu) && 752 (mfmsr() & MSR_HV)) 753 vcpu->arch.hflags |= BOOK3S_HFLAG_DCBZ32; 754 break; 755 case SPRN_GQR0: 756 case SPRN_GQR1: 757 case SPRN_GQR2: 758 case SPRN_GQR3: 759 case SPRN_GQR4: 760 case SPRN_GQR5: 761 case SPRN_GQR6: 762 case SPRN_GQR7: 763 to_book3s(vcpu)->gqr[sprn - SPRN_GQR0] = spr_val; 764 break; 765#ifdef CONFIG_PPC_BOOK3S_64 766 case SPRN_FSCR: 767 kvmppc_set_fscr(vcpu, spr_val); 768 break; 769 case SPRN_BESCR: 770 vcpu->arch.bescr = spr_val; 771 break; 772 case SPRN_EBBHR: 773 vcpu->arch.ebbhr = spr_val; 774 break; 775 case SPRN_EBBRR: 776 vcpu->arch.ebbrr = spr_val; 777 break; 778#ifdef CONFIG_PPC_TRANSACTIONAL_MEM 779 case SPRN_TFHAR: 780 case SPRN_TEXASR: 781 case SPRN_TFIAR: 782 if (!cpu_has_feature(CPU_FTR_TM)) 783 break; 784 785 if (!(kvmppc_get_msr(vcpu) & MSR_TM)) { 786 kvmppc_trigger_fac_interrupt(vcpu, FSCR_TM_LG); 787 emulated = EMULATE_AGAIN; 788 break; 789 } 790 791 if (MSR_TM_ACTIVE(kvmppc_get_msr(vcpu)) && 792 !((MSR_TM_SUSPENDED(kvmppc_get_msr(vcpu))) && 793 (sprn == SPRN_TFHAR))) { 794 /* it is illegal to mtspr() TM regs in 795 * other than non-transactional state, with 796 * the exception of TFHAR in suspend state. 797 */ 798 kvmppc_core_queue_program(vcpu, SRR1_PROGTM); 799 emulated = EMULATE_AGAIN; 800 break; 801 } 802 803 tm_enable(); 804 if (sprn == SPRN_TFHAR) 805 mtspr(SPRN_TFHAR, spr_val); 806 else if (sprn == SPRN_TEXASR) 807 mtspr(SPRN_TEXASR, spr_val); 808 else 809 mtspr(SPRN_TFIAR, spr_val); 810 tm_disable(); 811 812 break; 813#endif 814#endif 815 case SPRN_ICTC: 816 case SPRN_THRM1: 817 case SPRN_THRM2: 818 case SPRN_THRM3: 819 case SPRN_CTRLF: 820 case SPRN_CTRLT: 821 case SPRN_L2CR: 822 case SPRN_DSCR: 823 case SPRN_MMCR0_GEKKO: 824 case SPRN_MMCR1_GEKKO: 825 case SPRN_PMC1_GEKKO: 826 case SPRN_PMC2_GEKKO: 827 case SPRN_PMC3_GEKKO: 828 case SPRN_PMC4_GEKKO: 829 case SPRN_WPAR_GEKKO: 830 case SPRN_MSSSR0: 831 case SPRN_DABR: 832#ifdef CONFIG_PPC_BOOK3S_64 833 case SPRN_MMCRS: 834 case SPRN_MMCRA: 835 case SPRN_MMCR0: 836 case SPRN_MMCR1: 837 case SPRN_MMCR2: 838 case SPRN_UMMCR2: 839 case SPRN_UAMOR: 840 case SPRN_IAMR: 841 case SPRN_AMR: 842#endif 843 break; 844unprivileged: 845 default: 846 pr_info_ratelimited("KVM: invalid SPR write: %d\n", sprn); 847 if (sprn & 0x10) { 848 if (kvmppc_get_msr(vcpu) & MSR_PR) { 849 kvmppc_core_queue_program(vcpu, SRR1_PROGPRIV); 850 emulated = EMULATE_AGAIN; 851 } 852 } else { 853 if ((kvmppc_get_msr(vcpu) & MSR_PR) || sprn == 0) { 854 kvmppc_core_queue_program(vcpu, SRR1_PROGILL); 855 emulated = EMULATE_AGAIN; 856 } 857 } 858 break; 859 } 860 861 return emulated; 862} 863 864int kvmppc_core_emulate_mfspr_pr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val) 865{ 866 int emulated = EMULATE_DONE; 867 868 switch (sprn) { 869 case SPRN_IBAT0U ... SPRN_IBAT3L: 870 case SPRN_IBAT4U ... SPRN_IBAT7L: 871 case SPRN_DBAT0U ... SPRN_DBAT3L: 872 case SPRN_DBAT4U ... SPRN_DBAT7L: 873 { 874 struct kvmppc_bat *bat = kvmppc_find_bat(vcpu, sprn); 875 876 if (sprn % 2) 877 *spr_val = bat->raw >> 32; 878 else 879 *spr_val = bat->raw; 880 881 break; 882 } 883 case SPRN_SDR1: 884 if (!spr_allowed(vcpu, PRIV_HYPER)) 885 goto unprivileged; 886 *spr_val = to_book3s(vcpu)->sdr1; 887 break; 888 case SPRN_DSISR: 889 *spr_val = kvmppc_get_dsisr(vcpu); 890 break; 891 case SPRN_DAR: 892 *spr_val = kvmppc_get_dar(vcpu); 893 break; 894 case SPRN_HIOR: 895 *spr_val = to_book3s(vcpu)->hior; 896 break; 897 case SPRN_HID0: 898 *spr_val = to_book3s(vcpu)->hid[0]; 899 break; 900 case SPRN_HID1: 901 *spr_val = to_book3s(vcpu)->hid[1]; 902 break; 903 case SPRN_HID2: 904 case SPRN_HID2_GEKKO: 905 *spr_val = to_book3s(vcpu)->hid[2]; 906 break; 907 case SPRN_HID4: 908 case SPRN_HID4_GEKKO: 909 *spr_val = to_book3s(vcpu)->hid[4]; 910 break; 911 case SPRN_HID5: 912 *spr_val = to_book3s(vcpu)->hid[5]; 913 break; 914 case SPRN_CFAR: 915 case SPRN_DSCR: 916 *spr_val = 0; 917 break; 918 case SPRN_PURR: 919 /* 920 * On exit we would have updated purr 921 */ 922 *spr_val = vcpu->arch.purr; 923 break; 924 case SPRN_SPURR: 925 /* 926 * On exit we would have updated spurr 927 */ 928 *spr_val = vcpu->arch.spurr; 929 break; 930 case SPRN_VTB: 931 *spr_val = to_book3s(vcpu)->vtb; 932 break; 933 case SPRN_IC: 934 *spr_val = vcpu->arch.ic; 935 break; 936 case SPRN_GQR0: 937 case SPRN_GQR1: 938 case SPRN_GQR2: 939 case SPRN_GQR3: 940 case SPRN_GQR4: 941 case SPRN_GQR5: 942 case SPRN_GQR6: 943 case SPRN_GQR7: 944 *spr_val = to_book3s(vcpu)->gqr[sprn - SPRN_GQR0]; 945 break; 946#ifdef CONFIG_PPC_BOOK3S_64 947 case SPRN_FSCR: 948 *spr_val = vcpu->arch.fscr; 949 break; 950 case SPRN_BESCR: 951 *spr_val = vcpu->arch.bescr; 952 break; 953 case SPRN_EBBHR: 954 *spr_val = vcpu->arch.ebbhr; 955 break; 956 case SPRN_EBBRR: 957 *spr_val = vcpu->arch.ebbrr; 958 break; 959#ifdef CONFIG_PPC_TRANSACTIONAL_MEM 960 case SPRN_TFHAR: 961 case SPRN_TEXASR: 962 case SPRN_TFIAR: 963 if (!cpu_has_feature(CPU_FTR_TM)) 964 break; 965 966 if (!(kvmppc_get_msr(vcpu) & MSR_TM)) { 967 kvmppc_trigger_fac_interrupt(vcpu, FSCR_TM_LG); 968 emulated = EMULATE_AGAIN; 969 break; 970 } 971 972 tm_enable(); 973 if (sprn == SPRN_TFHAR) 974 *spr_val = mfspr(SPRN_TFHAR); 975 else if (sprn == SPRN_TEXASR) 976 *spr_val = mfspr(SPRN_TEXASR); 977 else if (sprn == SPRN_TFIAR) 978 *spr_val = mfspr(SPRN_TFIAR); 979 tm_disable(); 980 break; 981#endif 982#endif 983 case SPRN_THRM1: 984 case SPRN_THRM2: 985 case SPRN_THRM3: 986 case SPRN_CTRLF: 987 case SPRN_CTRLT: 988 case SPRN_L2CR: 989 case SPRN_MMCR0_GEKKO: 990 case SPRN_MMCR1_GEKKO: 991 case SPRN_PMC1_GEKKO: 992 case SPRN_PMC2_GEKKO: 993 case SPRN_PMC3_GEKKO: 994 case SPRN_PMC4_GEKKO: 995 case SPRN_WPAR_GEKKO: 996 case SPRN_MSSSR0: 997 case SPRN_DABR: 998#ifdef CONFIG_PPC_BOOK3S_64 999 case SPRN_MMCRS: 1000 case SPRN_MMCRA: 1001 case SPRN_MMCR0: 1002 case SPRN_MMCR1: 1003 case SPRN_MMCR2: 1004 case SPRN_UMMCR2: 1005 case SPRN_TIR: 1006 case SPRN_UAMOR: 1007 case SPRN_IAMR: 1008 case SPRN_AMR: 1009#endif 1010 *spr_val = 0; 1011 break; 1012 default: 1013unprivileged: 1014 pr_info_ratelimited("KVM: invalid SPR read: %d\n", sprn); 1015 if (sprn & 0x10) { 1016 if (kvmppc_get_msr(vcpu) & MSR_PR) { 1017 kvmppc_core_queue_program(vcpu, SRR1_PROGPRIV); 1018 emulated = EMULATE_AGAIN; 1019 } 1020 } else { 1021 if ((kvmppc_get_msr(vcpu) & MSR_PR) || sprn == 0 || 1022 sprn == 4 || sprn == 5 || sprn == 6) { 1023 kvmppc_core_queue_program(vcpu, SRR1_PROGILL); 1024 emulated = EMULATE_AGAIN; 1025 } 1026 } 1027 1028 break; 1029 } 1030 1031 return emulated; 1032} 1033 1034u32 kvmppc_alignment_dsisr(struct kvm_vcpu *vcpu, unsigned int inst) 1035{ 1036 return make_dsisr(inst); 1037} 1038 1039ulong kvmppc_alignment_dar(struct kvm_vcpu *vcpu, unsigned int inst) 1040{ 1041#ifdef CONFIG_PPC_BOOK3S_64 1042 /* 1043 * Linux's fix_alignment() assumes that DAR is valid, so can we 1044 */ 1045 return vcpu->arch.fault_dar; 1046#else 1047 ulong dar = 0; 1048 ulong ra = get_ra(inst); 1049 ulong rb = get_rb(inst); 1050 1051 switch (get_op(inst)) { 1052 case OP_LFS: 1053 case OP_LFD: 1054 case OP_STFD: 1055 case OP_STFS: 1056 if (ra) 1057 dar = kvmppc_get_gpr(vcpu, ra); 1058 dar += (s32)((s16)inst); 1059 break; 1060 case 31: 1061 if (ra) 1062 dar = kvmppc_get_gpr(vcpu, ra); 1063 dar += kvmppc_get_gpr(vcpu, rb); 1064 break; 1065 default: 1066 printk(KERN_INFO "KVM: Unaligned instruction 0x%x\n", inst); 1067 break; 1068 } 1069 1070 return dar; 1071#endif 1072}