linux/arch/powerpc/kvm/booke_emulate.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 *
   4 * Copyright IBM Corp. 2008
   5 * Copyright 2011 Freescale Semiconductor, Inc.
   6 *
   7 * Authors: Hollis Blanchard <hollisb@us.ibm.com>
   8 */
   9
  10#include <linux/kvm_host.h>
  11#include <asm/disassemble.h>
  12
  13#include "booke.h"
  14
  15#define OP_19_XOP_RFI     50
  16#define OP_19_XOP_RFCI    51
  17#define OP_19_XOP_RFDI    39
  18
  19#define OP_31_XOP_MFMSR   83
  20#define OP_31_XOP_WRTEE   131
  21#define OP_31_XOP_MTMSR   146
  22#define OP_31_XOP_WRTEEI  163
  23
  24static void kvmppc_emul_rfi(struct kvm_vcpu *vcpu)
  25{
  26        vcpu->arch.regs.nip = vcpu->arch.shared->srr0;
  27        kvmppc_set_msr(vcpu, vcpu->arch.shared->srr1);
  28}
  29
  30static void kvmppc_emul_rfdi(struct kvm_vcpu *vcpu)
  31{
  32        vcpu->arch.regs.nip = vcpu->arch.dsrr0;
  33        kvmppc_set_msr(vcpu, vcpu->arch.dsrr1);
  34}
  35
  36static void kvmppc_emul_rfci(struct kvm_vcpu *vcpu)
  37{
  38        vcpu->arch.regs.nip = vcpu->arch.csrr0;
  39        kvmppc_set_msr(vcpu, vcpu->arch.csrr1);
  40}
  41
  42int kvmppc_booke_emulate_op(struct kvm_run *run, struct kvm_vcpu *vcpu,
  43                            unsigned int inst, int *advance)
  44{
  45        int emulated = EMULATE_DONE;
  46        int rs = get_rs(inst);
  47        int rt = get_rt(inst);
  48
  49        switch (get_op(inst)) {
  50        case 19:
  51                switch (get_xop(inst)) {
  52                case OP_19_XOP_RFI:
  53                        kvmppc_emul_rfi(vcpu);
  54                        kvmppc_set_exit_type(vcpu, EMULATED_RFI_EXITS);
  55                        *advance = 0;
  56                        break;
  57
  58                case OP_19_XOP_RFCI:
  59                        kvmppc_emul_rfci(vcpu);
  60                        kvmppc_set_exit_type(vcpu, EMULATED_RFCI_EXITS);
  61                        *advance = 0;
  62                        break;
  63
  64                case OP_19_XOP_RFDI:
  65                        kvmppc_emul_rfdi(vcpu);
  66                        kvmppc_set_exit_type(vcpu, EMULATED_RFDI_EXITS);
  67                        *advance = 0;
  68                        break;
  69
  70                default:
  71                        emulated = EMULATE_FAIL;
  72                        break;
  73                }
  74                break;
  75
  76        case 31:
  77                switch (get_xop(inst)) {
  78
  79                case OP_31_XOP_MFMSR:
  80                        kvmppc_set_gpr(vcpu, rt, vcpu->arch.shared->msr);
  81                        kvmppc_set_exit_type(vcpu, EMULATED_MFMSR_EXITS);
  82                        break;
  83
  84                case OP_31_XOP_MTMSR:
  85                        kvmppc_set_exit_type(vcpu, EMULATED_MTMSR_EXITS);
  86                        kvmppc_set_msr(vcpu, kvmppc_get_gpr(vcpu, rs));
  87                        break;
  88
  89                case OP_31_XOP_WRTEE:
  90                        vcpu->arch.shared->msr = (vcpu->arch.shared->msr & ~MSR_EE)
  91                                        | (kvmppc_get_gpr(vcpu, rs) & MSR_EE);
  92                        kvmppc_set_exit_type(vcpu, EMULATED_WRTEE_EXITS);
  93                        break;
  94
  95                case OP_31_XOP_WRTEEI:
  96                        vcpu->arch.shared->msr = (vcpu->arch.shared->msr & ~MSR_EE)
  97                                                         | (inst & MSR_EE);
  98                        kvmppc_set_exit_type(vcpu, EMULATED_WRTEE_EXITS);
  99                        break;
 100
 101                default:
 102                        emulated = EMULATE_FAIL;
 103                }
 104
 105                break;
 106
 107        default:
 108                emulated = EMULATE_FAIL;
 109        }
 110
 111        return emulated;
 112}
 113
 114/*
 115 * NOTE: some of these registers are not emulated on BOOKE_HV (GS-mode).
 116 * Their backing store is in real registers, and these functions
 117 * will return the wrong result if called for them in another context
 118 * (such as debugging).
 119 */
 120int kvmppc_booke_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val)
 121{
 122        int emulated = EMULATE_DONE;
 123        bool debug_inst = false;
 124
 125        switch (sprn) {
 126        case SPRN_DEAR:
 127                vcpu->arch.shared->dar = spr_val;
 128                break;
 129        case SPRN_ESR:
 130                vcpu->arch.shared->esr = spr_val;
 131                break;
 132        case SPRN_CSRR0:
 133                vcpu->arch.csrr0 = spr_val;
 134                break;
 135        case SPRN_CSRR1:
 136                vcpu->arch.csrr1 = spr_val;
 137                break;
 138        case SPRN_DSRR0:
 139                vcpu->arch.dsrr0 = spr_val;
 140                break;
 141        case SPRN_DSRR1:
 142                vcpu->arch.dsrr1 = spr_val;
 143                break;
 144        case SPRN_IAC1:
 145                /*
 146                 * If userspace is debugging guest then guest
 147                 * can not access debug registers.
 148                 */
 149                if (vcpu->guest_debug)
 150                        break;
 151
 152                debug_inst = true;
 153                vcpu->arch.dbg_reg.iac1 = spr_val;
 154                break;
 155        case SPRN_IAC2:
 156                /*
 157                 * If userspace is debugging guest then guest
 158                 * can not access debug registers.
 159                 */
 160                if (vcpu->guest_debug)
 161                        break;
 162
 163                debug_inst = true;
 164                vcpu->arch.dbg_reg.iac2 = spr_val;
 165                break;
 166#if CONFIG_PPC_ADV_DEBUG_IACS > 2
 167        case SPRN_IAC3:
 168                /*
 169                 * If userspace is debugging guest then guest
 170                 * can not access debug registers.
 171                 */
 172                if (vcpu->guest_debug)
 173                        break;
 174
 175                debug_inst = true;
 176                vcpu->arch.dbg_reg.iac3 = spr_val;
 177                break;
 178        case SPRN_IAC4:
 179                /*
 180                 * If userspace is debugging guest then guest
 181                 * can not access debug registers.
 182                 */
 183                if (vcpu->guest_debug)
 184                        break;
 185
 186                debug_inst = true;
 187                vcpu->arch.dbg_reg.iac4 = spr_val;
 188                break;
 189#endif
 190        case SPRN_DAC1:
 191                /*
 192                 * If userspace is debugging guest then guest
 193                 * can not access debug registers.
 194                 */
 195                if (vcpu->guest_debug)
 196                        break;
 197
 198                debug_inst = true;
 199                vcpu->arch.dbg_reg.dac1 = spr_val;
 200                break;
 201        case SPRN_DAC2:
 202                /*
 203                 * If userspace is debugging guest then guest
 204                 * can not access debug registers.
 205                 */
 206                if (vcpu->guest_debug)
 207                        break;
 208
 209                debug_inst = true;
 210                vcpu->arch.dbg_reg.dac2 = spr_val;
 211                break;
 212        case SPRN_DBCR0:
 213                /*
 214                 * If userspace is debugging guest then guest
 215                 * can not access debug registers.
 216                 */
 217                if (vcpu->guest_debug)
 218                        break;
 219
 220                debug_inst = true;
 221                spr_val &= (DBCR0_IDM | DBCR0_IC | DBCR0_BT | DBCR0_TIE |
 222                        DBCR0_IAC1 | DBCR0_IAC2 | DBCR0_IAC3 | DBCR0_IAC4  |
 223                        DBCR0_DAC1R | DBCR0_DAC1W | DBCR0_DAC2R | DBCR0_DAC2W);
 224
 225                vcpu->arch.dbg_reg.dbcr0 = spr_val;
 226                break;
 227        case SPRN_DBCR1:
 228                /*
 229                 * If userspace is debugging guest then guest
 230                 * can not access debug registers.
 231                 */
 232                if (vcpu->guest_debug)
 233                        break;
 234
 235                debug_inst = true;
 236                vcpu->arch.dbg_reg.dbcr1 = spr_val;
 237                break;
 238        case SPRN_DBCR2:
 239                /*
 240                 * If userspace is debugging guest then guest
 241                 * can not access debug registers.
 242                 */
 243                if (vcpu->guest_debug)
 244                        break;
 245
 246                debug_inst = true;
 247                vcpu->arch.dbg_reg.dbcr2 = spr_val;
 248                break;
 249        case SPRN_DBSR:
 250                /*
 251                 * If userspace is debugging guest then guest
 252                 * can not access debug registers.
 253                 */
 254                if (vcpu->guest_debug)
 255                        break;
 256
 257                vcpu->arch.dbsr &= ~spr_val;
 258                if (!(vcpu->arch.dbsr & ~DBSR_IDE))
 259                        kvmppc_core_dequeue_debug(vcpu);
 260                break;
 261        case SPRN_TSR:
 262                kvmppc_clr_tsr_bits(vcpu, spr_val);
 263                break;
 264        case SPRN_TCR:
 265                /*
 266                 * WRC is a 2-bit field that is supposed to preserve its
 267                 * value once written to non-zero.
 268                 */
 269                if (vcpu->arch.tcr & TCR_WRC_MASK) {
 270                        spr_val &= ~TCR_WRC_MASK;
 271                        spr_val |= vcpu->arch.tcr & TCR_WRC_MASK;
 272                }
 273                kvmppc_set_tcr(vcpu, spr_val);
 274                break;
 275
 276        case SPRN_DECAR:
 277                vcpu->arch.decar = spr_val;
 278                break;
 279        /*
 280         * Note: SPRG4-7 are user-readable.
 281         * These values are loaded into the real SPRGs when resuming the
 282         * guest (PR-mode only).
 283         */
 284        case SPRN_SPRG4:
 285                kvmppc_set_sprg4(vcpu, spr_val);
 286                break;
 287        case SPRN_SPRG5:
 288                kvmppc_set_sprg5(vcpu, spr_val);
 289                break;
 290        case SPRN_SPRG6:
 291                kvmppc_set_sprg6(vcpu, spr_val);
 292                break;
 293        case SPRN_SPRG7:
 294                kvmppc_set_sprg7(vcpu, spr_val);
 295                break;
 296
 297        case SPRN_IVPR:
 298                vcpu->arch.ivpr = spr_val;
 299#ifdef CONFIG_KVM_BOOKE_HV
 300                mtspr(SPRN_GIVPR, spr_val);
 301#endif
 302                break;
 303        case SPRN_IVOR0:
 304                vcpu->arch.ivor[BOOKE_IRQPRIO_CRITICAL] = spr_val;
 305                break;
 306        case SPRN_IVOR1:
 307                vcpu->arch.ivor[BOOKE_IRQPRIO_MACHINE_CHECK] = spr_val;
 308                break;
 309        case SPRN_IVOR2:
 310                vcpu->arch.ivor[BOOKE_IRQPRIO_DATA_STORAGE] = spr_val;
 311#ifdef CONFIG_KVM_BOOKE_HV
 312                mtspr(SPRN_GIVOR2, spr_val);
 313#endif
 314                break;
 315        case SPRN_IVOR3:
 316                vcpu->arch.ivor[BOOKE_IRQPRIO_INST_STORAGE] = spr_val;
 317                break;
 318        case SPRN_IVOR4:
 319                vcpu->arch.ivor[BOOKE_IRQPRIO_EXTERNAL] = spr_val;
 320                break;
 321        case SPRN_IVOR5:
 322                vcpu->arch.ivor[BOOKE_IRQPRIO_ALIGNMENT] = spr_val;
 323                break;
 324        case SPRN_IVOR6:
 325                vcpu->arch.ivor[BOOKE_IRQPRIO_PROGRAM] = spr_val;
 326                break;
 327        case SPRN_IVOR7:
 328                vcpu->arch.ivor[BOOKE_IRQPRIO_FP_UNAVAIL] = spr_val;
 329                break;
 330        case SPRN_IVOR8:
 331                vcpu->arch.ivor[BOOKE_IRQPRIO_SYSCALL] = spr_val;
 332#ifdef CONFIG_KVM_BOOKE_HV
 333                mtspr(SPRN_GIVOR8, spr_val);
 334#endif
 335                break;
 336        case SPRN_IVOR9:
 337                vcpu->arch.ivor[BOOKE_IRQPRIO_AP_UNAVAIL] = spr_val;
 338                break;
 339        case SPRN_IVOR10:
 340                vcpu->arch.ivor[BOOKE_IRQPRIO_DECREMENTER] = spr_val;
 341                break;
 342        case SPRN_IVOR11:
 343                vcpu->arch.ivor[BOOKE_IRQPRIO_FIT] = spr_val;
 344                break;
 345        case SPRN_IVOR12:
 346                vcpu->arch.ivor[BOOKE_IRQPRIO_WATCHDOG] = spr_val;
 347                break;
 348        case SPRN_IVOR13:
 349                vcpu->arch.ivor[BOOKE_IRQPRIO_DTLB_MISS] = spr_val;
 350                break;
 351        case SPRN_IVOR14:
 352                vcpu->arch.ivor[BOOKE_IRQPRIO_ITLB_MISS] = spr_val;
 353                break;
 354        case SPRN_IVOR15:
 355                vcpu->arch.ivor[BOOKE_IRQPRIO_DEBUG] = spr_val;
 356                break;
 357        case SPRN_MCSR:
 358                vcpu->arch.mcsr &= ~spr_val;
 359                break;
 360#if defined(CONFIG_64BIT)
 361        case SPRN_EPCR:
 362                kvmppc_set_epcr(vcpu, spr_val);
 363#ifdef CONFIG_KVM_BOOKE_HV
 364                mtspr(SPRN_EPCR, vcpu->arch.shadow_epcr);
 365#endif
 366                break;
 367#endif
 368        default:
 369                emulated = EMULATE_FAIL;
 370        }
 371
 372        if (debug_inst) {
 373                current->thread.debug = vcpu->arch.dbg_reg;
 374                switch_booke_debug_regs(&vcpu->arch.dbg_reg);
 375        }
 376        return emulated;
 377}
 378
 379int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val)
 380{
 381        int emulated = EMULATE_DONE;
 382
 383        switch (sprn) {
 384        case SPRN_IVPR:
 385                *spr_val = vcpu->arch.ivpr;
 386                break;
 387        case SPRN_DEAR:
 388                *spr_val = vcpu->arch.shared->dar;
 389                break;
 390        case SPRN_ESR:
 391                *spr_val = vcpu->arch.shared->esr;
 392                break;
 393        case SPRN_EPR:
 394                *spr_val = vcpu->arch.epr;
 395                break;
 396        case SPRN_CSRR0:
 397                *spr_val = vcpu->arch.csrr0;
 398                break;
 399        case SPRN_CSRR1:
 400                *spr_val = vcpu->arch.csrr1;
 401                break;
 402        case SPRN_DSRR0:
 403                *spr_val = vcpu->arch.dsrr0;
 404                break;
 405        case SPRN_DSRR1:
 406                *spr_val = vcpu->arch.dsrr1;
 407                break;
 408        case SPRN_IAC1:
 409                *spr_val = vcpu->arch.dbg_reg.iac1;
 410                break;
 411        case SPRN_IAC2:
 412                *spr_val = vcpu->arch.dbg_reg.iac2;
 413                break;
 414#if CONFIG_PPC_ADV_DEBUG_IACS > 2
 415        case SPRN_IAC3:
 416                *spr_val = vcpu->arch.dbg_reg.iac3;
 417                break;
 418        case SPRN_IAC4:
 419                *spr_val = vcpu->arch.dbg_reg.iac4;
 420                break;
 421#endif
 422        case SPRN_DAC1:
 423                *spr_val = vcpu->arch.dbg_reg.dac1;
 424                break;
 425        case SPRN_DAC2:
 426                *spr_val = vcpu->arch.dbg_reg.dac2;
 427                break;
 428        case SPRN_DBCR0:
 429                *spr_val = vcpu->arch.dbg_reg.dbcr0;
 430                if (vcpu->guest_debug)
 431                        *spr_val = *spr_val | DBCR0_EDM;
 432                break;
 433        case SPRN_DBCR1:
 434                *spr_val = vcpu->arch.dbg_reg.dbcr1;
 435                break;
 436        case SPRN_DBCR2:
 437                *spr_val = vcpu->arch.dbg_reg.dbcr2;
 438                break;
 439        case SPRN_DBSR:
 440                *spr_val = vcpu->arch.dbsr;
 441                break;
 442        case SPRN_TSR:
 443                *spr_val = vcpu->arch.tsr;
 444                break;
 445        case SPRN_TCR:
 446                *spr_val = vcpu->arch.tcr;
 447                break;
 448
 449        case SPRN_IVOR0:
 450                *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_CRITICAL];
 451                break;
 452        case SPRN_IVOR1:
 453                *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_MACHINE_CHECK];
 454                break;
 455        case SPRN_IVOR2:
 456                *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_DATA_STORAGE];
 457                break;
 458        case SPRN_IVOR3:
 459                *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_INST_STORAGE];
 460                break;
 461        case SPRN_IVOR4:
 462                *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_EXTERNAL];
 463                break;
 464        case SPRN_IVOR5:
 465                *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_ALIGNMENT];
 466                break;
 467        case SPRN_IVOR6:
 468                *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_PROGRAM];
 469                break;
 470        case SPRN_IVOR7:
 471                *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_FP_UNAVAIL];
 472                break;
 473        case SPRN_IVOR8:
 474                *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_SYSCALL];
 475                break;
 476        case SPRN_IVOR9:
 477                *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_AP_UNAVAIL];
 478                break;
 479        case SPRN_IVOR10:
 480                *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_DECREMENTER];
 481                break;
 482        case SPRN_IVOR11:
 483                *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_FIT];
 484                break;
 485        case SPRN_IVOR12:
 486                *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_WATCHDOG];
 487                break;
 488        case SPRN_IVOR13:
 489                *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_DTLB_MISS];
 490                break;
 491        case SPRN_IVOR14:
 492                *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_ITLB_MISS];
 493                break;
 494        case SPRN_IVOR15:
 495                *spr_val = vcpu->arch.ivor[BOOKE_IRQPRIO_DEBUG];
 496                break;
 497        case SPRN_MCSR:
 498                *spr_val = vcpu->arch.mcsr;
 499                break;
 500#if defined(CONFIG_64BIT)
 501        case SPRN_EPCR:
 502                *spr_val = vcpu->arch.epcr;
 503                break;
 504#endif
 505
 506        default:
 507                emulated = EMULATE_FAIL;
 508        }
 509
 510        return emulated;
 511}
 512