Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * This file is subject to the terms and conditions of the GNU General Public
0003  * License.  See the file "COPYING" in the main directory of this archive
0004  * for more details.
0005  *
0006  * KVM/MIPS: Support for hardware virtualization extensions
0007  *
0008  * Copyright (C) 2012  MIPS Technologies, Inc.  All rights reserved.
0009  * Authors: Yann Le Du <ledu@kymasys.com>
0010  */
0011 
0012 #include <linux/errno.h>
0013 #include <linux/err.h>
0014 #include <linux/module.h>
0015 #include <linux/preempt.h>
0016 #include <linux/vmalloc.h>
0017 #include <asm/cacheflush.h>
0018 #include <asm/cacheops.h>
0019 #include <asm/cmpxchg.h>
0020 #include <asm/fpu.h>
0021 #include <asm/hazards.h>
0022 #include <asm/inst.h>
0023 #include <asm/mmu_context.h>
0024 #include <asm/r4kcache.h>
0025 #include <asm/time.h>
0026 #include <asm/tlb.h>
0027 #include <asm/tlbex.h>
0028 
0029 #include <linux/kvm_host.h>
0030 
0031 #include "interrupt.h"
0032 #ifdef CONFIG_CPU_LOONGSON64
0033 #include "loongson_regs.h"
0034 #endif
0035 
0036 #include "trace.h"
0037 
0038 /* Pointers to last VCPU loaded on each physical CPU */
0039 static struct kvm_vcpu *last_vcpu[NR_CPUS];
0040 /* Pointers to last VCPU executed on each physical CPU */
0041 static struct kvm_vcpu *last_exec_vcpu[NR_CPUS];
0042 
0043 /*
0044  * Number of guest VTLB entries to use, so we can catch inconsistency between
0045  * CPUs.
0046  */
0047 static unsigned int kvm_vz_guest_vtlb_size;
0048 
0049 static inline long kvm_vz_read_gc0_ebase(void)
0050 {
0051     if (sizeof(long) == 8 && cpu_has_ebase_wg)
0052         return read_gc0_ebase_64();
0053     else
0054         return read_gc0_ebase();
0055 }
0056 
0057 static inline void kvm_vz_write_gc0_ebase(long v)
0058 {
0059     /*
0060      * First write with WG=1 to write upper bits, then write again in case
0061      * WG should be left at 0.
0062      * write_gc0_ebase_64() is no longer UNDEFINED since R6.
0063      */
0064     if (sizeof(long) == 8 &&
0065         (cpu_has_mips64r6 || cpu_has_ebase_wg)) {
0066         write_gc0_ebase_64(v | MIPS_EBASE_WG);
0067         write_gc0_ebase_64(v);
0068     } else {
0069         write_gc0_ebase(v | MIPS_EBASE_WG);
0070         write_gc0_ebase(v);
0071     }
0072 }
0073 
0074 /*
0075  * These Config bits may be writable by the guest:
0076  * Config:  [K23, KU] (!TLB), K0
0077  * Config1: (none)
0078  * Config2: [TU, SU] (impl)
0079  * Config3: ISAOnExc
0080  * Config4: FTLBPageSize
0081  * Config5: K, CV, MSAEn, UFE, FRE, SBRI, UFR
0082  */
0083 
0084 static inline unsigned int kvm_vz_config_guest_wrmask(struct kvm_vcpu *vcpu)
0085 {
0086     return CONF_CM_CMASK;
0087 }
0088 
0089 static inline unsigned int kvm_vz_config1_guest_wrmask(struct kvm_vcpu *vcpu)
0090 {
0091     return 0;
0092 }
0093 
0094 static inline unsigned int kvm_vz_config2_guest_wrmask(struct kvm_vcpu *vcpu)
0095 {
0096     return 0;
0097 }
0098 
0099 static inline unsigned int kvm_vz_config3_guest_wrmask(struct kvm_vcpu *vcpu)
0100 {
0101     return MIPS_CONF3_ISA_OE;
0102 }
0103 
0104 static inline unsigned int kvm_vz_config4_guest_wrmask(struct kvm_vcpu *vcpu)
0105 {
0106     /* no need to be exact */
0107     return MIPS_CONF4_VFTLBPAGESIZE;
0108 }
0109 
0110 static inline unsigned int kvm_vz_config5_guest_wrmask(struct kvm_vcpu *vcpu)
0111 {
0112     unsigned int mask = MIPS_CONF5_K | MIPS_CONF5_CV | MIPS_CONF5_SBRI;
0113 
0114     /* Permit MSAEn changes if MSA supported and enabled */
0115     if (kvm_mips_guest_has_msa(&vcpu->arch))
0116         mask |= MIPS_CONF5_MSAEN;
0117 
0118     /*
0119      * Permit guest FPU mode changes if FPU is enabled and the relevant
0120      * feature exists according to FIR register.
0121      */
0122     if (kvm_mips_guest_has_fpu(&vcpu->arch)) {
0123         if (cpu_has_ufr)
0124             mask |= MIPS_CONF5_UFR;
0125         if (cpu_has_fre)
0126             mask |= MIPS_CONF5_FRE | MIPS_CONF5_UFE;
0127     }
0128 
0129     return mask;
0130 }
0131 
0132 static inline unsigned int kvm_vz_config6_guest_wrmask(struct kvm_vcpu *vcpu)
0133 {
0134     return LOONGSON_CONF6_INTIMER | LOONGSON_CONF6_EXTIMER;
0135 }
0136 
0137 /*
0138  * VZ optionally allows these additional Config bits to be written by root:
0139  * Config:  M, [MT]
0140  * Config1: M, [MMUSize-1, C2, MD, PC, WR, CA], FP
0141  * Config2: M
0142  * Config3: M, MSAP, [BPG], ULRI, [DSP2P, DSPP], CTXTC, [ITL, LPA, VEIC,
0143  *      VInt, SP, CDMM, MT, SM, TL]
0144  * Config4: M, [VTLBSizeExt, MMUSizeExt]
0145  * Config5: MRP
0146  */
0147 
0148 static inline unsigned int kvm_vz_config_user_wrmask(struct kvm_vcpu *vcpu)
0149 {
0150     return kvm_vz_config_guest_wrmask(vcpu) | MIPS_CONF_M;
0151 }
0152 
0153 static inline unsigned int kvm_vz_config1_user_wrmask(struct kvm_vcpu *vcpu)
0154 {
0155     unsigned int mask = kvm_vz_config1_guest_wrmask(vcpu) | MIPS_CONF_M;
0156 
0157     /* Permit FPU to be present if FPU is supported */
0158     if (kvm_mips_guest_can_have_fpu(&vcpu->arch))
0159         mask |= MIPS_CONF1_FP;
0160 
0161     return mask;
0162 }
0163 
0164 static inline unsigned int kvm_vz_config2_user_wrmask(struct kvm_vcpu *vcpu)
0165 {
0166     return kvm_vz_config2_guest_wrmask(vcpu) | MIPS_CONF_M;
0167 }
0168 
0169 static inline unsigned int kvm_vz_config3_user_wrmask(struct kvm_vcpu *vcpu)
0170 {
0171     unsigned int mask = kvm_vz_config3_guest_wrmask(vcpu) | MIPS_CONF_M |
0172         MIPS_CONF3_ULRI | MIPS_CONF3_CTXTC;
0173 
0174     /* Permit MSA to be present if MSA is supported */
0175     if (kvm_mips_guest_can_have_msa(&vcpu->arch))
0176         mask |= MIPS_CONF3_MSA;
0177 
0178     return mask;
0179 }
0180 
0181 static inline unsigned int kvm_vz_config4_user_wrmask(struct kvm_vcpu *vcpu)
0182 {
0183     return kvm_vz_config4_guest_wrmask(vcpu) | MIPS_CONF_M;
0184 }
0185 
0186 static inline unsigned int kvm_vz_config5_user_wrmask(struct kvm_vcpu *vcpu)
0187 {
0188     return kvm_vz_config5_guest_wrmask(vcpu) | MIPS_CONF5_MRP;
0189 }
0190 
0191 static inline unsigned int kvm_vz_config6_user_wrmask(struct kvm_vcpu *vcpu)
0192 {
0193     return kvm_vz_config6_guest_wrmask(vcpu) |
0194         LOONGSON_CONF6_SFBEN | LOONGSON_CONF6_FTLBDIS;
0195 }
0196 
0197 static gpa_t kvm_vz_gva_to_gpa_cb(gva_t gva)
0198 {
0199     /* VZ guest has already converted gva to gpa */
0200     return gva;
0201 }
0202 
0203 static void kvm_vz_queue_irq(struct kvm_vcpu *vcpu, unsigned int priority)
0204 {
0205     set_bit(priority, &vcpu->arch.pending_exceptions);
0206     clear_bit(priority, &vcpu->arch.pending_exceptions_clr);
0207 }
0208 
0209 static void kvm_vz_dequeue_irq(struct kvm_vcpu *vcpu, unsigned int priority)
0210 {
0211     clear_bit(priority, &vcpu->arch.pending_exceptions);
0212     set_bit(priority, &vcpu->arch.pending_exceptions_clr);
0213 }
0214 
0215 static void kvm_vz_queue_timer_int_cb(struct kvm_vcpu *vcpu)
0216 {
0217     /*
0218      * timer expiry is asynchronous to vcpu execution therefore defer guest
0219      * cp0 accesses
0220      */
0221     kvm_vz_queue_irq(vcpu, MIPS_EXC_INT_TIMER);
0222 }
0223 
0224 static void kvm_vz_dequeue_timer_int_cb(struct kvm_vcpu *vcpu)
0225 {
0226     /*
0227      * timer expiry is asynchronous to vcpu execution therefore defer guest
0228      * cp0 accesses
0229      */
0230     kvm_vz_dequeue_irq(vcpu, MIPS_EXC_INT_TIMER);
0231 }
0232 
0233 static void kvm_vz_queue_io_int_cb(struct kvm_vcpu *vcpu,
0234                    struct kvm_mips_interrupt *irq)
0235 {
0236     int intr = (int)irq->irq;
0237 
0238     /*
0239      * interrupts are asynchronous to vcpu execution therefore defer guest
0240      * cp0 accesses
0241      */
0242     kvm_vz_queue_irq(vcpu, kvm_irq_to_priority(intr));
0243 }
0244 
0245 static void kvm_vz_dequeue_io_int_cb(struct kvm_vcpu *vcpu,
0246                      struct kvm_mips_interrupt *irq)
0247 {
0248     int intr = (int)irq->irq;
0249 
0250     /*
0251      * interrupts are asynchronous to vcpu execution therefore defer guest
0252      * cp0 accesses
0253      */
0254     kvm_vz_dequeue_irq(vcpu, kvm_irq_to_priority(-intr));
0255 }
0256 
0257 static int kvm_vz_irq_deliver_cb(struct kvm_vcpu *vcpu, unsigned int priority,
0258                  u32 cause)
0259 {
0260     u32 irq = (priority < MIPS_EXC_MAX) ?
0261         kvm_priority_to_irq[priority] : 0;
0262 
0263     switch (priority) {
0264     case MIPS_EXC_INT_TIMER:
0265         set_gc0_cause(C_TI);
0266         break;
0267 
0268     case MIPS_EXC_INT_IO_1:
0269     case MIPS_EXC_INT_IO_2:
0270     case MIPS_EXC_INT_IPI_1:
0271     case MIPS_EXC_INT_IPI_2:
0272         if (cpu_has_guestctl2)
0273             set_c0_guestctl2(irq);
0274         else
0275             set_gc0_cause(irq);
0276         break;
0277 
0278     default:
0279         break;
0280     }
0281 
0282     clear_bit(priority, &vcpu->arch.pending_exceptions);
0283     return 1;
0284 }
0285 
0286 static int kvm_vz_irq_clear_cb(struct kvm_vcpu *vcpu, unsigned int priority,
0287                    u32 cause)
0288 {
0289     u32 irq = (priority < MIPS_EXC_MAX) ?
0290         kvm_priority_to_irq[priority] : 0;
0291 
0292     switch (priority) {
0293     case MIPS_EXC_INT_TIMER:
0294         /*
0295          * Explicitly clear irq associated with Cause.IP[IPTI]
0296          * if GuestCtl2 virtual interrupt register not
0297          * supported or if not using GuestCtl2 Hardware Clear.
0298          */
0299         if (cpu_has_guestctl2) {
0300             if (!(read_c0_guestctl2() & (irq << 14)))
0301                 clear_c0_guestctl2(irq);
0302         } else {
0303             clear_gc0_cause(irq);
0304         }
0305         break;
0306 
0307     case MIPS_EXC_INT_IO_1:
0308     case MIPS_EXC_INT_IO_2:
0309     case MIPS_EXC_INT_IPI_1:
0310     case MIPS_EXC_INT_IPI_2:
0311         /* Clear GuestCtl2.VIP irq if not using Hardware Clear */
0312         if (cpu_has_guestctl2) {
0313             if (!(read_c0_guestctl2() & (irq << 14)))
0314                 clear_c0_guestctl2(irq);
0315         } else {
0316             clear_gc0_cause(irq);
0317         }
0318         break;
0319 
0320     default:
0321         break;
0322     }
0323 
0324     clear_bit(priority, &vcpu->arch.pending_exceptions_clr);
0325     return 1;
0326 }
0327 
0328 /*
0329  * VZ guest timer handling.
0330  */
0331 
0332 /**
0333  * kvm_vz_should_use_htimer() - Find whether to use the VZ hard guest timer.
0334  * @vcpu:   Virtual CPU.
0335  *
0336  * Returns: true if the VZ GTOffset & real guest CP0_Count should be used
0337  *      instead of software emulation of guest timer.
0338  *      false otherwise.
0339  */
0340 static bool kvm_vz_should_use_htimer(struct kvm_vcpu *vcpu)
0341 {
0342     if (kvm_mips_count_disabled(vcpu))
0343         return false;
0344 
0345     /* Chosen frequency must match real frequency */
0346     if (mips_hpt_frequency != vcpu->arch.count_hz)
0347         return false;
0348 
0349     /* We don't support a CP0_GTOffset with fewer bits than CP0_Count */
0350     if (current_cpu_data.gtoffset_mask != 0xffffffff)
0351         return false;
0352 
0353     return true;
0354 }
0355 
0356 /**
0357  * _kvm_vz_restore_stimer() - Restore soft timer state.
0358  * @vcpu:   Virtual CPU.
0359  * @compare:    CP0_Compare register value, restored by caller.
0360  * @cause:  CP0_Cause register to restore.
0361  *
0362  * Restore VZ state relating to the soft timer. The hard timer can be enabled
0363  * later.
0364  */
0365 static void _kvm_vz_restore_stimer(struct kvm_vcpu *vcpu, u32 compare,
0366                    u32 cause)
0367 {
0368     /*
0369      * Avoid spurious counter interrupts by setting Guest CP0_Count to just
0370      * after Guest CP0_Compare.
0371      */
0372     write_c0_gtoffset(compare - read_c0_count());
0373 
0374     back_to_back_c0_hazard();
0375     write_gc0_cause(cause);
0376 }
0377 
0378 /**
0379  * _kvm_vz_restore_htimer() - Restore hard timer state.
0380  * @vcpu:   Virtual CPU.
0381  * @compare:    CP0_Compare register value, restored by caller.
0382  * @cause:  CP0_Cause register to restore.
0383  *
0384  * Restore hard timer Guest.Count & Guest.Cause taking care to preserve the
0385  * value of Guest.CP0_Cause.TI while restoring Guest.CP0_Cause.
0386  */
0387 static void _kvm_vz_restore_htimer(struct kvm_vcpu *vcpu,
0388                    u32 compare, u32 cause)
0389 {
0390     u32 start_count, after_count;
0391     unsigned long flags;
0392 
0393     /*
0394      * Freeze the soft-timer and sync the guest CP0_Count with it. We do
0395      * this with interrupts disabled to avoid latency.
0396      */
0397     local_irq_save(flags);
0398     kvm_mips_freeze_hrtimer(vcpu, &start_count);
0399     write_c0_gtoffset(start_count - read_c0_count());
0400     local_irq_restore(flags);
0401 
0402     /* restore guest CP0_Cause, as TI may already be set */
0403     back_to_back_c0_hazard();
0404     write_gc0_cause(cause);
0405 
0406     /*
0407      * The above sequence isn't atomic and would result in lost timer
0408      * interrupts if we're not careful. Detect if a timer interrupt is due
0409      * and assert it.
0410      */
0411     back_to_back_c0_hazard();
0412     after_count = read_gc0_count();
0413     if (after_count - start_count > compare - start_count - 1)
0414         kvm_vz_queue_irq(vcpu, MIPS_EXC_INT_TIMER);
0415 }
0416 
0417 /**
0418  * kvm_vz_restore_timer() - Restore timer state.
0419  * @vcpu:   Virtual CPU.
0420  *
0421  * Restore soft timer state from saved context.
0422  */
0423 static void kvm_vz_restore_timer(struct kvm_vcpu *vcpu)
0424 {
0425     struct mips_coproc *cop0 = vcpu->arch.cop0;
0426     u32 cause, compare;
0427 
0428     compare = kvm_read_sw_gc0_compare(cop0);
0429     cause = kvm_read_sw_gc0_cause(cop0);
0430 
0431     write_gc0_compare(compare);
0432     _kvm_vz_restore_stimer(vcpu, compare, cause);
0433 }
0434 
0435 /**
0436  * kvm_vz_acquire_htimer() - Switch to hard timer state.
0437  * @vcpu:   Virtual CPU.
0438  *
0439  * Restore hard timer state on top of existing soft timer state if possible.
0440  *
0441  * Since hard timer won't remain active over preemption, preemption should be
0442  * disabled by the caller.
0443  */
0444 void kvm_vz_acquire_htimer(struct kvm_vcpu *vcpu)
0445 {
0446     u32 gctl0;
0447 
0448     gctl0 = read_c0_guestctl0();
0449     if (!(gctl0 & MIPS_GCTL0_GT) && kvm_vz_should_use_htimer(vcpu)) {
0450         /* enable guest access to hard timer */
0451         write_c0_guestctl0(gctl0 | MIPS_GCTL0_GT);
0452 
0453         _kvm_vz_restore_htimer(vcpu, read_gc0_compare(),
0454                        read_gc0_cause());
0455     }
0456 }
0457 
0458 /**
0459  * _kvm_vz_save_htimer() - Switch to software emulation of guest timer.
0460  * @vcpu:   Virtual CPU.
0461  * @out_compare: Pointer to write compare value to.
0462  * @out_cause:  Pointer to write cause value to.
0463  *
0464  * Save VZ guest timer state and switch to software emulation of guest CP0
0465  * timer. The hard timer must already be in use, so preemption should be
0466  * disabled.
0467  */
0468 static void _kvm_vz_save_htimer(struct kvm_vcpu *vcpu,
0469                 u32 *out_compare, u32 *out_cause)
0470 {
0471     u32 cause, compare, before_count, end_count;
0472     ktime_t before_time;
0473 
0474     compare = read_gc0_compare();
0475     *out_compare = compare;
0476 
0477     before_time = ktime_get();
0478 
0479     /*
0480      * Record the CP0_Count *prior* to saving CP0_Cause, so we have a time
0481      * at which no pending timer interrupt is missing.
0482      */
0483     before_count = read_gc0_count();
0484     back_to_back_c0_hazard();
0485     cause = read_gc0_cause();
0486     *out_cause = cause;
0487 
0488     /*
0489      * Record a final CP0_Count which we will transfer to the soft-timer.
0490      * This is recorded *after* saving CP0_Cause, so we don't get any timer
0491      * interrupts from just after the final CP0_Count point.
0492      */
0493     back_to_back_c0_hazard();
0494     end_count = read_gc0_count();
0495 
0496     /*
0497      * The above sequence isn't atomic, so we could miss a timer interrupt
0498      * between reading CP0_Cause and end_count. Detect and record any timer
0499      * interrupt due between before_count and end_count.
0500      */
0501     if (end_count - before_count > compare - before_count - 1)
0502         kvm_vz_queue_irq(vcpu, MIPS_EXC_INT_TIMER);
0503 
0504     /*
0505      * Restore soft-timer, ignoring a small amount of negative drift due to
0506      * delay between freeze_hrtimer and setting CP0_GTOffset.
0507      */
0508     kvm_mips_restore_hrtimer(vcpu, before_time, end_count, -0x10000);
0509 }
0510 
0511 /**
0512  * kvm_vz_save_timer() - Save guest timer state.
0513  * @vcpu:   Virtual CPU.
0514  *
0515  * Save VZ guest timer state and switch to soft guest timer if hard timer was in
0516  * use.
0517  */
0518 static void kvm_vz_save_timer(struct kvm_vcpu *vcpu)
0519 {
0520     struct mips_coproc *cop0 = vcpu->arch.cop0;
0521     u32 gctl0, compare, cause;
0522 
0523     gctl0 = read_c0_guestctl0();
0524     if (gctl0 & MIPS_GCTL0_GT) {
0525         /* disable guest use of hard timer */
0526         write_c0_guestctl0(gctl0 & ~MIPS_GCTL0_GT);
0527 
0528         /* save hard timer state */
0529         _kvm_vz_save_htimer(vcpu, &compare, &cause);
0530     } else {
0531         compare = read_gc0_compare();
0532         cause = read_gc0_cause();
0533     }
0534 
0535     /* save timer-related state to VCPU context */
0536     kvm_write_sw_gc0_cause(cop0, cause);
0537     kvm_write_sw_gc0_compare(cop0, compare);
0538 }
0539 
0540 /**
0541  * kvm_vz_lose_htimer() - Ensure hard guest timer is not in use.
0542  * @vcpu:   Virtual CPU.
0543  *
0544  * Transfers the state of the hard guest timer to the soft guest timer, leaving
0545  * guest state intact so it can continue to be used with the soft timer.
0546  */
0547 void kvm_vz_lose_htimer(struct kvm_vcpu *vcpu)
0548 {
0549     u32 gctl0, compare, cause;
0550 
0551     preempt_disable();
0552     gctl0 = read_c0_guestctl0();
0553     if (gctl0 & MIPS_GCTL0_GT) {
0554         /* disable guest use of timer */
0555         write_c0_guestctl0(gctl0 & ~MIPS_GCTL0_GT);
0556 
0557         /* switch to soft timer */
0558         _kvm_vz_save_htimer(vcpu, &compare, &cause);
0559 
0560         /* leave soft timer in usable state */
0561         _kvm_vz_restore_stimer(vcpu, compare, cause);
0562     }
0563     preempt_enable();
0564 }
0565 
0566 /**
0567  * is_eva_access() - Find whether an instruction is an EVA memory accessor.
0568  * @inst:   32-bit instruction encoding.
0569  *
0570  * Finds whether @inst encodes an EVA memory access instruction, which would
0571  * indicate that emulation of it should access the user mode address space
0572  * instead of the kernel mode address space. This matters for MUSUK segments
0573  * which are TLB mapped for user mode but unmapped for kernel mode.
0574  *
0575  * Returns: Whether @inst encodes an EVA accessor instruction.
0576  */
0577 static bool is_eva_access(union mips_instruction inst)
0578 {
0579     if (inst.spec3_format.opcode != spec3_op)
0580         return false;
0581 
0582     switch (inst.spec3_format.func) {
0583     case lwle_op:
0584     case lwre_op:
0585     case cachee_op:
0586     case sbe_op:
0587     case she_op:
0588     case sce_op:
0589     case swe_op:
0590     case swle_op:
0591     case swre_op:
0592     case prefe_op:
0593     case lbue_op:
0594     case lhue_op:
0595     case lbe_op:
0596     case lhe_op:
0597     case lle_op:
0598     case lwe_op:
0599         return true;
0600     default:
0601         return false;
0602     }
0603 }
0604 
0605 /**
0606  * is_eva_am_mapped() - Find whether an access mode is mapped.
0607  * @vcpu:   KVM VCPU state.
0608  * @am:     3-bit encoded access mode.
0609  * @eu:     Segment becomes unmapped and uncached when Status.ERL=1.
0610  *
0611  * Decode @am to find whether it encodes a mapped segment for the current VCPU
0612  * state. Where necessary @eu and the actual instruction causing the fault are
0613  * taken into account to make the decision.
0614  *
0615  * Returns: Whether the VCPU faulted on a TLB mapped address.
0616  */
0617 static bool is_eva_am_mapped(struct kvm_vcpu *vcpu, unsigned int am, bool eu)
0618 {
0619     u32 am_lookup;
0620     int err;
0621 
0622     /*
0623      * Interpret access control mode. We assume address errors will already
0624      * have been caught by the guest, leaving us with:
0625      *      AM      UM  SM  KM  31..24 23..16
0626      * UK    0 000          Unm   0      0
0627      * MK    1 001          TLB   1
0628      * MSK   2 010      TLB TLB   1
0629      * MUSK  3 011  TLB TLB TLB   1
0630      * MUSUK 4 100  TLB TLB Unm   0      1
0631      * USK   5 101      Unm Unm   0      0
0632      * -     6 110                0      0
0633      * UUSK  7 111  Unm Unm Unm   0      0
0634      *
0635      * We shift a magic value by AM across the sign bit to find if always
0636      * TLB mapped, and if not shift by 8 again to find if it depends on KM.
0637      */
0638     am_lookup = 0x70080000 << am;
0639     if ((s32)am_lookup < 0) {
0640         /*
0641          * MK, MSK, MUSK
0642          * Always TLB mapped, unless SegCtl.EU && ERL
0643          */
0644         if (!eu || !(read_gc0_status() & ST0_ERL))
0645             return true;
0646     } else {
0647         am_lookup <<= 8;
0648         if ((s32)am_lookup < 0) {
0649             union mips_instruction inst;
0650             unsigned int status;
0651             u32 *opc;
0652 
0653             /*
0654              * MUSUK
0655              * TLB mapped if not in kernel mode
0656              */
0657             status = read_gc0_status();
0658             if (!(status & (ST0_EXL | ST0_ERL)) &&
0659                 (status & ST0_KSU))
0660                 return true;
0661             /*
0662              * EVA access instructions in kernel
0663              * mode access user address space.
0664              */
0665             opc = (u32 *)vcpu->arch.pc;
0666             if (vcpu->arch.host_cp0_cause & CAUSEF_BD)
0667                 opc += 1;
0668             err = kvm_get_badinstr(opc, vcpu, &inst.word);
0669             if (!err && is_eva_access(inst))
0670                 return true;
0671         }
0672     }
0673 
0674     return false;
0675 }
0676 
0677 /**
0678  * kvm_vz_gva_to_gpa() - Convert valid GVA to GPA.
0679  * @vcpu:   KVM VCPU state.
0680  * @gva:    Guest virtual address to convert.
0681  * @gpa:    Output guest physical address.
0682  *
0683  * Convert a guest virtual address (GVA) which is valid according to the guest
0684  * context, to a guest physical address (GPA).
0685  *
0686  * Returns: 0 on success.
0687  *      -errno on failure.
0688  */
0689 static int kvm_vz_gva_to_gpa(struct kvm_vcpu *vcpu, unsigned long gva,
0690                  unsigned long *gpa)
0691 {
0692     u32 gva32 = gva;
0693     unsigned long segctl;
0694 
0695     if ((long)gva == (s32)gva32) {
0696         /* Handle canonical 32-bit virtual address */
0697         if (cpu_guest_has_segments) {
0698             unsigned long mask, pa;
0699 
0700             switch (gva32 >> 29) {
0701             case 0:
0702             case 1: /* CFG5 (1GB) */
0703                 segctl = read_gc0_segctl2() >> 16;
0704                 mask = (unsigned long)0xfc0000000ull;
0705                 break;
0706             case 2:
0707             case 3: /* CFG4 (1GB) */
0708                 segctl = read_gc0_segctl2();
0709                 mask = (unsigned long)0xfc0000000ull;
0710                 break;
0711             case 4: /* CFG3 (512MB) */
0712                 segctl = read_gc0_segctl1() >> 16;
0713                 mask = (unsigned long)0xfe0000000ull;
0714                 break;
0715             case 5: /* CFG2 (512MB) */
0716                 segctl = read_gc0_segctl1();
0717                 mask = (unsigned long)0xfe0000000ull;
0718                 break;
0719             case 6: /* CFG1 (512MB) */
0720                 segctl = read_gc0_segctl0() >> 16;
0721                 mask = (unsigned long)0xfe0000000ull;
0722                 break;
0723             case 7: /* CFG0 (512MB) */
0724                 segctl = read_gc0_segctl0();
0725                 mask = (unsigned long)0xfe0000000ull;
0726                 break;
0727             default:
0728                 /*
0729                  * GCC 4.9 isn't smart enough to figure out that
0730                  * segctl and mask are always initialised.
0731                  */
0732                 unreachable();
0733             }
0734 
0735             if (is_eva_am_mapped(vcpu, (segctl >> 4) & 0x7,
0736                          segctl & 0x0008))
0737                 goto tlb_mapped;
0738 
0739             /* Unmapped, find guest physical address */
0740             pa = (segctl << 20) & mask;
0741             pa |= gva32 & ~mask;
0742             *gpa = pa;
0743             return 0;
0744         } else if ((s32)gva32 < (s32)0xc0000000) {
0745             /* legacy unmapped KSeg0 or KSeg1 */
0746             *gpa = gva32 & 0x1fffffff;
0747             return 0;
0748         }
0749 #ifdef CONFIG_64BIT
0750     } else if ((gva & 0xc000000000000000) == 0x8000000000000000) {
0751         /* XKPHYS */
0752         if (cpu_guest_has_segments) {
0753             /*
0754              * Each of the 8 regions can be overridden by SegCtl2.XR
0755              * to use SegCtl1.XAM.
0756              */
0757             segctl = read_gc0_segctl2();
0758             if (segctl & (1ull << (56 + ((gva >> 59) & 0x7)))) {
0759                 segctl = read_gc0_segctl1();
0760                 if (is_eva_am_mapped(vcpu, (segctl >> 59) & 0x7,
0761                              0))
0762                     goto tlb_mapped;
0763             }
0764 
0765         }
0766         /*
0767          * Traditionally fully unmapped.
0768          * Bits 61:59 specify the CCA, which we can just mask off here.
0769          * Bits 58:PABITS should be zero, but we shouldn't have got here
0770          * if it wasn't.
0771          */
0772         *gpa = gva & 0x07ffffffffffffff;
0773         return 0;
0774 #endif
0775     }
0776 
0777 tlb_mapped:
0778     return kvm_vz_guest_tlb_lookup(vcpu, gva, gpa);
0779 }
0780 
0781 /**
0782  * kvm_vz_badvaddr_to_gpa() - Convert GVA BadVAddr from root exception to GPA.
0783  * @vcpu:   KVM VCPU state.
0784  * @badvaddr:   Root BadVAddr.
0785  * @gpa:    Output guest physical address.
0786  *
0787  * VZ implementations are permitted to report guest virtual addresses (GVA) in
0788  * BadVAddr on a root exception during guest execution, instead of the more
0789  * convenient guest physical addresses (GPA). When we get a GVA, this function
0790  * converts it to a GPA, taking into account guest segmentation and guest TLB
0791  * state.
0792  *
0793  * Returns: 0 on success.
0794  *      -errno on failure.
0795  */
0796 static int kvm_vz_badvaddr_to_gpa(struct kvm_vcpu *vcpu, unsigned long badvaddr,
0797                   unsigned long *gpa)
0798 {
0799     unsigned int gexccode = (vcpu->arch.host_cp0_guestctl0 &
0800                  MIPS_GCTL0_GEXC) >> MIPS_GCTL0_GEXC_SHIFT;
0801 
0802     /* If BadVAddr is GPA, then all is well in the world */
0803     if (likely(gexccode == MIPS_GCTL0_GEXC_GPA)) {
0804         *gpa = badvaddr;
0805         return 0;
0806     }
0807 
0808     /* Otherwise we'd expect it to be GVA ... */
0809     if (WARN(gexccode != MIPS_GCTL0_GEXC_GVA,
0810          "Unexpected gexccode %#x\n", gexccode))
0811         return -EINVAL;
0812 
0813     /* ... and we need to perform the GVA->GPA translation in software */
0814     return kvm_vz_gva_to_gpa(vcpu, badvaddr, gpa);
0815 }
0816 
0817 static int kvm_trap_vz_no_handler(struct kvm_vcpu *vcpu)
0818 {
0819     u32 *opc = (u32 *) vcpu->arch.pc;
0820     u32 cause = vcpu->arch.host_cp0_cause;
0821     u32 exccode = (cause & CAUSEF_EXCCODE) >> CAUSEB_EXCCODE;
0822     unsigned long badvaddr = vcpu->arch.host_cp0_badvaddr;
0823     u32 inst = 0;
0824 
0825     /*
0826      *  Fetch the instruction.
0827      */
0828     if (cause & CAUSEF_BD)
0829         opc += 1;
0830     kvm_get_badinstr(opc, vcpu, &inst);
0831 
0832     kvm_err("Exception Code: %d not handled @ PC: %p, inst: 0x%08x BadVaddr: %#lx Status: %#x\n",
0833         exccode, opc, inst, badvaddr,
0834         read_gc0_status());
0835     kvm_arch_vcpu_dump_regs(vcpu);
0836     vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
0837     return RESUME_HOST;
0838 }
0839 
0840 static unsigned long mips_process_maar(unsigned int op, unsigned long val)
0841 {
0842     /* Mask off unused bits */
0843     unsigned long mask = 0xfffff000 | MIPS_MAAR_S | MIPS_MAAR_VL;
0844 
0845     if (read_gc0_pagegrain() & PG_ELPA)
0846         mask |= 0x00ffffff00000000ull;
0847     if (cpu_guest_has_mvh)
0848         mask |= MIPS_MAAR_VH;
0849 
0850     /* Set or clear VH */
0851     if (op == mtc_op) {
0852         /* clear VH */
0853         val &= ~MIPS_MAAR_VH;
0854     } else if (op == dmtc_op) {
0855         /* set VH to match VL */
0856         val &= ~MIPS_MAAR_VH;
0857         if (val & MIPS_MAAR_VL)
0858             val |= MIPS_MAAR_VH;
0859     }
0860 
0861     return val & mask;
0862 }
0863 
0864 static void kvm_write_maari(struct kvm_vcpu *vcpu, unsigned long val)
0865 {
0866     struct mips_coproc *cop0 = vcpu->arch.cop0;
0867 
0868     val &= MIPS_MAARI_INDEX;
0869     if (val == MIPS_MAARI_INDEX)
0870         kvm_write_sw_gc0_maari(cop0, ARRAY_SIZE(vcpu->arch.maar) - 1);
0871     else if (val < ARRAY_SIZE(vcpu->arch.maar))
0872         kvm_write_sw_gc0_maari(cop0, val);
0873 }
0874 
0875 static enum emulation_result kvm_vz_gpsi_cop0(union mips_instruction inst,
0876                           u32 *opc, u32 cause,
0877                           struct kvm_vcpu *vcpu)
0878 {
0879     struct mips_coproc *cop0 = vcpu->arch.cop0;
0880     enum emulation_result er = EMULATE_DONE;
0881     u32 rt, rd, sel;
0882     unsigned long curr_pc;
0883     unsigned long val;
0884 
0885     /*
0886      * Update PC and hold onto current PC in case there is
0887      * an error and we want to rollback the PC
0888      */
0889     curr_pc = vcpu->arch.pc;
0890     er = update_pc(vcpu, cause);
0891     if (er == EMULATE_FAIL)
0892         return er;
0893 
0894     if (inst.co_format.co) {
0895         switch (inst.co_format.func) {
0896         case wait_op:
0897             er = kvm_mips_emul_wait(vcpu);
0898             break;
0899         default:
0900             er = EMULATE_FAIL;
0901         }
0902     } else {
0903         rt = inst.c0r_format.rt;
0904         rd = inst.c0r_format.rd;
0905         sel = inst.c0r_format.sel;
0906 
0907         switch (inst.c0r_format.rs) {
0908         case dmfc_op:
0909         case mfc_op:
0910 #ifdef CONFIG_KVM_MIPS_DEBUG_COP0_COUNTERS
0911             cop0->stat[rd][sel]++;
0912 #endif
0913             if (rd == MIPS_CP0_COUNT &&
0914                 sel == 0) {         /* Count */
0915                 val = kvm_mips_read_count(vcpu);
0916             } else if (rd == MIPS_CP0_COMPARE &&
0917                    sel == 0) {      /* Compare */
0918                 val = read_gc0_compare();
0919             } else if (rd == MIPS_CP0_LLADDR &&
0920                    sel == 0) {      /* LLAddr */
0921                 if (cpu_guest_has_rw_llb)
0922                     val = read_gc0_lladdr() &
0923                         MIPS_LLADDR_LLB;
0924                 else
0925                     val = 0;
0926             } else if (rd == MIPS_CP0_LLADDR &&
0927                    sel == 1 &&      /* MAAR */
0928                    cpu_guest_has_maar &&
0929                    !cpu_guest_has_dyn_maar) {
0930                 /* MAARI must be in range */
0931                 BUG_ON(kvm_read_sw_gc0_maari(cop0) >=
0932                         ARRAY_SIZE(vcpu->arch.maar));
0933                 val = vcpu->arch.maar[
0934                     kvm_read_sw_gc0_maari(cop0)];
0935             } else if ((rd == MIPS_CP0_PRID &&
0936                     (sel == 0 ||    /* PRid */
0937                      sel == 2 ||    /* CDMMBase */
0938                      sel == 3)) ||  /* CMGCRBase */
0939                    (rd == MIPS_CP0_STATUS &&
0940                     (sel == 2 ||    /* SRSCtl */
0941                      sel == 3)) ||  /* SRSMap */
0942                    (rd == MIPS_CP0_CONFIG &&
0943                     (sel == 6 ||    /* Config6 */
0944                      sel == 7)) ||  /* Config7 */
0945                    (rd == MIPS_CP0_LLADDR &&
0946                     (sel == 2) &&   /* MAARI */
0947                     cpu_guest_has_maar &&
0948                     !cpu_guest_has_dyn_maar) ||
0949                    (rd == MIPS_CP0_ERRCTL &&
0950                     (sel == 0))) {  /* ErrCtl */
0951                 val = cop0->reg[rd][sel];
0952 #ifdef CONFIG_CPU_LOONGSON64
0953             } else if (rd == MIPS_CP0_DIAG &&
0954                    (sel == 0)) {    /* Diag */
0955                 val = cop0->reg[rd][sel];
0956 #endif
0957             } else {
0958                 val = 0;
0959                 er = EMULATE_FAIL;
0960             }
0961 
0962             if (er != EMULATE_FAIL) {
0963                 /* Sign extend */
0964                 if (inst.c0r_format.rs == mfc_op)
0965                     val = (int)val;
0966                 vcpu->arch.gprs[rt] = val;
0967             }
0968 
0969             trace_kvm_hwr(vcpu, (inst.c0r_format.rs == mfc_op) ?
0970                     KVM_TRACE_MFC0 : KVM_TRACE_DMFC0,
0971                       KVM_TRACE_COP0(rd, sel), val);
0972             break;
0973 
0974         case dmtc_op:
0975         case mtc_op:
0976 #ifdef CONFIG_KVM_MIPS_DEBUG_COP0_COUNTERS
0977             cop0->stat[rd][sel]++;
0978 #endif
0979             val = vcpu->arch.gprs[rt];
0980             trace_kvm_hwr(vcpu, (inst.c0r_format.rs == mtc_op) ?
0981                     KVM_TRACE_MTC0 : KVM_TRACE_DMTC0,
0982                       KVM_TRACE_COP0(rd, sel), val);
0983 
0984             if (rd == MIPS_CP0_COUNT &&
0985                 sel == 0) {         /* Count */
0986                 kvm_vz_lose_htimer(vcpu);
0987                 kvm_mips_write_count(vcpu, vcpu->arch.gprs[rt]);
0988             } else if (rd == MIPS_CP0_COMPARE &&
0989                    sel == 0) {      /* Compare */
0990                 kvm_mips_write_compare(vcpu,
0991                                vcpu->arch.gprs[rt],
0992                                true);
0993             } else if (rd == MIPS_CP0_LLADDR &&
0994                    sel == 0) {      /* LLAddr */
0995                 /*
0996                  * P5600 generates GPSI on guest MTC0 LLAddr.
0997                  * Only allow the guest to clear LLB.
0998                  */
0999                 if (cpu_guest_has_rw_llb &&
1000                     !(val & MIPS_LLADDR_LLB))
1001                     write_gc0_lladdr(0);
1002             } else if (rd == MIPS_CP0_LLADDR &&
1003                    sel == 1 &&      /* MAAR */
1004                    cpu_guest_has_maar &&
1005                    !cpu_guest_has_dyn_maar) {
1006                 val = mips_process_maar(inst.c0r_format.rs,
1007                             val);
1008 
1009                 /* MAARI must be in range */
1010                 BUG_ON(kvm_read_sw_gc0_maari(cop0) >=
1011                         ARRAY_SIZE(vcpu->arch.maar));
1012                 vcpu->arch.maar[kvm_read_sw_gc0_maari(cop0)] =
1013                                     val;
1014             } else if (rd == MIPS_CP0_LLADDR &&
1015                    (sel == 2) &&    /* MAARI */
1016                    cpu_guest_has_maar &&
1017                    !cpu_guest_has_dyn_maar) {
1018                 kvm_write_maari(vcpu, val);
1019             } else if (rd == MIPS_CP0_CONFIG &&
1020                    (sel == 6)) {
1021                 cop0->reg[rd][sel] = (int)val;
1022             } else if (rd == MIPS_CP0_ERRCTL &&
1023                    (sel == 0)) {    /* ErrCtl */
1024                 /* ignore the written value */
1025 #ifdef CONFIG_CPU_LOONGSON64
1026             } else if (rd == MIPS_CP0_DIAG &&
1027                    (sel == 0)) {    /* Diag */
1028                 unsigned long flags;
1029 
1030                 local_irq_save(flags);
1031                 if (val & LOONGSON_DIAG_BTB) {
1032                     /* Flush BTB */
1033                     set_c0_diag(LOONGSON_DIAG_BTB);
1034                 }
1035                 if (val & LOONGSON_DIAG_ITLB) {
1036                     /* Flush ITLB */
1037                     set_c0_diag(LOONGSON_DIAG_ITLB);
1038                 }
1039                 if (val & LOONGSON_DIAG_DTLB) {
1040                     /* Flush DTLB */
1041                     set_c0_diag(LOONGSON_DIAG_DTLB);
1042                 }
1043                 if (val & LOONGSON_DIAG_VTLB) {
1044                     /* Flush VTLB */
1045                     kvm_loongson_clear_guest_vtlb();
1046                 }
1047                 if (val & LOONGSON_DIAG_FTLB) {
1048                     /* Flush FTLB */
1049                     kvm_loongson_clear_guest_ftlb();
1050                 }
1051                 local_irq_restore(flags);
1052 #endif
1053             } else {
1054                 er = EMULATE_FAIL;
1055             }
1056             break;
1057 
1058         default:
1059             er = EMULATE_FAIL;
1060             break;
1061         }
1062     }
1063     /* Rollback PC only if emulation was unsuccessful */
1064     if (er == EMULATE_FAIL) {
1065         kvm_err("[%#lx]%s: unsupported cop0 instruction 0x%08x\n",
1066             curr_pc, __func__, inst.word);
1067 
1068         vcpu->arch.pc = curr_pc;
1069     }
1070 
1071     return er;
1072 }
1073 
1074 static enum emulation_result kvm_vz_gpsi_cache(union mips_instruction inst,
1075                            u32 *opc, u32 cause,
1076                            struct kvm_vcpu *vcpu)
1077 {
1078     enum emulation_result er = EMULATE_DONE;
1079     u32 cache, op_inst, op, base;
1080     s16 offset;
1081     struct kvm_vcpu_arch *arch = &vcpu->arch;
1082     unsigned long va, curr_pc;
1083 
1084     /*
1085      * Update PC and hold onto current PC in case there is
1086      * an error and we want to rollback the PC
1087      */
1088     curr_pc = vcpu->arch.pc;
1089     er = update_pc(vcpu, cause);
1090     if (er == EMULATE_FAIL)
1091         return er;
1092 
1093     base = inst.i_format.rs;
1094     op_inst = inst.i_format.rt;
1095     if (cpu_has_mips_r6)
1096         offset = inst.spec3_format.simmediate;
1097     else
1098         offset = inst.i_format.simmediate;
1099     cache = op_inst & CacheOp_Cache;
1100     op = op_inst & CacheOp_Op;
1101 
1102     va = arch->gprs[base] + offset;
1103 
1104     kvm_debug("CACHE (cache: %#x, op: %#x, base[%d]: %#lx, offset: %#x\n",
1105           cache, op, base, arch->gprs[base], offset);
1106 
1107     /* Secondary or tirtiary cache ops ignored */
1108     if (cache != Cache_I && cache != Cache_D)
1109         return EMULATE_DONE;
1110 
1111     switch (op_inst) {
1112     case Index_Invalidate_I:
1113         flush_icache_line_indexed(va);
1114         return EMULATE_DONE;
1115     case Index_Writeback_Inv_D:
1116         flush_dcache_line_indexed(va);
1117         return EMULATE_DONE;
1118     case Hit_Invalidate_I:
1119     case Hit_Invalidate_D:
1120     case Hit_Writeback_Inv_D:
1121         if (boot_cpu_type() == CPU_CAVIUM_OCTEON3) {
1122             /* We can just flush entire icache */
1123             local_flush_icache_range(0, 0);
1124             return EMULATE_DONE;
1125         }
1126 
1127         /* So far, other platforms support guest hit cache ops */
1128         break;
1129     default:
1130         break;
1131     }
1132 
1133     kvm_err("@ %#lx/%#lx CACHE (cache: %#x, op: %#x, base[%d]: %#lx, offset: %#x\n",
1134         curr_pc, vcpu->arch.gprs[31], cache, op, base, arch->gprs[base],
1135         offset);
1136     /* Rollback PC */
1137     vcpu->arch.pc = curr_pc;
1138 
1139     return EMULATE_FAIL;
1140 }
1141 
1142 #ifdef CONFIG_CPU_LOONGSON64
1143 static enum emulation_result kvm_vz_gpsi_lwc2(union mips_instruction inst,
1144                           u32 *opc, u32 cause,
1145                           struct kvm_vcpu *vcpu)
1146 {
1147     unsigned int rs, rd;
1148     unsigned int hostcfg;
1149     unsigned long curr_pc;
1150     enum emulation_result er = EMULATE_DONE;
1151 
1152     /*
1153      * Update PC and hold onto current PC in case there is
1154      * an error and we want to rollback the PC
1155      */
1156     curr_pc = vcpu->arch.pc;
1157     er = update_pc(vcpu, cause);
1158     if (er == EMULATE_FAIL)
1159         return er;
1160 
1161     rs = inst.loongson3_lscsr_format.rs;
1162     rd = inst.loongson3_lscsr_format.rd;
1163     switch (inst.loongson3_lscsr_format.fr) {
1164     case 0x8:  /* Read CPUCFG */
1165         ++vcpu->stat.vz_cpucfg_exits;
1166         hostcfg = read_cpucfg(vcpu->arch.gprs[rs]);
1167 
1168         switch (vcpu->arch.gprs[rs]) {
1169         case LOONGSON_CFG0:
1170             vcpu->arch.gprs[rd] = 0x14c000;
1171             break;
1172         case LOONGSON_CFG1:
1173             hostcfg &= (LOONGSON_CFG1_FP | LOONGSON_CFG1_MMI |
1174                     LOONGSON_CFG1_MSA1 | LOONGSON_CFG1_MSA2 |
1175                     LOONGSON_CFG1_SFBP);
1176             vcpu->arch.gprs[rd] = hostcfg;
1177             break;
1178         case LOONGSON_CFG2:
1179             hostcfg &= (LOONGSON_CFG2_LEXT1 | LOONGSON_CFG2_LEXT2 |
1180                     LOONGSON_CFG2_LEXT3 | LOONGSON_CFG2_LSPW);
1181             vcpu->arch.gprs[rd] = hostcfg;
1182             break;
1183         case LOONGSON_CFG3:
1184             vcpu->arch.gprs[rd] = hostcfg;
1185             break;
1186         default:
1187             /* Don't export any other advanced features to guest */
1188             vcpu->arch.gprs[rd] = 0;
1189             break;
1190         }
1191         break;
1192 
1193     default:
1194         kvm_err("lwc2 emulate not impl %d rs %lx @%lx\n",
1195             inst.loongson3_lscsr_format.fr, vcpu->arch.gprs[rs], curr_pc);
1196         er = EMULATE_FAIL;
1197         break;
1198     }
1199 
1200     /* Rollback PC only if emulation was unsuccessful */
1201     if (er == EMULATE_FAIL) {
1202         kvm_err("[%#lx]%s: unsupported lwc2 instruction 0x%08x 0x%08x\n",
1203             curr_pc, __func__, inst.word, inst.loongson3_lscsr_format.fr);
1204 
1205         vcpu->arch.pc = curr_pc;
1206     }
1207 
1208     return er;
1209 }
1210 #endif
1211 
1212 static enum emulation_result kvm_trap_vz_handle_gpsi(u32 cause, u32 *opc,
1213                              struct kvm_vcpu *vcpu)
1214 {
1215     enum emulation_result er = EMULATE_DONE;
1216     struct kvm_vcpu_arch *arch = &vcpu->arch;
1217     union mips_instruction inst;
1218     int rd, rt, sel;
1219     int err;
1220 
1221     /*
1222      *  Fetch the instruction.
1223      */
1224     if (cause & CAUSEF_BD)
1225         opc += 1;
1226     err = kvm_get_badinstr(opc, vcpu, &inst.word);
1227     if (err)
1228         return EMULATE_FAIL;
1229 
1230     switch (inst.r_format.opcode) {
1231     case cop0_op:
1232         er = kvm_vz_gpsi_cop0(inst, opc, cause, vcpu);
1233         break;
1234 #ifndef CONFIG_CPU_MIPSR6
1235     case cache_op:
1236         trace_kvm_exit(vcpu, KVM_TRACE_EXIT_CACHE);
1237         er = kvm_vz_gpsi_cache(inst, opc, cause, vcpu);
1238         break;
1239 #endif
1240 #ifdef CONFIG_CPU_LOONGSON64
1241     case lwc2_op:
1242         er = kvm_vz_gpsi_lwc2(inst, opc, cause, vcpu);
1243         break;
1244 #endif
1245     case spec3_op:
1246         switch (inst.spec3_format.func) {
1247 #ifdef CONFIG_CPU_MIPSR6
1248         case cache6_op:
1249             trace_kvm_exit(vcpu, KVM_TRACE_EXIT_CACHE);
1250             er = kvm_vz_gpsi_cache(inst, opc, cause, vcpu);
1251             break;
1252 #endif
1253         case rdhwr_op:
1254             if (inst.r_format.rs || (inst.r_format.re >> 3))
1255                 goto unknown;
1256 
1257             rd = inst.r_format.rd;
1258             rt = inst.r_format.rt;
1259             sel = inst.r_format.re & 0x7;
1260 
1261             switch (rd) {
1262             case MIPS_HWR_CC:   /* Read count register */
1263                 arch->gprs[rt] =
1264                     (long)(int)kvm_mips_read_count(vcpu);
1265                 break;
1266             default:
1267                 trace_kvm_hwr(vcpu, KVM_TRACE_RDHWR,
1268                           KVM_TRACE_HWR(rd, sel), 0);
1269                 goto unknown;
1270             }
1271 
1272             trace_kvm_hwr(vcpu, KVM_TRACE_RDHWR,
1273                       KVM_TRACE_HWR(rd, sel), arch->gprs[rt]);
1274 
1275             er = update_pc(vcpu, cause);
1276             break;
1277         default:
1278             goto unknown;
1279         }
1280         break;
1281 unknown:
1282 
1283     default:
1284         kvm_err("GPSI exception not supported (%p/%#x)\n",
1285                 opc, inst.word);
1286         kvm_arch_vcpu_dump_regs(vcpu);
1287         er = EMULATE_FAIL;
1288         break;
1289     }
1290 
1291     return er;
1292 }
1293 
1294 static enum emulation_result kvm_trap_vz_handle_gsfc(u32 cause, u32 *opc,
1295                              struct kvm_vcpu *vcpu)
1296 {
1297     enum emulation_result er = EMULATE_DONE;
1298     struct kvm_vcpu_arch *arch = &vcpu->arch;
1299     union mips_instruction inst;
1300     int err;
1301 
1302     /*
1303      *  Fetch the instruction.
1304      */
1305     if (cause & CAUSEF_BD)
1306         opc += 1;
1307     err = kvm_get_badinstr(opc, vcpu, &inst.word);
1308     if (err)
1309         return EMULATE_FAIL;
1310 
1311     /* complete MTC0 on behalf of guest and advance EPC */
1312     if (inst.c0r_format.opcode == cop0_op &&
1313         inst.c0r_format.rs == mtc_op &&
1314         inst.c0r_format.z == 0) {
1315         int rt = inst.c0r_format.rt;
1316         int rd = inst.c0r_format.rd;
1317         int sel = inst.c0r_format.sel;
1318         unsigned int val = arch->gprs[rt];
1319         unsigned int old_val, change;
1320 
1321         trace_kvm_hwr(vcpu, KVM_TRACE_MTC0, KVM_TRACE_COP0(rd, sel),
1322                   val);
1323 
1324         if ((rd == MIPS_CP0_STATUS) && (sel == 0)) {
1325             /* FR bit should read as zero if no FPU */
1326             if (!kvm_mips_guest_has_fpu(&vcpu->arch))
1327                 val &= ~(ST0_CU1 | ST0_FR);
1328 
1329             /*
1330              * Also don't allow FR to be set if host doesn't support
1331              * it.
1332              */
1333             if (!(boot_cpu_data.fpu_id & MIPS_FPIR_F64))
1334                 val &= ~ST0_FR;
1335 
1336             old_val = read_gc0_status();
1337             change = val ^ old_val;
1338 
1339             if (change & ST0_FR) {
1340                 /*
1341                  * FPU and Vector register state is made
1342                  * UNPREDICTABLE by a change of FR, so don't
1343                  * even bother saving it.
1344                  */
1345                 kvm_drop_fpu(vcpu);
1346             }
1347 
1348             /*
1349              * If MSA state is already live, it is undefined how it
1350              * interacts with FR=0 FPU state, and we don't want to
1351              * hit reserved instruction exceptions trying to save
1352              * the MSA state later when CU=1 && FR=1, so play it
1353              * safe and save it first.
1354              */
1355             if (change & ST0_CU1 && !(val & ST0_FR) &&
1356                 vcpu->arch.aux_inuse & KVM_MIPS_AUX_MSA)
1357                 kvm_lose_fpu(vcpu);
1358 
1359             write_gc0_status(val);
1360         } else if ((rd == MIPS_CP0_CAUSE) && (sel == 0)) {
1361             u32 old_cause = read_gc0_cause();
1362             u32 change = old_cause ^ val;
1363 
1364             /* DC bit enabling/disabling timer? */
1365             if (change & CAUSEF_DC) {
1366                 if (val & CAUSEF_DC) {
1367                     kvm_vz_lose_htimer(vcpu);
1368                     kvm_mips_count_disable_cause(vcpu);
1369                 } else {
1370                     kvm_mips_count_enable_cause(vcpu);
1371                 }
1372             }
1373 
1374             /* Only certain bits are RW to the guest */
1375             change &= (CAUSEF_DC | CAUSEF_IV | CAUSEF_WP |
1376                    CAUSEF_IP0 | CAUSEF_IP1);
1377 
1378             /* WP can only be cleared */
1379             change &= ~CAUSEF_WP | old_cause;
1380 
1381             write_gc0_cause(old_cause ^ change);
1382         } else if ((rd == MIPS_CP0_STATUS) && (sel == 1)) { /* IntCtl */
1383             write_gc0_intctl(val);
1384         } else if ((rd == MIPS_CP0_CONFIG) && (sel == 5)) {
1385             old_val = read_gc0_config5();
1386             change = val ^ old_val;
1387             /* Handle changes in FPU/MSA modes */
1388             preempt_disable();
1389 
1390             /*
1391              * Propagate FRE changes immediately if the FPU
1392              * context is already loaded.
1393              */
1394             if (change & MIPS_CONF5_FRE &&
1395                 vcpu->arch.aux_inuse & KVM_MIPS_AUX_FPU)
1396                 change_c0_config5(MIPS_CONF5_FRE, val);
1397 
1398             preempt_enable();
1399 
1400             val = old_val ^
1401                 (change & kvm_vz_config5_guest_wrmask(vcpu));
1402             write_gc0_config5(val);
1403         } else {
1404             kvm_err("Handle GSFC, unsupported field change @ %p: %#x\n",
1405                 opc, inst.word);
1406             er = EMULATE_FAIL;
1407         }
1408 
1409         if (er != EMULATE_FAIL)
1410             er = update_pc(vcpu, cause);
1411     } else {
1412         kvm_err("Handle GSFC, unrecognized instruction @ %p: %#x\n",
1413             opc, inst.word);
1414         er = EMULATE_FAIL;
1415     }
1416 
1417     return er;
1418 }
1419 
1420 static enum emulation_result kvm_trap_vz_handle_ghfc(u32 cause, u32 *opc,
1421                              struct kvm_vcpu *vcpu)
1422 {
1423     /*
1424      * Presumably this is due to MC (guest mode change), so lets trace some
1425      * relevant info.
1426      */
1427     trace_kvm_guest_mode_change(vcpu);
1428 
1429     return EMULATE_DONE;
1430 }
1431 
1432 static enum emulation_result kvm_trap_vz_handle_hc(u32 cause, u32 *opc,
1433                            struct kvm_vcpu *vcpu)
1434 {
1435     enum emulation_result er;
1436     union mips_instruction inst;
1437     unsigned long curr_pc;
1438     int err;
1439 
1440     if (cause & CAUSEF_BD)
1441         opc += 1;
1442     err = kvm_get_badinstr(opc, vcpu, &inst.word);
1443     if (err)
1444         return EMULATE_FAIL;
1445 
1446     /*
1447      * Update PC and hold onto current PC in case there is
1448      * an error and we want to rollback the PC
1449      */
1450     curr_pc = vcpu->arch.pc;
1451     er = update_pc(vcpu, cause);
1452     if (er == EMULATE_FAIL)
1453         return er;
1454 
1455     er = kvm_mips_emul_hypcall(vcpu, inst);
1456     if (er == EMULATE_FAIL)
1457         vcpu->arch.pc = curr_pc;
1458 
1459     return er;
1460 }
1461 
1462 static enum emulation_result kvm_trap_vz_no_handler_guest_exit(u32 gexccode,
1463                             u32 cause,
1464                             u32 *opc,
1465                             struct kvm_vcpu *vcpu)
1466 {
1467     u32 inst;
1468 
1469     /*
1470      *  Fetch the instruction.
1471      */
1472     if (cause & CAUSEF_BD)
1473         opc += 1;
1474     kvm_get_badinstr(opc, vcpu, &inst);
1475 
1476     kvm_err("Guest Exception Code: %d not yet handled @ PC: %p, inst: 0x%08x  Status: %#x\n",
1477         gexccode, opc, inst, read_gc0_status());
1478 
1479     return EMULATE_FAIL;
1480 }
1481 
1482 static int kvm_trap_vz_handle_guest_exit(struct kvm_vcpu *vcpu)
1483 {
1484     u32 *opc = (u32 *) vcpu->arch.pc;
1485     u32 cause = vcpu->arch.host_cp0_cause;
1486     enum emulation_result er = EMULATE_DONE;
1487     u32 gexccode = (vcpu->arch.host_cp0_guestctl0 &
1488             MIPS_GCTL0_GEXC) >> MIPS_GCTL0_GEXC_SHIFT;
1489     int ret = RESUME_GUEST;
1490 
1491     trace_kvm_exit(vcpu, KVM_TRACE_EXIT_GEXCCODE_BASE + gexccode);
1492     switch (gexccode) {
1493     case MIPS_GCTL0_GEXC_GPSI:
1494         ++vcpu->stat.vz_gpsi_exits;
1495         er = kvm_trap_vz_handle_gpsi(cause, opc, vcpu);
1496         break;
1497     case MIPS_GCTL0_GEXC_GSFC:
1498         ++vcpu->stat.vz_gsfc_exits;
1499         er = kvm_trap_vz_handle_gsfc(cause, opc, vcpu);
1500         break;
1501     case MIPS_GCTL0_GEXC_HC:
1502         ++vcpu->stat.vz_hc_exits;
1503         er = kvm_trap_vz_handle_hc(cause, opc, vcpu);
1504         break;
1505     case MIPS_GCTL0_GEXC_GRR:
1506         ++vcpu->stat.vz_grr_exits;
1507         er = kvm_trap_vz_no_handler_guest_exit(gexccode, cause, opc,
1508                                vcpu);
1509         break;
1510     case MIPS_GCTL0_GEXC_GVA:
1511         ++vcpu->stat.vz_gva_exits;
1512         er = kvm_trap_vz_no_handler_guest_exit(gexccode, cause, opc,
1513                                vcpu);
1514         break;
1515     case MIPS_GCTL0_GEXC_GHFC:
1516         ++vcpu->stat.vz_ghfc_exits;
1517         er = kvm_trap_vz_handle_ghfc(cause, opc, vcpu);
1518         break;
1519     case MIPS_GCTL0_GEXC_GPA:
1520         ++vcpu->stat.vz_gpa_exits;
1521         er = kvm_trap_vz_no_handler_guest_exit(gexccode, cause, opc,
1522                                vcpu);
1523         break;
1524     default:
1525         ++vcpu->stat.vz_resvd_exits;
1526         er = kvm_trap_vz_no_handler_guest_exit(gexccode, cause, opc,
1527                                vcpu);
1528         break;
1529 
1530     }
1531 
1532     if (er == EMULATE_DONE) {
1533         ret = RESUME_GUEST;
1534     } else if (er == EMULATE_HYPERCALL) {
1535         ret = kvm_mips_handle_hypcall(vcpu);
1536     } else {
1537         vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1538         ret = RESUME_HOST;
1539     }
1540     return ret;
1541 }
1542 
1543 /**
1544  * kvm_trap_vz_handle_cop_unusable() - Guest used unusable coprocessor.
1545  * @vcpu:   Virtual CPU context.
1546  *
1547  * Handle when the guest attempts to use a coprocessor which hasn't been allowed
1548  * by the root context.
1549  *
1550  * Return: value indicating whether to resume the host or the guest
1551  *     (RESUME_HOST or RESUME_GUEST)
1552  */
1553 static int kvm_trap_vz_handle_cop_unusable(struct kvm_vcpu *vcpu)
1554 {
1555     u32 cause = vcpu->arch.host_cp0_cause;
1556     enum emulation_result er = EMULATE_FAIL;
1557     int ret = RESUME_GUEST;
1558 
1559     if (((cause & CAUSEF_CE) >> CAUSEB_CE) == 1) {
1560         /*
1561          * If guest FPU not present, the FPU operation should have been
1562          * treated as a reserved instruction!
1563          * If FPU already in use, we shouldn't get this at all.
1564          */
1565         if (WARN_ON(!kvm_mips_guest_has_fpu(&vcpu->arch) ||
1566                 vcpu->arch.aux_inuse & KVM_MIPS_AUX_FPU)) {
1567             preempt_enable();
1568             return EMULATE_FAIL;
1569         }
1570 
1571         kvm_own_fpu(vcpu);
1572         er = EMULATE_DONE;
1573     }
1574     /* other coprocessors not handled */
1575 
1576     switch (er) {
1577     case EMULATE_DONE:
1578         ret = RESUME_GUEST;
1579         break;
1580 
1581     case EMULATE_FAIL:
1582         vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1583         ret = RESUME_HOST;
1584         break;
1585 
1586     default:
1587         BUG();
1588     }
1589     return ret;
1590 }
1591 
1592 /**
1593  * kvm_trap_vz_handle_msa_disabled() - Guest used MSA while disabled in root.
1594  * @vcpu:   Virtual CPU context.
1595  *
1596  * Handle when the guest attempts to use MSA when it is disabled in the root
1597  * context.
1598  *
1599  * Return: value indicating whether to resume the host or the guest
1600  *     (RESUME_HOST or RESUME_GUEST)
1601  */
1602 static int kvm_trap_vz_handle_msa_disabled(struct kvm_vcpu *vcpu)
1603 {
1604     /*
1605      * If MSA not present or not exposed to guest or FR=0, the MSA operation
1606      * should have been treated as a reserved instruction!
1607      * Same if CU1=1, FR=0.
1608      * If MSA already in use, we shouldn't get this at all.
1609      */
1610     if (!kvm_mips_guest_has_msa(&vcpu->arch) ||
1611         (read_gc0_status() & (ST0_CU1 | ST0_FR)) == ST0_CU1 ||
1612         !(read_gc0_config5() & MIPS_CONF5_MSAEN) ||
1613         vcpu->arch.aux_inuse & KVM_MIPS_AUX_MSA) {
1614         vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1615         return RESUME_HOST;
1616     }
1617 
1618     kvm_own_msa(vcpu);
1619 
1620     return RESUME_GUEST;
1621 }
1622 
1623 static int kvm_trap_vz_handle_tlb_ld_miss(struct kvm_vcpu *vcpu)
1624 {
1625     struct kvm_run *run = vcpu->run;
1626     u32 *opc = (u32 *) vcpu->arch.pc;
1627     u32 cause = vcpu->arch.host_cp0_cause;
1628     ulong badvaddr = vcpu->arch.host_cp0_badvaddr;
1629     union mips_instruction inst;
1630     enum emulation_result er = EMULATE_DONE;
1631     int err, ret = RESUME_GUEST;
1632 
1633     if (kvm_mips_handle_vz_root_tlb_fault(badvaddr, vcpu, false)) {
1634         /* A code fetch fault doesn't count as an MMIO */
1635         if (kvm_is_ifetch_fault(&vcpu->arch)) {
1636             run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1637             return RESUME_HOST;
1638         }
1639 
1640         /* Fetch the instruction */
1641         if (cause & CAUSEF_BD)
1642             opc += 1;
1643         err = kvm_get_badinstr(opc, vcpu, &inst.word);
1644         if (err) {
1645             run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1646             return RESUME_HOST;
1647         }
1648 
1649         /* Treat as MMIO */
1650         er = kvm_mips_emulate_load(inst, cause, vcpu);
1651         if (er == EMULATE_FAIL) {
1652             kvm_err("Guest Emulate Load from MMIO space failed: PC: %p, BadVaddr: %#lx\n",
1653                 opc, badvaddr);
1654             run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1655         }
1656     }
1657 
1658     if (er == EMULATE_DONE) {
1659         ret = RESUME_GUEST;
1660     } else if (er == EMULATE_DO_MMIO) {
1661         run->exit_reason = KVM_EXIT_MMIO;
1662         ret = RESUME_HOST;
1663     } else {
1664         run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1665         ret = RESUME_HOST;
1666     }
1667     return ret;
1668 }
1669 
1670 static int kvm_trap_vz_handle_tlb_st_miss(struct kvm_vcpu *vcpu)
1671 {
1672     struct kvm_run *run = vcpu->run;
1673     u32 *opc = (u32 *) vcpu->arch.pc;
1674     u32 cause = vcpu->arch.host_cp0_cause;
1675     ulong badvaddr = vcpu->arch.host_cp0_badvaddr;
1676     union mips_instruction inst;
1677     enum emulation_result er = EMULATE_DONE;
1678     int err;
1679     int ret = RESUME_GUEST;
1680 
1681     /* Just try the access again if we couldn't do the translation */
1682     if (kvm_vz_badvaddr_to_gpa(vcpu, badvaddr, &badvaddr))
1683         return RESUME_GUEST;
1684     vcpu->arch.host_cp0_badvaddr = badvaddr;
1685 
1686     if (kvm_mips_handle_vz_root_tlb_fault(badvaddr, vcpu, true)) {
1687         /* Fetch the instruction */
1688         if (cause & CAUSEF_BD)
1689             opc += 1;
1690         err = kvm_get_badinstr(opc, vcpu, &inst.word);
1691         if (err) {
1692             run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1693             return RESUME_HOST;
1694         }
1695 
1696         /* Treat as MMIO */
1697         er = kvm_mips_emulate_store(inst, cause, vcpu);
1698         if (er == EMULATE_FAIL) {
1699             kvm_err("Guest Emulate Store to MMIO space failed: PC: %p, BadVaddr: %#lx\n",
1700                 opc, badvaddr);
1701             run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1702         }
1703     }
1704 
1705     if (er == EMULATE_DONE) {
1706         ret = RESUME_GUEST;
1707     } else if (er == EMULATE_DO_MMIO) {
1708         run->exit_reason = KVM_EXIT_MMIO;
1709         ret = RESUME_HOST;
1710     } else {
1711         run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
1712         ret = RESUME_HOST;
1713     }
1714     return ret;
1715 }
1716 
1717 static u64 kvm_vz_get_one_regs[] = {
1718     KVM_REG_MIPS_CP0_INDEX,
1719     KVM_REG_MIPS_CP0_ENTRYLO0,
1720     KVM_REG_MIPS_CP0_ENTRYLO1,
1721     KVM_REG_MIPS_CP0_CONTEXT,
1722     KVM_REG_MIPS_CP0_PAGEMASK,
1723     KVM_REG_MIPS_CP0_PAGEGRAIN,
1724     KVM_REG_MIPS_CP0_WIRED,
1725     KVM_REG_MIPS_CP0_HWRENA,
1726     KVM_REG_MIPS_CP0_BADVADDR,
1727     KVM_REG_MIPS_CP0_COUNT,
1728     KVM_REG_MIPS_CP0_ENTRYHI,
1729     KVM_REG_MIPS_CP0_COMPARE,
1730     KVM_REG_MIPS_CP0_STATUS,
1731     KVM_REG_MIPS_CP0_INTCTL,
1732     KVM_REG_MIPS_CP0_CAUSE,
1733     KVM_REG_MIPS_CP0_EPC,
1734     KVM_REG_MIPS_CP0_PRID,
1735     KVM_REG_MIPS_CP0_EBASE,
1736     KVM_REG_MIPS_CP0_CONFIG,
1737     KVM_REG_MIPS_CP0_CONFIG1,
1738     KVM_REG_MIPS_CP0_CONFIG2,
1739     KVM_REG_MIPS_CP0_CONFIG3,
1740     KVM_REG_MIPS_CP0_CONFIG4,
1741     KVM_REG_MIPS_CP0_CONFIG5,
1742     KVM_REG_MIPS_CP0_CONFIG6,
1743 #ifdef CONFIG_64BIT
1744     KVM_REG_MIPS_CP0_XCONTEXT,
1745 #endif
1746     KVM_REG_MIPS_CP0_ERROREPC,
1747 
1748     KVM_REG_MIPS_COUNT_CTL,
1749     KVM_REG_MIPS_COUNT_RESUME,
1750     KVM_REG_MIPS_COUNT_HZ,
1751 };
1752 
1753 static u64 kvm_vz_get_one_regs_contextconfig[] = {
1754     KVM_REG_MIPS_CP0_CONTEXTCONFIG,
1755 #ifdef CONFIG_64BIT
1756     KVM_REG_MIPS_CP0_XCONTEXTCONFIG,
1757 #endif
1758 };
1759 
1760 static u64 kvm_vz_get_one_regs_segments[] = {
1761     KVM_REG_MIPS_CP0_SEGCTL0,
1762     KVM_REG_MIPS_CP0_SEGCTL1,
1763     KVM_REG_MIPS_CP0_SEGCTL2,
1764 };
1765 
1766 static u64 kvm_vz_get_one_regs_htw[] = {
1767     KVM_REG_MIPS_CP0_PWBASE,
1768     KVM_REG_MIPS_CP0_PWFIELD,
1769     KVM_REG_MIPS_CP0_PWSIZE,
1770     KVM_REG_MIPS_CP0_PWCTL,
1771 };
1772 
1773 static u64 kvm_vz_get_one_regs_kscratch[] = {
1774     KVM_REG_MIPS_CP0_KSCRATCH1,
1775     KVM_REG_MIPS_CP0_KSCRATCH2,
1776     KVM_REG_MIPS_CP0_KSCRATCH3,
1777     KVM_REG_MIPS_CP0_KSCRATCH4,
1778     KVM_REG_MIPS_CP0_KSCRATCH5,
1779     KVM_REG_MIPS_CP0_KSCRATCH6,
1780 };
1781 
1782 static unsigned long kvm_vz_num_regs(struct kvm_vcpu *vcpu)
1783 {
1784     unsigned long ret;
1785 
1786     ret = ARRAY_SIZE(kvm_vz_get_one_regs);
1787     if (cpu_guest_has_userlocal)
1788         ++ret;
1789     if (cpu_guest_has_badinstr)
1790         ++ret;
1791     if (cpu_guest_has_badinstrp)
1792         ++ret;
1793     if (cpu_guest_has_contextconfig)
1794         ret += ARRAY_SIZE(kvm_vz_get_one_regs_contextconfig);
1795     if (cpu_guest_has_segments)
1796         ret += ARRAY_SIZE(kvm_vz_get_one_regs_segments);
1797     if (cpu_guest_has_htw || cpu_guest_has_ldpte)
1798         ret += ARRAY_SIZE(kvm_vz_get_one_regs_htw);
1799     if (cpu_guest_has_maar && !cpu_guest_has_dyn_maar)
1800         ret += 1 + ARRAY_SIZE(vcpu->arch.maar);
1801     ret += __arch_hweight8(cpu_data[0].guest.kscratch_mask);
1802 
1803     return ret;
1804 }
1805 
1806 static int kvm_vz_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *indices)
1807 {
1808     u64 index;
1809     unsigned int i;
1810 
1811     if (copy_to_user(indices, kvm_vz_get_one_regs,
1812              sizeof(kvm_vz_get_one_regs)))
1813         return -EFAULT;
1814     indices += ARRAY_SIZE(kvm_vz_get_one_regs);
1815 
1816     if (cpu_guest_has_userlocal) {
1817         index = KVM_REG_MIPS_CP0_USERLOCAL;
1818         if (copy_to_user(indices, &index, sizeof(index)))
1819             return -EFAULT;
1820         ++indices;
1821     }
1822     if (cpu_guest_has_badinstr) {
1823         index = KVM_REG_MIPS_CP0_BADINSTR;
1824         if (copy_to_user(indices, &index, sizeof(index)))
1825             return -EFAULT;
1826         ++indices;
1827     }
1828     if (cpu_guest_has_badinstrp) {
1829         index = KVM_REG_MIPS_CP0_BADINSTRP;
1830         if (copy_to_user(indices, &index, sizeof(index)))
1831             return -EFAULT;
1832         ++indices;
1833     }
1834     if (cpu_guest_has_contextconfig) {
1835         if (copy_to_user(indices, kvm_vz_get_one_regs_contextconfig,
1836                  sizeof(kvm_vz_get_one_regs_contextconfig)))
1837             return -EFAULT;
1838         indices += ARRAY_SIZE(kvm_vz_get_one_regs_contextconfig);
1839     }
1840     if (cpu_guest_has_segments) {
1841         if (copy_to_user(indices, kvm_vz_get_one_regs_segments,
1842                  sizeof(kvm_vz_get_one_regs_segments)))
1843             return -EFAULT;
1844         indices += ARRAY_SIZE(kvm_vz_get_one_regs_segments);
1845     }
1846     if (cpu_guest_has_htw || cpu_guest_has_ldpte) {
1847         if (copy_to_user(indices, kvm_vz_get_one_regs_htw,
1848                  sizeof(kvm_vz_get_one_regs_htw)))
1849             return -EFAULT;
1850         indices += ARRAY_SIZE(kvm_vz_get_one_regs_htw);
1851     }
1852     if (cpu_guest_has_maar && !cpu_guest_has_dyn_maar) {
1853         for (i = 0; i < ARRAY_SIZE(vcpu->arch.maar); ++i) {
1854             index = KVM_REG_MIPS_CP0_MAAR(i);
1855             if (copy_to_user(indices, &index, sizeof(index)))
1856                 return -EFAULT;
1857             ++indices;
1858         }
1859 
1860         index = KVM_REG_MIPS_CP0_MAARI;
1861         if (copy_to_user(indices, &index, sizeof(index)))
1862             return -EFAULT;
1863         ++indices;
1864     }
1865     for (i = 0; i < 6; ++i) {
1866         if (!cpu_guest_has_kscr(i + 2))
1867             continue;
1868 
1869         if (copy_to_user(indices, &kvm_vz_get_one_regs_kscratch[i],
1870                  sizeof(kvm_vz_get_one_regs_kscratch[i])))
1871             return -EFAULT;
1872         ++indices;
1873     }
1874 
1875     return 0;
1876 }
1877 
1878 static inline s64 entrylo_kvm_to_user(unsigned long v)
1879 {
1880     s64 mask, ret = v;
1881 
1882     if (BITS_PER_LONG == 32) {
1883         /*
1884          * KVM API exposes 64-bit version of the register, so move the
1885          * RI/XI bits up into place.
1886          */
1887         mask = MIPS_ENTRYLO_RI | MIPS_ENTRYLO_XI;
1888         ret &= ~mask;
1889         ret |= ((s64)v & mask) << 32;
1890     }
1891     return ret;
1892 }
1893 
1894 static inline unsigned long entrylo_user_to_kvm(s64 v)
1895 {
1896     unsigned long mask, ret = v;
1897 
1898     if (BITS_PER_LONG == 32) {
1899         /*
1900          * KVM API exposes 64-bit versiono of the register, so move the
1901          * RI/XI bits down into place.
1902          */
1903         mask = MIPS_ENTRYLO_RI | MIPS_ENTRYLO_XI;
1904         ret &= ~mask;
1905         ret |= (v >> 32) & mask;
1906     }
1907     return ret;
1908 }
1909 
1910 static int kvm_vz_get_one_reg(struct kvm_vcpu *vcpu,
1911                   const struct kvm_one_reg *reg,
1912                   s64 *v)
1913 {
1914     struct mips_coproc *cop0 = vcpu->arch.cop0;
1915     unsigned int idx;
1916 
1917     switch (reg->id) {
1918     case KVM_REG_MIPS_CP0_INDEX:
1919         *v = (long)read_gc0_index();
1920         break;
1921     case KVM_REG_MIPS_CP0_ENTRYLO0:
1922         *v = entrylo_kvm_to_user(read_gc0_entrylo0());
1923         break;
1924     case KVM_REG_MIPS_CP0_ENTRYLO1:
1925         *v = entrylo_kvm_to_user(read_gc0_entrylo1());
1926         break;
1927     case KVM_REG_MIPS_CP0_CONTEXT:
1928         *v = (long)read_gc0_context();
1929         break;
1930     case KVM_REG_MIPS_CP0_CONTEXTCONFIG:
1931         if (!cpu_guest_has_contextconfig)
1932             return -EINVAL;
1933         *v = read_gc0_contextconfig();
1934         break;
1935     case KVM_REG_MIPS_CP0_USERLOCAL:
1936         if (!cpu_guest_has_userlocal)
1937             return -EINVAL;
1938         *v = read_gc0_userlocal();
1939         break;
1940 #ifdef CONFIG_64BIT
1941     case KVM_REG_MIPS_CP0_XCONTEXTCONFIG:
1942         if (!cpu_guest_has_contextconfig)
1943             return -EINVAL;
1944         *v = read_gc0_xcontextconfig();
1945         break;
1946 #endif
1947     case KVM_REG_MIPS_CP0_PAGEMASK:
1948         *v = (long)read_gc0_pagemask();
1949         break;
1950     case KVM_REG_MIPS_CP0_PAGEGRAIN:
1951         *v = (long)read_gc0_pagegrain();
1952         break;
1953     case KVM_REG_MIPS_CP0_SEGCTL0:
1954         if (!cpu_guest_has_segments)
1955             return -EINVAL;
1956         *v = read_gc0_segctl0();
1957         break;
1958     case KVM_REG_MIPS_CP0_SEGCTL1:
1959         if (!cpu_guest_has_segments)
1960             return -EINVAL;
1961         *v = read_gc0_segctl1();
1962         break;
1963     case KVM_REG_MIPS_CP0_SEGCTL2:
1964         if (!cpu_guest_has_segments)
1965             return -EINVAL;
1966         *v = read_gc0_segctl2();
1967         break;
1968     case KVM_REG_MIPS_CP0_PWBASE:
1969         if (!cpu_guest_has_htw && !cpu_guest_has_ldpte)
1970             return -EINVAL;
1971         *v = read_gc0_pwbase();
1972         break;
1973     case KVM_REG_MIPS_CP0_PWFIELD:
1974         if (!cpu_guest_has_htw && !cpu_guest_has_ldpte)
1975             return -EINVAL;
1976         *v = read_gc0_pwfield();
1977         break;
1978     case KVM_REG_MIPS_CP0_PWSIZE:
1979         if (!cpu_guest_has_htw && !cpu_guest_has_ldpte)
1980             return -EINVAL;
1981         *v = read_gc0_pwsize();
1982         break;
1983     case KVM_REG_MIPS_CP0_WIRED:
1984         *v = (long)read_gc0_wired();
1985         break;
1986     case KVM_REG_MIPS_CP0_PWCTL:
1987         if (!cpu_guest_has_htw && !cpu_guest_has_ldpte)
1988             return -EINVAL;
1989         *v = read_gc0_pwctl();
1990         break;
1991     case KVM_REG_MIPS_CP0_HWRENA:
1992         *v = (long)read_gc0_hwrena();
1993         break;
1994     case KVM_REG_MIPS_CP0_BADVADDR:
1995         *v = (long)read_gc0_badvaddr();
1996         break;
1997     case KVM_REG_MIPS_CP0_BADINSTR:
1998         if (!cpu_guest_has_badinstr)
1999             return -EINVAL;
2000         *v = read_gc0_badinstr();
2001         break;
2002     case KVM_REG_MIPS_CP0_BADINSTRP:
2003         if (!cpu_guest_has_badinstrp)
2004             return -EINVAL;
2005         *v = read_gc0_badinstrp();
2006         break;
2007     case KVM_REG_MIPS_CP0_COUNT:
2008         *v = kvm_mips_read_count(vcpu);
2009         break;
2010     case KVM_REG_MIPS_CP0_ENTRYHI:
2011         *v = (long)read_gc0_entryhi();
2012         break;
2013     case KVM_REG_MIPS_CP0_COMPARE:
2014         *v = (long)read_gc0_compare();
2015         break;
2016     case KVM_REG_MIPS_CP0_STATUS:
2017         *v = (long)read_gc0_status();
2018         break;
2019     case KVM_REG_MIPS_CP0_INTCTL:
2020         *v = read_gc0_intctl();
2021         break;
2022     case KVM_REG_MIPS_CP0_CAUSE:
2023         *v = (long)read_gc0_cause();
2024         break;
2025     case KVM_REG_MIPS_CP0_EPC:
2026         *v = (long)read_gc0_epc();
2027         break;
2028     case KVM_REG_MIPS_CP0_PRID:
2029         switch (boot_cpu_type()) {
2030         case CPU_CAVIUM_OCTEON3:
2031             /* Octeon III has a read-only guest.PRid */
2032             *v = read_gc0_prid();
2033             break;
2034         default:
2035             *v = (long)kvm_read_c0_guest_prid(cop0);
2036             break;
2037         }
2038         break;
2039     case KVM_REG_MIPS_CP0_EBASE:
2040         *v = kvm_vz_read_gc0_ebase();
2041         break;
2042     case KVM_REG_MIPS_CP0_CONFIG:
2043         *v = read_gc0_config();
2044         break;
2045     case KVM_REG_MIPS_CP0_CONFIG1:
2046         if (!cpu_guest_has_conf1)
2047             return -EINVAL;
2048         *v = read_gc0_config1();
2049         break;
2050     case KVM_REG_MIPS_CP0_CONFIG2:
2051         if (!cpu_guest_has_conf2)
2052             return -EINVAL;
2053         *v = read_gc0_config2();
2054         break;
2055     case KVM_REG_MIPS_CP0_CONFIG3:
2056         if (!cpu_guest_has_conf3)
2057             return -EINVAL;
2058         *v = read_gc0_config3();
2059         break;
2060     case KVM_REG_MIPS_CP0_CONFIG4:
2061         if (!cpu_guest_has_conf4)
2062             return -EINVAL;
2063         *v = read_gc0_config4();
2064         break;
2065     case KVM_REG_MIPS_CP0_CONFIG5:
2066         if (!cpu_guest_has_conf5)
2067             return -EINVAL;
2068         *v = read_gc0_config5();
2069         break;
2070     case KVM_REG_MIPS_CP0_CONFIG6:
2071         *v = kvm_read_sw_gc0_config6(cop0);
2072         break;
2073     case KVM_REG_MIPS_CP0_MAAR(0) ... KVM_REG_MIPS_CP0_MAAR(0x3f):
2074         if (!cpu_guest_has_maar || cpu_guest_has_dyn_maar)
2075             return -EINVAL;
2076         idx = reg->id - KVM_REG_MIPS_CP0_MAAR(0);
2077         if (idx >= ARRAY_SIZE(vcpu->arch.maar))
2078             return -EINVAL;
2079         *v = vcpu->arch.maar[idx];
2080         break;
2081     case KVM_REG_MIPS_CP0_MAARI:
2082         if (!cpu_guest_has_maar || cpu_guest_has_dyn_maar)
2083             return -EINVAL;
2084         *v = kvm_read_sw_gc0_maari(vcpu->arch.cop0);
2085         break;
2086 #ifdef CONFIG_64BIT
2087     case KVM_REG_MIPS_CP0_XCONTEXT:
2088         *v = read_gc0_xcontext();
2089         break;
2090 #endif
2091     case KVM_REG_MIPS_CP0_ERROREPC:
2092         *v = (long)read_gc0_errorepc();
2093         break;
2094     case KVM_REG_MIPS_CP0_KSCRATCH1 ... KVM_REG_MIPS_CP0_KSCRATCH6:
2095         idx = reg->id - KVM_REG_MIPS_CP0_KSCRATCH1 + 2;
2096         if (!cpu_guest_has_kscr(idx))
2097             return -EINVAL;
2098         switch (idx) {
2099         case 2:
2100             *v = (long)read_gc0_kscratch1();
2101             break;
2102         case 3:
2103             *v = (long)read_gc0_kscratch2();
2104             break;
2105         case 4:
2106             *v = (long)read_gc0_kscratch3();
2107             break;
2108         case 5:
2109             *v = (long)read_gc0_kscratch4();
2110             break;
2111         case 6:
2112             *v = (long)read_gc0_kscratch5();
2113             break;
2114         case 7:
2115             *v = (long)read_gc0_kscratch6();
2116             break;
2117         }
2118         break;
2119     case KVM_REG_MIPS_COUNT_CTL:
2120         *v = vcpu->arch.count_ctl;
2121         break;
2122     case KVM_REG_MIPS_COUNT_RESUME:
2123         *v = ktime_to_ns(vcpu->arch.count_resume);
2124         break;
2125     case KVM_REG_MIPS_COUNT_HZ:
2126         *v = vcpu->arch.count_hz;
2127         break;
2128     default:
2129         return -EINVAL;
2130     }
2131     return 0;
2132 }
2133 
2134 static int kvm_vz_set_one_reg(struct kvm_vcpu *vcpu,
2135                   const struct kvm_one_reg *reg,
2136                   s64 v)
2137 {
2138     struct mips_coproc *cop0 = vcpu->arch.cop0;
2139     unsigned int idx;
2140     int ret = 0;
2141     unsigned int cur, change;
2142 
2143     switch (reg->id) {
2144     case KVM_REG_MIPS_CP0_INDEX:
2145         write_gc0_index(v);
2146         break;
2147     case KVM_REG_MIPS_CP0_ENTRYLO0:
2148         write_gc0_entrylo0(entrylo_user_to_kvm(v));
2149         break;
2150     case KVM_REG_MIPS_CP0_ENTRYLO1:
2151         write_gc0_entrylo1(entrylo_user_to_kvm(v));
2152         break;
2153     case KVM_REG_MIPS_CP0_CONTEXT:
2154         write_gc0_context(v);
2155         break;
2156     case KVM_REG_MIPS_CP0_CONTEXTCONFIG:
2157         if (!cpu_guest_has_contextconfig)
2158             return -EINVAL;
2159         write_gc0_contextconfig(v);
2160         break;
2161     case KVM_REG_MIPS_CP0_USERLOCAL:
2162         if (!cpu_guest_has_userlocal)
2163             return -EINVAL;
2164         write_gc0_userlocal(v);
2165         break;
2166 #ifdef CONFIG_64BIT
2167     case KVM_REG_MIPS_CP0_XCONTEXTCONFIG:
2168         if (!cpu_guest_has_contextconfig)
2169             return -EINVAL;
2170         write_gc0_xcontextconfig(v);
2171         break;
2172 #endif
2173     case KVM_REG_MIPS_CP0_PAGEMASK:
2174         write_gc0_pagemask(v);
2175         break;
2176     case KVM_REG_MIPS_CP0_PAGEGRAIN:
2177         write_gc0_pagegrain(v);
2178         break;
2179     case KVM_REG_MIPS_CP0_SEGCTL0:
2180         if (!cpu_guest_has_segments)
2181             return -EINVAL;
2182         write_gc0_segctl0(v);
2183         break;
2184     case KVM_REG_MIPS_CP0_SEGCTL1:
2185         if (!cpu_guest_has_segments)
2186             return -EINVAL;
2187         write_gc0_segctl1(v);
2188         break;
2189     case KVM_REG_MIPS_CP0_SEGCTL2:
2190         if (!cpu_guest_has_segments)
2191             return -EINVAL;
2192         write_gc0_segctl2(v);
2193         break;
2194     case KVM_REG_MIPS_CP0_PWBASE:
2195         if (!cpu_guest_has_htw && !cpu_guest_has_ldpte)
2196             return -EINVAL;
2197         write_gc0_pwbase(v);
2198         break;
2199     case KVM_REG_MIPS_CP0_PWFIELD:
2200         if (!cpu_guest_has_htw && !cpu_guest_has_ldpte)
2201             return -EINVAL;
2202         write_gc0_pwfield(v);
2203         break;
2204     case KVM_REG_MIPS_CP0_PWSIZE:
2205         if (!cpu_guest_has_htw && !cpu_guest_has_ldpte)
2206             return -EINVAL;
2207         write_gc0_pwsize(v);
2208         break;
2209     case KVM_REG_MIPS_CP0_WIRED:
2210         change_gc0_wired(MIPSR6_WIRED_WIRED, v);
2211         break;
2212     case KVM_REG_MIPS_CP0_PWCTL:
2213         if (!cpu_guest_has_htw && !cpu_guest_has_ldpte)
2214             return -EINVAL;
2215         write_gc0_pwctl(v);
2216         break;
2217     case KVM_REG_MIPS_CP0_HWRENA:
2218         write_gc0_hwrena(v);
2219         break;
2220     case KVM_REG_MIPS_CP0_BADVADDR:
2221         write_gc0_badvaddr(v);
2222         break;
2223     case KVM_REG_MIPS_CP0_BADINSTR:
2224         if (!cpu_guest_has_badinstr)
2225             return -EINVAL;
2226         write_gc0_badinstr(v);
2227         break;
2228     case KVM_REG_MIPS_CP0_BADINSTRP:
2229         if (!cpu_guest_has_badinstrp)
2230             return -EINVAL;
2231         write_gc0_badinstrp(v);
2232         break;
2233     case KVM_REG_MIPS_CP0_COUNT:
2234         kvm_mips_write_count(vcpu, v);
2235         break;
2236     case KVM_REG_MIPS_CP0_ENTRYHI:
2237         write_gc0_entryhi(v);
2238         break;
2239     case KVM_REG_MIPS_CP0_COMPARE:
2240         kvm_mips_write_compare(vcpu, v, false);
2241         break;
2242     case KVM_REG_MIPS_CP0_STATUS:
2243         write_gc0_status(v);
2244         break;
2245     case KVM_REG_MIPS_CP0_INTCTL:
2246         write_gc0_intctl(v);
2247         break;
2248     case KVM_REG_MIPS_CP0_CAUSE:
2249         /*
2250          * If the timer is stopped or started (DC bit) it must look
2251          * atomic with changes to the timer interrupt pending bit (TI).
2252          * A timer interrupt should not happen in between.
2253          */
2254         if ((read_gc0_cause() ^ v) & CAUSEF_DC) {
2255             if (v & CAUSEF_DC) {
2256                 /* disable timer first */
2257                 kvm_mips_count_disable_cause(vcpu);
2258                 change_gc0_cause((u32)~CAUSEF_DC, v);
2259             } else {
2260                 /* enable timer last */
2261                 change_gc0_cause((u32)~CAUSEF_DC, v);
2262                 kvm_mips_count_enable_cause(vcpu);
2263             }
2264         } else {
2265             write_gc0_cause(v);
2266         }
2267         break;
2268     case KVM_REG_MIPS_CP0_EPC:
2269         write_gc0_epc(v);
2270         break;
2271     case KVM_REG_MIPS_CP0_PRID:
2272         switch (boot_cpu_type()) {
2273         case CPU_CAVIUM_OCTEON3:
2274             /* Octeon III has a guest.PRid, but its read-only */
2275             break;
2276         default:
2277             kvm_write_c0_guest_prid(cop0, v);
2278             break;
2279         }
2280         break;
2281     case KVM_REG_MIPS_CP0_EBASE:
2282         kvm_vz_write_gc0_ebase(v);
2283         break;
2284     case KVM_REG_MIPS_CP0_CONFIG:
2285         cur = read_gc0_config();
2286         change = (cur ^ v) & kvm_vz_config_user_wrmask(vcpu);
2287         if (change) {
2288             v = cur ^ change;
2289             write_gc0_config(v);
2290         }
2291         break;
2292     case KVM_REG_MIPS_CP0_CONFIG1:
2293         if (!cpu_guest_has_conf1)
2294             break;
2295         cur = read_gc0_config1();
2296         change = (cur ^ v) & kvm_vz_config1_user_wrmask(vcpu);
2297         if (change) {
2298             v = cur ^ change;
2299             write_gc0_config1(v);
2300         }
2301         break;
2302     case KVM_REG_MIPS_CP0_CONFIG2:
2303         if (!cpu_guest_has_conf2)
2304             break;
2305         cur = read_gc0_config2();
2306         change = (cur ^ v) & kvm_vz_config2_user_wrmask(vcpu);
2307         if (change) {
2308             v = cur ^ change;
2309             write_gc0_config2(v);
2310         }
2311         break;
2312     case KVM_REG_MIPS_CP0_CONFIG3:
2313         if (!cpu_guest_has_conf3)
2314             break;
2315         cur = read_gc0_config3();
2316         change = (cur ^ v) & kvm_vz_config3_user_wrmask(vcpu);
2317         if (change) {
2318             v = cur ^ change;
2319             write_gc0_config3(v);
2320         }
2321         break;
2322     case KVM_REG_MIPS_CP0_CONFIG4:
2323         if (!cpu_guest_has_conf4)
2324             break;
2325         cur = read_gc0_config4();
2326         change = (cur ^ v) & kvm_vz_config4_user_wrmask(vcpu);
2327         if (change) {
2328             v = cur ^ change;
2329             write_gc0_config4(v);
2330         }
2331         break;
2332     case KVM_REG_MIPS_CP0_CONFIG5:
2333         if (!cpu_guest_has_conf5)
2334             break;
2335         cur = read_gc0_config5();
2336         change = (cur ^ v) & kvm_vz_config5_user_wrmask(vcpu);
2337         if (change) {
2338             v = cur ^ change;
2339             write_gc0_config5(v);
2340         }
2341         break;
2342     case KVM_REG_MIPS_CP0_CONFIG6:
2343         cur = kvm_read_sw_gc0_config6(cop0);
2344         change = (cur ^ v) & kvm_vz_config6_user_wrmask(vcpu);
2345         if (change) {
2346             v = cur ^ change;
2347             kvm_write_sw_gc0_config6(cop0, (int)v);
2348         }
2349         break;
2350     case KVM_REG_MIPS_CP0_MAAR(0) ... KVM_REG_MIPS_CP0_MAAR(0x3f):
2351         if (!cpu_guest_has_maar || cpu_guest_has_dyn_maar)
2352             return -EINVAL;
2353         idx = reg->id - KVM_REG_MIPS_CP0_MAAR(0);
2354         if (idx >= ARRAY_SIZE(vcpu->arch.maar))
2355             return -EINVAL;
2356         vcpu->arch.maar[idx] = mips_process_maar(dmtc_op, v);
2357         break;
2358     case KVM_REG_MIPS_CP0_MAARI:
2359         if (!cpu_guest_has_maar || cpu_guest_has_dyn_maar)
2360             return -EINVAL;
2361         kvm_write_maari(vcpu, v);
2362         break;
2363 #ifdef CONFIG_64BIT
2364     case KVM_REG_MIPS_CP0_XCONTEXT:
2365         write_gc0_xcontext(v);
2366         break;
2367 #endif
2368     case KVM_REG_MIPS_CP0_ERROREPC:
2369         write_gc0_errorepc(v);
2370         break;
2371     case KVM_REG_MIPS_CP0_KSCRATCH1 ... KVM_REG_MIPS_CP0_KSCRATCH6:
2372         idx = reg->id - KVM_REG_MIPS_CP0_KSCRATCH1 + 2;
2373         if (!cpu_guest_has_kscr(idx))
2374             return -EINVAL;
2375         switch (idx) {
2376         case 2:
2377             write_gc0_kscratch1(v);
2378             break;
2379         case 3:
2380             write_gc0_kscratch2(v);
2381             break;
2382         case 4:
2383             write_gc0_kscratch3(v);
2384             break;
2385         case 5:
2386             write_gc0_kscratch4(v);
2387             break;
2388         case 6:
2389             write_gc0_kscratch5(v);
2390             break;
2391         case 7:
2392             write_gc0_kscratch6(v);
2393             break;
2394         }
2395         break;
2396     case KVM_REG_MIPS_COUNT_CTL:
2397         ret = kvm_mips_set_count_ctl(vcpu, v);
2398         break;
2399     case KVM_REG_MIPS_COUNT_RESUME:
2400         ret = kvm_mips_set_count_resume(vcpu, v);
2401         break;
2402     case KVM_REG_MIPS_COUNT_HZ:
2403         ret = kvm_mips_set_count_hz(vcpu, v);
2404         break;
2405     default:
2406         return -EINVAL;
2407     }
2408     return ret;
2409 }
2410 
2411 #define guestid_cache(cpu)  (cpu_data[cpu].guestid_cache)
2412 static void kvm_vz_get_new_guestid(unsigned long cpu, struct kvm_vcpu *vcpu)
2413 {
2414     unsigned long guestid = guestid_cache(cpu);
2415 
2416     if (!(++guestid & GUESTID_MASK)) {
2417         if (cpu_has_vtag_icache)
2418             flush_icache_all();
2419 
2420         if (!guestid)       /* fix version if needed */
2421             guestid = GUESTID_FIRST_VERSION;
2422 
2423         ++guestid;      /* guestid 0 reserved for root */
2424 
2425         /* start new guestid cycle */
2426         kvm_vz_local_flush_roottlb_all_guests();
2427         kvm_vz_local_flush_guesttlb_all();
2428     }
2429 
2430     guestid_cache(cpu) = guestid;
2431 }
2432 
2433 /* Returns 1 if the guest TLB may be clobbered */
2434 static int kvm_vz_check_requests(struct kvm_vcpu *vcpu, int cpu)
2435 {
2436     int ret = 0;
2437     int i;
2438 
2439     if (!kvm_request_pending(vcpu))
2440         return 0;
2441 
2442     if (kvm_check_request(KVM_REQ_TLB_FLUSH, vcpu)) {
2443         if (cpu_has_guestid) {
2444             /* Drop all GuestIDs for this VCPU */
2445             for_each_possible_cpu(i)
2446                 vcpu->arch.vzguestid[i] = 0;
2447             /* This will clobber guest TLB contents too */
2448             ret = 1;
2449         }
2450         /*
2451          * For Root ASID Dealias (RAD) we don't do anything here, but we
2452          * still need the request to ensure we recheck asid_flush_mask.
2453          * We can still return 0 as only the root TLB will be affected
2454          * by a root ASID flush.
2455          */
2456     }
2457 
2458     return ret;
2459 }
2460 
2461 static void kvm_vz_vcpu_save_wired(struct kvm_vcpu *vcpu)
2462 {
2463     unsigned int wired = read_gc0_wired();
2464     struct kvm_mips_tlb *tlbs;
2465     int i;
2466 
2467     /* Expand the wired TLB array if necessary */
2468     wired &= MIPSR6_WIRED_WIRED;
2469     if (wired > vcpu->arch.wired_tlb_limit) {
2470         tlbs = krealloc(vcpu->arch.wired_tlb, wired *
2471                 sizeof(*vcpu->arch.wired_tlb), GFP_ATOMIC);
2472         if (WARN_ON(!tlbs)) {
2473             /* Save whatever we can */
2474             wired = vcpu->arch.wired_tlb_limit;
2475         } else {
2476             vcpu->arch.wired_tlb = tlbs;
2477             vcpu->arch.wired_tlb_limit = wired;
2478         }
2479     }
2480 
2481     if (wired)
2482         /* Save wired entries from the guest TLB */
2483         kvm_vz_save_guesttlb(vcpu->arch.wired_tlb, 0, wired);
2484     /* Invalidate any dropped entries since last time */
2485     for (i = wired; i < vcpu->arch.wired_tlb_used; ++i) {
2486         vcpu->arch.wired_tlb[i].tlb_hi = UNIQUE_GUEST_ENTRYHI(i);
2487         vcpu->arch.wired_tlb[i].tlb_lo[0] = 0;
2488         vcpu->arch.wired_tlb[i].tlb_lo[1] = 0;
2489         vcpu->arch.wired_tlb[i].tlb_mask = 0;
2490     }
2491     vcpu->arch.wired_tlb_used = wired;
2492 }
2493 
2494 static void kvm_vz_vcpu_load_wired(struct kvm_vcpu *vcpu)
2495 {
2496     /* Load wired entries into the guest TLB */
2497     if (vcpu->arch.wired_tlb)
2498         kvm_vz_load_guesttlb(vcpu->arch.wired_tlb, 0,
2499                      vcpu->arch.wired_tlb_used);
2500 }
2501 
2502 static void kvm_vz_vcpu_load_tlb(struct kvm_vcpu *vcpu, int cpu)
2503 {
2504     struct kvm *kvm = vcpu->kvm;
2505     struct mm_struct *gpa_mm = &kvm->arch.gpa_mm;
2506     bool migrated;
2507 
2508     /*
2509      * Are we entering guest context on a different CPU to last time?
2510      * If so, the VCPU's guest TLB state on this CPU may be stale.
2511      */
2512     migrated = (vcpu->arch.last_exec_cpu != cpu);
2513     vcpu->arch.last_exec_cpu = cpu;
2514 
2515     /*
2516      * A vcpu's GuestID is set in GuestCtl1.ID when the vcpu is loaded and
2517      * remains set until another vcpu is loaded in.  As a rule GuestRID
2518      * remains zeroed when in root context unless the kernel is busy
2519      * manipulating guest tlb entries.
2520      */
2521     if (cpu_has_guestid) {
2522         /*
2523          * Check if our GuestID is of an older version and thus invalid.
2524          *
2525          * We also discard the stored GuestID if we've executed on
2526          * another CPU, as the guest mappings may have changed without
2527          * hypervisor knowledge.
2528          */
2529         if (migrated ||
2530             (vcpu->arch.vzguestid[cpu] ^ guestid_cache(cpu)) &
2531                     GUESTID_VERSION_MASK) {
2532             kvm_vz_get_new_guestid(cpu, vcpu);
2533             vcpu->arch.vzguestid[cpu] = guestid_cache(cpu);
2534             trace_kvm_guestid_change(vcpu,
2535                          vcpu->arch.vzguestid[cpu]);
2536         }
2537 
2538         /* Restore GuestID */
2539         change_c0_guestctl1(GUESTID_MASK, vcpu->arch.vzguestid[cpu]);
2540     } else {
2541         /*
2542          * The Guest TLB only stores a single guest's TLB state, so
2543          * flush it if another VCPU has executed on this CPU.
2544          *
2545          * We also flush if we've executed on another CPU, as the guest
2546          * mappings may have changed without hypervisor knowledge.
2547          */
2548         if (migrated || last_exec_vcpu[cpu] != vcpu)
2549             kvm_vz_local_flush_guesttlb_all();
2550         last_exec_vcpu[cpu] = vcpu;
2551 
2552         /*
2553          * Root ASID dealiases guest GPA mappings in the root TLB.
2554          * Allocate new root ASID if needed.
2555          */
2556         if (cpumask_test_and_clear_cpu(cpu, &kvm->arch.asid_flush_mask))
2557             get_new_mmu_context(gpa_mm);
2558         else
2559             check_mmu_context(gpa_mm);
2560     }
2561 }
2562 
2563 static int kvm_vz_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
2564 {
2565     struct mips_coproc *cop0 = vcpu->arch.cop0;
2566     bool migrated, all;
2567 
2568     /*
2569      * Have we migrated to a different CPU?
2570      * If so, any old guest TLB state may be stale.
2571      */
2572     migrated = (vcpu->arch.last_sched_cpu != cpu);
2573 
2574     /*
2575      * Was this the last VCPU to run on this CPU?
2576      * If not, any old guest state from this VCPU will have been clobbered.
2577      */
2578     all = migrated || (last_vcpu[cpu] != vcpu);
2579     last_vcpu[cpu] = vcpu;
2580 
2581     /*
2582      * Restore CP0_Wired unconditionally as we clear it after use, and
2583      * restore wired guest TLB entries (while in guest context).
2584      */
2585     kvm_restore_gc0_wired(cop0);
2586     if (current->flags & PF_VCPU) {
2587         tlbw_use_hazard();
2588         kvm_vz_vcpu_load_tlb(vcpu, cpu);
2589         kvm_vz_vcpu_load_wired(vcpu);
2590     }
2591 
2592     /*
2593      * Restore timer state regardless, as e.g. Cause.TI can change over time
2594      * if left unmaintained.
2595      */
2596     kvm_vz_restore_timer(vcpu);
2597 
2598     /* Set MC bit if we want to trace guest mode changes */
2599     if (kvm_trace_guest_mode_change)
2600         set_c0_guestctl0(MIPS_GCTL0_MC);
2601     else
2602         clear_c0_guestctl0(MIPS_GCTL0_MC);
2603 
2604     /* Don't bother restoring registers multiple times unless necessary */
2605     if (!all)
2606         return 0;
2607 
2608     /*
2609      * Restore config registers first, as some implementations restrict
2610      * writes to other registers when the corresponding feature bits aren't
2611      * set. For example Status.CU1 cannot be set unless Config1.FP is set.
2612      */
2613     kvm_restore_gc0_config(cop0);
2614     if (cpu_guest_has_conf1)
2615         kvm_restore_gc0_config1(cop0);
2616     if (cpu_guest_has_conf2)
2617         kvm_restore_gc0_config2(cop0);
2618     if (cpu_guest_has_conf3)
2619         kvm_restore_gc0_config3(cop0);
2620     if (cpu_guest_has_conf4)
2621         kvm_restore_gc0_config4(cop0);
2622     if (cpu_guest_has_conf5)
2623         kvm_restore_gc0_config5(cop0);
2624     if (cpu_guest_has_conf6)
2625         kvm_restore_gc0_config6(cop0);
2626     if (cpu_guest_has_conf7)
2627         kvm_restore_gc0_config7(cop0);
2628 
2629     kvm_restore_gc0_index(cop0);
2630     kvm_restore_gc0_entrylo0(cop0);
2631     kvm_restore_gc0_entrylo1(cop0);
2632     kvm_restore_gc0_context(cop0);
2633     if (cpu_guest_has_contextconfig)
2634         kvm_restore_gc0_contextconfig(cop0);
2635 #ifdef CONFIG_64BIT
2636     kvm_restore_gc0_xcontext(cop0);
2637     if (cpu_guest_has_contextconfig)
2638         kvm_restore_gc0_xcontextconfig(cop0);
2639 #endif
2640     kvm_restore_gc0_pagemask(cop0);
2641     kvm_restore_gc0_pagegrain(cop0);
2642     kvm_restore_gc0_hwrena(cop0);
2643     kvm_restore_gc0_badvaddr(cop0);
2644     kvm_restore_gc0_entryhi(cop0);
2645     kvm_restore_gc0_status(cop0);
2646     kvm_restore_gc0_intctl(cop0);
2647     kvm_restore_gc0_epc(cop0);
2648     kvm_vz_write_gc0_ebase(kvm_read_sw_gc0_ebase(cop0));
2649     if (cpu_guest_has_userlocal)
2650         kvm_restore_gc0_userlocal(cop0);
2651 
2652     kvm_restore_gc0_errorepc(cop0);
2653 
2654     /* restore KScratch registers if enabled in guest */
2655     if (cpu_guest_has_conf4) {
2656         if (cpu_guest_has_kscr(2))
2657             kvm_restore_gc0_kscratch1(cop0);
2658         if (cpu_guest_has_kscr(3))
2659             kvm_restore_gc0_kscratch2(cop0);
2660         if (cpu_guest_has_kscr(4))
2661             kvm_restore_gc0_kscratch3(cop0);
2662         if (cpu_guest_has_kscr(5))
2663             kvm_restore_gc0_kscratch4(cop0);
2664         if (cpu_guest_has_kscr(6))
2665             kvm_restore_gc0_kscratch5(cop0);
2666         if (cpu_guest_has_kscr(7))
2667             kvm_restore_gc0_kscratch6(cop0);
2668     }
2669 
2670     if (cpu_guest_has_badinstr)
2671         kvm_restore_gc0_badinstr(cop0);
2672     if (cpu_guest_has_badinstrp)
2673         kvm_restore_gc0_badinstrp(cop0);
2674 
2675     if (cpu_guest_has_segments) {
2676         kvm_restore_gc0_segctl0(cop0);
2677         kvm_restore_gc0_segctl1(cop0);
2678         kvm_restore_gc0_segctl2(cop0);
2679     }
2680 
2681     /* restore HTW registers */
2682     if (cpu_guest_has_htw || cpu_guest_has_ldpte) {
2683         kvm_restore_gc0_pwbase(cop0);
2684         kvm_restore_gc0_pwfield(cop0);
2685         kvm_restore_gc0_pwsize(cop0);
2686         kvm_restore_gc0_pwctl(cop0);
2687     }
2688 
2689     /* restore Root.GuestCtl2 from unused Guest guestctl2 register */
2690     if (cpu_has_guestctl2)
2691         write_c0_guestctl2(
2692             cop0->reg[MIPS_CP0_GUESTCTL2][MIPS_CP0_GUESTCTL2_SEL]);
2693 
2694     /*
2695      * We should clear linked load bit to break interrupted atomics. This
2696      * prevents a SC on the next VCPU from succeeding by matching a LL on
2697      * the previous VCPU.
2698      */
2699     if (vcpu->kvm->created_vcpus > 1)
2700         write_gc0_lladdr(0);
2701 
2702     return 0;
2703 }
2704 
2705 static int kvm_vz_vcpu_put(struct kvm_vcpu *vcpu, int cpu)
2706 {
2707     struct mips_coproc *cop0 = vcpu->arch.cop0;
2708 
2709     if (current->flags & PF_VCPU)
2710         kvm_vz_vcpu_save_wired(vcpu);
2711 
2712     kvm_lose_fpu(vcpu);
2713 
2714     kvm_save_gc0_index(cop0);
2715     kvm_save_gc0_entrylo0(cop0);
2716     kvm_save_gc0_entrylo1(cop0);
2717     kvm_save_gc0_context(cop0);
2718     if (cpu_guest_has_contextconfig)
2719         kvm_save_gc0_contextconfig(cop0);
2720 #ifdef CONFIG_64BIT
2721     kvm_save_gc0_xcontext(cop0);
2722     if (cpu_guest_has_contextconfig)
2723         kvm_save_gc0_xcontextconfig(cop0);
2724 #endif
2725     kvm_save_gc0_pagemask(cop0);
2726     kvm_save_gc0_pagegrain(cop0);
2727     kvm_save_gc0_wired(cop0);
2728     /* allow wired TLB entries to be overwritten */
2729     clear_gc0_wired(MIPSR6_WIRED_WIRED);
2730     kvm_save_gc0_hwrena(cop0);
2731     kvm_save_gc0_badvaddr(cop0);
2732     kvm_save_gc0_entryhi(cop0);
2733     kvm_save_gc0_status(cop0);
2734     kvm_save_gc0_intctl(cop0);
2735     kvm_save_gc0_epc(cop0);
2736     kvm_write_sw_gc0_ebase(cop0, kvm_vz_read_gc0_ebase());
2737     if (cpu_guest_has_userlocal)
2738         kvm_save_gc0_userlocal(cop0);
2739 
2740     /* only save implemented config registers */
2741     kvm_save_gc0_config(cop0);
2742     if (cpu_guest_has_conf1)
2743         kvm_save_gc0_config1(cop0);
2744     if (cpu_guest_has_conf2)
2745         kvm_save_gc0_config2(cop0);
2746     if (cpu_guest_has_conf3)
2747         kvm_save_gc0_config3(cop0);
2748     if (cpu_guest_has_conf4)
2749         kvm_save_gc0_config4(cop0);
2750     if (cpu_guest_has_conf5)
2751         kvm_save_gc0_config5(cop0);
2752     if (cpu_guest_has_conf6)
2753         kvm_save_gc0_config6(cop0);
2754     if (cpu_guest_has_conf7)
2755         kvm_save_gc0_config7(cop0);
2756 
2757     kvm_save_gc0_errorepc(cop0);
2758 
2759     /* save KScratch registers if enabled in guest */
2760     if (cpu_guest_has_conf4) {
2761         if (cpu_guest_has_kscr(2))
2762             kvm_save_gc0_kscratch1(cop0);
2763         if (cpu_guest_has_kscr(3))
2764             kvm_save_gc0_kscratch2(cop0);
2765         if (cpu_guest_has_kscr(4))
2766             kvm_save_gc0_kscratch3(cop0);
2767         if (cpu_guest_has_kscr(5))
2768             kvm_save_gc0_kscratch4(cop0);
2769         if (cpu_guest_has_kscr(6))
2770             kvm_save_gc0_kscratch5(cop0);
2771         if (cpu_guest_has_kscr(7))
2772             kvm_save_gc0_kscratch6(cop0);
2773     }
2774 
2775     if (cpu_guest_has_badinstr)
2776         kvm_save_gc0_badinstr(cop0);
2777     if (cpu_guest_has_badinstrp)
2778         kvm_save_gc0_badinstrp(cop0);
2779 
2780     if (cpu_guest_has_segments) {
2781         kvm_save_gc0_segctl0(cop0);
2782         kvm_save_gc0_segctl1(cop0);
2783         kvm_save_gc0_segctl2(cop0);
2784     }
2785 
2786     /* save HTW registers if enabled in guest */
2787     if (cpu_guest_has_ldpte || (cpu_guest_has_htw &&
2788         kvm_read_sw_gc0_config3(cop0) & MIPS_CONF3_PW)) {
2789         kvm_save_gc0_pwbase(cop0);
2790         kvm_save_gc0_pwfield(cop0);
2791         kvm_save_gc0_pwsize(cop0);
2792         kvm_save_gc0_pwctl(cop0);
2793     }
2794 
2795     kvm_vz_save_timer(vcpu);
2796 
2797     /* save Root.GuestCtl2 in unused Guest guestctl2 register */
2798     if (cpu_has_guestctl2)
2799         cop0->reg[MIPS_CP0_GUESTCTL2][MIPS_CP0_GUESTCTL2_SEL] =
2800             read_c0_guestctl2();
2801 
2802     return 0;
2803 }
2804 
2805 /**
2806  * kvm_vz_resize_guest_vtlb() - Attempt to resize guest VTLB.
2807  * @size:   Number of guest VTLB entries (0 < @size <= root VTLB entries).
2808  *
2809  * Attempt to resize the guest VTLB by writing guest Config registers. This is
2810  * necessary for cores with a shared root/guest TLB to avoid overlap with wired
2811  * entries in the root VTLB.
2812  *
2813  * Returns: The resulting guest VTLB size.
2814  */
2815 static unsigned int kvm_vz_resize_guest_vtlb(unsigned int size)
2816 {
2817     unsigned int config4 = 0, ret = 0, limit;
2818 
2819     /* Write MMUSize - 1 into guest Config registers */
2820     if (cpu_guest_has_conf1)
2821         change_gc0_config1(MIPS_CONF1_TLBS,
2822                    (size - 1) << MIPS_CONF1_TLBS_SHIFT);
2823     if (cpu_guest_has_conf4) {
2824         config4 = read_gc0_config4();
2825         if (cpu_has_mips_r6 || (config4 & MIPS_CONF4_MMUEXTDEF) ==
2826             MIPS_CONF4_MMUEXTDEF_VTLBSIZEEXT) {
2827             config4 &= ~MIPS_CONF4_VTLBSIZEEXT;
2828             config4 |= ((size - 1) >> MIPS_CONF1_TLBS_SIZE) <<
2829                 MIPS_CONF4_VTLBSIZEEXT_SHIFT;
2830         } else if ((config4 & MIPS_CONF4_MMUEXTDEF) ==
2831                MIPS_CONF4_MMUEXTDEF_MMUSIZEEXT) {
2832             config4 &= ~MIPS_CONF4_MMUSIZEEXT;
2833             config4 |= ((size - 1) >> MIPS_CONF1_TLBS_SIZE) <<
2834                 MIPS_CONF4_MMUSIZEEXT_SHIFT;
2835         }
2836         write_gc0_config4(config4);
2837     }
2838 
2839     /*
2840      * Set Guest.Wired.Limit = 0 (no limit up to Guest.MMUSize-1), unless it
2841      * would exceed Root.Wired.Limit (clearing Guest.Wired.Wired so write
2842      * not dropped)
2843      */
2844     if (cpu_has_mips_r6) {
2845         limit = (read_c0_wired() & MIPSR6_WIRED_LIMIT) >>
2846                         MIPSR6_WIRED_LIMIT_SHIFT;
2847         if (size - 1 <= limit)
2848             limit = 0;
2849         write_gc0_wired(limit << MIPSR6_WIRED_LIMIT_SHIFT);
2850     }
2851 
2852     /* Read back MMUSize - 1 */
2853     back_to_back_c0_hazard();
2854     if (cpu_guest_has_conf1)
2855         ret = (read_gc0_config1() & MIPS_CONF1_TLBS) >>
2856                         MIPS_CONF1_TLBS_SHIFT;
2857     if (config4) {
2858         if (cpu_has_mips_r6 || (config4 & MIPS_CONF4_MMUEXTDEF) ==
2859             MIPS_CONF4_MMUEXTDEF_VTLBSIZEEXT)
2860             ret |= ((config4 & MIPS_CONF4_VTLBSIZEEXT) >>
2861                 MIPS_CONF4_VTLBSIZEEXT_SHIFT) <<
2862                 MIPS_CONF1_TLBS_SIZE;
2863         else if ((config4 & MIPS_CONF4_MMUEXTDEF) ==
2864              MIPS_CONF4_MMUEXTDEF_MMUSIZEEXT)
2865             ret |= ((config4 & MIPS_CONF4_MMUSIZEEXT) >>
2866                 MIPS_CONF4_MMUSIZEEXT_SHIFT) <<
2867                 MIPS_CONF1_TLBS_SIZE;
2868     }
2869     return ret + 1;
2870 }
2871 
2872 static int kvm_vz_hardware_enable(void)
2873 {
2874     unsigned int mmu_size, guest_mmu_size, ftlb_size;
2875     u64 guest_cvmctl, cvmvmconfig;
2876 
2877     switch (current_cpu_type()) {
2878     case CPU_CAVIUM_OCTEON3:
2879         /* Set up guest timer/perfcount IRQ lines */
2880         guest_cvmctl = read_gc0_cvmctl();
2881         guest_cvmctl &= ~CVMCTL_IPTI;
2882         guest_cvmctl |= 7ull << CVMCTL_IPTI_SHIFT;
2883         guest_cvmctl &= ~CVMCTL_IPPCI;
2884         guest_cvmctl |= 6ull << CVMCTL_IPPCI_SHIFT;
2885         write_gc0_cvmctl(guest_cvmctl);
2886 
2887         cvmvmconfig = read_c0_cvmvmconfig();
2888         /* No I/O hole translation. */
2889         cvmvmconfig |= CVMVMCONF_DGHT;
2890         /* Halve the root MMU size */
2891         mmu_size = ((cvmvmconfig & CVMVMCONF_MMUSIZEM1)
2892                 >> CVMVMCONF_MMUSIZEM1_S) + 1;
2893         guest_mmu_size = mmu_size / 2;
2894         mmu_size -= guest_mmu_size;
2895         cvmvmconfig &= ~CVMVMCONF_RMMUSIZEM1;
2896         cvmvmconfig |= mmu_size - 1;
2897         write_c0_cvmvmconfig(cvmvmconfig);
2898 
2899         /* Update our records */
2900         current_cpu_data.tlbsize = mmu_size;
2901         current_cpu_data.tlbsizevtlb = mmu_size;
2902         current_cpu_data.guest.tlbsize = guest_mmu_size;
2903 
2904         /* Flush moved entries in new (guest) context */
2905         kvm_vz_local_flush_guesttlb_all();
2906         break;
2907     default:
2908         /*
2909          * ImgTec cores tend to use a shared root/guest TLB. To avoid
2910          * overlap of root wired and guest entries, the guest TLB may
2911          * need resizing.
2912          */
2913         mmu_size = current_cpu_data.tlbsizevtlb;
2914         ftlb_size = current_cpu_data.tlbsize - mmu_size;
2915 
2916         /* Try switching to maximum guest VTLB size for flush */
2917         guest_mmu_size = kvm_vz_resize_guest_vtlb(mmu_size);
2918         current_cpu_data.guest.tlbsize = guest_mmu_size + ftlb_size;
2919         kvm_vz_local_flush_guesttlb_all();
2920 
2921         /*
2922          * Reduce to make space for root wired entries and at least 2
2923          * root non-wired entries. This does assume that long-term wired
2924          * entries won't be added later.
2925          */
2926         guest_mmu_size = mmu_size - num_wired_entries() - 2;
2927         guest_mmu_size = kvm_vz_resize_guest_vtlb(guest_mmu_size);
2928         current_cpu_data.guest.tlbsize = guest_mmu_size + ftlb_size;
2929 
2930         /*
2931          * Write the VTLB size, but if another CPU has already written,
2932          * check it matches or we won't provide a consistent view to the
2933          * guest. If this ever happens it suggests an asymmetric number
2934          * of wired entries.
2935          */
2936         if (cmpxchg(&kvm_vz_guest_vtlb_size, 0, guest_mmu_size) &&
2937             WARN(guest_mmu_size != kvm_vz_guest_vtlb_size,
2938              "Available guest VTLB size mismatch"))
2939             return -EINVAL;
2940         break;
2941     }
2942 
2943     /*
2944      * Enable virtualization features granting guest direct control of
2945      * certain features:
2946      * CP0=1:   Guest coprocessor 0 context.
2947      * AT=Guest:    Guest MMU.
2948      * CG=1:    Hit (virtual address) CACHE operations (optional).
2949      * CF=1:    Guest Config registers.
2950      * CGI=1:   Indexed flush CACHE operations (optional).
2951      */
2952     write_c0_guestctl0(MIPS_GCTL0_CP0 |
2953                (MIPS_GCTL0_AT_GUEST << MIPS_GCTL0_AT_SHIFT) |
2954                MIPS_GCTL0_CG | MIPS_GCTL0_CF);
2955     if (cpu_has_guestctl0ext) {
2956         if (current_cpu_type() != CPU_LOONGSON64)
2957             set_c0_guestctl0ext(MIPS_GCTL0EXT_CGI);
2958         else
2959             clear_c0_guestctl0ext(MIPS_GCTL0EXT_CGI);
2960     }
2961 
2962     if (cpu_has_guestid) {
2963         write_c0_guestctl1(0);
2964         kvm_vz_local_flush_roottlb_all_guests();
2965 
2966         GUESTID_MASK = current_cpu_data.guestid_mask;
2967         GUESTID_FIRST_VERSION = GUESTID_MASK + 1;
2968         GUESTID_VERSION_MASK = ~GUESTID_MASK;
2969 
2970         current_cpu_data.guestid_cache = GUESTID_FIRST_VERSION;
2971     }
2972 
2973     /* clear any pending injected virtual guest interrupts */
2974     if (cpu_has_guestctl2)
2975         clear_c0_guestctl2(0x3f << 10);
2976 
2977 #ifdef CONFIG_CPU_LOONGSON64
2978     /* Control guest CCA attribute */
2979     if (cpu_has_csr())
2980         csr_writel(csr_readl(0xffffffec) | 0x1, 0xffffffec);
2981 #endif
2982 
2983     return 0;
2984 }
2985 
2986 static void kvm_vz_hardware_disable(void)
2987 {
2988     u64 cvmvmconfig;
2989     unsigned int mmu_size;
2990 
2991     /* Flush any remaining guest TLB entries */
2992     kvm_vz_local_flush_guesttlb_all();
2993 
2994     switch (current_cpu_type()) {
2995     case CPU_CAVIUM_OCTEON3:
2996         /*
2997          * Allocate whole TLB for root. Existing guest TLB entries will
2998          * change ownership to the root TLB. We should be safe though as
2999          * they've already been flushed above while in guest TLB.
3000          */
3001         cvmvmconfig = read_c0_cvmvmconfig();
3002         mmu_size = ((cvmvmconfig & CVMVMCONF_MMUSIZEM1)
3003                 >> CVMVMCONF_MMUSIZEM1_S) + 1;
3004         cvmvmconfig &= ~CVMVMCONF_RMMUSIZEM1;
3005         cvmvmconfig |= mmu_size - 1;
3006         write_c0_cvmvmconfig(cvmvmconfig);
3007 
3008         /* Update our records */
3009         current_cpu_data.tlbsize = mmu_size;
3010         current_cpu_data.tlbsizevtlb = mmu_size;
3011         current_cpu_data.guest.tlbsize = 0;
3012 
3013         /* Flush moved entries in new (root) context */
3014         local_flush_tlb_all();
3015         break;
3016     }
3017 
3018     if (cpu_has_guestid) {
3019         write_c0_guestctl1(0);
3020         kvm_vz_local_flush_roottlb_all_guests();
3021     }
3022 }
3023 
3024 static int kvm_vz_check_extension(struct kvm *kvm, long ext)
3025 {
3026     int r;
3027 
3028     switch (ext) {
3029     case KVM_CAP_MIPS_VZ:
3030         /* we wouldn't be here unless cpu_has_vz */
3031         r = 1;
3032         break;
3033 #ifdef CONFIG_64BIT
3034     case KVM_CAP_MIPS_64BIT:
3035         /* We support 64-bit registers/operations and addresses */
3036         r = 2;
3037         break;
3038 #endif
3039     case KVM_CAP_IOEVENTFD:
3040         r = 1;
3041         break;
3042     default:
3043         r = 0;
3044         break;
3045     }
3046 
3047     return r;
3048 }
3049 
3050 static int kvm_vz_vcpu_init(struct kvm_vcpu *vcpu)
3051 {
3052     int i;
3053 
3054     for_each_possible_cpu(i)
3055         vcpu->arch.vzguestid[i] = 0;
3056 
3057     return 0;
3058 }
3059 
3060 static void kvm_vz_vcpu_uninit(struct kvm_vcpu *vcpu)
3061 {
3062     int cpu;
3063 
3064     /*
3065      * If the VCPU is freed and reused as another VCPU, we don't want the
3066      * matching pointer wrongly hanging around in last_vcpu[] or
3067      * last_exec_vcpu[].
3068      */
3069     for_each_possible_cpu(cpu) {
3070         if (last_vcpu[cpu] == vcpu)
3071             last_vcpu[cpu] = NULL;
3072         if (last_exec_vcpu[cpu] == vcpu)
3073             last_exec_vcpu[cpu] = NULL;
3074     }
3075 }
3076 
3077 static int kvm_vz_vcpu_setup(struct kvm_vcpu *vcpu)
3078 {
3079     struct mips_coproc *cop0 = vcpu->arch.cop0;
3080     unsigned long count_hz = 100*1000*1000; /* default to 100 MHz */
3081 
3082     /*
3083      * Start off the timer at the same frequency as the host timer, but the
3084      * soft timer doesn't handle frequencies greater than 1GHz yet.
3085      */
3086     if (mips_hpt_frequency && mips_hpt_frequency <= NSEC_PER_SEC)
3087         count_hz = mips_hpt_frequency;
3088     kvm_mips_init_count(vcpu, count_hz);
3089 
3090     /*
3091      * Initialize guest register state to valid architectural reset state.
3092      */
3093 
3094     /* PageGrain */
3095     if (cpu_has_mips_r5 || cpu_has_mips_r6)
3096         kvm_write_sw_gc0_pagegrain(cop0, PG_RIE | PG_XIE | PG_IEC);
3097     /* Wired */
3098     if (cpu_has_mips_r6)
3099         kvm_write_sw_gc0_wired(cop0,
3100                        read_gc0_wired() & MIPSR6_WIRED_LIMIT);
3101     /* Status */
3102     kvm_write_sw_gc0_status(cop0, ST0_BEV | ST0_ERL);
3103     if (cpu_has_mips_r5 || cpu_has_mips_r6)
3104         kvm_change_sw_gc0_status(cop0, ST0_FR, read_gc0_status());
3105     /* IntCtl */
3106     kvm_write_sw_gc0_intctl(cop0, read_gc0_intctl() &
3107                 (INTCTLF_IPFDC | INTCTLF_IPPCI | INTCTLF_IPTI));
3108     /* PRId */
3109     kvm_write_sw_gc0_prid(cop0, boot_cpu_data.processor_id);
3110     /* EBase */
3111     kvm_write_sw_gc0_ebase(cop0, (s32)0x80000000 | vcpu->vcpu_id);
3112     /* Config */
3113     kvm_save_gc0_config(cop0);
3114     /* architecturally writable (e.g. from guest) */
3115     kvm_change_sw_gc0_config(cop0, CONF_CM_CMASK,
3116                  _page_cachable_default >> _CACHE_SHIFT);
3117     /* architecturally read only, but maybe writable from root */
3118     kvm_change_sw_gc0_config(cop0, MIPS_CONF_MT, read_c0_config());
3119     if (cpu_guest_has_conf1) {
3120         kvm_set_sw_gc0_config(cop0, MIPS_CONF_M);
3121         /* Config1 */
3122         kvm_save_gc0_config1(cop0);
3123         /* architecturally read only, but maybe writable from root */
3124         kvm_clear_sw_gc0_config1(cop0, MIPS_CONF1_C2    |
3125                            MIPS_CONF1_MD    |
3126                            MIPS_CONF1_PC    |
3127                            MIPS_CONF1_WR    |
3128                            MIPS_CONF1_CA    |
3129                            MIPS_CONF1_FP);
3130     }
3131     if (cpu_guest_has_conf2) {
3132         kvm_set_sw_gc0_config1(cop0, MIPS_CONF_M);
3133         /* Config2 */
3134         kvm_save_gc0_config2(cop0);
3135     }
3136     if (cpu_guest_has_conf3) {
3137         kvm_set_sw_gc0_config2(cop0, MIPS_CONF_M);
3138         /* Config3 */
3139         kvm_save_gc0_config3(cop0);
3140         /* architecturally writable (e.g. from guest) */
3141         kvm_clear_sw_gc0_config3(cop0, MIPS_CONF3_ISA_OE);
3142         /* architecturally read only, but maybe writable from root */
3143         kvm_clear_sw_gc0_config3(cop0, MIPS_CONF3_MSA   |
3144                            MIPS_CONF3_BPG   |
3145                            MIPS_CONF3_ULRI  |
3146                            MIPS_CONF3_DSP   |
3147                            MIPS_CONF3_CTXTC |
3148                            MIPS_CONF3_ITL   |
3149                            MIPS_CONF3_LPA   |
3150                            MIPS_CONF3_VEIC  |
3151                            MIPS_CONF3_VINT  |
3152                            MIPS_CONF3_SP    |
3153                            MIPS_CONF3_CDMM  |
3154                            MIPS_CONF3_MT    |
3155                            MIPS_CONF3_SM    |
3156                            MIPS_CONF3_TL);
3157     }
3158     if (cpu_guest_has_conf4) {
3159         kvm_set_sw_gc0_config3(cop0, MIPS_CONF_M);
3160         /* Config4 */
3161         kvm_save_gc0_config4(cop0);
3162     }
3163     if (cpu_guest_has_conf5) {
3164         kvm_set_sw_gc0_config4(cop0, MIPS_CONF_M);
3165         /* Config5 */
3166         kvm_save_gc0_config5(cop0);
3167         /* architecturally writable (e.g. from guest) */
3168         kvm_clear_sw_gc0_config5(cop0, MIPS_CONF5_K |
3169                            MIPS_CONF5_CV    |
3170                            MIPS_CONF5_MSAEN |
3171                            MIPS_CONF5_UFE   |
3172                            MIPS_CONF5_FRE   |
3173                            MIPS_CONF5_SBRI  |
3174                            MIPS_CONF5_UFR);
3175         /* architecturally read only, but maybe writable from root */
3176         kvm_clear_sw_gc0_config5(cop0, MIPS_CONF5_MRP);
3177     }
3178 
3179     if (cpu_guest_has_contextconfig) {
3180         /* ContextConfig */
3181         kvm_write_sw_gc0_contextconfig(cop0, 0x007ffff0);
3182 #ifdef CONFIG_64BIT
3183         /* XContextConfig */
3184         /* bits SEGBITS-13+3:4 set */
3185         kvm_write_sw_gc0_xcontextconfig(cop0,
3186                     ((1ull << (cpu_vmbits - 13)) - 1) << 4);
3187 #endif
3188     }
3189 
3190     /* Implementation dependent, use the legacy layout */
3191     if (cpu_guest_has_segments) {
3192         /* SegCtl0, SegCtl1, SegCtl2 */
3193         kvm_write_sw_gc0_segctl0(cop0, 0x00200010);
3194         kvm_write_sw_gc0_segctl1(cop0, 0x00000002 |
3195                 (_page_cachable_default >> _CACHE_SHIFT) <<
3196                         (16 + MIPS_SEGCFG_C_SHIFT));
3197         kvm_write_sw_gc0_segctl2(cop0, 0x00380438);
3198     }
3199 
3200     /* reset HTW registers */
3201     if (cpu_guest_has_htw && (cpu_has_mips_r5 || cpu_has_mips_r6)) {
3202         /* PWField */
3203         kvm_write_sw_gc0_pwfield(cop0, 0x0c30c302);
3204         /* PWSize */
3205         kvm_write_sw_gc0_pwsize(cop0, 1 << MIPS_PWSIZE_PTW_SHIFT);
3206     }
3207 
3208     /* start with no pending virtual guest interrupts */
3209     if (cpu_has_guestctl2)
3210         cop0->reg[MIPS_CP0_GUESTCTL2][MIPS_CP0_GUESTCTL2_SEL] = 0;
3211 
3212     /* Put PC at reset vector */
3213     vcpu->arch.pc = CKSEG1ADDR(0x1fc00000);
3214 
3215     return 0;
3216 }
3217 
3218 static void kvm_vz_prepare_flush_shadow(struct kvm *kvm)
3219 {
3220     if (!cpu_has_guestid) {
3221         /*
3222          * For each CPU there is a single GPA ASID used by all VCPUs in
3223          * the VM, so it doesn't make sense for the VCPUs to handle
3224          * invalidation of these ASIDs individually.
3225          *
3226          * Instead mark all CPUs as needing ASID invalidation in
3227          * asid_flush_mask, and kvm_flush_remote_tlbs(kvm) will
3228          * kick any running VCPUs so they check asid_flush_mask.
3229          */
3230         cpumask_setall(&kvm->arch.asid_flush_mask);
3231     }
3232 }
3233 
3234 static void kvm_vz_vcpu_reenter(struct kvm_vcpu *vcpu)
3235 {
3236     int cpu = smp_processor_id();
3237     int preserve_guest_tlb;
3238 
3239     preserve_guest_tlb = kvm_vz_check_requests(vcpu, cpu);
3240 
3241     if (preserve_guest_tlb)
3242         kvm_vz_vcpu_save_wired(vcpu);
3243 
3244     kvm_vz_vcpu_load_tlb(vcpu, cpu);
3245 
3246     if (preserve_guest_tlb)
3247         kvm_vz_vcpu_load_wired(vcpu);
3248 }
3249 
3250 static int kvm_vz_vcpu_run(struct kvm_vcpu *vcpu)
3251 {
3252     int cpu = smp_processor_id();
3253     int r;
3254 
3255     kvm_vz_acquire_htimer(vcpu);
3256     /* Check if we have any exceptions/interrupts pending */
3257     kvm_mips_deliver_interrupts(vcpu, read_gc0_cause());
3258 
3259     kvm_vz_check_requests(vcpu, cpu);
3260     kvm_vz_vcpu_load_tlb(vcpu, cpu);
3261     kvm_vz_vcpu_load_wired(vcpu);
3262 
3263     r = vcpu->arch.vcpu_run(vcpu);
3264 
3265     kvm_vz_vcpu_save_wired(vcpu);
3266 
3267     return r;
3268 }
3269 
3270 static struct kvm_mips_callbacks kvm_vz_callbacks = {
3271     .handle_cop_unusable = kvm_trap_vz_handle_cop_unusable,
3272     .handle_tlb_mod = kvm_trap_vz_handle_tlb_st_miss,
3273     .handle_tlb_ld_miss = kvm_trap_vz_handle_tlb_ld_miss,
3274     .handle_tlb_st_miss = kvm_trap_vz_handle_tlb_st_miss,
3275     .handle_addr_err_st = kvm_trap_vz_no_handler,
3276     .handle_addr_err_ld = kvm_trap_vz_no_handler,
3277     .handle_syscall = kvm_trap_vz_no_handler,
3278     .handle_res_inst = kvm_trap_vz_no_handler,
3279     .handle_break = kvm_trap_vz_no_handler,
3280     .handle_msa_disabled = kvm_trap_vz_handle_msa_disabled,
3281     .handle_guest_exit = kvm_trap_vz_handle_guest_exit,
3282 
3283     .hardware_enable = kvm_vz_hardware_enable,
3284     .hardware_disable = kvm_vz_hardware_disable,
3285     .check_extension = kvm_vz_check_extension,
3286     .vcpu_init = kvm_vz_vcpu_init,
3287     .vcpu_uninit = kvm_vz_vcpu_uninit,
3288     .vcpu_setup = kvm_vz_vcpu_setup,
3289     .prepare_flush_shadow = kvm_vz_prepare_flush_shadow,
3290     .gva_to_gpa = kvm_vz_gva_to_gpa_cb,
3291     .queue_timer_int = kvm_vz_queue_timer_int_cb,
3292     .dequeue_timer_int = kvm_vz_dequeue_timer_int_cb,
3293     .queue_io_int = kvm_vz_queue_io_int_cb,
3294     .dequeue_io_int = kvm_vz_dequeue_io_int_cb,
3295     .irq_deliver = kvm_vz_irq_deliver_cb,
3296     .irq_clear = kvm_vz_irq_clear_cb,
3297     .num_regs = kvm_vz_num_regs,
3298     .copy_reg_indices = kvm_vz_copy_reg_indices,
3299     .get_one_reg = kvm_vz_get_one_reg,
3300     .set_one_reg = kvm_vz_set_one_reg,
3301     .vcpu_load = kvm_vz_vcpu_load,
3302     .vcpu_put = kvm_vz_vcpu_put,
3303     .vcpu_run = kvm_vz_vcpu_run,
3304     .vcpu_reenter = kvm_vz_vcpu_reenter,
3305 };
3306 
3307 int kvm_mips_emulation_init(struct kvm_mips_callbacks **install_callbacks)
3308 {
3309     if (!cpu_has_vz)
3310         return -ENODEV;
3311 
3312     /*
3313      * VZ requires at least 2 KScratch registers, so it should have been
3314      * possible to allocate pgd_reg.
3315      */
3316     if (WARN(pgd_reg == -1,
3317          "pgd_reg not allocated even though cpu_has_vz\n"))
3318         return -ENODEV;
3319 
3320     pr_info("Starting KVM with MIPS VZ extensions\n");
3321 
3322     *install_callbacks = &kvm_vz_callbacks;
3323     return 0;
3324 }