linux/arch/mips/kvm/vz.c
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * KVM/MIPS: Support for hardware virtualization extensions
   7 *
   8 * Copyright (C) 2012  MIPS Technologies, Inc.  All rights reserved.
   9 * Authors: Yann Le Du <ledu@kymasys.com>
  10 */
  11
  12#include <linux/errno.h>
  13#include <linux/err.h>
  14#include <linux/module.h>
  15#include <linux/preempt.h>
  16#include <linux/vmalloc.h>
  17#include <asm/cacheflush.h>
  18#include <asm/cacheops.h>
  19#include <asm/cmpxchg.h>
  20#include <asm/fpu.h>
  21#include <asm/hazards.h>
  22#include <asm/inst.h>
  23#include <asm/mmu_context.h>
  24#include <asm/r4kcache.h>
  25#include <asm/time.h>
  26#include <asm/tlb.h>
  27#include <asm/tlbex.h>
  28
  29#include <linux/kvm_host.h>
  30
  31#include "interrupt.h"
  32#ifdef CONFIG_CPU_LOONGSON64
  33#include "loongson_regs.h"
  34#endif
  35
  36#include "trace.h"
  37
  38/* Pointers to last VCPU loaded on each physical CPU */
  39static struct kvm_vcpu *last_vcpu[NR_CPUS];
  40/* Pointers to last VCPU executed on each physical CPU */
  41static struct kvm_vcpu *last_exec_vcpu[NR_CPUS];
  42
  43/*
  44 * Number of guest VTLB entries to use, so we can catch inconsistency between
  45 * CPUs.
  46 */
  47static unsigned int kvm_vz_guest_vtlb_size;
  48
  49static inline long kvm_vz_read_gc0_ebase(void)
  50{
  51        if (sizeof(long) == 8 && cpu_has_ebase_wg)
  52                return read_gc0_ebase_64();
  53        else
  54                return read_gc0_ebase();
  55}
  56
  57static inline void kvm_vz_write_gc0_ebase(long v)
  58{
  59        /*
  60         * First write with WG=1 to write upper bits, then write again in case
  61         * WG should be left at 0.
  62         * write_gc0_ebase_64() is no longer UNDEFINED since R6.
  63         */
  64        if (sizeof(long) == 8 &&
  65            (cpu_has_mips64r6 || cpu_has_ebase_wg)) {
  66                write_gc0_ebase_64(v | MIPS_EBASE_WG);
  67                write_gc0_ebase_64(v);
  68        } else {
  69                write_gc0_ebase(v | MIPS_EBASE_WG);
  70                write_gc0_ebase(v);
  71        }
  72}
  73
  74/*
  75 * These Config bits may be writable by the guest:
  76 * Config:      [K23, KU] (!TLB), K0
  77 * Config1:     (none)
  78 * Config2:     [TU, SU] (impl)
  79 * Config3:     ISAOnExc
  80 * Config4:     FTLBPageSize
  81 * Config5:     K, CV, MSAEn, UFE, FRE, SBRI, UFR
  82 */
  83
  84static inline unsigned int kvm_vz_config_guest_wrmask(struct kvm_vcpu *vcpu)
  85{
  86        return CONF_CM_CMASK;
  87}
  88
  89static inline unsigned int kvm_vz_config1_guest_wrmask(struct kvm_vcpu *vcpu)
  90{
  91        return 0;
  92}
  93
  94static inline unsigned int kvm_vz_config2_guest_wrmask(struct kvm_vcpu *vcpu)
  95{
  96        return 0;
  97}
  98
  99static inline unsigned int kvm_vz_config3_guest_wrmask(struct kvm_vcpu *vcpu)
 100{
 101        return MIPS_CONF3_ISA_OE;
 102}
 103
 104static inline unsigned int kvm_vz_config4_guest_wrmask(struct kvm_vcpu *vcpu)
 105{
 106        /* no need to be exact */
 107        return MIPS_CONF4_VFTLBPAGESIZE;
 108}
 109
 110static inline unsigned int kvm_vz_config5_guest_wrmask(struct kvm_vcpu *vcpu)
 111{
 112        unsigned int mask = MIPS_CONF5_K | MIPS_CONF5_CV | MIPS_CONF5_SBRI;
 113
 114        /* Permit MSAEn changes if MSA supported and enabled */
 115        if (kvm_mips_guest_has_msa(&vcpu->arch))
 116                mask |= MIPS_CONF5_MSAEN;
 117
 118        /*
 119         * Permit guest FPU mode changes if FPU is enabled and the relevant
 120         * feature exists according to FIR register.
 121         */
 122        if (kvm_mips_guest_has_fpu(&vcpu->arch)) {
 123                if (cpu_has_ufr)
 124                        mask |= MIPS_CONF5_UFR;
 125                if (cpu_has_fre)
 126                        mask |= MIPS_CONF5_FRE | MIPS_CONF5_UFE;
 127        }
 128
 129        return mask;
 130}
 131
 132static inline unsigned int kvm_vz_config6_guest_wrmask(struct kvm_vcpu *vcpu)
 133{
 134        return LOONGSON_CONF6_INTIMER | LOONGSON_CONF6_EXTIMER;
 135}
 136
 137/*
 138 * VZ optionally allows these additional Config bits to be written by root:
 139 * Config:      M, [MT]
 140 * Config1:     M, [MMUSize-1, C2, MD, PC, WR, CA], FP
 141 * Config2:     M
 142 * Config3:     M, MSAP, [BPG], ULRI, [DSP2P, DSPP], CTXTC, [ITL, LPA, VEIC,
 143 *              VInt, SP, CDMM, MT, SM, TL]
 144 * Config4:     M, [VTLBSizeExt, MMUSizeExt]
 145 * Config5:     MRP
 146 */
 147
 148static inline unsigned int kvm_vz_config_user_wrmask(struct kvm_vcpu *vcpu)
 149{
 150        return kvm_vz_config_guest_wrmask(vcpu) | MIPS_CONF_M;
 151}
 152
 153static inline unsigned int kvm_vz_config1_user_wrmask(struct kvm_vcpu *vcpu)
 154{
 155        unsigned int mask = kvm_vz_config1_guest_wrmask(vcpu) | MIPS_CONF_M;
 156
 157        /* Permit FPU to be present if FPU is supported */
 158        if (kvm_mips_guest_can_have_fpu(&vcpu->arch))
 159                mask |= MIPS_CONF1_FP;
 160
 161        return mask;
 162}
 163
 164static inline unsigned int kvm_vz_config2_user_wrmask(struct kvm_vcpu *vcpu)
 165{
 166        return kvm_vz_config2_guest_wrmask(vcpu) | MIPS_CONF_M;
 167}
 168
 169static inline unsigned int kvm_vz_config3_user_wrmask(struct kvm_vcpu *vcpu)
 170{
 171        unsigned int mask = kvm_vz_config3_guest_wrmask(vcpu) | MIPS_CONF_M |
 172                MIPS_CONF3_ULRI | MIPS_CONF3_CTXTC;
 173
 174        /* Permit MSA to be present if MSA is supported */
 175        if (kvm_mips_guest_can_have_msa(&vcpu->arch))
 176                mask |= MIPS_CONF3_MSA;
 177
 178        return mask;
 179}
 180
 181static inline unsigned int kvm_vz_config4_user_wrmask(struct kvm_vcpu *vcpu)
 182{
 183        return kvm_vz_config4_guest_wrmask(vcpu) | MIPS_CONF_M;
 184}
 185
 186static inline unsigned int kvm_vz_config5_user_wrmask(struct kvm_vcpu *vcpu)
 187{
 188        return kvm_vz_config5_guest_wrmask(vcpu) | MIPS_CONF5_MRP;
 189}
 190
 191static inline unsigned int kvm_vz_config6_user_wrmask(struct kvm_vcpu *vcpu)
 192{
 193        return kvm_vz_config6_guest_wrmask(vcpu) |
 194                LOONGSON_CONF6_SFBEN | LOONGSON_CONF6_FTLBDIS;
 195}
 196
 197static gpa_t kvm_vz_gva_to_gpa_cb(gva_t gva)
 198{
 199        /* VZ guest has already converted gva to gpa */
 200        return gva;
 201}
 202
 203static void kvm_vz_queue_irq(struct kvm_vcpu *vcpu, unsigned int priority)
 204{
 205        set_bit(priority, &vcpu->arch.pending_exceptions);
 206        clear_bit(priority, &vcpu->arch.pending_exceptions_clr);
 207}
 208
 209static void kvm_vz_dequeue_irq(struct kvm_vcpu *vcpu, unsigned int priority)
 210{
 211        clear_bit(priority, &vcpu->arch.pending_exceptions);
 212        set_bit(priority, &vcpu->arch.pending_exceptions_clr);
 213}
 214
 215static void kvm_vz_queue_timer_int_cb(struct kvm_vcpu *vcpu)
 216{
 217        /*
 218         * timer expiry is asynchronous to vcpu execution therefore defer guest
 219         * cp0 accesses
 220         */
 221        kvm_vz_queue_irq(vcpu, MIPS_EXC_INT_TIMER);
 222}
 223
 224static void kvm_vz_dequeue_timer_int_cb(struct kvm_vcpu *vcpu)
 225{
 226        /*
 227         * timer expiry is asynchronous to vcpu execution therefore defer guest
 228         * cp0 accesses
 229         */
 230        kvm_vz_dequeue_irq(vcpu, MIPS_EXC_INT_TIMER);
 231}
 232
 233static void kvm_vz_queue_io_int_cb(struct kvm_vcpu *vcpu,
 234                                   struct kvm_mips_interrupt *irq)
 235{
 236        int intr = (int)irq->irq;
 237
 238        /*
 239         * interrupts are asynchronous to vcpu execution therefore defer guest
 240         * cp0 accesses
 241         */
 242        kvm_vz_queue_irq(vcpu, kvm_irq_to_priority(intr));
 243}
 244
 245static void kvm_vz_dequeue_io_int_cb(struct kvm_vcpu *vcpu,
 246                                     struct kvm_mips_interrupt *irq)
 247{
 248        int intr = (int)irq->irq;
 249
 250        /*
 251         * interrupts are asynchronous to vcpu execution therefore defer guest
 252         * cp0 accesses
 253         */
 254        kvm_vz_dequeue_irq(vcpu, kvm_irq_to_priority(-intr));
 255}
 256
 257static int kvm_vz_irq_deliver_cb(struct kvm_vcpu *vcpu, unsigned int priority,
 258                                 u32 cause)
 259{
 260        u32 irq = (priority < MIPS_EXC_MAX) ?
 261                kvm_priority_to_irq[priority] : 0;
 262
 263        switch (priority) {
 264        case MIPS_EXC_INT_TIMER:
 265                set_gc0_cause(C_TI);
 266                break;
 267
 268        case MIPS_EXC_INT_IO_1:
 269        case MIPS_EXC_INT_IO_2:
 270        case MIPS_EXC_INT_IPI_1:
 271        case MIPS_EXC_INT_IPI_2:
 272                if (cpu_has_guestctl2)
 273                        set_c0_guestctl2(irq);
 274                else
 275                        set_gc0_cause(irq);
 276                break;
 277
 278        default:
 279                break;
 280        }
 281
 282        clear_bit(priority, &vcpu->arch.pending_exceptions);
 283        return 1;
 284}
 285
 286static int kvm_vz_irq_clear_cb(struct kvm_vcpu *vcpu, unsigned int priority,
 287                               u32 cause)
 288{
 289        u32 irq = (priority < MIPS_EXC_MAX) ?
 290                kvm_priority_to_irq[priority] : 0;
 291
 292        switch (priority) {
 293        case MIPS_EXC_INT_TIMER:
 294                /*
 295                 * Call to kvm_write_c0_guest_compare() clears Cause.TI in
 296                 * kvm_mips_emulate_CP0(). Explicitly clear irq associated with
 297                 * Cause.IP[IPTI] if GuestCtl2 virtual interrupt register not
 298                 * supported or if not using GuestCtl2 Hardware Clear.
 299                 */
 300                if (cpu_has_guestctl2) {
 301                        if (!(read_c0_guestctl2() & (irq << 14)))
 302                                clear_c0_guestctl2(irq);
 303                } else {
 304                        clear_gc0_cause(irq);
 305                }
 306                break;
 307
 308        case MIPS_EXC_INT_IO_1:
 309        case MIPS_EXC_INT_IO_2:
 310        case MIPS_EXC_INT_IPI_1:
 311        case MIPS_EXC_INT_IPI_2:
 312                /* Clear GuestCtl2.VIP irq if not using Hardware Clear */
 313                if (cpu_has_guestctl2) {
 314                        if (!(read_c0_guestctl2() & (irq << 14)))
 315                                clear_c0_guestctl2(irq);
 316                } else {
 317                        clear_gc0_cause(irq);
 318                }
 319                break;
 320
 321        default:
 322                break;
 323        }
 324
 325        clear_bit(priority, &vcpu->arch.pending_exceptions_clr);
 326        return 1;
 327}
 328
 329/*
 330 * VZ guest timer handling.
 331 */
 332
 333/**
 334 * kvm_vz_should_use_htimer() - Find whether to use the VZ hard guest timer.
 335 * @vcpu:       Virtual CPU.
 336 *
 337 * Returns:     true if the VZ GTOffset & real guest CP0_Count should be used
 338 *              instead of software emulation of guest timer.
 339 *              false otherwise.
 340 */
 341static bool kvm_vz_should_use_htimer(struct kvm_vcpu *vcpu)
 342{
 343        if (kvm_mips_count_disabled(vcpu))
 344                return false;
 345
 346        /* Chosen frequency must match real frequency */
 347        if (mips_hpt_frequency != vcpu->arch.count_hz)
 348                return false;
 349
 350        /* We don't support a CP0_GTOffset with fewer bits than CP0_Count */
 351        if (current_cpu_data.gtoffset_mask != 0xffffffff)
 352                return false;
 353
 354        return true;
 355}
 356
 357/**
 358 * _kvm_vz_restore_stimer() - Restore soft timer state.
 359 * @vcpu:       Virtual CPU.
 360 * @compare:    CP0_Compare register value, restored by caller.
 361 * @cause:      CP0_Cause register to restore.
 362 *
 363 * Restore VZ state relating to the soft timer. The hard timer can be enabled
 364 * later.
 365 */
 366static void _kvm_vz_restore_stimer(struct kvm_vcpu *vcpu, u32 compare,
 367                                   u32 cause)
 368{
 369        /*
 370         * Avoid spurious counter interrupts by setting Guest CP0_Count to just
 371         * after Guest CP0_Compare.
 372         */
 373        write_c0_gtoffset(compare - read_c0_count());
 374
 375        back_to_back_c0_hazard();
 376        write_gc0_cause(cause);
 377}
 378
 379/**
 380 * _kvm_vz_restore_htimer() - Restore hard timer state.
 381 * @vcpu:       Virtual CPU.
 382 * @compare:    CP0_Compare register value, restored by caller.
 383 * @cause:      CP0_Cause register to restore.
 384 *
 385 * Restore hard timer Guest.Count & Guest.Cause taking care to preserve the
 386 * value of Guest.CP0_Cause.TI while restoring Guest.CP0_Cause.
 387 */
 388static void _kvm_vz_restore_htimer(struct kvm_vcpu *vcpu,
 389                                   u32 compare, u32 cause)
 390{
 391        u32 start_count, after_count;
 392        ktime_t freeze_time;
 393        unsigned long flags;
 394
 395        /*
 396         * Freeze the soft-timer and sync the guest CP0_Count with it. We do
 397         * this with interrupts disabled to avoid latency.
 398         */
 399        local_irq_save(flags);
 400        freeze_time = kvm_mips_freeze_hrtimer(vcpu, &start_count);
 401        write_c0_gtoffset(start_count - read_c0_count());
 402        local_irq_restore(flags);
 403
 404        /* restore guest CP0_Cause, as TI may already be set */
 405        back_to_back_c0_hazard();
 406        write_gc0_cause(cause);
 407
 408        /*
 409         * The above sequence isn't atomic and would result in lost timer
 410         * interrupts if we're not careful. Detect if a timer interrupt is due
 411         * and assert it.
 412         */
 413        back_to_back_c0_hazard();
 414        after_count = read_gc0_count();
 415        if (after_count - start_count > compare - start_count - 1)
 416                kvm_vz_queue_irq(vcpu, MIPS_EXC_INT_TIMER);
 417}
 418
 419/**
 420 * kvm_vz_restore_timer() - Restore timer state.
 421 * @vcpu:       Virtual CPU.
 422 *
 423 * Restore soft timer state from saved context.
 424 */
 425static void kvm_vz_restore_timer(struct kvm_vcpu *vcpu)
 426{
 427        struct mips_coproc *cop0 = vcpu->arch.cop0;
 428        u32 cause, compare;
 429
 430        compare = kvm_read_sw_gc0_compare(cop0);
 431        cause = kvm_read_sw_gc0_cause(cop0);
 432
 433        write_gc0_compare(compare);
 434        _kvm_vz_restore_stimer(vcpu, compare, cause);
 435}
 436
 437/**
 438 * kvm_vz_acquire_htimer() - Switch to hard timer state.
 439 * @vcpu:       Virtual CPU.
 440 *
 441 * Restore hard timer state on top of existing soft timer state if possible.
 442 *
 443 * Since hard timer won't remain active over preemption, preemption should be
 444 * disabled by the caller.
 445 */
 446void kvm_vz_acquire_htimer(struct kvm_vcpu *vcpu)
 447{
 448        u32 gctl0;
 449
 450        gctl0 = read_c0_guestctl0();
 451        if (!(gctl0 & MIPS_GCTL0_GT) && kvm_vz_should_use_htimer(vcpu)) {
 452                /* enable guest access to hard timer */
 453                write_c0_guestctl0(gctl0 | MIPS_GCTL0_GT);
 454
 455                _kvm_vz_restore_htimer(vcpu, read_gc0_compare(),
 456                                       read_gc0_cause());
 457        }
 458}
 459
 460/**
 461 * _kvm_vz_save_htimer() - Switch to software emulation of guest timer.
 462 * @vcpu:       Virtual CPU.
 463 * @compare:    Pointer to write compare value to.
 464 * @cause:      Pointer to write cause value to.
 465 *
 466 * Save VZ guest timer state and switch to software emulation of guest CP0
 467 * timer. The hard timer must already be in use, so preemption should be
 468 * disabled.
 469 */
 470static void _kvm_vz_save_htimer(struct kvm_vcpu *vcpu,
 471                                u32 *out_compare, u32 *out_cause)
 472{
 473        u32 cause, compare, before_count, end_count;
 474        ktime_t before_time;
 475
 476        compare = read_gc0_compare();
 477        *out_compare = compare;
 478
 479        before_time = ktime_get();
 480
 481        /*
 482         * Record the CP0_Count *prior* to saving CP0_Cause, so we have a time
 483         * at which no pending timer interrupt is missing.
 484         */
 485        before_count = read_gc0_count();
 486        back_to_back_c0_hazard();
 487        cause = read_gc0_cause();
 488        *out_cause = cause;
 489
 490        /*
 491         * Record a final CP0_Count which we will transfer to the soft-timer.
 492         * This is recorded *after* saving CP0_Cause, so we don't get any timer
 493         * interrupts from just after the final CP0_Count point.
 494         */
 495        back_to_back_c0_hazard();
 496        end_count = read_gc0_count();
 497
 498        /*
 499         * The above sequence isn't atomic, so we could miss a timer interrupt
 500         * between reading CP0_Cause and end_count. Detect and record any timer
 501         * interrupt due between before_count and end_count.
 502         */
 503        if (end_count - before_count > compare - before_count - 1)
 504                kvm_vz_queue_irq(vcpu, MIPS_EXC_INT_TIMER);
 505
 506        /*
 507         * Restore soft-timer, ignoring a small amount of negative drift due to
 508         * delay between freeze_hrtimer and setting CP0_GTOffset.
 509         */
 510        kvm_mips_restore_hrtimer(vcpu, before_time, end_count, -0x10000);
 511}
 512
 513/**
 514 * kvm_vz_save_timer() - Save guest timer state.
 515 * @vcpu:       Virtual CPU.
 516 *
 517 * Save VZ guest timer state and switch to soft guest timer if hard timer was in
 518 * use.
 519 */
 520static void kvm_vz_save_timer(struct kvm_vcpu *vcpu)
 521{
 522        struct mips_coproc *cop0 = vcpu->arch.cop0;
 523        u32 gctl0, compare, cause;
 524
 525        gctl0 = read_c0_guestctl0();
 526        if (gctl0 & MIPS_GCTL0_GT) {
 527                /* disable guest use of hard timer */
 528                write_c0_guestctl0(gctl0 & ~MIPS_GCTL0_GT);
 529
 530                /* save hard timer state */
 531                _kvm_vz_save_htimer(vcpu, &compare, &cause);
 532        } else {
 533                compare = read_gc0_compare();
 534                cause = read_gc0_cause();
 535        }
 536
 537        /* save timer-related state to VCPU context */
 538        kvm_write_sw_gc0_cause(cop0, cause);
 539        kvm_write_sw_gc0_compare(cop0, compare);
 540}
 541
 542/**
 543 * kvm_vz_lose_htimer() - Ensure hard guest timer is not in use.
 544 * @vcpu:       Virtual CPU.
 545 *
 546 * Transfers the state of the hard guest timer to the soft guest timer, leaving
 547 * guest state intact so it can continue to be used with the soft timer.
 548 */
 549void kvm_vz_lose_htimer(struct kvm_vcpu *vcpu)
 550{
 551        u32 gctl0, compare, cause;
 552
 553        preempt_disable();
 554        gctl0 = read_c0_guestctl0();
 555        if (gctl0 & MIPS_GCTL0_GT) {
 556                /* disable guest use of timer */
 557                write_c0_guestctl0(gctl0 & ~MIPS_GCTL0_GT);
 558
 559                /* switch to soft timer */
 560                _kvm_vz_save_htimer(vcpu, &compare, &cause);
 561
 562                /* leave soft timer in usable state */
 563                _kvm_vz_restore_stimer(vcpu, compare, cause);
 564        }
 565        preempt_enable();
 566}
 567
 568/**
 569 * is_eva_access() - Find whether an instruction is an EVA memory accessor.
 570 * @inst:       32-bit instruction encoding.
 571 *
 572 * Finds whether @inst encodes an EVA memory access instruction, which would
 573 * indicate that emulation of it should access the user mode address space
 574 * instead of the kernel mode address space. This matters for MUSUK segments
 575 * which are TLB mapped for user mode but unmapped for kernel mode.
 576 *
 577 * Returns:     Whether @inst encodes an EVA accessor instruction.
 578 */
 579static bool is_eva_access(union mips_instruction inst)
 580{
 581        if (inst.spec3_format.opcode != spec3_op)
 582                return false;
 583
 584        switch (inst.spec3_format.func) {
 585        case lwle_op:
 586        case lwre_op:
 587        case cachee_op:
 588        case sbe_op:
 589        case she_op:
 590        case sce_op:
 591        case swe_op:
 592        case swle_op:
 593        case swre_op:
 594        case prefe_op:
 595        case lbue_op:
 596        case lhue_op:
 597        case lbe_op:
 598        case lhe_op:
 599        case lle_op:
 600        case lwe_op:
 601                return true;
 602        default:
 603                return false;
 604        }
 605}
 606
 607/**
 608 * is_eva_am_mapped() - Find whether an access mode is mapped.
 609 * @vcpu:       KVM VCPU state.
 610 * @am:         3-bit encoded access mode.
 611 * @eu:         Segment becomes unmapped and uncached when Status.ERL=1.
 612 *
 613 * Decode @am to find whether it encodes a mapped segment for the current VCPU
 614 * state. Where necessary @eu and the actual instruction causing the fault are
 615 * taken into account to make the decision.
 616 *
 617 * Returns:     Whether the VCPU faulted on a TLB mapped address.
 618 */
 619static bool is_eva_am_mapped(struct kvm_vcpu *vcpu, unsigned int am, bool eu)
 620{
 621        u32 am_lookup;
 622        int err;
 623
 624        /*
 625         * Interpret access control mode. We assume address errors will already
 626         * have been caught by the guest, leaving us with:
 627         *      AM      UM  SM  KM  31..24 23..16
 628         * UK    0 000          Unm   0      0
 629         * MK    1 001          TLB   1
 630         * MSK   2 010      TLB TLB   1
 631         * MUSK  3 011  TLB TLB TLB   1
 632         * MUSUK 4 100  TLB TLB Unm   0      1
 633         * USK   5 101      Unm Unm   0      0
 634         * -     6 110                0      0
 635         * UUSK  7 111  Unm Unm Unm   0      0
 636         *
 637         * We shift a magic value by AM across the sign bit to find if always
 638         * TLB mapped, and if not shift by 8 again to find if it depends on KM.
 639         */
 640        am_lookup = 0x70080000 << am;
 641        if ((s32)am_lookup < 0) {
 642                /*
 643                 * MK, MSK, MUSK
 644                 * Always TLB mapped, unless SegCtl.EU && ERL
 645                 */
 646                if (!eu || !(read_gc0_status() & ST0_ERL))
 647                        return true;
 648        } else {
 649                am_lookup <<= 8;
 650                if ((s32)am_lookup < 0) {
 651                        union mips_instruction inst;
 652                        unsigned int status;
 653                        u32 *opc;
 654
 655                        /*
 656                         * MUSUK
 657                         * TLB mapped if not in kernel mode
 658                         */
 659                        status = read_gc0_status();
 660                        if (!(status & (ST0_EXL | ST0_ERL)) &&
 661                            (status & ST0_KSU))
 662                                return true;
 663                        /*
 664                         * EVA access instructions in kernel
 665                         * mode access user address space.
 666                         */
 667                        opc = (u32 *)vcpu->arch.pc;
 668                        if (vcpu->arch.host_cp0_cause & CAUSEF_BD)
 669                                opc += 1;
 670                        err = kvm_get_badinstr(opc, vcpu, &inst.word);
 671                        if (!err && is_eva_access(inst))
 672                                return true;
 673                }
 674        }
 675
 676        return false;
 677}
 678
 679/**
 680 * kvm_vz_gva_to_gpa() - Convert valid GVA to GPA.
 681 * @vcpu:       KVM VCPU state.
 682 * @gva:        Guest virtual address to convert.
 683 * @gpa:        Output guest physical address.
 684 *
 685 * Convert a guest virtual address (GVA) which is valid according to the guest
 686 * context, to a guest physical address (GPA).
 687 *
 688 * Returns:     0 on success.
 689 *              -errno on failure.
 690 */
 691static int kvm_vz_gva_to_gpa(struct kvm_vcpu *vcpu, unsigned long gva,
 692                             unsigned long *gpa)
 693{
 694        u32 gva32 = gva;
 695        unsigned long segctl;
 696
 697        if ((long)gva == (s32)gva32) {
 698                /* Handle canonical 32-bit virtual address */
 699                if (cpu_guest_has_segments) {
 700                        unsigned long mask, pa;
 701
 702                        switch (gva32 >> 29) {
 703                        case 0:
 704                        case 1: /* CFG5 (1GB) */
 705                                segctl = read_gc0_segctl2() >> 16;
 706                                mask = (unsigned long)0xfc0000000ull;
 707                                break;
 708                        case 2:
 709                        case 3: /* CFG4 (1GB) */
 710                                segctl = read_gc0_segctl2();
 711                                mask = (unsigned long)0xfc0000000ull;
 712                                break;
 713                        case 4: /* CFG3 (512MB) */
 714                                segctl = read_gc0_segctl1() >> 16;
 715                                mask = (unsigned long)0xfe0000000ull;
 716                                break;
 717                        case 5: /* CFG2 (512MB) */
 718                                segctl = read_gc0_segctl1();
 719                                mask = (unsigned long)0xfe0000000ull;
 720                                break;
 721                        case 6: /* CFG1 (512MB) */
 722                                segctl = read_gc0_segctl0() >> 16;
 723                                mask = (unsigned long)0xfe0000000ull;
 724                                break;
 725                        case 7: /* CFG0 (512MB) */
 726                                segctl = read_gc0_segctl0();
 727                                mask = (unsigned long)0xfe0000000ull;
 728                                break;
 729                        default:
 730                                /*
 731                                 * GCC 4.9 isn't smart enough to figure out that
 732                                 * segctl and mask are always initialised.
 733                                 */
 734                                unreachable();
 735                        }
 736
 737                        if (is_eva_am_mapped(vcpu, (segctl >> 4) & 0x7,
 738                                             segctl & 0x0008))
 739                                goto tlb_mapped;
 740
 741                        /* Unmapped, find guest physical address */
 742                        pa = (segctl << 20) & mask;
 743                        pa |= gva32 & ~mask;
 744                        *gpa = pa;
 745                        return 0;
 746                } else if ((s32)gva32 < (s32)0xc0000000) {
 747                        /* legacy unmapped KSeg0 or KSeg1 */
 748                        *gpa = gva32 & 0x1fffffff;
 749                        return 0;
 750                }
 751#ifdef CONFIG_64BIT
 752        } else if ((gva & 0xc000000000000000) == 0x8000000000000000) {
 753                /* XKPHYS */
 754                if (cpu_guest_has_segments) {
 755                        /*
 756                         * Each of the 8 regions can be overridden by SegCtl2.XR
 757                         * to use SegCtl1.XAM.
 758                         */
 759                        segctl = read_gc0_segctl2();
 760                        if (segctl & (1ull << (56 + ((gva >> 59) & 0x7)))) {
 761                                segctl = read_gc0_segctl1();
 762                                if (is_eva_am_mapped(vcpu, (segctl >> 59) & 0x7,
 763                                                     0))
 764                                        goto tlb_mapped;
 765                        }
 766
 767                }
 768                /*
 769                 * Traditionally fully unmapped.
 770                 * Bits 61:59 specify the CCA, which we can just mask off here.
 771                 * Bits 58:PABITS should be zero, but we shouldn't have got here
 772                 * if it wasn't.
 773                 */
 774                *gpa = gva & 0x07ffffffffffffff;
 775                return 0;
 776#endif
 777        }
 778
 779tlb_mapped:
 780        return kvm_vz_guest_tlb_lookup(vcpu, gva, gpa);
 781}
 782
 783/**
 784 * kvm_vz_badvaddr_to_gpa() - Convert GVA BadVAddr from root exception to GPA.
 785 * @vcpu:       KVM VCPU state.
 786 * @badvaddr:   Root BadVAddr.
 787 * @gpa:        Output guest physical address.
 788 *
 789 * VZ implementations are permitted to report guest virtual addresses (GVA) in
 790 * BadVAddr on a root exception during guest execution, instead of the more
 791 * convenient guest physical addresses (GPA). When we get a GVA, this function
 792 * converts it to a GPA, taking into account guest segmentation and guest TLB
 793 * state.
 794 *
 795 * Returns:     0 on success.
 796 *              -errno on failure.
 797 */
 798static int kvm_vz_badvaddr_to_gpa(struct kvm_vcpu *vcpu, unsigned long badvaddr,
 799                                  unsigned long *gpa)
 800{
 801        unsigned int gexccode = (vcpu->arch.host_cp0_guestctl0 &
 802                                 MIPS_GCTL0_GEXC) >> MIPS_GCTL0_GEXC_SHIFT;
 803
 804        /* If BadVAddr is GPA, then all is well in the world */
 805        if (likely(gexccode == MIPS_GCTL0_GEXC_GPA)) {
 806                *gpa = badvaddr;
 807                return 0;
 808        }
 809
 810        /* Otherwise we'd expect it to be GVA ... */
 811        if (WARN(gexccode != MIPS_GCTL0_GEXC_GVA,
 812                 "Unexpected gexccode %#x\n", gexccode))
 813                return -EINVAL;
 814
 815        /* ... and we need to perform the GVA->GPA translation in software */
 816        return kvm_vz_gva_to_gpa(vcpu, badvaddr, gpa);
 817}
 818
 819static int kvm_trap_vz_no_handler(struct kvm_vcpu *vcpu)
 820{
 821        u32 *opc = (u32 *) vcpu->arch.pc;
 822        u32 cause = vcpu->arch.host_cp0_cause;
 823        u32 exccode = (cause & CAUSEF_EXCCODE) >> CAUSEB_EXCCODE;
 824        unsigned long badvaddr = vcpu->arch.host_cp0_badvaddr;
 825        u32 inst = 0;
 826
 827        /*
 828         *  Fetch the instruction.
 829         */
 830        if (cause & CAUSEF_BD)
 831                opc += 1;
 832        kvm_get_badinstr(opc, vcpu, &inst);
 833
 834        kvm_err("Exception Code: %d not handled @ PC: %p, inst: 0x%08x BadVaddr: %#lx Status: %#x\n",
 835                exccode, opc, inst, badvaddr,
 836                read_gc0_status());
 837        kvm_arch_vcpu_dump_regs(vcpu);
 838        vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 839        return RESUME_HOST;
 840}
 841
 842static unsigned long mips_process_maar(unsigned int op, unsigned long val)
 843{
 844        /* Mask off unused bits */
 845        unsigned long mask = 0xfffff000 | MIPS_MAAR_S | MIPS_MAAR_VL;
 846
 847        if (read_gc0_pagegrain() & PG_ELPA)
 848                mask |= 0x00ffffff00000000ull;
 849        if (cpu_guest_has_mvh)
 850                mask |= MIPS_MAAR_VH;
 851
 852        /* Set or clear VH */
 853        if (op == mtc_op) {
 854                /* clear VH */
 855                val &= ~MIPS_MAAR_VH;
 856        } else if (op == dmtc_op) {
 857                /* set VH to match VL */
 858                val &= ~MIPS_MAAR_VH;
 859                if (val & MIPS_MAAR_VL)
 860                        val |= MIPS_MAAR_VH;
 861        }
 862
 863        return val & mask;
 864}
 865
 866static void kvm_write_maari(struct kvm_vcpu *vcpu, unsigned long val)
 867{
 868        struct mips_coproc *cop0 = vcpu->arch.cop0;
 869
 870        val &= MIPS_MAARI_INDEX;
 871        if (val == MIPS_MAARI_INDEX)
 872                kvm_write_sw_gc0_maari(cop0, ARRAY_SIZE(vcpu->arch.maar) - 1);
 873        else if (val < ARRAY_SIZE(vcpu->arch.maar))
 874                kvm_write_sw_gc0_maari(cop0, val);
 875}
 876
 877static enum emulation_result kvm_vz_gpsi_cop0(union mips_instruction inst,
 878                                              u32 *opc, u32 cause,
 879                                              struct kvm_vcpu *vcpu)
 880{
 881        struct mips_coproc *cop0 = vcpu->arch.cop0;
 882        enum emulation_result er = EMULATE_DONE;
 883        u32 rt, rd, sel;
 884        unsigned long curr_pc;
 885        unsigned long val;
 886
 887        /*
 888         * Update PC and hold onto current PC in case there is
 889         * an error and we want to rollback the PC
 890         */
 891        curr_pc = vcpu->arch.pc;
 892        er = update_pc(vcpu, cause);
 893        if (er == EMULATE_FAIL)
 894                return er;
 895
 896        if (inst.co_format.co) {
 897                switch (inst.co_format.func) {
 898                case wait_op:
 899                        er = kvm_mips_emul_wait(vcpu);
 900                        break;
 901                default:
 902                        er = EMULATE_FAIL;
 903                }
 904        } else {
 905                rt = inst.c0r_format.rt;
 906                rd = inst.c0r_format.rd;
 907                sel = inst.c0r_format.sel;
 908
 909                switch (inst.c0r_format.rs) {
 910                case dmfc_op:
 911                case mfc_op:
 912#ifdef CONFIG_KVM_MIPS_DEBUG_COP0_COUNTERS
 913                        cop0->stat[rd][sel]++;
 914#endif
 915                        if (rd == MIPS_CP0_COUNT &&
 916                            sel == 0) {                 /* Count */
 917                                val = kvm_mips_read_count(vcpu);
 918                        } else if (rd == MIPS_CP0_COMPARE &&
 919                                   sel == 0) {          /* Compare */
 920                                val = read_gc0_compare();
 921                        } else if (rd == MIPS_CP0_LLADDR &&
 922                                   sel == 0) {          /* LLAddr */
 923                                if (cpu_guest_has_rw_llb)
 924                                        val = read_gc0_lladdr() &
 925                                                MIPS_LLADDR_LLB;
 926                                else
 927                                        val = 0;
 928                        } else if (rd == MIPS_CP0_LLADDR &&
 929                                   sel == 1 &&          /* MAAR */
 930                                   cpu_guest_has_maar &&
 931                                   !cpu_guest_has_dyn_maar) {
 932                                /* MAARI must be in range */
 933                                BUG_ON(kvm_read_sw_gc0_maari(cop0) >=
 934                                                ARRAY_SIZE(vcpu->arch.maar));
 935                                val = vcpu->arch.maar[
 936                                        kvm_read_sw_gc0_maari(cop0)];
 937                        } else if ((rd == MIPS_CP0_PRID &&
 938                                    (sel == 0 ||        /* PRid */
 939                                     sel == 2 ||        /* CDMMBase */
 940                                     sel == 3)) ||      /* CMGCRBase */
 941                                   (rd == MIPS_CP0_STATUS &&
 942                                    (sel == 2 ||        /* SRSCtl */
 943                                     sel == 3)) ||      /* SRSMap */
 944                                   (rd == MIPS_CP0_CONFIG &&
 945                                    (sel == 6 ||        /* Config6 */
 946                                     sel == 7)) ||      /* Config7 */
 947                                   (rd == MIPS_CP0_LLADDR &&
 948                                    (sel == 2) &&       /* MAARI */
 949                                    cpu_guest_has_maar &&
 950                                    !cpu_guest_has_dyn_maar) ||
 951                                   (rd == MIPS_CP0_ERRCTL &&
 952                                    (sel == 0))) {      /* ErrCtl */
 953                                val = cop0->reg[rd][sel];
 954#ifdef CONFIG_CPU_LOONGSON64
 955                        } else if (rd == MIPS_CP0_DIAG &&
 956                                   (sel == 0)) {        /* Diag */
 957                                val = cop0->reg[rd][sel];
 958#endif
 959                        } else {
 960                                val = 0;
 961                                er = EMULATE_FAIL;
 962                        }
 963
 964                        if (er != EMULATE_FAIL) {
 965                                /* Sign extend */
 966                                if (inst.c0r_format.rs == mfc_op)
 967                                        val = (int)val;
 968                                vcpu->arch.gprs[rt] = val;
 969                        }
 970
 971                        trace_kvm_hwr(vcpu, (inst.c0r_format.rs == mfc_op) ?
 972                                        KVM_TRACE_MFC0 : KVM_TRACE_DMFC0,
 973                                      KVM_TRACE_COP0(rd, sel), val);
 974                        break;
 975
 976                case dmtc_op:
 977                case mtc_op:
 978#ifdef CONFIG_KVM_MIPS_DEBUG_COP0_COUNTERS
 979                        cop0->stat[rd][sel]++;
 980#endif
 981                        val = vcpu->arch.gprs[rt];
 982                        trace_kvm_hwr(vcpu, (inst.c0r_format.rs == mtc_op) ?
 983                                        KVM_TRACE_MTC0 : KVM_TRACE_DMTC0,
 984                                      KVM_TRACE_COP0(rd, sel), val);
 985
 986                        if (rd == MIPS_CP0_COUNT &&
 987                            sel == 0) {                 /* Count */
 988                                kvm_vz_lose_htimer(vcpu);
 989                                kvm_mips_write_count(vcpu, vcpu->arch.gprs[rt]);
 990                        } else if (rd == MIPS_CP0_COMPARE &&
 991                                   sel == 0) {          /* Compare */
 992                                kvm_mips_write_compare(vcpu,
 993                                                       vcpu->arch.gprs[rt],
 994                                                       true);
 995                        } else if (rd == MIPS_CP0_LLADDR &&
 996                                   sel == 0) {          /* LLAddr */
 997                                /*
 998                                 * P5600 generates GPSI on guest MTC0 LLAddr.
 999                                 * Only allow the guest to clear LLB.
1000                                 */
1001                                if (cpu_guest_has_rw_llb &&
1002                                    !(val & MIPS_LLADDR_LLB))
1003                                        write_gc0_lladdr(0);
1004                        } else if (rd == MIPS_CP0_LLADDR &&
1005                                   sel == 1 &&          /* MAAR */
1006                                   cpu_guest_has_maar &&
1007                                   !cpu_guest_has_dyn_maar) {
1008                                val = mips_process_maar(inst.c0r_format.rs,
1009                                                        val);
1010
1011                                /* MAARI must be in range */
1012                                BUG_ON(kvm_read_sw_gc0_maari(cop0) >=
1013                                                ARRAY_SIZE(vcpu->arch.maar));
1014                                vcpu->arch.maar[kvm_read_sw_gc0_maari(cop0)] =
1015                                                                        val;
1016                        } else if (rd == MIPS_CP0_LLADDR &&
1017                                   (sel == 2) &&        /* MAARI */
1018                                   cpu_guest_has_maar &&
1019                                   !cpu_guest_has_dyn_maar) {
1020                                kvm_write_maari(vcpu, val);
1021                        } else if (rd == MIPS_CP0_CONFIG &&
1022                                   (sel == 6)) {
1023                                cop0->reg[rd][sel] = (int)val;
1024                        } else if (rd == MIPS_CP0_ERRCTL &&
1025                                   (sel == 0)) {        /* ErrCtl */
1026                                /* ignore the written value */
1027#ifdef CONFIG_CPU_LOONGSON64
1028                        } else if (rd == MIPS_CP0_DIAG &&
1029                                   (sel == 0)) {        /* Diag */
1030                                unsigned long flags;
1031
1032                                local_irq_save(flags);
1033                                if (val & LOONGSON_DIAG_BTB) {
1034                                        /* Flush BTB */
1035                                        set_c0_diag(LOONGSON_DIAG_BTB);
1036                                }
1037                                if (val & LOONGSON_DIAG_ITLB) {
1038                                        /* Flush ITLB */
1039                                        set_c0_diag(LOONGSON_DIAG_ITLB);
1040                                }
1041                                if (val & LOONGSON_DIAG_DTLB) {
1042                                        /* Flush DTLB */
1043                                        set_c0_diag(LOONGSON_DIAG_DTLB);
1044                                }
1045                                if (val & LOONGSON_DIAG_VTLB) {
1046                                        /* Flush VTLB */
1047                                        kvm_loongson_clear_guest_vtlb();
1048                                }
1049                                if (val & LOONGSON_DIAG_FTLB) {
1050                                        /* Flush FTLB */
1051                                        kvm_loongson_clear_guest_ftlb();
1052                                }
1053                                local_irq_restore(flags);
1054#endif
1055                        } else {
1056                                er = EMULATE_FAIL;
1057                        }
1058                        break;
1059
1060                default:
1061                        er = EMULATE_FAIL;
1062                        break;
1063                }
1064        }
1065        /* Rollback PC only if emulation was unsuccessful */
1066        if (er == EMULATE_FAIL) {
1067                kvm_err("[%#lx]%s: unsupported cop0 instruction 0x%08x\n",
1068                        curr_pc, __func__, inst.word);
1069
1070                vcpu->arch.pc = curr_pc;
1071        }
1072
1073        return er;
1074}
1075
1076static enum emulation_result kvm_vz_gpsi_cache(union mips_instruction inst,
1077                                               u32 *opc, u32 cause,
1078                                               struct kvm_vcpu *vcpu)
1079{
1080        enum emulation_result er = EMULATE_DONE;
1081        u32 cache, op_inst, op, base;
1082        s16 offset;
1083        struct kvm_vcpu_arch *arch = &vcpu->arch;
1084        unsigned long va, curr_pc;
1085
1086        /*
1087         * Update PC and hold onto current PC in case there is
1088         * an error and we want to rollback the PC
1089         */
1090        curr_pc = vcpu->arch.pc;
1091        er = update_pc(vcpu, cause);
1092        if (er == EMULATE_FAIL)
1093                return er;
1094
1095        base = inst.i_format.rs;
1096        op_inst = inst.i_format.rt;
1097        if (cpu_has_mips_r6)
1098                offset = inst.spec3_format.simmediate;
1099        else
1100                offset = inst.i_format.simmediate;
1101        cache = op_inst & CacheOp_Cache;
1102        op = op_inst & CacheOp_Op;
1103
1104        va = arch->gprs[base] + offset;
1105
1106        kvm_debug("CACHE (cache: %#x, op: %#x, base[%d]: %#lx, offset: %#x\n",
1107                  cache, op, base, arch->gprs[base], offset);
1108
1109        /* Secondary or tirtiary cache ops ignored */
1110        if (cache != Cache_I && cache != Cache_D)
1111                return EMULATE_DONE;
1112
1113        switch (op_inst) {
1114        case Index_Invalidate_I:
1115                flush_icache_line_indexed(va);
1116                return EMULATE_DONE;
1117        case Index_Writeback_Inv_D:
1118                flush_dcache_line_indexed(va);
1119                return EMULATE_DONE;
1120        case Hit_Invalidate_I:
1121        case Hit_Invalidate_D:
1122        case Hit_Writeback_Inv_D:
1123                if (boot_cpu_type() == CPU_CAVIUM_OCTEON3) {
1124                        /* We can just flush entire icache */
1125                        local_flush_icache_range(0, 0);
1126                        return EMULATE_DONE;
1127                }
1128
1129                /* So far, other platforms support guest hit cache ops */
1130                break;
1131        default:
1132                break;
1133        }
1134
1135        kvm_err("@ %#lx/%#lx CACHE (cache: %#x, op: %#x, base[%d]: %#lx, offset: %#x\n",
1136                curr_pc, vcpu->arch.gprs[31], cache, op, base, arch->gprs[base],
1137                offset);
1138        /* Rollback PC */
1139        vcpu->arch.pc = curr_pc;
1140
1141        return EMULATE_FAIL;
1142}
1143
1144#ifdef CONFIG_CPU_LOONGSON64
1145static enum emulation_result kvm_vz_gpsi_lwc2(union mips_instruction inst,
1146                                              u32 *opc, u32 cause,
1147                                              struct kvm_vcpu *vcpu)
1148{
1149        unsigned int rs, rd;
1150        unsigned int hostcfg;
1151        unsigned long curr_pc;
1152        enum emulation_result er = EMULATE_DONE;
1153
1154        /*
1155         * Update PC and hold onto current PC in case there is
1156         * an error and we want to rollback the PC
1157         */
1158        curr_pc = vcpu->arch.pc;
1159        er = update_pc(vcpu, cause);
1160        if (er == EMULATE_FAIL)
1161                return er;
1162
1163        rs = inst.loongson3_lscsr_format.rs;
1164        rd = inst.loongson3_lscsr_format.rd;
1165        switch (inst.loongson3_lscsr_format.fr) {
1166        case 0x8:  /* Read CPUCFG */
1167                ++vcpu->stat.vz_cpucfg_exits;
1168                hostcfg = read_cpucfg(vcpu->arch.gprs[rs]);
1169
1170                switch (vcpu->arch.gprs[rs]) {
1171                case LOONGSON_CFG0:
1172                        vcpu->arch.gprs[rd] = 0x14c000;
1173                        break;
1174                case LOONGSON_CFG1:
1175                        hostcfg &= (LOONGSON_CFG1_FP | LOONGSON_CFG1_MMI |
1176                                    LOONGSON_CFG1_MSA1 | LOONGSON_CFG1_MSA2 |
1177                                    LOONGSON_CFG1_SFBP);
1178                        vcpu->arch.gprs[rd] = hostcfg;
1179                        break;
1180                case LOONGSON_CFG2:
1181                        hostcfg &= (LOONGSON_CFG2_LEXT1 | LOONGSON_CFG2_LEXT2 |
1182                                    LOONGSON_CFG2_LEXT3 | LOONGSON_CFG2_LSPW);
1183                        vcpu->arch.gprs[rd] = hostcfg;
1184                        break;
1185                case LOONGSON_CFG3:
1186                        vcpu->arch.gprs[rd] = hostcfg;
1187                        break;
1188                default:
1189                        /* Don't export any other advanced features to guest */
1190                        vcpu->arch.gprs[rd] = 0;
1191                        break;
1192                }
1193                break;
1194
1195        default:
1196                kvm_err("lwc2 emulate not impl %d rs %lx @%lx\n",
1197                        inst.loongson3_lscsr_format.fr, vcpu->arch.gprs[rs], curr_pc);
1198                er = EMULATE_FAIL;
1199                break;
1200        }
1201
1202        /* Rollback PC only if emulation was unsuccessful */
1203        if (er == EMULATE_FAIL) {
1204                kvm_err("[%#lx]%s: unsupported lwc2 instruction 0x%08x 0x%08x\n",
1205                        curr_pc, __func__, inst.word, inst.loongson3_lscsr_format.fr);
1206
1207                vcpu->arch.pc = curr_pc;
1208        }
1209
1210        return er;
1211}
1212#endif
1213
1214static enum emulation_result kvm_trap_vz_handle_gpsi(u32 cause, u32 *opc,
1215                                                     struct kvm_vcpu *vcpu)
1216{
1217        enum emulation_result er = EMULATE_DONE;
1218        struct kvm_vcpu_arch *arch = &vcpu->arch;
1219        union mips_instruction inst;
1220        int rd, rt, sel;
1221        int err;
1222
1223        /*
1224         *  Fetch the instruction.
1225         */
1226        if (cause & CAUSEF_BD)
1227                opc += 1;
1228        err = kvm_get_badinstr(opc, vcpu, &inst.word);
1229        if (err)
1230                return EMULATE_FAIL;
1231
1232        switch (inst.r_format.opcode) {
1233        case cop0_op:
1234                er = kvm_vz_gpsi_cop0(inst, opc, cause, vcpu);
1235                break;
1236#ifndef CONFIG_CPU_MIPSR6
1237        case cache_op:
1238                trace_kvm_exit(vcpu, KVM_TRACE_EXIT_CACHE);
1239                er = kvm_vz_gpsi_cache(inst, opc, cause, vcpu);
1240                break;
1241#endif
1242#ifdef CONFIG_CPU_LOONGSON64
1243        case lwc2_op:
1244                er = kvm_vz_gpsi_lwc2(inst, opc, cause, vcpu);
1245                break;
1246#endif
1247        case spec3_op:
1248                switch (inst.spec3_format.func) {
1249#ifdef CONFIG_CPU_MIPSR6
1250                case cache6_op:
1251                        trace_kvm_exit(vcpu, KVM_TRACE_EXIT_CACHE);
1252                        er = kvm_vz_gpsi_cache(inst, opc, cause, vcpu);
1253                        break;
1254#endif
1255                case rdhwr_op:
1256                        if (inst.r_format.rs || (inst.r_format.re >> 3))
1257                                goto unknown;
1258
1259                        rd = inst.r_format.rd;
1260                        rt = inst.r_format.rt;
1261                        sel = inst.r_format.re & 0x7;
1262
1263                        switch (rd) {
1264                        case MIPS_HWR_CC:       /* Read count register */
1265                                arch->gprs[rt] =
1266                                        (long)(int)kvm_mips_read_count(vcpu);
1267                                break;
1268                        default:
1269                                trace_kvm_hwr(vcpu, KVM_TRACE_RDHWR,
1270                                              KVM_TRACE_HWR(rd, sel), 0);
1271                                goto unknown;
1272                        }
1273
1274                        trace_kvm_hwr(vcpu, KVM_TRACE_RDHWR,
1275                                      KVM_TRACE_HWR(rd, sel), arch->gprs[rt]);
1276
1277                        er = update_pc(vcpu, cause);
1278                        break;
1279                default:
1280                        goto unknown;
1281                }
1282                break;
1283unknown:
1284
1285        default:
1286                kvm_err("GPSI exception not supported (%p/%#x)\n",
1287                                opc, inst.word);
1288                kvm_arch_vcpu_dump_regs(vcpu);
1289                er = EMULATE_FAIL;
1290                break;
1291        }
1292
1293        return er;
1294}
1295
1296static enum emulation_result kvm_trap_vz_handle_gsfc(u32 cause, u32 *opc,
1297                                                     struct kvm_vcpu *vcpu)
1298{
1299        enum emulation_result er = EMULATE_DONE;
1300        struct kvm_vcpu_arch *arch = &vcpu->arch;
1301        union mips_instruction inst;
1302        int err;
1303
1304        /*
1305         *  Fetch the instruction.
1306         */
1307        if (cause & CAUSEF_BD)
1308                opc += 1;
1309        err = kvm_get_badinstr(opc, vcpu, &inst.word);
1310        if (err)
1311                return EMULATE_FAIL;
1312
1313        /* complete MTC0 on behalf of guest and advance EPC */
1314        if (inst.c0r_format.opcode == cop0_op &&
1315            inst.c0r_format.rs == mtc_op &&
1316            inst.c0r_format.z == 0) {
1317                int rt = inst.c0r_format.rt;
1318                int rd = inst.c0r_format.rd;
1319                int sel = inst.c0r_format.sel;
1320                unsigned int val = arch->gprs[rt];
1321                unsigned int old_val, change;
1322
1323                trace_kvm_hwr(vcpu, KVM_TRACE_MTC0, KVM_TRACE_COP0(rd, sel),
1324                              val);
1325
1326                if ((rd == MIPS_CP0_STATUS) && (sel == 0)) {
1327                        /* FR bit should read as zero if no FPU */
1328                        if (!kvm_mips_guest_has_fpu(&vcpu->arch))
1329                                val &= ~(ST0_CU1 | ST0_FR);
1330
1331                        /*
1332                         * Also don't allow FR to be set if host doesn't support
1333                         * it.
1334                         */
1335                        if (!(boot_cpu_data.fpu_id & MIPS_FPIR_F64))
1336                                val &= ~ST0_FR;
1337
1338                        old_val = read_gc0_status();
1339                        change = val ^ old_val;
1340
1341                        if (change & ST0_FR) {
1342                                /*
1343                                 * FPU and Vector register state is made
1344                                 * UNPREDICTABLE by a change of FR, so don't
1345                                 * even bother saving it.
1346                                 */
1347                                kvm_drop_fpu(vcpu);
1348                        }
1349
1350                        /*
1351                         * If MSA state is already live, it is undefined how it
1352                         * interacts with FR=0 FPU state, and we don't want to
1353                         * hit reserved instruction exceptions trying to save
1354                         * the MSA state later when CU=1 && FR=1, so play it
1355                         * safe and save it first.
1356                         */
1357                        if (change & ST0_CU1 && !(val & ST0_FR) &&
1358                            vcpu->arch.aux_inuse & KVM_MIPS_AUX_MSA)
1359                                kvm_lose_fpu(vcpu);
1360
1361                        write_gc0_status(val);
1362                } else if ((rd == MIPS_CP0_CAUSE) && (sel == 0)) {
1363                        u32 old_cause = read_gc0_cause();
1364                        u32 change = old_cause ^ val;
1365
1366                        /* DC bit enabling/disabling timer? */
1367                        if (change & CAUSEF_DC) {
1368                                if (val & CAUSEF_DC) {
1369                                        kvm_vz_lose_htimer(vcpu);
1370                                        kvm_mips_count_disable_cause(vcpu);
1371                                } else {
1372                                        kvm_mips_count_enable_cause(vcpu);
1373                                }
1374                        }
1375
1376                        /* Only certain bits are RW to the guest */
1377                        change &= (CAUSEF_DC | CAUSEF_IV | CAUSEF_WP |
1378                                   CAUSEF_IP0 | CAUSEF_IP1);
1379
1380                        /* WP can only be cleared */
1381                        change &= ~CAUSEF_WP | old_cause;
1382
1383                        write_gc0_cause(old_cause ^ change);
1384                } else if ((rd == MIPS_CP0_STATUS) && (sel == 1)) { /* IntCtl */
1385                        write_gc0_intctl(val);
1386                } else if ((rd == MIPS_CP0_CONFIG) && (sel == 5)) {
1387                        old_val = read_gc0_config5();
1388                        change = val ^ old_val;
1389                        /* Handle changes in FPU/MSA modes */
1390                        preempt_disable();
1391
1392                        /*
1393                         * Propagate FRE changes immediately if the FPU
1394                         * context is already loaded.
1395                         */
1396                        if (change & MIPS_CONF5_FRE &&
1397                            vcpu->arch.aux_inuse & KVM_MIPS_AUX_FPU)
1398                                change_c0_config5(MIPS_CONF5_FRE, val);
1399
1400                        preempt_enable();
1401
1402                        val = old_val ^
1403                                (change & kvm_vz_config5_guest_wrmask(vcpu));
1404                        write_gc0_config5(val);
1405                } else {
1406                        kvm_err("Handle GSFC, unsupported field change @ %p: %#x\n",
1407                            opc, inst.word);
1408                        er = EMULATE_FAIL;
1409                }
1410
1411                if (er != EMULATE_FAIL)
1412                        er = update_pc(vcpu, cause);
1413        } else {
1414                kvm_err("Handle GSFC, unrecognized instruction @ %p: %#x\n",
1415                        opc, inst.word);
1416                er = EMULATE_FAIL;
1417        }
1418
1419        return er;
1420}
1421
1422static enum emulation_result kvm_trap_vz_handle_ghfc(u32 cause, u32 *opc,
1423                                                     struct kvm_vcpu *vcpu)
1424{
1425        /*
1426         * Presumably this is due to MC (guest mode change), so lets trace some
1427         * relevant info.
1428         */
1429        trace_kvm_guest_mode_change(vcpu);
1430
1431        return EMULATE_DONE;
1432}
1433
1434static enum emulation_result kvm_trap_vz_handle_hc(u32 cause, u32 *opc,
1435                                                   struct kvm_vcpu *vcpu)
1436{
1437        enum emulation_result er;
1438        union mips_instruction inst;
1439        unsigned long curr_pc;
1440        int err;
1441
1442        if (cause & CAUSEF_BD)
1443                opc += 1;
1444        err = kvm_get_badinstr(opc, vcpu, &inst.word);
1445        if (err)
1446                return EMULATE_FAIL;
1447
1448        /*
1449         * Update PC and hold onto current PC in case there is
1450         * an error and we want to rollback the PC
1451         */
1452        curr_pc = vcpu->arch.pc;
1453        er = update_pc(vcpu, cause);
1454        if (er == EMULATE_FAIL)
1455                return er;
1456
1457        er = kvm_mips_emul_hypcall(vcpu, inst);
1458        if (er == EMULATE_FAIL)
1459                vcpu->arch.pc = curr_pc;
1460
1461        return er;
1462}
1463
1464static enum emulation_result kvm_trap_vz_no_handler_guest_exit(u32 gexccode,
1465                                                        u32 cause,
1466                                                        u32 *opc,
1467                                                        struct kvm_vcpu *vcpu)
1468{
1469        u32 inst;
1470
1471        /*
1472         *  Fetch the instruction.
1473         */
1474        if (cause & CAUSEF_BD)
1475                opc += 1;
1476        kvm_get_badinstr(opc, vcpu, &inst);
1477
1478        kvm_err("Guest Exception Code: %d not yet handled @ PC: %p, inst: 0x%08x  Status: %#x\n",
1479                gexccode, opc, inst, read_gc0_status());
1480
1481        return EMULATE_FAIL;
1482}
1483
1484static int kvm_trap_vz_handle_guest_exit(struct kvm_vcpu *vcpu)
1485{
1486        u32 *opc = (u32 *) vcpu->arch.pc;
1487        u32 cause = vcpu->arch.host_cp0_cause;
1488        enum emulation_result er = EMULATE_DONE;
1489        u32 gexccode = (vcpu->arch.host_cp0_guestctl0 &
1490                        MIPS_GCTL0_GEXC) >> MIPS_GCTL0_GEXC_SHIFT;
1491        int ret = RESUME_GUEST;
1492
1493        trace_kvm_exit(vcpu, KVM_TRACE_EXIT_GEXCCODE_BASE + gexccode);
1494        switch (gexccode) {
1495        case MIPS_GCTL0_GEXC_GPSI:
1496                ++vcpu->stat.vz_gpsi_exits;
1497                er = kvm_trap_vz_handle_gpsi(cause, opc, vcpu);
1498                break;
1499        case MIPS_GCTL0_GEXC_GSFC:
1500                ++vcpu->stat.vz_gsfc_exits;
1501                er = kvm_trap_vz_handle_gsfc(cause, opc, vcpu);
1502                break;
1503        case MIPS_GCTL0_GEXC_HC:
1504                ++vcpu->stat.vz_hc_exits;
1505                er = kvm_trap_vz_handle_hc(cause, opc, vcpu);
1506                break;
1507        case MIPS_GCTL0_GEXC_GRR:
1508                ++vcpu->stat.vz_grr_exits;
1509                er = kvm_trap_vz_no_handler_guest_exit(gexccode, cause, opc,
1510                                                       vcpu);
1511                break;
1512        case MIPS_GCTL0_GEXC_GVA:
1513                ++vcpu->stat.vz_gva_exits;
1514                er = kvm_trap_vz_no_handler_guest_exit(gexccode, cause, opc,
1515                                                       vcpu);
1516                break;
1517        case MIPS_GCTL0_GEXC_GHFC:
1518                ++vcpu->stat.vz_ghfc_exits;
1519                er = kvm_trap_vz_handle_ghfc(cause, opc, vcpu);
1520                break;
1521        case MIPS_GCTL0_GEXC_GPA:
1522                ++vcpu->stat.vz_gpa_exits;
1523                er = kvm_trap_vz_no_handler_guest_exit(gexccode, cause, opc,
1524                                                       vcpu);
1525                break;
1526        default:
1527                ++vcpu->stat.vz_resvd_exits;
1528                er = kvm_trap_vz_no_handler_guest_exit(gexccode, cause, opc,
1529                                                       vcpu);
1530                break;
1531
1532        }
1533
1534        if (er == EMULATE_DONE) {
1535                ret = RESUME_GUEST;
1536        } else if (er == EMULATE_HYPERCALL) {
1537                ret = kvm_mips_handle_hypcall(vcpu);
1538        } else {
1539                vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1540                ret = RESUME_HOST;
1541        }
1542        return ret;
1543}
1544
1545/**
1546 * kvm_trap_vz_handle_cop_unusuable() - Guest used unusable coprocessor.
1547 * @vcpu:       Virtual CPU context.
1548 *
1549 * Handle when the guest attempts to use a coprocessor which hasn't been allowed
1550 * by the root context.
1551 */
1552static int kvm_trap_vz_handle_cop_unusable(struct kvm_vcpu *vcpu)
1553{
1554        u32 cause = vcpu->arch.host_cp0_cause;
1555        enum emulation_result er = EMULATE_FAIL;
1556        int ret = RESUME_GUEST;
1557
1558        if (((cause & CAUSEF_CE) >> CAUSEB_CE) == 1) {
1559                /*
1560                 * If guest FPU not present, the FPU operation should have been
1561                 * treated as a reserved instruction!
1562                 * If FPU already in use, we shouldn't get this at all.
1563                 */
1564                if (WARN_ON(!kvm_mips_guest_has_fpu(&vcpu->arch) ||
1565                            vcpu->arch.aux_inuse & KVM_MIPS_AUX_FPU)) {
1566                        preempt_enable();
1567                        return EMULATE_FAIL;
1568                }
1569
1570                kvm_own_fpu(vcpu);
1571                er = EMULATE_DONE;
1572        }
1573        /* other coprocessors not handled */
1574
1575        switch (er) {
1576        case EMULATE_DONE:
1577                ret = RESUME_GUEST;
1578                break;
1579
1580        case EMULATE_FAIL:
1581                vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1582                ret = RESUME_HOST;
1583                break;
1584
1585        default:
1586                BUG();
1587        }
1588        return ret;
1589}
1590
1591/**
1592 * kvm_trap_vz_handle_msa_disabled() - Guest used MSA while disabled in root.
1593 * @vcpu:       Virtual CPU context.
1594 *
1595 * Handle when the guest attempts to use MSA when it is disabled in the root
1596 * context.
1597 */
1598static int kvm_trap_vz_handle_msa_disabled(struct kvm_vcpu *vcpu)
1599{
1600        /*
1601         * If MSA not present or not exposed to guest or FR=0, the MSA operation
1602         * should have been treated as a reserved instruction!
1603         * Same if CU1=1, FR=0.
1604         * If MSA already in use, we shouldn't get this at all.
1605         */
1606        if (!kvm_mips_guest_has_msa(&vcpu->arch) ||
1607            (read_gc0_status() & (ST0_CU1 | ST0_FR)) == ST0_CU1 ||
1608            !(read_gc0_config5() & MIPS_CONF5_MSAEN) ||
1609            vcpu->arch.aux_inuse & KVM_MIPS_AUX_MSA) {
1610                vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1611                return RESUME_HOST;
1612        }
1613
1614        kvm_own_msa(vcpu);
1615
1616        return RESUME_GUEST;
1617}
1618
1619static int kvm_trap_vz_handle_tlb_ld_miss(struct kvm_vcpu *vcpu)
1620{
1621        struct kvm_run *run = vcpu->run;
1622        u32 *opc = (u32 *) vcpu->arch.pc;
1623        u32 cause = vcpu->arch.host_cp0_cause;
1624        ulong badvaddr = vcpu->arch.host_cp0_badvaddr;
1625        union mips_instruction inst;
1626        enum emulation_result er = EMULATE_DONE;
1627        int err, ret = RESUME_GUEST;
1628
1629        if (kvm_mips_handle_vz_root_tlb_fault(badvaddr, vcpu, false)) {
1630                /* A code fetch fault doesn't count as an MMIO */
1631                if (kvm_is_ifetch_fault(&vcpu->arch)) {
1632                        run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1633                        return RESUME_HOST;
1634                }
1635
1636                /* Fetch the instruction */
1637                if (cause & CAUSEF_BD)
1638                        opc += 1;
1639                err = kvm_get_badinstr(opc, vcpu, &inst.word);
1640                if (err) {
1641                        run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1642                        return RESUME_HOST;
1643                }
1644
1645                /* Treat as MMIO */
1646                er = kvm_mips_emulate_load(inst, cause, vcpu);
1647                if (er == EMULATE_FAIL) {
1648                        kvm_err("Guest Emulate Load from MMIO space failed: PC: %p, BadVaddr: %#lx\n",
1649                                opc, badvaddr);
1650                        run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1651                }
1652        }
1653
1654        if (er == EMULATE_DONE) {
1655                ret = RESUME_GUEST;
1656        } else if (er == EMULATE_DO_MMIO) {
1657                run->exit_reason = KVM_EXIT_MMIO;
1658                ret = RESUME_HOST;
1659        } else {
1660                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1661                ret = RESUME_HOST;
1662        }
1663        return ret;
1664}
1665
1666static int kvm_trap_vz_handle_tlb_st_miss(struct kvm_vcpu *vcpu)
1667{
1668        struct kvm_run *run = vcpu->run;
1669        u32 *opc = (u32 *) vcpu->arch.pc;
1670        u32 cause = vcpu->arch.host_cp0_cause;
1671        ulong badvaddr = vcpu->arch.host_cp0_badvaddr;
1672        union mips_instruction inst;
1673        enum emulation_result er = EMULATE_DONE;
1674        int err;
1675        int ret = RESUME_GUEST;
1676
1677        /* Just try the access again if we couldn't do the translation */
1678        if (kvm_vz_badvaddr_to_gpa(vcpu, badvaddr, &badvaddr))
1679                return RESUME_GUEST;
1680        vcpu->arch.host_cp0_badvaddr = badvaddr;
1681
1682        if (kvm_mips_handle_vz_root_tlb_fault(badvaddr, vcpu, true)) {
1683                /* Fetch the instruction */
1684                if (cause & CAUSEF_BD)
1685                        opc += 1;
1686                err = kvm_get_badinstr(opc, vcpu, &inst.word);
1687                if (err) {
1688                        run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1689                        return RESUME_HOST;
1690                }
1691
1692                /* Treat as MMIO */
1693                er = kvm_mips_emulate_store(inst, cause, vcpu);
1694                if (er == EMULATE_FAIL) {
1695                        kvm_err("Guest Emulate Store to MMIO space failed: PC: %p, BadVaddr: %#lx\n",
1696                                opc, badvaddr);
1697                        run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1698                }
1699        }
1700
1701        if (er == EMULATE_DONE) {
1702                ret = RESUME_GUEST;
1703        } else if (er == EMULATE_DO_MMIO) {
1704                run->exit_reason = KVM_EXIT_MMIO;
1705                ret = RESUME_HOST;
1706        } else {
1707                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1708                ret = RESUME_HOST;
1709        }
1710        return ret;
1711}
1712
1713static u64 kvm_vz_get_one_regs[] = {
1714        KVM_REG_MIPS_CP0_INDEX,
1715        KVM_REG_MIPS_CP0_ENTRYLO0,
1716        KVM_REG_MIPS_CP0_ENTRYLO1,
1717        KVM_REG_MIPS_CP0_CONTEXT,
1718        KVM_REG_MIPS_CP0_PAGEMASK,
1719        KVM_REG_MIPS_CP0_PAGEGRAIN,
1720        KVM_REG_MIPS_CP0_WIRED,
1721        KVM_REG_MIPS_CP0_HWRENA,
1722        KVM_REG_MIPS_CP0_BADVADDR,
1723        KVM_REG_MIPS_CP0_COUNT,
1724        KVM_REG_MIPS_CP0_ENTRYHI,
1725        KVM_REG_MIPS_CP0_COMPARE,
1726        KVM_REG_MIPS_CP0_STATUS,
1727        KVM_REG_MIPS_CP0_INTCTL,
1728        KVM_REG_MIPS_CP0_CAUSE,
1729        KVM_REG_MIPS_CP0_EPC,
1730        KVM_REG_MIPS_CP0_PRID,
1731        KVM_REG_MIPS_CP0_EBASE,
1732        KVM_REG_MIPS_CP0_CONFIG,
1733        KVM_REG_MIPS_CP0_CONFIG1,
1734        KVM_REG_MIPS_CP0_CONFIG2,
1735        KVM_REG_MIPS_CP0_CONFIG3,
1736        KVM_REG_MIPS_CP0_CONFIG4,
1737        KVM_REG_MIPS_CP0_CONFIG5,
1738        KVM_REG_MIPS_CP0_CONFIG6,
1739#ifdef CONFIG_64BIT
1740        KVM_REG_MIPS_CP0_XCONTEXT,
1741#endif
1742        KVM_REG_MIPS_CP0_ERROREPC,
1743
1744        KVM_REG_MIPS_COUNT_CTL,
1745        KVM_REG_MIPS_COUNT_RESUME,
1746        KVM_REG_MIPS_COUNT_HZ,
1747};
1748
1749static u64 kvm_vz_get_one_regs_contextconfig[] = {
1750        KVM_REG_MIPS_CP0_CONTEXTCONFIG,
1751#ifdef CONFIG_64BIT
1752        KVM_REG_MIPS_CP0_XCONTEXTCONFIG,
1753#endif
1754};
1755
1756static u64 kvm_vz_get_one_regs_segments[] = {
1757        KVM_REG_MIPS_CP0_SEGCTL0,
1758        KVM_REG_MIPS_CP0_SEGCTL1,
1759        KVM_REG_MIPS_CP0_SEGCTL2,
1760};
1761
1762static u64 kvm_vz_get_one_regs_htw[] = {
1763        KVM_REG_MIPS_CP0_PWBASE,
1764        KVM_REG_MIPS_CP0_PWFIELD,
1765        KVM_REG_MIPS_CP0_PWSIZE,
1766        KVM_REG_MIPS_CP0_PWCTL,
1767};
1768
1769static u64 kvm_vz_get_one_regs_kscratch[] = {
1770        KVM_REG_MIPS_CP0_KSCRATCH1,
1771        KVM_REG_MIPS_CP0_KSCRATCH2,
1772        KVM_REG_MIPS_CP0_KSCRATCH3,
1773        KVM_REG_MIPS_CP0_KSCRATCH4,
1774        KVM_REG_MIPS_CP0_KSCRATCH5,
1775        KVM_REG_MIPS_CP0_KSCRATCH6,
1776};
1777
1778static unsigned long kvm_vz_num_regs(struct kvm_vcpu *vcpu)
1779{
1780        unsigned long ret;
1781
1782        ret = ARRAY_SIZE(kvm_vz_get_one_regs);
1783        if (cpu_guest_has_userlocal)
1784                ++ret;
1785        if (cpu_guest_has_badinstr)
1786                ++ret;
1787        if (cpu_guest_has_badinstrp)
1788                ++ret;
1789        if (cpu_guest_has_contextconfig)
1790                ret += ARRAY_SIZE(kvm_vz_get_one_regs_contextconfig);
1791        if (cpu_guest_has_segments)
1792                ret += ARRAY_SIZE(kvm_vz_get_one_regs_segments);
1793        if (cpu_guest_has_htw || cpu_guest_has_ldpte)
1794                ret += ARRAY_SIZE(kvm_vz_get_one_regs_htw);
1795        if (cpu_guest_has_maar && !cpu_guest_has_dyn_maar)
1796                ret += 1 + ARRAY_SIZE(vcpu->arch.maar);
1797        ret += __arch_hweight8(cpu_data[0].guest.kscratch_mask);
1798
1799        return ret;
1800}
1801
1802static int kvm_vz_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *indices)
1803{
1804        u64 index;
1805        unsigned int i;
1806
1807        if (copy_to_user(indices, kvm_vz_get_one_regs,
1808                         sizeof(kvm_vz_get_one_regs)))
1809                return -EFAULT;
1810        indices += ARRAY_SIZE(kvm_vz_get_one_regs);
1811
1812        if (cpu_guest_has_userlocal) {
1813                index = KVM_REG_MIPS_CP0_USERLOCAL;
1814                if (copy_to_user(indices, &index, sizeof(index)))
1815                        return -EFAULT;
1816                ++indices;
1817        }
1818        if (cpu_guest_has_badinstr) {
1819                index = KVM_REG_MIPS_CP0_BADINSTR;
1820                if (copy_to_user(indices, &index, sizeof(index)))
1821                        return -EFAULT;
1822                ++indices;
1823        }
1824        if (cpu_guest_has_badinstrp) {
1825                index = KVM_REG_MIPS_CP0_BADINSTRP;
1826                if (copy_to_user(indices, &index, sizeof(index)))
1827                        return -EFAULT;
1828                ++indices;
1829        }
1830        if (cpu_guest_has_contextconfig) {
1831                if (copy_to_user(indices, kvm_vz_get_one_regs_contextconfig,
1832                                 sizeof(kvm_vz_get_one_regs_contextconfig)))
1833                        return -EFAULT;
1834                indices += ARRAY_SIZE(kvm_vz_get_one_regs_contextconfig);
1835        }
1836        if (cpu_guest_has_segments) {
1837                if (copy_to_user(indices, kvm_vz_get_one_regs_segments,
1838                                 sizeof(kvm_vz_get_one_regs_segments)))
1839                        return -EFAULT;
1840                indices += ARRAY_SIZE(kvm_vz_get_one_regs_segments);
1841        }
1842        if (cpu_guest_has_htw || cpu_guest_has_ldpte) {
1843                if (copy_to_user(indices, kvm_vz_get_one_regs_htw,
1844                                 sizeof(kvm_vz_get_one_regs_htw)))
1845                        return -EFAULT;
1846                indices += ARRAY_SIZE(kvm_vz_get_one_regs_htw);
1847        }
1848        if (cpu_guest_has_maar && !cpu_guest_has_dyn_maar) {
1849                for (i = 0; i < ARRAY_SIZE(vcpu->arch.maar); ++i) {
1850                        index = KVM_REG_MIPS_CP0_MAAR(i);
1851                        if (copy_to_user(indices, &index, sizeof(index)))
1852                                return -EFAULT;
1853                        ++indices;
1854                }
1855
1856                index = KVM_REG_MIPS_CP0_MAARI;
1857                if (copy_to_user(indices, &index, sizeof(index)))
1858                        return -EFAULT;
1859                ++indices;
1860        }
1861        for (i = 0; i < 6; ++i) {
1862                if (!cpu_guest_has_kscr(i + 2))
1863                        continue;
1864
1865                if (copy_to_user(indices, &kvm_vz_get_one_regs_kscratch[i],
1866                                 sizeof(kvm_vz_get_one_regs_kscratch[i])))
1867                        return -EFAULT;
1868                ++indices;
1869        }
1870
1871        return 0;
1872}
1873
1874static inline s64 entrylo_kvm_to_user(unsigned long v)
1875{
1876        s64 mask, ret = v;
1877
1878        if (BITS_PER_LONG == 32) {
1879                /*
1880                 * KVM API exposes 64-bit version of the register, so move the
1881                 * RI/XI bits up into place.
1882                 */
1883                mask = MIPS_ENTRYLO_RI | MIPS_ENTRYLO_XI;
1884                ret &= ~mask;
1885                ret |= ((s64)v & mask) << 32;
1886        }
1887        return ret;
1888}
1889
1890static inline unsigned long entrylo_user_to_kvm(s64 v)
1891{
1892        unsigned long mask, ret = v;
1893
1894        if (BITS_PER_LONG == 32) {
1895                /*
1896                 * KVM API exposes 64-bit versiono of the register, so move the
1897                 * RI/XI bits down into place.
1898                 */
1899                mask = MIPS_ENTRYLO_RI | MIPS_ENTRYLO_XI;
1900                ret &= ~mask;
1901                ret |= (v >> 32) & mask;
1902        }
1903        return ret;
1904}
1905
1906static int kvm_vz_get_one_reg(struct kvm_vcpu *vcpu,
1907                              const struct kvm_one_reg *reg,
1908                              s64 *v)
1909{
1910        struct mips_coproc *cop0 = vcpu->arch.cop0;
1911        unsigned int idx;
1912
1913        switch (reg->id) {
1914        case KVM_REG_MIPS_CP0_INDEX:
1915                *v = (long)read_gc0_index();
1916                break;
1917        case KVM_REG_MIPS_CP0_ENTRYLO0:
1918                *v = entrylo_kvm_to_user(read_gc0_entrylo0());
1919                break;
1920        case KVM_REG_MIPS_CP0_ENTRYLO1:
1921                *v = entrylo_kvm_to_user(read_gc0_entrylo1());
1922                break;
1923        case KVM_REG_MIPS_CP0_CONTEXT:
1924                *v = (long)read_gc0_context();
1925                break;
1926        case KVM_REG_MIPS_CP0_CONTEXTCONFIG:
1927                if (!cpu_guest_has_contextconfig)
1928                        return -EINVAL;
1929                *v = read_gc0_contextconfig();
1930                break;
1931        case KVM_REG_MIPS_CP0_USERLOCAL:
1932                if (!cpu_guest_has_userlocal)
1933                        return -EINVAL;
1934                *v = read_gc0_userlocal();
1935                break;
1936#ifdef CONFIG_64BIT
1937        case KVM_REG_MIPS_CP0_XCONTEXTCONFIG:
1938                if (!cpu_guest_has_contextconfig)
1939                        return -EINVAL;
1940                *v = read_gc0_xcontextconfig();
1941                break;
1942#endif
1943        case KVM_REG_MIPS_CP0_PAGEMASK:
1944                *v = (long)read_gc0_pagemask();
1945                break;
1946        case KVM_REG_MIPS_CP0_PAGEGRAIN:
1947                *v = (long)read_gc0_pagegrain();
1948                break;
1949        case KVM_REG_MIPS_CP0_SEGCTL0:
1950                if (!cpu_guest_has_segments)
1951                        return -EINVAL;
1952                *v = read_gc0_segctl0();
1953                break;
1954        case KVM_REG_MIPS_CP0_SEGCTL1:
1955                if (!cpu_guest_has_segments)
1956                        return -EINVAL;
1957                *v = read_gc0_segctl1();
1958                break;
1959        case KVM_REG_MIPS_CP0_SEGCTL2:
1960                if (!cpu_guest_has_segments)
1961                        return -EINVAL;
1962                *v = read_gc0_segctl2();
1963                break;
1964        case KVM_REG_MIPS_CP0_PWBASE:
1965                if (!cpu_guest_has_htw && !cpu_guest_has_ldpte)
1966                        return -EINVAL;
1967                *v = read_gc0_pwbase();
1968                break;
1969        case KVM_REG_MIPS_CP0_PWFIELD:
1970                if (!cpu_guest_has_htw && !cpu_guest_has_ldpte)
1971                        return -EINVAL;
1972                *v = read_gc0_pwfield();
1973                break;
1974        case KVM_REG_MIPS_CP0_PWSIZE:
1975                if (!cpu_guest_has_htw && !cpu_guest_has_ldpte)
1976                        return -EINVAL;
1977                *v = read_gc0_pwsize();
1978                break;
1979        case KVM_REG_MIPS_CP0_WIRED:
1980                *v = (long)read_gc0_wired();
1981                break;
1982        case KVM_REG_MIPS_CP0_PWCTL:
1983                if (!cpu_guest_has_htw && !cpu_guest_has_ldpte)
1984                        return -EINVAL;
1985                *v = read_gc0_pwctl();
1986                break;
1987        case KVM_REG_MIPS_CP0_HWRENA:
1988                *v = (long)read_gc0_hwrena();
1989                break;
1990        case KVM_REG_MIPS_CP0_BADVADDR:
1991                *v = (long)read_gc0_badvaddr();
1992                break;
1993        case KVM_REG_MIPS_CP0_BADINSTR:
1994                if (!cpu_guest_has_badinstr)
1995                        return -EINVAL;
1996                *v = read_gc0_badinstr();
1997                break;
1998        case KVM_REG_MIPS_CP0_BADINSTRP:
1999                if (!cpu_guest_has_badinstrp)
2000                        return -EINVAL;
2001                *v = read_gc0_badinstrp();
2002                break;
2003        case KVM_REG_MIPS_CP0_COUNT:
2004                *v = kvm_mips_read_count(vcpu);
2005                break;
2006        case KVM_REG_MIPS_CP0_ENTRYHI:
2007                *v = (long)read_gc0_entryhi();
2008                break;
2009        case KVM_REG_MIPS_CP0_COMPARE:
2010                *v = (long)read_gc0_compare();
2011                break;
2012        case KVM_REG_MIPS_CP0_STATUS:
2013                *v = (long)read_gc0_status();
2014                break;
2015        case KVM_REG_MIPS_CP0_INTCTL:
2016                *v = read_gc0_intctl();
2017                break;
2018        case KVM_REG_MIPS_CP0_CAUSE:
2019                *v = (long)read_gc0_cause();
2020                break;
2021        case KVM_REG_MIPS_CP0_EPC:
2022                *v = (long)read_gc0_epc();
2023                break;
2024        case KVM_REG_MIPS_CP0_PRID:
2025                switch (boot_cpu_type()) {
2026                case CPU_CAVIUM_OCTEON3:
2027                        /* Octeon III has a read-only guest.PRid */
2028                        *v = read_gc0_prid();
2029                        break;
2030                default:
2031                        *v = (long)kvm_read_c0_guest_prid(cop0);
2032                        break;
2033                }
2034                break;
2035        case KVM_REG_MIPS_CP0_EBASE:
2036                *v = kvm_vz_read_gc0_ebase();
2037                break;
2038        case KVM_REG_MIPS_CP0_CONFIG:
2039                *v = read_gc0_config();
2040                break;
2041        case KVM_REG_MIPS_CP0_CONFIG1:
2042                if (!cpu_guest_has_conf1)
2043                        return -EINVAL;
2044                *v = read_gc0_config1();
2045                break;
2046        case KVM_REG_MIPS_CP0_CONFIG2:
2047                if (!cpu_guest_has_conf2)
2048                        return -EINVAL;
2049                *v = read_gc0_config2();
2050                break;
2051        case KVM_REG_MIPS_CP0_CONFIG3:
2052                if (!cpu_guest_has_conf3)
2053                        return -EINVAL;
2054                *v = read_gc0_config3();
2055                break;
2056        case KVM_REG_MIPS_CP0_CONFIG4:
2057                if (!cpu_guest_has_conf4)
2058                        return -EINVAL;
2059                *v = read_gc0_config4();
2060                break;
2061        case KVM_REG_MIPS_CP0_CONFIG5:
2062                if (!cpu_guest_has_conf5)
2063                        return -EINVAL;
2064                *v = read_gc0_config5();
2065                break;
2066        case KVM_REG_MIPS_CP0_CONFIG6:
2067                *v = kvm_read_sw_gc0_config6(cop0);
2068                break;
2069        case KVM_REG_MIPS_CP0_MAAR(0) ... KVM_REG_MIPS_CP0_MAAR(0x3f):
2070                if (!cpu_guest_has_maar || cpu_guest_has_dyn_maar)
2071                        return -EINVAL;
2072                idx = reg->id - KVM_REG_MIPS_CP0_MAAR(0);
2073                if (idx >= ARRAY_SIZE(vcpu->arch.maar))
2074                        return -EINVAL;
2075                *v = vcpu->arch.maar[idx];
2076                break;
2077        case KVM_REG_MIPS_CP0_MAARI:
2078                if (!cpu_guest_has_maar || cpu_guest_has_dyn_maar)
2079                        return -EINVAL;
2080                *v = kvm_read_sw_gc0_maari(vcpu->arch.cop0);
2081                break;
2082#ifdef CONFIG_64BIT
2083        case KVM_REG_MIPS_CP0_XCONTEXT:
2084                *v = read_gc0_xcontext();
2085                break;
2086#endif
2087        case KVM_REG_MIPS_CP0_ERROREPC:
2088                *v = (long)read_gc0_errorepc();
2089                break;
2090        case KVM_REG_MIPS_CP0_KSCRATCH1 ... KVM_REG_MIPS_CP0_KSCRATCH6:
2091                idx = reg->id - KVM_REG_MIPS_CP0_KSCRATCH1 + 2;
2092                if (!cpu_guest_has_kscr(idx))
2093                        return -EINVAL;
2094                switch (idx) {
2095                case 2:
2096                        *v = (long)read_gc0_kscratch1();
2097                        break;
2098                case 3:
2099                        *v = (long)read_gc0_kscratch2();
2100                        break;
2101                case 4:
2102                        *v = (long)read_gc0_kscratch3();
2103                        break;
2104                case 5:
2105                        *v = (long)read_gc0_kscratch4();
2106                        break;
2107                case 6:
2108                        *v = (long)read_gc0_kscratch5();
2109                        break;
2110                case 7:
2111                        *v = (long)read_gc0_kscratch6();
2112                        break;
2113                }
2114                break;
2115        case KVM_REG_MIPS_COUNT_CTL:
2116                *v = vcpu->arch.count_ctl;
2117                break;
2118        case KVM_REG_MIPS_COUNT_RESUME:
2119                *v = ktime_to_ns(vcpu->arch.count_resume);
2120                break;
2121        case KVM_REG_MIPS_COUNT_HZ:
2122                *v = vcpu->arch.count_hz;
2123                break;
2124        default:
2125                return -EINVAL;
2126        }
2127        return 0;
2128}
2129
2130static int kvm_vz_set_one_reg(struct kvm_vcpu *vcpu,
2131                              const struct kvm_one_reg *reg,
2132                              s64 v)
2133{
2134        struct mips_coproc *cop0 = vcpu->arch.cop0;
2135        unsigned int idx;
2136        int ret = 0;
2137        unsigned int cur, change;
2138
2139        switch (reg->id) {
2140        case KVM_REG_MIPS_CP0_INDEX:
2141                write_gc0_index(v);
2142                break;
2143        case KVM_REG_MIPS_CP0_ENTRYLO0:
2144                write_gc0_entrylo0(entrylo_user_to_kvm(v));
2145                break;
2146        case KVM_REG_MIPS_CP0_ENTRYLO1:
2147                write_gc0_entrylo1(entrylo_user_to_kvm(v));
2148                break;
2149        case KVM_REG_MIPS_CP0_CONTEXT:
2150                write_gc0_context(v);
2151                break;
2152        case KVM_REG_MIPS_CP0_CONTEXTCONFIG:
2153                if (!cpu_guest_has_contextconfig)
2154                        return -EINVAL;
2155                write_gc0_contextconfig(v);
2156                break;
2157        case KVM_REG_MIPS_CP0_USERLOCAL:
2158                if (!cpu_guest_has_userlocal)
2159                        return -EINVAL;
2160                write_gc0_userlocal(v);
2161                break;
2162#ifdef CONFIG_64BIT
2163        case KVM_REG_MIPS_CP0_XCONTEXTCONFIG:
2164                if (!cpu_guest_has_contextconfig)
2165                        return -EINVAL;
2166                write_gc0_xcontextconfig(v);
2167                break;
2168#endif
2169        case KVM_REG_MIPS_CP0_PAGEMASK:
2170                write_gc0_pagemask(v);
2171                break;
2172        case KVM_REG_MIPS_CP0_PAGEGRAIN:
2173                write_gc0_pagegrain(v);
2174                break;
2175        case KVM_REG_MIPS_CP0_SEGCTL0:
2176                if (!cpu_guest_has_segments)
2177                        return -EINVAL;
2178                write_gc0_segctl0(v);
2179                break;
2180        case KVM_REG_MIPS_CP0_SEGCTL1:
2181                if (!cpu_guest_has_segments)
2182                        return -EINVAL;
2183                write_gc0_segctl1(v);
2184                break;
2185        case KVM_REG_MIPS_CP0_SEGCTL2:
2186                if (!cpu_guest_has_segments)
2187                        return -EINVAL;
2188                write_gc0_segctl2(v);
2189                break;
2190        case KVM_REG_MIPS_CP0_PWBASE:
2191                if (!cpu_guest_has_htw && !cpu_guest_has_ldpte)
2192                        return -EINVAL;
2193                write_gc0_pwbase(v);
2194                break;
2195        case KVM_REG_MIPS_CP0_PWFIELD:
2196                if (!cpu_guest_has_htw && !cpu_guest_has_ldpte)
2197                        return -EINVAL;
2198                write_gc0_pwfield(v);
2199                break;
2200        case KVM_REG_MIPS_CP0_PWSIZE:
2201                if (!cpu_guest_has_htw && !cpu_guest_has_ldpte)
2202                        return -EINVAL;
2203                write_gc0_pwsize(v);
2204                break;
2205        case KVM_REG_MIPS_CP0_WIRED:
2206                change_gc0_wired(MIPSR6_WIRED_WIRED, v);
2207                break;
2208        case KVM_REG_MIPS_CP0_PWCTL:
2209                if (!cpu_guest_has_htw && !cpu_guest_has_ldpte)
2210                        return -EINVAL;
2211                write_gc0_pwctl(v);
2212                break;
2213        case KVM_REG_MIPS_CP0_HWRENA:
2214                write_gc0_hwrena(v);
2215                break;
2216        case KVM_REG_MIPS_CP0_BADVADDR:
2217                write_gc0_badvaddr(v);
2218                break;
2219        case KVM_REG_MIPS_CP0_BADINSTR:
2220                if (!cpu_guest_has_badinstr)
2221                        return -EINVAL;
2222                write_gc0_badinstr(v);
2223                break;
2224        case KVM_REG_MIPS_CP0_BADINSTRP:
2225                if (!cpu_guest_has_badinstrp)
2226                        return -EINVAL;
2227                write_gc0_badinstrp(v);
2228                break;
2229        case KVM_REG_MIPS_CP0_COUNT:
2230                kvm_mips_write_count(vcpu, v);
2231                break;
2232        case KVM_REG_MIPS_CP0_ENTRYHI:
2233                write_gc0_entryhi(v);
2234                break;
2235        case KVM_REG_MIPS_CP0_COMPARE:
2236                kvm_mips_write_compare(vcpu, v, false);
2237                break;
2238        case KVM_REG_MIPS_CP0_STATUS:
2239                write_gc0_status(v);
2240                break;
2241        case KVM_REG_MIPS_CP0_INTCTL:
2242                write_gc0_intctl(v);
2243                break;
2244        case KVM_REG_MIPS_CP0_CAUSE:
2245                /*
2246                 * If the timer is stopped or started (DC bit) it must look
2247                 * atomic with changes to the timer interrupt pending bit (TI).
2248                 * A timer interrupt should not happen in between.
2249                 */
2250                if ((read_gc0_cause() ^ v) & CAUSEF_DC) {
2251                        if (v & CAUSEF_DC) {
2252                                /* disable timer first */
2253                                kvm_mips_count_disable_cause(vcpu);
2254                                change_gc0_cause((u32)~CAUSEF_DC, v);
2255                        } else {
2256                                /* enable timer last */
2257                                change_gc0_cause((u32)~CAUSEF_DC, v);
2258                                kvm_mips_count_enable_cause(vcpu);
2259                        }
2260                } else {
2261                        write_gc0_cause(v);
2262                }
2263                break;
2264        case KVM_REG_MIPS_CP0_EPC:
2265                write_gc0_epc(v);
2266                break;
2267        case KVM_REG_MIPS_CP0_PRID:
2268                switch (boot_cpu_type()) {
2269                case CPU_CAVIUM_OCTEON3:
2270                        /* Octeon III has a guest.PRid, but its read-only */
2271                        break;
2272                default:
2273                        kvm_write_c0_guest_prid(cop0, v);
2274                        break;
2275                }
2276                break;
2277        case KVM_REG_MIPS_CP0_EBASE:
2278                kvm_vz_write_gc0_ebase(v);
2279                break;
2280        case KVM_REG_MIPS_CP0_CONFIG:
2281                cur = read_gc0_config();
2282                change = (cur ^ v) & kvm_vz_config_user_wrmask(vcpu);
2283                if (change) {
2284                        v = cur ^ change;
2285                        write_gc0_config(v);
2286                }
2287                break;
2288        case KVM_REG_MIPS_CP0_CONFIG1:
2289                if (!cpu_guest_has_conf1)
2290                        break;
2291                cur = read_gc0_config1();
2292                change = (cur ^ v) & kvm_vz_config1_user_wrmask(vcpu);
2293                if (change) {
2294                        v = cur ^ change;
2295                        write_gc0_config1(v);
2296                }
2297                break;
2298        case KVM_REG_MIPS_CP0_CONFIG2:
2299                if (!cpu_guest_has_conf2)
2300                        break;
2301                cur = read_gc0_config2();
2302                change = (cur ^ v) & kvm_vz_config2_user_wrmask(vcpu);
2303                if (change) {
2304                        v = cur ^ change;
2305                        write_gc0_config2(v);
2306                }
2307                break;
2308        case KVM_REG_MIPS_CP0_CONFIG3:
2309                if (!cpu_guest_has_conf3)
2310                        break;
2311                cur = read_gc0_config3();
2312                change = (cur ^ v) & kvm_vz_config3_user_wrmask(vcpu);
2313                if (change) {
2314                        v = cur ^ change;
2315                        write_gc0_config3(v);
2316                }
2317                break;
2318        case KVM_REG_MIPS_CP0_CONFIG4:
2319                if (!cpu_guest_has_conf4)
2320                        break;
2321                cur = read_gc0_config4();
2322                change = (cur ^ v) & kvm_vz_config4_user_wrmask(vcpu);
2323                if (change) {
2324                        v = cur ^ change;
2325                        write_gc0_config4(v);
2326                }
2327                break;
2328        case KVM_REG_MIPS_CP0_CONFIG5:
2329                if (!cpu_guest_has_conf5)
2330                        break;
2331                cur = read_gc0_config5();
2332                change = (cur ^ v) & kvm_vz_config5_user_wrmask(vcpu);
2333                if (change) {
2334                        v = cur ^ change;
2335                        write_gc0_config5(v);
2336                }
2337                break;
2338        case KVM_REG_MIPS_CP0_CONFIG6:
2339                cur = kvm_read_sw_gc0_config6(cop0);
2340                change = (cur ^ v) & kvm_vz_config6_user_wrmask(vcpu);
2341                if (change) {
2342                        v = cur ^ change;
2343                        kvm_write_sw_gc0_config6(cop0, (int)v);
2344                }
2345                break;
2346        case KVM_REG_MIPS_CP0_MAAR(0) ... KVM_REG_MIPS_CP0_MAAR(0x3f):
2347                if (!cpu_guest_has_maar || cpu_guest_has_dyn_maar)
2348                        return -EINVAL;
2349                idx = reg->id - KVM_REG_MIPS_CP0_MAAR(0);
2350                if (idx >= ARRAY_SIZE(vcpu->arch.maar))
2351                        return -EINVAL;
2352                vcpu->arch.maar[idx] = mips_process_maar(dmtc_op, v);
2353                break;
2354        case KVM_REG_MIPS_CP0_MAARI:
2355                if (!cpu_guest_has_maar || cpu_guest_has_dyn_maar)
2356                        return -EINVAL;
2357                kvm_write_maari(vcpu, v);
2358                break;
2359#ifdef CONFIG_64BIT
2360        case KVM_REG_MIPS_CP0_XCONTEXT:
2361                write_gc0_xcontext(v);
2362                break;
2363#endif
2364        case KVM_REG_MIPS_CP0_ERROREPC:
2365                write_gc0_errorepc(v);
2366                break;
2367        case KVM_REG_MIPS_CP0_KSCRATCH1 ... KVM_REG_MIPS_CP0_KSCRATCH6:
2368                idx = reg->id - KVM_REG_MIPS_CP0_KSCRATCH1 + 2;
2369                if (!cpu_guest_has_kscr(idx))
2370                        return -EINVAL;
2371                switch (idx) {
2372                case 2:
2373                        write_gc0_kscratch1(v);
2374                        break;
2375                case 3:
2376                        write_gc0_kscratch2(v);
2377                        break;
2378                case 4:
2379                        write_gc0_kscratch3(v);
2380                        break;
2381                case 5:
2382                        write_gc0_kscratch4(v);
2383                        break;
2384                case 6:
2385                        write_gc0_kscratch5(v);
2386                        break;
2387                case 7:
2388                        write_gc0_kscratch6(v);
2389                        break;
2390                }
2391                break;
2392        case KVM_REG_MIPS_COUNT_CTL:
2393                ret = kvm_mips_set_count_ctl(vcpu, v);
2394                break;
2395        case KVM_REG_MIPS_COUNT_RESUME:
2396                ret = kvm_mips_set_count_resume(vcpu, v);
2397                break;
2398        case KVM_REG_MIPS_COUNT_HZ:
2399                ret = kvm_mips_set_count_hz(vcpu, v);
2400                break;
2401        default:
2402                return -EINVAL;
2403        }
2404        return ret;
2405}
2406
2407#define guestid_cache(cpu)      (cpu_data[cpu].guestid_cache)
2408static void kvm_vz_get_new_guestid(unsigned long cpu, struct kvm_vcpu *vcpu)
2409{
2410        unsigned long guestid = guestid_cache(cpu);
2411
2412        if (!(++guestid & GUESTID_MASK)) {
2413                if (cpu_has_vtag_icache)
2414                        flush_icache_all();
2415
2416                if (!guestid)           /* fix version if needed */
2417                        guestid = GUESTID_FIRST_VERSION;
2418
2419                ++guestid;              /* guestid 0 reserved for root */
2420
2421                /* start new guestid cycle */
2422                kvm_vz_local_flush_roottlb_all_guests();
2423                kvm_vz_local_flush_guesttlb_all();
2424        }
2425
2426        guestid_cache(cpu) = guestid;
2427}
2428
2429/* Returns 1 if the guest TLB may be clobbered */
2430static int kvm_vz_check_requests(struct kvm_vcpu *vcpu, int cpu)
2431{
2432        int ret = 0;
2433        int i;
2434
2435        if (!kvm_request_pending(vcpu))
2436                return 0;
2437
2438        if (kvm_check_request(KVM_REQ_TLB_FLUSH, vcpu)) {
2439                if (cpu_has_guestid) {
2440                        /* Drop all GuestIDs for this VCPU */
2441                        for_each_possible_cpu(i)
2442                                vcpu->arch.vzguestid[i] = 0;
2443                        /* This will clobber guest TLB contents too */
2444                        ret = 1;
2445                }
2446                /*
2447                 * For Root ASID Dealias (RAD) we don't do anything here, but we
2448                 * still need the request to ensure we recheck asid_flush_mask.
2449                 * We can still return 0 as only the root TLB will be affected
2450                 * by a root ASID flush.
2451                 */
2452        }
2453
2454        return ret;
2455}
2456
2457static void kvm_vz_vcpu_save_wired(struct kvm_vcpu *vcpu)
2458{
2459        unsigned int wired = read_gc0_wired();
2460        struct kvm_mips_tlb *tlbs;
2461        int i;
2462
2463        /* Expand the wired TLB array if necessary */
2464        wired &= MIPSR6_WIRED_WIRED;
2465        if (wired > vcpu->arch.wired_tlb_limit) {
2466                tlbs = krealloc(vcpu->arch.wired_tlb, wired *
2467                                sizeof(*vcpu->arch.wired_tlb), GFP_ATOMIC);
2468                if (WARN_ON(!tlbs)) {
2469                        /* Save whatever we can */
2470                        wired = vcpu->arch.wired_tlb_limit;
2471                } else {
2472                        vcpu->arch.wired_tlb = tlbs;
2473                        vcpu->arch.wired_tlb_limit = wired;
2474                }
2475        }
2476
2477        if (wired)
2478                /* Save wired entries from the guest TLB */
2479                kvm_vz_save_guesttlb(vcpu->arch.wired_tlb, 0, wired);
2480        /* Invalidate any dropped entries since last time */
2481        for (i = wired; i < vcpu->arch.wired_tlb_used; ++i) {
2482                vcpu->arch.wired_tlb[i].tlb_hi = UNIQUE_GUEST_ENTRYHI(i);
2483                vcpu->arch.wired_tlb[i].tlb_lo[0] = 0;
2484                vcpu->arch.wired_tlb[i].tlb_lo[1] = 0;
2485                vcpu->arch.wired_tlb[i].tlb_mask = 0;
2486        }
2487        vcpu->arch.wired_tlb_used = wired;
2488}
2489
2490static void kvm_vz_vcpu_load_wired(struct kvm_vcpu *vcpu)
2491{
2492        /* Load wired entries into the guest TLB */
2493        if (vcpu->arch.wired_tlb)
2494                kvm_vz_load_guesttlb(vcpu->arch.wired_tlb, 0,
2495                                     vcpu->arch.wired_tlb_used);
2496}
2497
2498static void kvm_vz_vcpu_load_tlb(struct kvm_vcpu *vcpu, int cpu)
2499{
2500        struct kvm *kvm = vcpu->kvm;
2501        struct mm_struct *gpa_mm = &kvm->arch.gpa_mm;
2502        bool migrated;
2503
2504        /*
2505         * Are we entering guest context on a different CPU to last time?
2506         * If so, the VCPU's guest TLB state on this CPU may be stale.
2507         */
2508        migrated = (vcpu->arch.last_exec_cpu != cpu);
2509        vcpu->arch.last_exec_cpu = cpu;
2510
2511        /*
2512         * A vcpu's GuestID is set in GuestCtl1.ID when the vcpu is loaded and
2513         * remains set until another vcpu is loaded in.  As a rule GuestRID
2514         * remains zeroed when in root context unless the kernel is busy
2515         * manipulating guest tlb entries.
2516         */
2517        if (cpu_has_guestid) {
2518                /*
2519                 * Check if our GuestID is of an older version and thus invalid.
2520                 *
2521                 * We also discard the stored GuestID if we've executed on
2522                 * another CPU, as the guest mappings may have changed without
2523                 * hypervisor knowledge.
2524                 */
2525                if (migrated ||
2526                    (vcpu->arch.vzguestid[cpu] ^ guestid_cache(cpu)) &
2527                                        GUESTID_VERSION_MASK) {
2528                        kvm_vz_get_new_guestid(cpu, vcpu);
2529                        vcpu->arch.vzguestid[cpu] = guestid_cache(cpu);
2530                        trace_kvm_guestid_change(vcpu,
2531                                                 vcpu->arch.vzguestid[cpu]);
2532                }
2533
2534                /* Restore GuestID */
2535                change_c0_guestctl1(GUESTID_MASK, vcpu->arch.vzguestid[cpu]);
2536        } else {
2537                /*
2538                 * The Guest TLB only stores a single guest's TLB state, so
2539                 * flush it if another VCPU has executed on this CPU.
2540                 *
2541                 * We also flush if we've executed on another CPU, as the guest
2542                 * mappings may have changed without hypervisor knowledge.
2543                 */
2544                if (migrated || last_exec_vcpu[cpu] != vcpu)
2545                        kvm_vz_local_flush_guesttlb_all();
2546                last_exec_vcpu[cpu] = vcpu;
2547
2548                /*
2549                 * Root ASID dealiases guest GPA mappings in the root TLB.
2550                 * Allocate new root ASID if needed.
2551                 */
2552                if (cpumask_test_and_clear_cpu(cpu, &kvm->arch.asid_flush_mask))
2553                        get_new_mmu_context(gpa_mm);
2554                else
2555                        check_mmu_context(gpa_mm);
2556        }
2557}
2558
2559static int kvm_vz_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
2560{
2561        struct mips_coproc *cop0 = vcpu->arch.cop0;
2562        bool migrated, all;
2563
2564        /*
2565         * Have we migrated to a different CPU?
2566         * If so, any old guest TLB state may be stale.
2567         */
2568        migrated = (vcpu->arch.last_sched_cpu != cpu);
2569
2570        /*
2571         * Was this the last VCPU to run on this CPU?
2572         * If not, any old guest state from this VCPU will have been clobbered.
2573         */
2574        all = migrated || (last_vcpu[cpu] != vcpu);
2575        last_vcpu[cpu] = vcpu;
2576
2577        /*
2578         * Restore CP0_Wired unconditionally as we clear it after use, and
2579         * restore wired guest TLB entries (while in guest context).
2580         */
2581        kvm_restore_gc0_wired(cop0);
2582        if (current->flags & PF_VCPU) {
2583                tlbw_use_hazard();
2584                kvm_vz_vcpu_load_tlb(vcpu, cpu);
2585                kvm_vz_vcpu_load_wired(vcpu);
2586        }
2587
2588        /*
2589         * Restore timer state regardless, as e.g. Cause.TI can change over time
2590         * if left unmaintained.
2591         */
2592        kvm_vz_restore_timer(vcpu);
2593
2594        /* Set MC bit if we want to trace guest mode changes */
2595        if (kvm_trace_guest_mode_change)
2596                set_c0_guestctl0(MIPS_GCTL0_MC);
2597        else
2598                clear_c0_guestctl0(MIPS_GCTL0_MC);
2599
2600        /* Don't bother restoring registers multiple times unless necessary */
2601        if (!all)
2602                return 0;
2603
2604        /*
2605         * Restore config registers first, as some implementations restrict
2606         * writes to other registers when the corresponding feature bits aren't
2607         * set. For example Status.CU1 cannot be set unless Config1.FP is set.
2608         */
2609        kvm_restore_gc0_config(cop0);
2610        if (cpu_guest_has_conf1)
2611                kvm_restore_gc0_config1(cop0);
2612        if (cpu_guest_has_conf2)
2613                kvm_restore_gc0_config2(cop0);
2614        if (cpu_guest_has_conf3)
2615                kvm_restore_gc0_config3(cop0);
2616        if (cpu_guest_has_conf4)
2617                kvm_restore_gc0_config4(cop0);
2618        if (cpu_guest_has_conf5)
2619                kvm_restore_gc0_config5(cop0);
2620        if (cpu_guest_has_conf6)
2621                kvm_restore_gc0_config6(cop0);
2622        if (cpu_guest_has_conf7)
2623                kvm_restore_gc0_config7(cop0);
2624
2625        kvm_restore_gc0_index(cop0);
2626        kvm_restore_gc0_entrylo0(cop0);
2627        kvm_restore_gc0_entrylo1(cop0);
2628        kvm_restore_gc0_context(cop0);
2629        if (cpu_guest_has_contextconfig)
2630                kvm_restore_gc0_contextconfig(cop0);
2631#ifdef CONFIG_64BIT
2632        kvm_restore_gc0_xcontext(cop0);
2633        if (cpu_guest_has_contextconfig)
2634                kvm_restore_gc0_xcontextconfig(cop0);
2635#endif
2636        kvm_restore_gc0_pagemask(cop0);
2637        kvm_restore_gc0_pagegrain(cop0);
2638        kvm_restore_gc0_hwrena(cop0);
2639        kvm_restore_gc0_badvaddr(cop0);
2640        kvm_restore_gc0_entryhi(cop0);
2641        kvm_restore_gc0_status(cop0);
2642        kvm_restore_gc0_intctl(cop0);
2643        kvm_restore_gc0_epc(cop0);
2644        kvm_vz_write_gc0_ebase(kvm_read_sw_gc0_ebase(cop0));
2645        if (cpu_guest_has_userlocal)
2646                kvm_restore_gc0_userlocal(cop0);
2647
2648        kvm_restore_gc0_errorepc(cop0);
2649
2650        /* restore KScratch registers if enabled in guest */
2651        if (cpu_guest_has_conf4) {
2652                if (cpu_guest_has_kscr(2))
2653                        kvm_restore_gc0_kscratch1(cop0);
2654                if (cpu_guest_has_kscr(3))
2655                        kvm_restore_gc0_kscratch2(cop0);
2656                if (cpu_guest_has_kscr(4))
2657                        kvm_restore_gc0_kscratch3(cop0);
2658                if (cpu_guest_has_kscr(5))
2659                        kvm_restore_gc0_kscratch4(cop0);
2660                if (cpu_guest_has_kscr(6))
2661                        kvm_restore_gc0_kscratch5(cop0);
2662                if (cpu_guest_has_kscr(7))
2663                        kvm_restore_gc0_kscratch6(cop0);
2664        }
2665
2666        if (cpu_guest_has_badinstr)
2667                kvm_restore_gc0_badinstr(cop0);
2668        if (cpu_guest_has_badinstrp)
2669                kvm_restore_gc0_badinstrp(cop0);
2670
2671        if (cpu_guest_has_segments) {
2672                kvm_restore_gc0_segctl0(cop0);
2673                kvm_restore_gc0_segctl1(cop0);
2674                kvm_restore_gc0_segctl2(cop0);
2675        }
2676
2677        /* restore HTW registers */
2678        if (cpu_guest_has_htw || cpu_guest_has_ldpte) {
2679                kvm_restore_gc0_pwbase(cop0);
2680                kvm_restore_gc0_pwfield(cop0);
2681                kvm_restore_gc0_pwsize(cop0);
2682                kvm_restore_gc0_pwctl(cop0);
2683        }
2684
2685        /* restore Root.GuestCtl2 from unused Guest guestctl2 register */
2686        if (cpu_has_guestctl2)
2687                write_c0_guestctl2(
2688                        cop0->reg[MIPS_CP0_GUESTCTL2][MIPS_CP0_GUESTCTL2_SEL]);
2689
2690        /*
2691         * We should clear linked load bit to break interrupted atomics. This
2692         * prevents a SC on the next VCPU from succeeding by matching a LL on
2693         * the previous VCPU.
2694         */
2695        if (vcpu->kvm->created_vcpus > 1)
2696                write_gc0_lladdr(0);
2697
2698        return 0;
2699}
2700
2701static int kvm_vz_vcpu_put(struct kvm_vcpu *vcpu, int cpu)
2702{
2703        struct mips_coproc *cop0 = vcpu->arch.cop0;
2704
2705        if (current->flags & PF_VCPU)
2706                kvm_vz_vcpu_save_wired(vcpu);
2707
2708        kvm_lose_fpu(vcpu);
2709
2710        kvm_save_gc0_index(cop0);
2711        kvm_save_gc0_entrylo0(cop0);
2712        kvm_save_gc0_entrylo1(cop0);
2713        kvm_save_gc0_context(cop0);
2714        if (cpu_guest_has_contextconfig)
2715                kvm_save_gc0_contextconfig(cop0);
2716#ifdef CONFIG_64BIT
2717        kvm_save_gc0_xcontext(cop0);
2718        if (cpu_guest_has_contextconfig)
2719                kvm_save_gc0_xcontextconfig(cop0);
2720#endif
2721        kvm_save_gc0_pagemask(cop0);
2722        kvm_save_gc0_pagegrain(cop0);
2723        kvm_save_gc0_wired(cop0);
2724        /* allow wired TLB entries to be overwritten */
2725        clear_gc0_wired(MIPSR6_WIRED_WIRED);
2726        kvm_save_gc0_hwrena(cop0);
2727        kvm_save_gc0_badvaddr(cop0);
2728        kvm_save_gc0_entryhi(cop0);
2729        kvm_save_gc0_status(cop0);
2730        kvm_save_gc0_intctl(cop0);
2731        kvm_save_gc0_epc(cop0);
2732        kvm_write_sw_gc0_ebase(cop0, kvm_vz_read_gc0_ebase());
2733        if (cpu_guest_has_userlocal)
2734                kvm_save_gc0_userlocal(cop0);
2735
2736        /* only save implemented config registers */
2737        kvm_save_gc0_config(cop0);
2738        if (cpu_guest_has_conf1)
2739                kvm_save_gc0_config1(cop0);
2740        if (cpu_guest_has_conf2)
2741                kvm_save_gc0_config2(cop0);
2742        if (cpu_guest_has_conf3)
2743                kvm_save_gc0_config3(cop0);
2744        if (cpu_guest_has_conf4)
2745                kvm_save_gc0_config4(cop0);
2746        if (cpu_guest_has_conf5)
2747                kvm_save_gc0_config5(cop0);
2748        if (cpu_guest_has_conf6)
2749                kvm_save_gc0_config6(cop0);
2750        if (cpu_guest_has_conf7)
2751                kvm_save_gc0_config7(cop0);
2752
2753        kvm_save_gc0_errorepc(cop0);
2754
2755        /* save KScratch registers if enabled in guest */
2756        if (cpu_guest_has_conf4) {
2757                if (cpu_guest_has_kscr(2))
2758                        kvm_save_gc0_kscratch1(cop0);
2759                if (cpu_guest_has_kscr(3))
2760                        kvm_save_gc0_kscratch2(cop0);
2761                if (cpu_guest_has_kscr(4))
2762                        kvm_save_gc0_kscratch3(cop0);
2763                if (cpu_guest_has_kscr(5))
2764                        kvm_save_gc0_kscratch4(cop0);
2765                if (cpu_guest_has_kscr(6))
2766                        kvm_save_gc0_kscratch5(cop0);
2767                if (cpu_guest_has_kscr(7))
2768                        kvm_save_gc0_kscratch6(cop0);
2769        }
2770
2771        if (cpu_guest_has_badinstr)
2772                kvm_save_gc0_badinstr(cop0);
2773        if (cpu_guest_has_badinstrp)
2774                kvm_save_gc0_badinstrp(cop0);
2775
2776        if (cpu_guest_has_segments) {
2777                kvm_save_gc0_segctl0(cop0);
2778                kvm_save_gc0_segctl1(cop0);
2779                kvm_save_gc0_segctl2(cop0);
2780        }
2781
2782        /* save HTW registers if enabled in guest */
2783        if (cpu_guest_has_ldpte || (cpu_guest_has_htw &&
2784            kvm_read_sw_gc0_config3(cop0) & MIPS_CONF3_PW)) {
2785                kvm_save_gc0_pwbase(cop0);
2786                kvm_save_gc0_pwfield(cop0);
2787                kvm_save_gc0_pwsize(cop0);
2788                kvm_save_gc0_pwctl(cop0);
2789        }
2790
2791        kvm_vz_save_timer(vcpu);
2792
2793        /* save Root.GuestCtl2 in unused Guest guestctl2 register */
2794        if (cpu_has_guestctl2)
2795                cop0->reg[MIPS_CP0_GUESTCTL2][MIPS_CP0_GUESTCTL2_SEL] =
2796                        read_c0_guestctl2();
2797
2798        return 0;
2799}
2800
2801/**
2802 * kvm_vz_resize_guest_vtlb() - Attempt to resize guest VTLB.
2803 * @size:       Number of guest VTLB entries (0 < @size <= root VTLB entries).
2804 *
2805 * Attempt to resize the guest VTLB by writing guest Config registers. This is
2806 * necessary for cores with a shared root/guest TLB to avoid overlap with wired
2807 * entries in the root VTLB.
2808 *
2809 * Returns:     The resulting guest VTLB size.
2810 */
2811static unsigned int kvm_vz_resize_guest_vtlb(unsigned int size)
2812{
2813        unsigned int config4 = 0, ret = 0, limit;
2814
2815        /* Write MMUSize - 1 into guest Config registers */
2816        if (cpu_guest_has_conf1)
2817                change_gc0_config1(MIPS_CONF1_TLBS,
2818                                   (size - 1) << MIPS_CONF1_TLBS_SHIFT);
2819        if (cpu_guest_has_conf4) {
2820                config4 = read_gc0_config4();
2821                if (cpu_has_mips_r6 || (config4 & MIPS_CONF4_MMUEXTDEF) ==
2822                    MIPS_CONF4_MMUEXTDEF_VTLBSIZEEXT) {
2823                        config4 &= ~MIPS_CONF4_VTLBSIZEEXT;
2824                        config4 |= ((size - 1) >> MIPS_CONF1_TLBS_SIZE) <<
2825                                MIPS_CONF4_VTLBSIZEEXT_SHIFT;
2826                } else if ((config4 & MIPS_CONF4_MMUEXTDEF) ==
2827                           MIPS_CONF4_MMUEXTDEF_MMUSIZEEXT) {
2828                        config4 &= ~MIPS_CONF4_MMUSIZEEXT;
2829                        config4 |= ((size - 1) >> MIPS_CONF1_TLBS_SIZE) <<
2830                                MIPS_CONF4_MMUSIZEEXT_SHIFT;
2831                }
2832                write_gc0_config4(config4);
2833        }
2834
2835        /*
2836         * Set Guest.Wired.Limit = 0 (no limit up to Guest.MMUSize-1), unless it
2837         * would exceed Root.Wired.Limit (clearing Guest.Wired.Wired so write
2838         * not dropped)
2839         */
2840        if (cpu_has_mips_r6) {
2841                limit = (read_c0_wired() & MIPSR6_WIRED_LIMIT) >>
2842                                                MIPSR6_WIRED_LIMIT_SHIFT;
2843                if (size - 1 <= limit)
2844                        limit = 0;
2845                write_gc0_wired(limit << MIPSR6_WIRED_LIMIT_SHIFT);
2846        }
2847
2848        /* Read back MMUSize - 1 */
2849        back_to_back_c0_hazard();
2850        if (cpu_guest_has_conf1)
2851                ret = (read_gc0_config1() & MIPS_CONF1_TLBS) >>
2852                                                MIPS_CONF1_TLBS_SHIFT;
2853        if (config4) {
2854                if (cpu_has_mips_r6 || (config4 & MIPS_CONF4_MMUEXTDEF) ==
2855                    MIPS_CONF4_MMUEXTDEF_VTLBSIZEEXT)
2856                        ret |= ((config4 & MIPS_CONF4_VTLBSIZEEXT) >>
2857                                MIPS_CONF4_VTLBSIZEEXT_SHIFT) <<
2858                                MIPS_CONF1_TLBS_SIZE;
2859                else if ((config4 & MIPS_CONF4_MMUEXTDEF) ==
2860                         MIPS_CONF4_MMUEXTDEF_MMUSIZEEXT)
2861                        ret |= ((config4 & MIPS_CONF4_MMUSIZEEXT) >>
2862                                MIPS_CONF4_MMUSIZEEXT_SHIFT) <<
2863                                MIPS_CONF1_TLBS_SIZE;
2864        }
2865        return ret + 1;
2866}
2867
2868static int kvm_vz_hardware_enable(void)
2869{
2870        unsigned int mmu_size, guest_mmu_size, ftlb_size;
2871        u64 guest_cvmctl, cvmvmconfig;
2872
2873        switch (current_cpu_type()) {
2874        case CPU_CAVIUM_OCTEON3:
2875                /* Set up guest timer/perfcount IRQ lines */
2876                guest_cvmctl = read_gc0_cvmctl();
2877                guest_cvmctl &= ~CVMCTL_IPTI;
2878                guest_cvmctl |= 7ull << CVMCTL_IPTI_SHIFT;
2879                guest_cvmctl &= ~CVMCTL_IPPCI;
2880                guest_cvmctl |= 6ull << CVMCTL_IPPCI_SHIFT;
2881                write_gc0_cvmctl(guest_cvmctl);
2882
2883                cvmvmconfig = read_c0_cvmvmconfig();
2884                /* No I/O hole translation. */
2885                cvmvmconfig |= CVMVMCONF_DGHT;
2886                /* Halve the root MMU size */
2887                mmu_size = ((cvmvmconfig & CVMVMCONF_MMUSIZEM1)
2888                            >> CVMVMCONF_MMUSIZEM1_S) + 1;
2889                guest_mmu_size = mmu_size / 2;
2890                mmu_size -= guest_mmu_size;
2891                cvmvmconfig &= ~CVMVMCONF_RMMUSIZEM1;
2892                cvmvmconfig |= mmu_size - 1;
2893                write_c0_cvmvmconfig(cvmvmconfig);
2894
2895                /* Update our records */
2896                current_cpu_data.tlbsize = mmu_size;
2897                current_cpu_data.tlbsizevtlb = mmu_size;
2898                current_cpu_data.guest.tlbsize = guest_mmu_size;
2899
2900                /* Flush moved entries in new (guest) context */
2901                kvm_vz_local_flush_guesttlb_all();
2902                break;
2903        default:
2904                /*
2905                 * ImgTec cores tend to use a shared root/guest TLB. To avoid
2906                 * overlap of root wired and guest entries, the guest TLB may
2907                 * need resizing.
2908                 */
2909                mmu_size = current_cpu_data.tlbsizevtlb;
2910                ftlb_size = current_cpu_data.tlbsize - mmu_size;
2911
2912                /* Try switching to maximum guest VTLB size for flush */
2913                guest_mmu_size = kvm_vz_resize_guest_vtlb(mmu_size);
2914                current_cpu_data.guest.tlbsize = guest_mmu_size + ftlb_size;
2915                kvm_vz_local_flush_guesttlb_all();
2916
2917                /*
2918                 * Reduce to make space for root wired entries and at least 2
2919                 * root non-wired entries. This does assume that long-term wired
2920                 * entries won't be added later.
2921                 */
2922                guest_mmu_size = mmu_size - num_wired_entries() - 2;
2923                guest_mmu_size = kvm_vz_resize_guest_vtlb(guest_mmu_size);
2924                current_cpu_data.guest.tlbsize = guest_mmu_size + ftlb_size;
2925
2926                /*
2927                 * Write the VTLB size, but if another CPU has already written,
2928                 * check it matches or we won't provide a consistent view to the
2929                 * guest. If this ever happens it suggests an asymmetric number
2930                 * of wired entries.
2931                 */
2932                if (cmpxchg(&kvm_vz_guest_vtlb_size, 0, guest_mmu_size) &&
2933                    WARN(guest_mmu_size != kvm_vz_guest_vtlb_size,
2934                         "Available guest VTLB size mismatch"))
2935                        return -EINVAL;
2936                break;
2937        }
2938
2939        /*
2940         * Enable virtualization features granting guest direct control of
2941         * certain features:
2942         * CP0=1:       Guest coprocessor 0 context.
2943         * AT=Guest:    Guest MMU.
2944         * CG=1:        Hit (virtual address) CACHE operations (optional).
2945         * CF=1:        Guest Config registers.
2946         * CGI=1:       Indexed flush CACHE operations (optional).
2947         */
2948        write_c0_guestctl0(MIPS_GCTL0_CP0 |
2949                           (MIPS_GCTL0_AT_GUEST << MIPS_GCTL0_AT_SHIFT) |
2950                           MIPS_GCTL0_CG | MIPS_GCTL0_CF);
2951        if (cpu_has_guestctl0ext) {
2952                if (current_cpu_type() != CPU_LOONGSON64)
2953                        set_c0_guestctl0ext(MIPS_GCTL0EXT_CGI);
2954                else
2955                        clear_c0_guestctl0ext(MIPS_GCTL0EXT_CGI);
2956        }
2957
2958        if (cpu_has_guestid) {
2959                write_c0_guestctl1(0);
2960                kvm_vz_local_flush_roottlb_all_guests();
2961
2962                GUESTID_MASK = current_cpu_data.guestid_mask;
2963                GUESTID_FIRST_VERSION = GUESTID_MASK + 1;
2964                GUESTID_VERSION_MASK = ~GUESTID_MASK;
2965
2966                current_cpu_data.guestid_cache = GUESTID_FIRST_VERSION;
2967        }
2968
2969        /* clear any pending injected virtual guest interrupts */
2970        if (cpu_has_guestctl2)
2971                clear_c0_guestctl2(0x3f << 10);
2972
2973#ifdef CONFIG_CPU_LOONGSON64
2974        /* Control guest CCA attribute */
2975        if (cpu_has_csr())
2976                csr_writel(csr_readl(0xffffffec) | 0x1, 0xffffffec);
2977#endif
2978
2979        return 0;
2980}
2981
2982static void kvm_vz_hardware_disable(void)
2983{
2984        u64 cvmvmconfig;
2985        unsigned int mmu_size;
2986
2987        /* Flush any remaining guest TLB entries */
2988        kvm_vz_local_flush_guesttlb_all();
2989
2990        switch (current_cpu_type()) {
2991        case CPU_CAVIUM_OCTEON3:
2992                /*
2993                 * Allocate whole TLB for root. Existing guest TLB entries will
2994                 * change ownership to the root TLB. We should be safe though as
2995                 * they've already been flushed above while in guest TLB.
2996                 */
2997                cvmvmconfig = read_c0_cvmvmconfig();
2998                mmu_size = ((cvmvmconfig & CVMVMCONF_MMUSIZEM1)
2999                            >> CVMVMCONF_MMUSIZEM1_S) + 1;
3000                cvmvmconfig &= ~CVMVMCONF_RMMUSIZEM1;
3001                cvmvmconfig |= mmu_size - 1;
3002                write_c0_cvmvmconfig(cvmvmconfig);
3003
3004                /* Update our records */
3005                current_cpu_data.tlbsize = mmu_size;
3006                current_cpu_data.tlbsizevtlb = mmu_size;
3007                current_cpu_data.guest.tlbsize = 0;
3008
3009                /* Flush moved entries in new (root) context */
3010                local_flush_tlb_all();
3011                break;
3012        }
3013
3014        if (cpu_has_guestid) {
3015                write_c0_guestctl1(0);
3016                kvm_vz_local_flush_roottlb_all_guests();
3017        }
3018}
3019
3020static int kvm_vz_check_extension(struct kvm *kvm, long ext)
3021{
3022        int r;
3023
3024        switch (ext) {
3025        case KVM_CAP_MIPS_VZ:
3026                /* we wouldn't be here unless cpu_has_vz */
3027                r = 1;
3028                break;
3029#ifdef CONFIG_64BIT
3030        case KVM_CAP_MIPS_64BIT:
3031                /* We support 64-bit registers/operations and addresses */
3032                r = 2;
3033                break;
3034#endif
3035        case KVM_CAP_IOEVENTFD:
3036                r = 1;
3037                break;
3038        default:
3039                r = 0;
3040                break;
3041        }
3042
3043        return r;
3044}
3045
3046static int kvm_vz_vcpu_init(struct kvm_vcpu *vcpu)
3047{
3048        int i;
3049
3050        for_each_possible_cpu(i)
3051                vcpu->arch.vzguestid[i] = 0;
3052
3053        return 0;
3054}
3055
3056static void kvm_vz_vcpu_uninit(struct kvm_vcpu *vcpu)
3057{
3058        int cpu;
3059
3060        /*
3061         * If the VCPU is freed and reused as another VCPU, we don't want the
3062         * matching pointer wrongly hanging around in last_vcpu[] or
3063         * last_exec_vcpu[].
3064         */
3065        for_each_possible_cpu(cpu) {
3066                if (last_vcpu[cpu] == vcpu)
3067                        last_vcpu[cpu] = NULL;
3068                if (last_exec_vcpu[cpu] == vcpu)
3069                        last_exec_vcpu[cpu] = NULL;
3070        }
3071}
3072
3073static int kvm_vz_vcpu_setup(struct kvm_vcpu *vcpu)
3074{
3075        struct mips_coproc *cop0 = vcpu->arch.cop0;
3076        unsigned long count_hz = 100*1000*1000; /* default to 100 MHz */
3077
3078        /*
3079         * Start off the timer at the same frequency as the host timer, but the
3080         * soft timer doesn't handle frequencies greater than 1GHz yet.
3081         */
3082        if (mips_hpt_frequency && mips_hpt_frequency <= NSEC_PER_SEC)
3083                count_hz = mips_hpt_frequency;
3084        kvm_mips_init_count(vcpu, count_hz);
3085
3086        /*
3087         * Initialize guest register state to valid architectural reset state.
3088         */
3089
3090        /* PageGrain */
3091        if (cpu_has_mips_r5 || cpu_has_mips_r6)
3092                kvm_write_sw_gc0_pagegrain(cop0, PG_RIE | PG_XIE | PG_IEC);
3093        /* Wired */
3094        if (cpu_has_mips_r6)
3095                kvm_write_sw_gc0_wired(cop0,
3096                                       read_gc0_wired() & MIPSR6_WIRED_LIMIT);
3097        /* Status */
3098        kvm_write_sw_gc0_status(cop0, ST0_BEV | ST0_ERL);
3099        if (cpu_has_mips_r5 || cpu_has_mips_r6)
3100                kvm_change_sw_gc0_status(cop0, ST0_FR, read_gc0_status());
3101        /* IntCtl */
3102        kvm_write_sw_gc0_intctl(cop0, read_gc0_intctl() &
3103                                (INTCTLF_IPFDC | INTCTLF_IPPCI | INTCTLF_IPTI));
3104        /* PRId */
3105        kvm_write_sw_gc0_prid(cop0, boot_cpu_data.processor_id);
3106        /* EBase */
3107        kvm_write_sw_gc0_ebase(cop0, (s32)0x80000000 | vcpu->vcpu_id);
3108        /* Config */
3109        kvm_save_gc0_config(cop0);
3110        /* architecturally writable (e.g. from guest) */
3111        kvm_change_sw_gc0_config(cop0, CONF_CM_CMASK,
3112                                 _page_cachable_default >> _CACHE_SHIFT);
3113        /* architecturally read only, but maybe writable from root */
3114        kvm_change_sw_gc0_config(cop0, MIPS_CONF_MT, read_c0_config());
3115        if (cpu_guest_has_conf1) {
3116                kvm_set_sw_gc0_config(cop0, MIPS_CONF_M);
3117                /* Config1 */
3118                kvm_save_gc0_config1(cop0);
3119                /* architecturally read only, but maybe writable from root */
3120                kvm_clear_sw_gc0_config1(cop0, MIPS_CONF1_C2    |
3121                                               MIPS_CONF1_MD    |
3122                                               MIPS_CONF1_PC    |
3123                                               MIPS_CONF1_WR    |
3124                                               MIPS_CONF1_CA    |
3125                                               MIPS_CONF1_FP);
3126        }
3127        if (cpu_guest_has_conf2) {
3128                kvm_set_sw_gc0_config1(cop0, MIPS_CONF_M);
3129                /* Config2 */
3130                kvm_save_gc0_config2(cop0);
3131        }
3132        if (cpu_guest_has_conf3) {
3133                kvm_set_sw_gc0_config2(cop0, MIPS_CONF_M);
3134                /* Config3 */
3135                kvm_save_gc0_config3(cop0);
3136                /* architecturally writable (e.g. from guest) */
3137                kvm_clear_sw_gc0_config3(cop0, MIPS_CONF3_ISA_OE);
3138                /* architecturally read only, but maybe writable from root */
3139                kvm_clear_sw_gc0_config3(cop0, MIPS_CONF3_MSA   |
3140                                               MIPS_CONF3_BPG   |
3141                                               MIPS_CONF3_ULRI  |
3142                                               MIPS_CONF3_DSP   |
3143                                               MIPS_CONF3_CTXTC |
3144                                               MIPS_CONF3_ITL   |
3145                                               MIPS_CONF3_LPA   |
3146                                               MIPS_CONF3_VEIC  |
3147                                               MIPS_CONF3_VINT  |
3148                                               MIPS_CONF3_SP    |
3149                                               MIPS_CONF3_CDMM  |
3150                                               MIPS_CONF3_MT    |
3151                                               MIPS_CONF3_SM    |
3152                                               MIPS_CONF3_TL);
3153        }
3154        if (cpu_guest_has_conf4) {
3155                kvm_set_sw_gc0_config3(cop0, MIPS_CONF_M);
3156                /* Config4 */
3157                kvm_save_gc0_config4(cop0);
3158        }
3159        if (cpu_guest_has_conf5) {
3160                kvm_set_sw_gc0_config4(cop0, MIPS_CONF_M);
3161                /* Config5 */
3162                kvm_save_gc0_config5(cop0);
3163                /* architecturally writable (e.g. from guest) */
3164                kvm_clear_sw_gc0_config5(cop0, MIPS_CONF5_K     |
3165                                               MIPS_CONF5_CV    |
3166                                               MIPS_CONF5_MSAEN |
3167                                               MIPS_CONF5_UFE   |
3168                                               MIPS_CONF5_FRE   |
3169                                               MIPS_CONF5_SBRI  |
3170                                               MIPS_CONF5_UFR);
3171                /* architecturally read only, but maybe writable from root */
3172                kvm_clear_sw_gc0_config5(cop0, MIPS_CONF5_MRP);
3173        }
3174
3175        if (cpu_guest_has_contextconfig) {
3176                /* ContextConfig */
3177                kvm_write_sw_gc0_contextconfig(cop0, 0x007ffff0);
3178#ifdef CONFIG_64BIT
3179                /* XContextConfig */
3180                /* bits SEGBITS-13+3:4 set */
3181                kvm_write_sw_gc0_xcontextconfig(cop0,
3182                                        ((1ull << (cpu_vmbits - 13)) - 1) << 4);
3183#endif
3184        }
3185
3186        /* Implementation dependent, use the legacy layout */
3187        if (cpu_guest_has_segments) {
3188                /* SegCtl0, SegCtl1, SegCtl2 */
3189                kvm_write_sw_gc0_segctl0(cop0, 0x00200010);
3190                kvm_write_sw_gc0_segctl1(cop0, 0x00000002 |
3191                                (_page_cachable_default >> _CACHE_SHIFT) <<
3192                                                (16 + MIPS_SEGCFG_C_SHIFT));
3193                kvm_write_sw_gc0_segctl2(cop0, 0x00380438);
3194        }
3195
3196        /* reset HTW registers */
3197        if (cpu_guest_has_htw && (cpu_has_mips_r5 || cpu_has_mips_r6)) {
3198                /* PWField */
3199                kvm_write_sw_gc0_pwfield(cop0, 0x0c30c302);
3200                /* PWSize */
3201                kvm_write_sw_gc0_pwsize(cop0, 1 << MIPS_PWSIZE_PTW_SHIFT);
3202        }
3203
3204        /* start with no pending virtual guest interrupts */
3205        if (cpu_has_guestctl2)
3206                cop0->reg[MIPS_CP0_GUESTCTL2][MIPS_CP0_GUESTCTL2_SEL] = 0;
3207
3208        /* Put PC at reset vector */
3209        vcpu->arch.pc = CKSEG1ADDR(0x1fc00000);
3210
3211        return 0;
3212}
3213
3214static void kvm_vz_flush_shadow_all(struct kvm *kvm)
3215{
3216        if (cpu_has_guestid) {
3217                /* Flush GuestID for each VCPU individually */
3218                kvm_flush_remote_tlbs(kvm);
3219        } else {
3220                /*
3221                 * For each CPU there is a single GPA ASID used by all VCPUs in
3222                 * the VM, so it doesn't make sense for the VCPUs to handle
3223                 * invalidation of these ASIDs individually.
3224                 *
3225                 * Instead mark all CPUs as needing ASID invalidation in
3226                 * asid_flush_mask, and just use kvm_flush_remote_tlbs(kvm) to
3227                 * kick any running VCPUs so they check asid_flush_mask.
3228                 */
3229                cpumask_setall(&kvm->arch.asid_flush_mask);
3230                kvm_flush_remote_tlbs(kvm);
3231        }
3232}
3233
3234static void kvm_vz_flush_shadow_memslot(struct kvm *kvm,
3235                                        const struct kvm_memory_slot *slot)
3236{
3237        kvm_vz_flush_shadow_all(kvm);
3238}
3239
3240static void kvm_vz_vcpu_reenter(struct kvm_vcpu *vcpu)
3241{
3242        int cpu = smp_processor_id();
3243        int preserve_guest_tlb;
3244
3245        preserve_guest_tlb = kvm_vz_check_requests(vcpu, cpu);
3246
3247        if (preserve_guest_tlb)
3248                kvm_vz_vcpu_save_wired(vcpu);
3249
3250        kvm_vz_vcpu_load_tlb(vcpu, cpu);
3251
3252        if (preserve_guest_tlb)
3253                kvm_vz_vcpu_load_wired(vcpu);
3254}
3255
3256static int kvm_vz_vcpu_run(struct kvm_vcpu *vcpu)
3257{
3258        int cpu = smp_processor_id();
3259        int r;
3260
3261        kvm_vz_acquire_htimer(vcpu);
3262        /* Check if we have any exceptions/interrupts pending */
3263        kvm_mips_deliver_interrupts(vcpu, read_gc0_cause());
3264
3265        kvm_vz_check_requests(vcpu, cpu);
3266        kvm_vz_vcpu_load_tlb(vcpu, cpu);
3267        kvm_vz_vcpu_load_wired(vcpu);
3268
3269        r = vcpu->arch.vcpu_run(vcpu->run, vcpu);
3270
3271        kvm_vz_vcpu_save_wired(vcpu);
3272
3273        return r;
3274}
3275
3276static struct kvm_mips_callbacks kvm_vz_callbacks = {
3277        .handle_cop_unusable = kvm_trap_vz_handle_cop_unusable,
3278        .handle_tlb_mod = kvm_trap_vz_handle_tlb_st_miss,
3279        .handle_tlb_ld_miss = kvm_trap_vz_handle_tlb_ld_miss,
3280        .handle_tlb_st_miss = kvm_trap_vz_handle_tlb_st_miss,
3281        .handle_addr_err_st = kvm_trap_vz_no_handler,
3282        .handle_addr_err_ld = kvm_trap_vz_no_handler,
3283        .handle_syscall = kvm_trap_vz_no_handler,
3284        .handle_res_inst = kvm_trap_vz_no_handler,
3285        .handle_break = kvm_trap_vz_no_handler,
3286        .handle_msa_disabled = kvm_trap_vz_handle_msa_disabled,
3287        .handle_guest_exit = kvm_trap_vz_handle_guest_exit,
3288
3289        .hardware_enable = kvm_vz_hardware_enable,
3290        .hardware_disable = kvm_vz_hardware_disable,
3291        .check_extension = kvm_vz_check_extension,
3292        .vcpu_init = kvm_vz_vcpu_init,
3293        .vcpu_uninit = kvm_vz_vcpu_uninit,
3294        .vcpu_setup = kvm_vz_vcpu_setup,
3295        .flush_shadow_all = kvm_vz_flush_shadow_all,
3296        .flush_shadow_memslot = kvm_vz_flush_shadow_memslot,
3297        .gva_to_gpa = kvm_vz_gva_to_gpa_cb,
3298        .queue_timer_int = kvm_vz_queue_timer_int_cb,
3299        .dequeue_timer_int = kvm_vz_dequeue_timer_int_cb,
3300        .queue_io_int = kvm_vz_queue_io_int_cb,
3301        .dequeue_io_int = kvm_vz_dequeue_io_int_cb,
3302        .irq_deliver = kvm_vz_irq_deliver_cb,
3303        .irq_clear = kvm_vz_irq_clear_cb,
3304        .num_regs = kvm_vz_num_regs,
3305        .copy_reg_indices = kvm_vz_copy_reg_indices,
3306        .get_one_reg = kvm_vz_get_one_reg,
3307        .set_one_reg = kvm_vz_set_one_reg,
3308        .vcpu_load = kvm_vz_vcpu_load,
3309        .vcpu_put = kvm_vz_vcpu_put,
3310        .vcpu_run = kvm_vz_vcpu_run,
3311        .vcpu_reenter = kvm_vz_vcpu_reenter,
3312};
3313
3314int kvm_mips_emulation_init(struct kvm_mips_callbacks **install_callbacks)
3315{
3316        if (!cpu_has_vz)
3317                return -ENODEV;
3318
3319        /*
3320         * VZ requires at least 2 KScratch registers, so it should have been
3321         * possible to allocate pgd_reg.
3322         */
3323        if (WARN(pgd_reg == -1,
3324                 "pgd_reg not allocated even though cpu_has_vz\n"))
3325                return -ENODEV;
3326
3327        pr_info("Starting KVM with MIPS VZ extensions\n");
3328
3329        *install_callbacks = &kvm_vz_callbacks;
3330        return 0;
3331}
3332