linux/arch/mips/kvm/trap_emul.c
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * KVM/MIPS: Deliver/Emulate exceptions to the guest kernel
   7 *
   8 * Copyright (C) 2012  MIPS Technologies, Inc.  All rights reserved.
   9 * Authors: Sanjay Lal <sanjayl@kymasys.com>
  10 */
  11
  12#include <linux/errno.h>
  13#include <linux/err.h>
  14#include <linux/kvm_host.h>
  15#include <linux/log2.h>
  16#include <linux/uaccess.h>
  17#include <linux/vmalloc.h>
  18#include <asm/mmu_context.h>
  19#include <asm/pgalloc.h>
  20
  21#include "interrupt.h"
  22
  23static gpa_t kvm_trap_emul_gva_to_gpa_cb(gva_t gva)
  24{
  25        gpa_t gpa;
  26        gva_t kseg = KSEGX(gva);
  27        gva_t gkseg = KVM_GUEST_KSEGX(gva);
  28
  29        if ((kseg == CKSEG0) || (kseg == CKSEG1))
  30                gpa = CPHYSADDR(gva);
  31        else if (gkseg == KVM_GUEST_KSEG0)
  32                gpa = KVM_GUEST_CPHYSADDR(gva);
  33        else {
  34                kvm_err("%s: cannot find GPA for GVA: %#lx\n", __func__, gva);
  35                kvm_mips_dump_host_tlbs();
  36                gpa = KVM_INVALID_ADDR;
  37        }
  38
  39        kvm_debug("%s: gva %#lx, gpa: %#llx\n", __func__, gva, gpa);
  40
  41        return gpa;
  42}
  43
  44static int kvm_trap_emul_no_handler(struct kvm_vcpu *vcpu)
  45{
  46        u32 __user *opc = (u32 __user *) vcpu->arch.pc;
  47        u32 cause = vcpu->arch.host_cp0_cause;
  48        u32 exccode = (cause & CAUSEF_EXCCODE) >> CAUSEB_EXCCODE;
  49        unsigned long badvaddr = vcpu->arch.host_cp0_badvaddr;
  50        u32 inst = 0;
  51
  52        /*
  53         *  Fetch the instruction.
  54         */
  55        if (cause & CAUSEF_BD)
  56                opc += 1;
  57        kvm_get_badinstr(opc, vcpu, &inst);
  58
  59        kvm_err("Exception Code: %d not handled @ PC: %p, inst: 0x%08x BadVaddr: %#lx Status: %#x\n",
  60                exccode, opc, inst, badvaddr,
  61                kvm_read_c0_guest_status(vcpu->arch.cop0));
  62        kvm_arch_vcpu_dump_regs(vcpu);
  63        vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
  64        return RESUME_HOST;
  65}
  66
  67static int kvm_trap_emul_handle_cop_unusable(struct kvm_vcpu *vcpu)
  68{
  69        struct mips_coproc *cop0 = vcpu->arch.cop0;
  70        struct kvm_run *run = vcpu->run;
  71        u32 __user *opc = (u32 __user *) vcpu->arch.pc;
  72        u32 cause = vcpu->arch.host_cp0_cause;
  73        enum emulation_result er = EMULATE_DONE;
  74        int ret = RESUME_GUEST;
  75
  76        if (((cause & CAUSEF_CE) >> CAUSEB_CE) == 1) {
  77                /* FPU Unusable */
  78                if (!kvm_mips_guest_has_fpu(&vcpu->arch) ||
  79                    (kvm_read_c0_guest_status(cop0) & ST0_CU1) == 0) {
  80                        /*
  81                         * Unusable/no FPU in guest:
  82                         * deliver guest COP1 Unusable Exception
  83                         */
  84                        er = kvm_mips_emulate_fpu_exc(cause, opc, run, vcpu);
  85                } else {
  86                        /* Restore FPU state */
  87                        kvm_own_fpu(vcpu);
  88                        er = EMULATE_DONE;
  89                }
  90        } else {
  91                er = kvm_mips_emulate_inst(cause, opc, run, vcpu);
  92        }
  93
  94        switch (er) {
  95        case EMULATE_DONE:
  96                ret = RESUME_GUEST;
  97                break;
  98
  99        case EMULATE_FAIL:
 100                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 101                ret = RESUME_HOST;
 102                break;
 103
 104        case EMULATE_WAIT:
 105                run->exit_reason = KVM_EXIT_INTR;
 106                ret = RESUME_HOST;
 107                break;
 108
 109        case EMULATE_HYPERCALL:
 110                ret = kvm_mips_handle_hypcall(vcpu);
 111                break;
 112
 113        default:
 114                BUG();
 115        }
 116        return ret;
 117}
 118
 119static int kvm_mips_bad_load(u32 cause, u32 *opc, struct kvm_run *run,
 120                             struct kvm_vcpu *vcpu)
 121{
 122        enum emulation_result er;
 123        union mips_instruction inst;
 124        int err;
 125
 126        /* A code fetch fault doesn't count as an MMIO */
 127        if (kvm_is_ifetch_fault(&vcpu->arch)) {
 128                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 129                return RESUME_HOST;
 130        }
 131
 132        /* Fetch the instruction. */
 133        if (cause & CAUSEF_BD)
 134                opc += 1;
 135        err = kvm_get_badinstr(opc, vcpu, &inst.word);
 136        if (err) {
 137                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 138                return RESUME_HOST;
 139        }
 140
 141        /* Emulate the load */
 142        er = kvm_mips_emulate_load(inst, cause, run, vcpu);
 143        if (er == EMULATE_FAIL) {
 144                kvm_err("Emulate load from MMIO space failed\n");
 145                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 146        } else {
 147                run->exit_reason = KVM_EXIT_MMIO;
 148        }
 149        return RESUME_HOST;
 150}
 151
 152static int kvm_mips_bad_store(u32 cause, u32 *opc, struct kvm_run *run,
 153                              struct kvm_vcpu *vcpu)
 154{
 155        enum emulation_result er;
 156        union mips_instruction inst;
 157        int err;
 158
 159        /* Fetch the instruction. */
 160        if (cause & CAUSEF_BD)
 161                opc += 1;
 162        err = kvm_get_badinstr(opc, vcpu, &inst.word);
 163        if (err) {
 164                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 165                return RESUME_HOST;
 166        }
 167
 168        /* Emulate the store */
 169        er = kvm_mips_emulate_store(inst, cause, run, vcpu);
 170        if (er == EMULATE_FAIL) {
 171                kvm_err("Emulate store to MMIO space failed\n");
 172                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 173        } else {
 174                run->exit_reason = KVM_EXIT_MMIO;
 175        }
 176        return RESUME_HOST;
 177}
 178
 179static int kvm_mips_bad_access(u32 cause, u32 *opc, struct kvm_run *run,
 180                               struct kvm_vcpu *vcpu, bool store)
 181{
 182        if (store)
 183                return kvm_mips_bad_store(cause, opc, run, vcpu);
 184        else
 185                return kvm_mips_bad_load(cause, opc, run, vcpu);
 186}
 187
 188static int kvm_trap_emul_handle_tlb_mod(struct kvm_vcpu *vcpu)
 189{
 190        struct mips_coproc *cop0 = vcpu->arch.cop0;
 191        struct kvm_run *run = vcpu->run;
 192        u32 __user *opc = (u32 __user *) vcpu->arch.pc;
 193        unsigned long badvaddr = vcpu->arch.host_cp0_badvaddr;
 194        u32 cause = vcpu->arch.host_cp0_cause;
 195        struct kvm_mips_tlb *tlb;
 196        unsigned long entryhi;
 197        int index;
 198
 199        if (KVM_GUEST_KSEGX(badvaddr) < KVM_GUEST_KSEG0
 200            || KVM_GUEST_KSEGX(badvaddr) == KVM_GUEST_KSEG23) {
 201                /*
 202                 * First find the mapping in the guest TLB. If the failure to
 203                 * write was due to the guest TLB, it should be up to the guest
 204                 * to handle it.
 205                 */
 206                entryhi = (badvaddr & VPN2_MASK) |
 207                          (kvm_read_c0_guest_entryhi(cop0) & KVM_ENTRYHI_ASID);
 208                index = kvm_mips_guest_tlb_lookup(vcpu, entryhi);
 209
 210                /*
 211                 * These should never happen.
 212                 * They would indicate stale host TLB entries.
 213                 */
 214                if (unlikely(index < 0)) {
 215                        run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 216                        return RESUME_HOST;
 217                }
 218                tlb = vcpu->arch.guest_tlb + index;
 219                if (unlikely(!TLB_IS_VALID(*tlb, badvaddr))) {
 220                        run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 221                        return RESUME_HOST;
 222                }
 223
 224                /*
 225                 * Guest entry not dirty? That would explain the TLB modified
 226                 * exception. Relay that on to the guest so it can handle it.
 227                 */
 228                if (!TLB_IS_DIRTY(*tlb, badvaddr)) {
 229                        kvm_mips_emulate_tlbmod(cause, opc, run, vcpu);
 230                        return RESUME_GUEST;
 231                }
 232
 233                if (kvm_mips_handle_mapped_seg_tlb_fault(vcpu, tlb, badvaddr,
 234                                                         true))
 235                        /* Not writable, needs handling as MMIO */
 236                        return kvm_mips_bad_store(cause, opc, run, vcpu);
 237                return RESUME_GUEST;
 238        } else if (KVM_GUEST_KSEGX(badvaddr) == KVM_GUEST_KSEG0) {
 239                if (kvm_mips_handle_kseg0_tlb_fault(badvaddr, vcpu, true) < 0)
 240                        /* Not writable, needs handling as MMIO */
 241                        return kvm_mips_bad_store(cause, opc, run, vcpu);
 242                return RESUME_GUEST;
 243        } else {
 244                /* host kernel addresses are all handled as MMIO */
 245                return kvm_mips_bad_store(cause, opc, run, vcpu);
 246        }
 247}
 248
 249static int kvm_trap_emul_handle_tlb_miss(struct kvm_vcpu *vcpu, bool store)
 250{
 251        struct kvm_run *run = vcpu->run;
 252        u32 __user *opc = (u32 __user *) vcpu->arch.pc;
 253        unsigned long badvaddr = vcpu->arch.host_cp0_badvaddr;
 254        u32 cause = vcpu->arch.host_cp0_cause;
 255        enum emulation_result er = EMULATE_DONE;
 256        int ret = RESUME_GUEST;
 257
 258        if (((badvaddr & PAGE_MASK) == KVM_GUEST_COMMPAGE_ADDR)
 259            && KVM_GUEST_KERNEL_MODE(vcpu)) {
 260                if (kvm_mips_handle_commpage_tlb_fault(badvaddr, vcpu) < 0) {
 261                        run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 262                        ret = RESUME_HOST;
 263                }
 264        } else if (KVM_GUEST_KSEGX(badvaddr) < KVM_GUEST_KSEG0
 265                   || KVM_GUEST_KSEGX(badvaddr) == KVM_GUEST_KSEG23) {
 266                kvm_debug("USER ADDR TLB %s fault: cause %#x, PC: %p, BadVaddr: %#lx\n",
 267                          store ? "ST" : "LD", cause, opc, badvaddr);
 268
 269                /*
 270                 * User Address (UA) fault, this could happen if
 271                 * (1) TLB entry not present/valid in both Guest and shadow host
 272                 *     TLBs, in this case we pass on the fault to the guest
 273                 *     kernel and let it handle it.
 274                 * (2) TLB entry is present in the Guest TLB but not in the
 275                 *     shadow, in this case we inject the TLB from the Guest TLB
 276                 *     into the shadow host TLB
 277                 */
 278
 279                er = kvm_mips_handle_tlbmiss(cause, opc, run, vcpu, store);
 280                if (er == EMULATE_DONE)
 281                        ret = RESUME_GUEST;
 282                else {
 283                        run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 284                        ret = RESUME_HOST;
 285                }
 286        } else if (KVM_GUEST_KSEGX(badvaddr) == KVM_GUEST_KSEG0) {
 287                /*
 288                 * All KSEG0 faults are handled by KVM, as the guest kernel does
 289                 * not expect to ever get them
 290                 */
 291                if (kvm_mips_handle_kseg0_tlb_fault(badvaddr, vcpu, store) < 0)
 292                        ret = kvm_mips_bad_access(cause, opc, run, vcpu, store);
 293        } else if (KVM_GUEST_KERNEL_MODE(vcpu)
 294                   && (KSEGX(badvaddr) == CKSEG0 || KSEGX(badvaddr) == CKSEG1)) {
 295                /*
 296                 * With EVA we may get a TLB exception instead of an address
 297                 * error when the guest performs MMIO to KSeg1 addresses.
 298                 */
 299                ret = kvm_mips_bad_access(cause, opc, run, vcpu, store);
 300        } else {
 301                kvm_err("Illegal TLB %s fault address , cause %#x, PC: %p, BadVaddr: %#lx\n",
 302                        store ? "ST" : "LD", cause, opc, badvaddr);
 303                kvm_mips_dump_host_tlbs();
 304                kvm_arch_vcpu_dump_regs(vcpu);
 305                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 306                ret = RESUME_HOST;
 307        }
 308        return ret;
 309}
 310
 311static int kvm_trap_emul_handle_tlb_st_miss(struct kvm_vcpu *vcpu)
 312{
 313        return kvm_trap_emul_handle_tlb_miss(vcpu, true);
 314}
 315
 316static int kvm_trap_emul_handle_tlb_ld_miss(struct kvm_vcpu *vcpu)
 317{
 318        return kvm_trap_emul_handle_tlb_miss(vcpu, false);
 319}
 320
 321static int kvm_trap_emul_handle_addr_err_st(struct kvm_vcpu *vcpu)
 322{
 323        struct kvm_run *run = vcpu->run;
 324        u32 __user *opc = (u32 __user *) vcpu->arch.pc;
 325        unsigned long badvaddr = vcpu->arch.host_cp0_badvaddr;
 326        u32 cause = vcpu->arch.host_cp0_cause;
 327        int ret = RESUME_GUEST;
 328
 329        if (KVM_GUEST_KERNEL_MODE(vcpu)
 330            && (KSEGX(badvaddr) == CKSEG0 || KSEGX(badvaddr) == CKSEG1)) {
 331                ret = kvm_mips_bad_store(cause, opc, run, vcpu);
 332        } else {
 333                kvm_err("Address Error (STORE): cause %#x, PC: %p, BadVaddr: %#lx\n",
 334                        cause, opc, badvaddr);
 335                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 336                ret = RESUME_HOST;
 337        }
 338        return ret;
 339}
 340
 341static int kvm_trap_emul_handle_addr_err_ld(struct kvm_vcpu *vcpu)
 342{
 343        struct kvm_run *run = vcpu->run;
 344        u32 __user *opc = (u32 __user *) vcpu->arch.pc;
 345        unsigned long badvaddr = vcpu->arch.host_cp0_badvaddr;
 346        u32 cause = vcpu->arch.host_cp0_cause;
 347        int ret = RESUME_GUEST;
 348
 349        if (KSEGX(badvaddr) == CKSEG0 || KSEGX(badvaddr) == CKSEG1) {
 350                ret = kvm_mips_bad_load(cause, opc, run, vcpu);
 351        } else {
 352                kvm_err("Address Error (LOAD): cause %#x, PC: %p, BadVaddr: %#lx\n",
 353                        cause, opc, badvaddr);
 354                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 355                ret = RESUME_HOST;
 356        }
 357        return ret;
 358}
 359
 360static int kvm_trap_emul_handle_syscall(struct kvm_vcpu *vcpu)
 361{
 362        struct kvm_run *run = vcpu->run;
 363        u32 __user *opc = (u32 __user *) vcpu->arch.pc;
 364        u32 cause = vcpu->arch.host_cp0_cause;
 365        enum emulation_result er = EMULATE_DONE;
 366        int ret = RESUME_GUEST;
 367
 368        er = kvm_mips_emulate_syscall(cause, opc, run, vcpu);
 369        if (er == EMULATE_DONE)
 370                ret = RESUME_GUEST;
 371        else {
 372                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 373                ret = RESUME_HOST;
 374        }
 375        return ret;
 376}
 377
 378static int kvm_trap_emul_handle_res_inst(struct kvm_vcpu *vcpu)
 379{
 380        struct kvm_run *run = vcpu->run;
 381        u32 __user *opc = (u32 __user *) vcpu->arch.pc;
 382        u32 cause = vcpu->arch.host_cp0_cause;
 383        enum emulation_result er = EMULATE_DONE;
 384        int ret = RESUME_GUEST;
 385
 386        er = kvm_mips_handle_ri(cause, opc, run, vcpu);
 387        if (er == EMULATE_DONE)
 388                ret = RESUME_GUEST;
 389        else {
 390                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 391                ret = RESUME_HOST;
 392        }
 393        return ret;
 394}
 395
 396static int kvm_trap_emul_handle_break(struct kvm_vcpu *vcpu)
 397{
 398        struct kvm_run *run = vcpu->run;
 399        u32 __user *opc = (u32 __user *) vcpu->arch.pc;
 400        u32 cause = vcpu->arch.host_cp0_cause;
 401        enum emulation_result er = EMULATE_DONE;
 402        int ret = RESUME_GUEST;
 403
 404        er = kvm_mips_emulate_bp_exc(cause, opc, run, vcpu);
 405        if (er == EMULATE_DONE)
 406                ret = RESUME_GUEST;
 407        else {
 408                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 409                ret = RESUME_HOST;
 410        }
 411        return ret;
 412}
 413
 414static int kvm_trap_emul_handle_trap(struct kvm_vcpu *vcpu)
 415{
 416        struct kvm_run *run = vcpu->run;
 417        u32 __user *opc = (u32 __user *)vcpu->arch.pc;
 418        u32 cause = vcpu->arch.host_cp0_cause;
 419        enum emulation_result er = EMULATE_DONE;
 420        int ret = RESUME_GUEST;
 421
 422        er = kvm_mips_emulate_trap_exc(cause, opc, run, vcpu);
 423        if (er == EMULATE_DONE) {
 424                ret = RESUME_GUEST;
 425        } else {
 426                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 427                ret = RESUME_HOST;
 428        }
 429        return ret;
 430}
 431
 432static int kvm_trap_emul_handle_msa_fpe(struct kvm_vcpu *vcpu)
 433{
 434        struct kvm_run *run = vcpu->run;
 435        u32 __user *opc = (u32 __user *)vcpu->arch.pc;
 436        u32 cause = vcpu->arch.host_cp0_cause;
 437        enum emulation_result er = EMULATE_DONE;
 438        int ret = RESUME_GUEST;
 439
 440        er = kvm_mips_emulate_msafpe_exc(cause, opc, run, vcpu);
 441        if (er == EMULATE_DONE) {
 442                ret = RESUME_GUEST;
 443        } else {
 444                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 445                ret = RESUME_HOST;
 446        }
 447        return ret;
 448}
 449
 450static int kvm_trap_emul_handle_fpe(struct kvm_vcpu *vcpu)
 451{
 452        struct kvm_run *run = vcpu->run;
 453        u32 __user *opc = (u32 __user *)vcpu->arch.pc;
 454        u32 cause = vcpu->arch.host_cp0_cause;
 455        enum emulation_result er = EMULATE_DONE;
 456        int ret = RESUME_GUEST;
 457
 458        er = kvm_mips_emulate_fpe_exc(cause, opc, run, vcpu);
 459        if (er == EMULATE_DONE) {
 460                ret = RESUME_GUEST;
 461        } else {
 462                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 463                ret = RESUME_HOST;
 464        }
 465        return ret;
 466}
 467
 468/**
 469 * kvm_trap_emul_handle_msa_disabled() - Guest used MSA while disabled in root.
 470 * @vcpu:       Virtual CPU context.
 471 *
 472 * Handle when the guest attempts to use MSA when it is disabled.
 473 */
 474static int kvm_trap_emul_handle_msa_disabled(struct kvm_vcpu *vcpu)
 475{
 476        struct mips_coproc *cop0 = vcpu->arch.cop0;
 477        struct kvm_run *run = vcpu->run;
 478        u32 __user *opc = (u32 __user *) vcpu->arch.pc;
 479        u32 cause = vcpu->arch.host_cp0_cause;
 480        enum emulation_result er = EMULATE_DONE;
 481        int ret = RESUME_GUEST;
 482
 483        if (!kvm_mips_guest_has_msa(&vcpu->arch) ||
 484            (kvm_read_c0_guest_status(cop0) & (ST0_CU1 | ST0_FR)) == ST0_CU1) {
 485                /*
 486                 * No MSA in guest, or FPU enabled and not in FR=1 mode,
 487                 * guest reserved instruction exception
 488                 */
 489                er = kvm_mips_emulate_ri_exc(cause, opc, run, vcpu);
 490        } else if (!(kvm_read_c0_guest_config5(cop0) & MIPS_CONF5_MSAEN)) {
 491                /* MSA disabled by guest, guest MSA disabled exception */
 492                er = kvm_mips_emulate_msadis_exc(cause, opc, run, vcpu);
 493        } else {
 494                /* Restore MSA/FPU state */
 495                kvm_own_msa(vcpu);
 496                er = EMULATE_DONE;
 497        }
 498
 499        switch (er) {
 500        case EMULATE_DONE:
 501                ret = RESUME_GUEST;
 502                break;
 503
 504        case EMULATE_FAIL:
 505                run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
 506                ret = RESUME_HOST;
 507                break;
 508
 509        default:
 510                BUG();
 511        }
 512        return ret;
 513}
 514
 515static int kvm_trap_emul_hardware_enable(void)
 516{
 517        return 0;
 518}
 519
 520static void kvm_trap_emul_hardware_disable(void)
 521{
 522}
 523
 524static int kvm_trap_emul_check_extension(struct kvm *kvm, long ext)
 525{
 526        int r;
 527
 528        switch (ext) {
 529        case KVM_CAP_MIPS_TE:
 530                r = 1;
 531                break;
 532        default:
 533                r = 0;
 534                break;
 535        }
 536
 537        return r;
 538}
 539
 540static int kvm_trap_emul_vcpu_init(struct kvm_vcpu *vcpu)
 541{
 542        struct mm_struct *kern_mm = &vcpu->arch.guest_kernel_mm;
 543        struct mm_struct *user_mm = &vcpu->arch.guest_user_mm;
 544
 545        /*
 546         * Allocate GVA -> HPA page tables.
 547         * MIPS doesn't use the mm_struct pointer argument.
 548         */
 549        kern_mm->pgd = pgd_alloc(kern_mm);
 550        if (!kern_mm->pgd)
 551                return -ENOMEM;
 552
 553        user_mm->pgd = pgd_alloc(user_mm);
 554        if (!user_mm->pgd) {
 555                pgd_free(kern_mm, kern_mm->pgd);
 556                return -ENOMEM;
 557        }
 558
 559        return 0;
 560}
 561
 562static void kvm_mips_emul_free_gva_pt(pgd_t *pgd)
 563{
 564        /* Don't free host kernel page tables copied from init_mm.pgd */
 565        const unsigned long end = 0x80000000;
 566        unsigned long pgd_va, pud_va, pmd_va;
 567        pud_t *pud;
 568        pmd_t *pmd;
 569        pte_t *pte;
 570        int i, j, k;
 571
 572        for (i = 0; i < USER_PTRS_PER_PGD; i++) {
 573                if (pgd_none(pgd[i]))
 574                        continue;
 575
 576                pgd_va = (unsigned long)i << PGDIR_SHIFT;
 577                if (pgd_va >= end)
 578                        break;
 579                pud = pud_offset(pgd + i, 0);
 580                for (j = 0; j < PTRS_PER_PUD; j++) {
 581                        if (pud_none(pud[j]))
 582                                continue;
 583
 584                        pud_va = pgd_va | ((unsigned long)j << PUD_SHIFT);
 585                        if (pud_va >= end)
 586                                break;
 587                        pmd = pmd_offset(pud + j, 0);
 588                        for (k = 0; k < PTRS_PER_PMD; k++) {
 589                                if (pmd_none(pmd[k]))
 590                                        continue;
 591
 592                                pmd_va = pud_va | (k << PMD_SHIFT);
 593                                if (pmd_va >= end)
 594                                        break;
 595                                pte = pte_offset(pmd + k, 0);
 596                                pte_free_kernel(NULL, pte);
 597                        }
 598                        pmd_free(NULL, pmd);
 599                }
 600                pud_free(NULL, pud);
 601        }
 602        pgd_free(NULL, pgd);
 603}
 604
 605static void kvm_trap_emul_vcpu_uninit(struct kvm_vcpu *vcpu)
 606{
 607        kvm_mips_emul_free_gva_pt(vcpu->arch.guest_kernel_mm.pgd);
 608        kvm_mips_emul_free_gva_pt(vcpu->arch.guest_user_mm.pgd);
 609}
 610
 611static int kvm_trap_emul_vcpu_setup(struct kvm_vcpu *vcpu)
 612{
 613        struct mips_coproc *cop0 = vcpu->arch.cop0;
 614        u32 config, config1;
 615        int vcpu_id = vcpu->vcpu_id;
 616
 617        /* Start off the timer at 100 MHz */
 618        kvm_mips_init_count(vcpu, 100*1000*1000);
 619
 620        /*
 621         * Arch specific stuff, set up config registers properly so that the
 622         * guest will come up as expected
 623         */
 624#ifndef CONFIG_CPU_MIPSR6
 625        /* r2-r5, simulate a MIPS 24kc */
 626        kvm_write_c0_guest_prid(cop0, 0x00019300);
 627#else
 628        /* r6+, simulate a generic QEMU machine */
 629        kvm_write_c0_guest_prid(cop0, 0x00010000);
 630#endif
 631        /*
 632         * Have config1, Cacheable, noncoherent, write-back, write allocate.
 633         * Endianness, arch revision & virtually tagged icache should match
 634         * host.
 635         */
 636        config = read_c0_config() & MIPS_CONF_AR;
 637        config |= MIPS_CONF_M | CONF_CM_CACHABLE_NONCOHERENT | MIPS_CONF_MT_TLB;
 638#ifdef CONFIG_CPU_BIG_ENDIAN
 639        config |= CONF_BE;
 640#endif
 641        if (cpu_has_vtag_icache)
 642                config |= MIPS_CONF_VI;
 643        kvm_write_c0_guest_config(cop0, config);
 644
 645        /* Read the cache characteristics from the host Config1 Register */
 646        config1 = (read_c0_config1() & ~0x7f);
 647
 648        /* DCache line size not correctly reported in Config1 on Octeon CPUs */
 649        if (cpu_dcache_line_size()) {
 650                config1 &= ~MIPS_CONF1_DL;
 651                config1 |= ((ilog2(cpu_dcache_line_size()) - 1) <<
 652                            MIPS_CONF1_DL_SHF) & MIPS_CONF1_DL;
 653        }
 654
 655        /* Set up MMU size */
 656        config1 &= ~(0x3f << 25);
 657        config1 |= ((KVM_MIPS_GUEST_TLB_SIZE - 1) << 25);
 658
 659        /* We unset some bits that we aren't emulating */
 660        config1 &= ~(MIPS_CONF1_C2 | MIPS_CONF1_MD | MIPS_CONF1_PC |
 661                     MIPS_CONF1_WR | MIPS_CONF1_CA);
 662        kvm_write_c0_guest_config1(cop0, config1);
 663
 664        /* Have config3, no tertiary/secondary caches implemented */
 665        kvm_write_c0_guest_config2(cop0, MIPS_CONF_M);
 666        /* MIPS_CONF_M | (read_c0_config2() & 0xfff) */
 667
 668        /* Have config4, UserLocal */
 669        kvm_write_c0_guest_config3(cop0, MIPS_CONF_M | MIPS_CONF3_ULRI);
 670
 671        /* Have config5 */
 672        kvm_write_c0_guest_config4(cop0, MIPS_CONF_M);
 673
 674        /* No config6 */
 675        kvm_write_c0_guest_config5(cop0, 0);
 676
 677        /* Set Wait IE/IXMT Ignore in Config7, IAR, AR */
 678        kvm_write_c0_guest_config7(cop0, (MIPS_CONF7_WII) | (1 << 10));
 679
 680        /* Status */
 681        kvm_write_c0_guest_status(cop0, ST0_BEV | ST0_ERL);
 682
 683        /*
 684         * Setup IntCtl defaults, compatibility mode for timer interrupts (HW5)
 685         */
 686        kvm_write_c0_guest_intctl(cop0, 0xFC000000);
 687
 688        /* Put in vcpu id as CPUNum into Ebase Reg to handle SMP Guests */
 689        kvm_write_c0_guest_ebase(cop0, KVM_GUEST_KSEG0 |
 690                                       (vcpu_id & MIPS_EBASE_CPUNUM));
 691
 692        /* Put PC at guest reset vector */
 693        vcpu->arch.pc = KVM_GUEST_CKSEG1ADDR(0x1fc00000);
 694
 695        return 0;
 696}
 697
 698static void kvm_trap_emul_flush_shadow_all(struct kvm *kvm)
 699{
 700        /* Flush GVA page tables and invalidate GVA ASIDs on all VCPUs */
 701        kvm_flush_remote_tlbs(kvm);
 702}
 703
 704static void kvm_trap_emul_flush_shadow_memslot(struct kvm *kvm,
 705                                        const struct kvm_memory_slot *slot)
 706{
 707        kvm_trap_emul_flush_shadow_all(kvm);
 708}
 709
 710static u64 kvm_trap_emul_get_one_regs[] = {
 711        KVM_REG_MIPS_CP0_INDEX,
 712        KVM_REG_MIPS_CP0_ENTRYLO0,
 713        KVM_REG_MIPS_CP0_ENTRYLO1,
 714        KVM_REG_MIPS_CP0_CONTEXT,
 715        KVM_REG_MIPS_CP0_USERLOCAL,
 716        KVM_REG_MIPS_CP0_PAGEMASK,
 717        KVM_REG_MIPS_CP0_WIRED,
 718        KVM_REG_MIPS_CP0_HWRENA,
 719        KVM_REG_MIPS_CP0_BADVADDR,
 720        KVM_REG_MIPS_CP0_COUNT,
 721        KVM_REG_MIPS_CP0_ENTRYHI,
 722        KVM_REG_MIPS_CP0_COMPARE,
 723        KVM_REG_MIPS_CP0_STATUS,
 724        KVM_REG_MIPS_CP0_INTCTL,
 725        KVM_REG_MIPS_CP0_CAUSE,
 726        KVM_REG_MIPS_CP0_EPC,
 727        KVM_REG_MIPS_CP0_PRID,
 728        KVM_REG_MIPS_CP0_EBASE,
 729        KVM_REG_MIPS_CP0_CONFIG,
 730        KVM_REG_MIPS_CP0_CONFIG1,
 731        KVM_REG_MIPS_CP0_CONFIG2,
 732        KVM_REG_MIPS_CP0_CONFIG3,
 733        KVM_REG_MIPS_CP0_CONFIG4,
 734        KVM_REG_MIPS_CP0_CONFIG5,
 735        KVM_REG_MIPS_CP0_CONFIG7,
 736        KVM_REG_MIPS_CP0_ERROREPC,
 737        KVM_REG_MIPS_CP0_KSCRATCH1,
 738        KVM_REG_MIPS_CP0_KSCRATCH2,
 739        KVM_REG_MIPS_CP0_KSCRATCH3,
 740        KVM_REG_MIPS_CP0_KSCRATCH4,
 741        KVM_REG_MIPS_CP0_KSCRATCH5,
 742        KVM_REG_MIPS_CP0_KSCRATCH6,
 743
 744        KVM_REG_MIPS_COUNT_CTL,
 745        KVM_REG_MIPS_COUNT_RESUME,
 746        KVM_REG_MIPS_COUNT_HZ,
 747};
 748
 749static unsigned long kvm_trap_emul_num_regs(struct kvm_vcpu *vcpu)
 750{
 751        return ARRAY_SIZE(kvm_trap_emul_get_one_regs);
 752}
 753
 754static int kvm_trap_emul_copy_reg_indices(struct kvm_vcpu *vcpu,
 755                                          u64 __user *indices)
 756{
 757        if (copy_to_user(indices, kvm_trap_emul_get_one_regs,
 758                         sizeof(kvm_trap_emul_get_one_regs)))
 759                return -EFAULT;
 760        indices += ARRAY_SIZE(kvm_trap_emul_get_one_regs);
 761
 762        return 0;
 763}
 764
 765static int kvm_trap_emul_get_one_reg(struct kvm_vcpu *vcpu,
 766                                     const struct kvm_one_reg *reg,
 767                                     s64 *v)
 768{
 769        struct mips_coproc *cop0 = vcpu->arch.cop0;
 770
 771        switch (reg->id) {
 772        case KVM_REG_MIPS_CP0_INDEX:
 773                *v = (long)kvm_read_c0_guest_index(cop0);
 774                break;
 775        case KVM_REG_MIPS_CP0_ENTRYLO0:
 776                *v = kvm_read_c0_guest_entrylo0(cop0);
 777                break;
 778        case KVM_REG_MIPS_CP0_ENTRYLO1:
 779                *v = kvm_read_c0_guest_entrylo1(cop0);
 780                break;
 781        case KVM_REG_MIPS_CP0_CONTEXT:
 782                *v = (long)kvm_read_c0_guest_context(cop0);
 783                break;
 784        case KVM_REG_MIPS_CP0_USERLOCAL:
 785                *v = (long)kvm_read_c0_guest_userlocal(cop0);
 786                break;
 787        case KVM_REG_MIPS_CP0_PAGEMASK:
 788                *v = (long)kvm_read_c0_guest_pagemask(cop0);
 789                break;
 790        case KVM_REG_MIPS_CP0_WIRED:
 791                *v = (long)kvm_read_c0_guest_wired(cop0);
 792                break;
 793        case KVM_REG_MIPS_CP0_HWRENA:
 794                *v = (long)kvm_read_c0_guest_hwrena(cop0);
 795                break;
 796        case KVM_REG_MIPS_CP0_BADVADDR:
 797                *v = (long)kvm_read_c0_guest_badvaddr(cop0);
 798                break;
 799        case KVM_REG_MIPS_CP0_ENTRYHI:
 800                *v = (long)kvm_read_c0_guest_entryhi(cop0);
 801                break;
 802        case KVM_REG_MIPS_CP0_COMPARE:
 803                *v = (long)kvm_read_c0_guest_compare(cop0);
 804                break;
 805        case KVM_REG_MIPS_CP0_STATUS:
 806                *v = (long)kvm_read_c0_guest_status(cop0);
 807                break;
 808        case KVM_REG_MIPS_CP0_INTCTL:
 809                *v = (long)kvm_read_c0_guest_intctl(cop0);
 810                break;
 811        case KVM_REG_MIPS_CP0_CAUSE:
 812                *v = (long)kvm_read_c0_guest_cause(cop0);
 813                break;
 814        case KVM_REG_MIPS_CP0_EPC:
 815                *v = (long)kvm_read_c0_guest_epc(cop0);
 816                break;
 817        case KVM_REG_MIPS_CP0_PRID:
 818                *v = (long)kvm_read_c0_guest_prid(cop0);
 819                break;
 820        case KVM_REG_MIPS_CP0_EBASE:
 821                *v = (long)kvm_read_c0_guest_ebase(cop0);
 822                break;
 823        case KVM_REG_MIPS_CP0_CONFIG:
 824                *v = (long)kvm_read_c0_guest_config(cop0);
 825                break;
 826        case KVM_REG_MIPS_CP0_CONFIG1:
 827                *v = (long)kvm_read_c0_guest_config1(cop0);
 828                break;
 829        case KVM_REG_MIPS_CP0_CONFIG2:
 830                *v = (long)kvm_read_c0_guest_config2(cop0);
 831                break;
 832        case KVM_REG_MIPS_CP0_CONFIG3:
 833                *v = (long)kvm_read_c0_guest_config3(cop0);
 834                break;
 835        case KVM_REG_MIPS_CP0_CONFIG4:
 836                *v = (long)kvm_read_c0_guest_config4(cop0);
 837                break;
 838        case KVM_REG_MIPS_CP0_CONFIG5:
 839                *v = (long)kvm_read_c0_guest_config5(cop0);
 840                break;
 841        case KVM_REG_MIPS_CP0_CONFIG7:
 842                *v = (long)kvm_read_c0_guest_config7(cop0);
 843                break;
 844        case KVM_REG_MIPS_CP0_COUNT:
 845                *v = kvm_mips_read_count(vcpu);
 846                break;
 847        case KVM_REG_MIPS_COUNT_CTL:
 848                *v = vcpu->arch.count_ctl;
 849                break;
 850        case KVM_REG_MIPS_COUNT_RESUME:
 851                *v = ktime_to_ns(vcpu->arch.count_resume);
 852                break;
 853        case KVM_REG_MIPS_COUNT_HZ:
 854                *v = vcpu->arch.count_hz;
 855                break;
 856        case KVM_REG_MIPS_CP0_ERROREPC:
 857                *v = (long)kvm_read_c0_guest_errorepc(cop0);
 858                break;
 859        case KVM_REG_MIPS_CP0_KSCRATCH1:
 860                *v = (long)kvm_read_c0_guest_kscratch1(cop0);
 861                break;
 862        case KVM_REG_MIPS_CP0_KSCRATCH2:
 863                *v = (long)kvm_read_c0_guest_kscratch2(cop0);
 864                break;
 865        case KVM_REG_MIPS_CP0_KSCRATCH3:
 866                *v = (long)kvm_read_c0_guest_kscratch3(cop0);
 867                break;
 868        case KVM_REG_MIPS_CP0_KSCRATCH4:
 869                *v = (long)kvm_read_c0_guest_kscratch4(cop0);
 870                break;
 871        case KVM_REG_MIPS_CP0_KSCRATCH5:
 872                *v = (long)kvm_read_c0_guest_kscratch5(cop0);
 873                break;
 874        case KVM_REG_MIPS_CP0_KSCRATCH6:
 875                *v = (long)kvm_read_c0_guest_kscratch6(cop0);
 876                break;
 877        default:
 878                return -EINVAL;
 879        }
 880        return 0;
 881}
 882
 883static int kvm_trap_emul_set_one_reg(struct kvm_vcpu *vcpu,
 884                                     const struct kvm_one_reg *reg,
 885                                     s64 v)
 886{
 887        struct mips_coproc *cop0 = vcpu->arch.cop0;
 888        int ret = 0;
 889        unsigned int cur, change;
 890
 891        switch (reg->id) {
 892        case KVM_REG_MIPS_CP0_INDEX:
 893                kvm_write_c0_guest_index(cop0, v);
 894                break;
 895        case KVM_REG_MIPS_CP0_ENTRYLO0:
 896                kvm_write_c0_guest_entrylo0(cop0, v);
 897                break;
 898        case KVM_REG_MIPS_CP0_ENTRYLO1:
 899                kvm_write_c0_guest_entrylo1(cop0, v);
 900                break;
 901        case KVM_REG_MIPS_CP0_CONTEXT:
 902                kvm_write_c0_guest_context(cop0, v);
 903                break;
 904        case KVM_REG_MIPS_CP0_USERLOCAL:
 905                kvm_write_c0_guest_userlocal(cop0, v);
 906                break;
 907        case KVM_REG_MIPS_CP0_PAGEMASK:
 908                kvm_write_c0_guest_pagemask(cop0, v);
 909                break;
 910        case KVM_REG_MIPS_CP0_WIRED:
 911                kvm_write_c0_guest_wired(cop0, v);
 912                break;
 913        case KVM_REG_MIPS_CP0_HWRENA:
 914                kvm_write_c0_guest_hwrena(cop0, v);
 915                break;
 916        case KVM_REG_MIPS_CP0_BADVADDR:
 917                kvm_write_c0_guest_badvaddr(cop0, v);
 918                break;
 919        case KVM_REG_MIPS_CP0_ENTRYHI:
 920                kvm_write_c0_guest_entryhi(cop0, v);
 921                break;
 922        case KVM_REG_MIPS_CP0_STATUS:
 923                kvm_write_c0_guest_status(cop0, v);
 924                break;
 925        case KVM_REG_MIPS_CP0_INTCTL:
 926                /* No VInt, so no VS, read-only for now */
 927                break;
 928        case KVM_REG_MIPS_CP0_EPC:
 929                kvm_write_c0_guest_epc(cop0, v);
 930                break;
 931        case KVM_REG_MIPS_CP0_PRID:
 932                kvm_write_c0_guest_prid(cop0, v);
 933                break;
 934        case KVM_REG_MIPS_CP0_EBASE:
 935                /*
 936                 * Allow core number to be written, but the exception base must
 937                 * remain in guest KSeg0.
 938                 */
 939                kvm_change_c0_guest_ebase(cop0, 0x1ffff000 | MIPS_EBASE_CPUNUM,
 940                                          v);
 941                break;
 942        case KVM_REG_MIPS_CP0_COUNT:
 943                kvm_mips_write_count(vcpu, v);
 944                break;
 945        case KVM_REG_MIPS_CP0_COMPARE:
 946                kvm_mips_write_compare(vcpu, v, false);
 947                break;
 948        case KVM_REG_MIPS_CP0_CAUSE:
 949                /*
 950                 * If the timer is stopped or started (DC bit) it must look
 951                 * atomic with changes to the interrupt pending bits (TI, IRQ5).
 952                 * A timer interrupt should not happen in between.
 953                 */
 954                if ((kvm_read_c0_guest_cause(cop0) ^ v) & CAUSEF_DC) {
 955                        if (v & CAUSEF_DC) {
 956                                /* disable timer first */
 957                                kvm_mips_count_disable_cause(vcpu);
 958                                kvm_change_c0_guest_cause(cop0, (u32)~CAUSEF_DC,
 959                                                          v);
 960                        } else {
 961                                /* enable timer last */
 962                                kvm_change_c0_guest_cause(cop0, (u32)~CAUSEF_DC,
 963                                                          v);
 964                                kvm_mips_count_enable_cause(vcpu);
 965                        }
 966                } else {
 967                        kvm_write_c0_guest_cause(cop0, v);
 968                }
 969                break;
 970        case KVM_REG_MIPS_CP0_CONFIG:
 971                /* read-only for now */
 972                break;
 973        case KVM_REG_MIPS_CP0_CONFIG1:
 974                cur = kvm_read_c0_guest_config1(cop0);
 975                change = (cur ^ v) & kvm_mips_config1_wrmask(vcpu);
 976                if (change) {
 977                        v = cur ^ change;
 978                        kvm_write_c0_guest_config1(cop0, v);
 979                }
 980                break;
 981        case KVM_REG_MIPS_CP0_CONFIG2:
 982                /* read-only for now */
 983                break;
 984        case KVM_REG_MIPS_CP0_CONFIG3:
 985                cur = kvm_read_c0_guest_config3(cop0);
 986                change = (cur ^ v) & kvm_mips_config3_wrmask(vcpu);
 987                if (change) {
 988                        v = cur ^ change;
 989                        kvm_write_c0_guest_config3(cop0, v);
 990                }
 991                break;
 992        case KVM_REG_MIPS_CP0_CONFIG4:
 993                cur = kvm_read_c0_guest_config4(cop0);
 994                change = (cur ^ v) & kvm_mips_config4_wrmask(vcpu);
 995                if (change) {
 996                        v = cur ^ change;
 997                        kvm_write_c0_guest_config4(cop0, v);
 998                }
 999                break;
1000        case KVM_REG_MIPS_CP0_CONFIG5:
1001                cur = kvm_read_c0_guest_config5(cop0);
1002                change = (cur ^ v) & kvm_mips_config5_wrmask(vcpu);
1003                if (change) {
1004                        v = cur ^ change;
1005                        kvm_write_c0_guest_config5(cop0, v);
1006                }
1007                break;
1008        case KVM_REG_MIPS_CP0_CONFIG7:
1009                /* writes ignored */
1010                break;
1011        case KVM_REG_MIPS_COUNT_CTL:
1012                ret = kvm_mips_set_count_ctl(vcpu, v);
1013                break;
1014        case KVM_REG_MIPS_COUNT_RESUME:
1015                ret = kvm_mips_set_count_resume(vcpu, v);
1016                break;
1017        case KVM_REG_MIPS_COUNT_HZ:
1018                ret = kvm_mips_set_count_hz(vcpu, v);
1019                break;
1020        case KVM_REG_MIPS_CP0_ERROREPC:
1021                kvm_write_c0_guest_errorepc(cop0, v);
1022                break;
1023        case KVM_REG_MIPS_CP0_KSCRATCH1:
1024                kvm_write_c0_guest_kscratch1(cop0, v);
1025                break;
1026        case KVM_REG_MIPS_CP0_KSCRATCH2:
1027                kvm_write_c0_guest_kscratch2(cop0, v);
1028                break;
1029        case KVM_REG_MIPS_CP0_KSCRATCH3:
1030                kvm_write_c0_guest_kscratch3(cop0, v);
1031                break;
1032        case KVM_REG_MIPS_CP0_KSCRATCH4:
1033                kvm_write_c0_guest_kscratch4(cop0, v);
1034                break;
1035        case KVM_REG_MIPS_CP0_KSCRATCH5:
1036                kvm_write_c0_guest_kscratch5(cop0, v);
1037                break;
1038        case KVM_REG_MIPS_CP0_KSCRATCH6:
1039                kvm_write_c0_guest_kscratch6(cop0, v);
1040                break;
1041        default:
1042                return -EINVAL;
1043        }
1044        return ret;
1045}
1046
1047static int kvm_trap_emul_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
1048{
1049        struct mm_struct *kern_mm = &vcpu->arch.guest_kernel_mm;
1050        struct mm_struct *user_mm = &vcpu->arch.guest_user_mm;
1051        struct mm_struct *mm;
1052
1053        /*
1054         * Were we in guest context? If so, restore the appropriate ASID based
1055         * on the mode of the Guest (Kernel/User).
1056         */
1057        if (current->flags & PF_VCPU) {
1058                mm = KVM_GUEST_KERNEL_MODE(vcpu) ? kern_mm : user_mm;
1059                check_switch_mmu_context(mm);
1060                kvm_mips_suspend_mm(cpu);
1061                ehb();
1062        }
1063
1064        return 0;
1065}
1066
1067static int kvm_trap_emul_vcpu_put(struct kvm_vcpu *vcpu, int cpu)
1068{
1069        kvm_lose_fpu(vcpu);
1070
1071        if (current->flags & PF_VCPU) {
1072                /* Restore normal Linux process memory map */
1073                check_switch_mmu_context(current->mm);
1074                kvm_mips_resume_mm(cpu);
1075                ehb();
1076        }
1077
1078        return 0;
1079}
1080
1081static void kvm_trap_emul_check_requests(struct kvm_vcpu *vcpu, int cpu,
1082                                         bool reload_asid)
1083{
1084        struct mm_struct *kern_mm = &vcpu->arch.guest_kernel_mm;
1085        struct mm_struct *user_mm = &vcpu->arch.guest_user_mm;
1086        struct mm_struct *mm;
1087        int i;
1088
1089        if (likely(!kvm_request_pending(vcpu)))
1090                return;
1091
1092        if (kvm_check_request(KVM_REQ_TLB_FLUSH, vcpu)) {
1093                /*
1094                 * Both kernel & user GVA mappings must be invalidated. The
1095                 * caller is just about to check whether the ASID is stale
1096                 * anyway so no need to reload it here.
1097                 */
1098                kvm_mips_flush_gva_pt(kern_mm->pgd, KMF_GPA | KMF_KERN);
1099                kvm_mips_flush_gva_pt(user_mm->pgd, KMF_GPA | KMF_USER);
1100                for_each_possible_cpu(i) {
1101                        set_cpu_context(i, kern_mm, 0);
1102                        set_cpu_context(i, user_mm, 0);
1103                }
1104
1105                /* Generate new ASID for current mode */
1106                if (reload_asid) {
1107                        mm = KVM_GUEST_KERNEL_MODE(vcpu) ? kern_mm : user_mm;
1108                        get_new_mmu_context(mm);
1109                        htw_stop();
1110                        write_c0_entryhi(cpu_asid(cpu, mm));
1111                        TLBMISS_HANDLER_SETUP_PGD(mm->pgd);
1112                        htw_start();
1113                }
1114        }
1115}
1116
1117/**
1118 * kvm_trap_emul_gva_lockless_begin() - Begin lockless access to GVA space.
1119 * @vcpu:       VCPU pointer.
1120 *
1121 * Call before a GVA space access outside of guest mode, to ensure that
1122 * asynchronous TLB flush requests are handled or delayed until completion of
1123 * the GVA access (as indicated by a matching kvm_trap_emul_gva_lockless_end()).
1124 *
1125 * Should be called with IRQs already enabled.
1126 */
1127void kvm_trap_emul_gva_lockless_begin(struct kvm_vcpu *vcpu)
1128{
1129        /* We re-enable IRQs in kvm_trap_emul_gva_lockless_end() */
1130        WARN_ON_ONCE(irqs_disabled());
1131
1132        /*
1133         * The caller is about to access the GVA space, so we set the mode to
1134         * force TLB flush requests to send an IPI, and also disable IRQs to
1135         * delay IPI handling until kvm_trap_emul_gva_lockless_end().
1136         */
1137        local_irq_disable();
1138
1139        /*
1140         * Make sure the read of VCPU requests is not reordered ahead of the
1141         * write to vcpu->mode, or we could miss a TLB flush request while
1142         * the requester sees the VCPU as outside of guest mode and not needing
1143         * an IPI.
1144         */
1145        smp_store_mb(vcpu->mode, READING_SHADOW_PAGE_TABLES);
1146
1147        /*
1148         * If a TLB flush has been requested (potentially while
1149         * OUTSIDE_GUEST_MODE and assumed immediately effective), perform it
1150         * before accessing the GVA space, and be sure to reload the ASID if
1151         * necessary as it'll be immediately used.
1152         *
1153         * TLB flush requests after this check will trigger an IPI due to the
1154         * mode change above, which will be delayed due to IRQs disabled.
1155         */
1156        kvm_trap_emul_check_requests(vcpu, smp_processor_id(), true);
1157}
1158
1159/**
1160 * kvm_trap_emul_gva_lockless_end() - End lockless access to GVA space.
1161 * @vcpu:       VCPU pointer.
1162 *
1163 * Called after a GVA space access outside of guest mode. Should have a matching
1164 * call to kvm_trap_emul_gva_lockless_begin().
1165 */
1166void kvm_trap_emul_gva_lockless_end(struct kvm_vcpu *vcpu)
1167{
1168        /*
1169         * Make sure the write to vcpu->mode is not reordered in front of GVA
1170         * accesses, or a TLB flush requester may not think it necessary to send
1171         * an IPI.
1172         */
1173        smp_store_release(&vcpu->mode, OUTSIDE_GUEST_MODE);
1174
1175        /*
1176         * Now that the access to GVA space is complete, its safe for pending
1177         * TLB flush request IPIs to be handled (which indicates completion).
1178         */
1179        local_irq_enable();
1180}
1181
1182static void kvm_trap_emul_vcpu_reenter(struct kvm_run *run,
1183                                       struct kvm_vcpu *vcpu)
1184{
1185        struct mm_struct *kern_mm = &vcpu->arch.guest_kernel_mm;
1186        struct mm_struct *user_mm = &vcpu->arch.guest_user_mm;
1187        struct mm_struct *mm;
1188        struct mips_coproc *cop0 = vcpu->arch.cop0;
1189        int i, cpu = smp_processor_id();
1190        unsigned int gasid;
1191
1192        /*
1193         * No need to reload ASID, IRQs are disabled already so there's no rush,
1194         * and we'll check if we need to regenerate below anyway before
1195         * re-entering the guest.
1196         */
1197        kvm_trap_emul_check_requests(vcpu, cpu, false);
1198
1199        if (KVM_GUEST_KERNEL_MODE(vcpu)) {
1200                mm = kern_mm;
1201        } else {
1202                mm = user_mm;
1203
1204                /*
1205                 * Lazy host ASID regeneration / PT flush for guest user mode.
1206                 * If the guest ASID has changed since the last guest usermode
1207                 * execution, invalidate the stale TLB entries and flush GVA PT
1208                 * entries too.
1209                 */
1210                gasid = kvm_read_c0_guest_entryhi(cop0) & KVM_ENTRYHI_ASID;
1211                if (gasid != vcpu->arch.last_user_gasid) {
1212                        kvm_mips_flush_gva_pt(user_mm->pgd, KMF_USER);
1213                        for_each_possible_cpu(i)
1214                                set_cpu_context(i, user_mm, 0);
1215                        vcpu->arch.last_user_gasid = gasid;
1216                }
1217        }
1218
1219        /*
1220         * Check if ASID is stale. This may happen due to a TLB flush request or
1221         * a lazy user MM invalidation.
1222         */
1223        check_mmu_context(mm);
1224}
1225
1226static int kvm_trap_emul_vcpu_run(struct kvm_run *run, struct kvm_vcpu *vcpu)
1227{
1228        int cpu = smp_processor_id();
1229        int r;
1230
1231        /* Check if we have any exceptions/interrupts pending */
1232        kvm_mips_deliver_interrupts(vcpu,
1233                                    kvm_read_c0_guest_cause(vcpu->arch.cop0));
1234
1235        kvm_trap_emul_vcpu_reenter(run, vcpu);
1236
1237        /*
1238         * We use user accessors to access guest memory, but we don't want to
1239         * invoke Linux page faulting.
1240         */
1241        pagefault_disable();
1242
1243        /* Disable hardware page table walking while in guest */
1244        htw_stop();
1245
1246        /*
1247         * While in guest context we're in the guest's address space, not the
1248         * host process address space, so we need to be careful not to confuse
1249         * e.g. cache management IPIs.
1250         */
1251        kvm_mips_suspend_mm(cpu);
1252
1253        r = vcpu->arch.vcpu_run(run, vcpu);
1254
1255        /* We may have migrated while handling guest exits */
1256        cpu = smp_processor_id();
1257
1258        /* Restore normal Linux process memory map */
1259        check_switch_mmu_context(current->mm);
1260        kvm_mips_resume_mm(cpu);
1261
1262        htw_start();
1263
1264        pagefault_enable();
1265
1266        return r;
1267}
1268
1269static struct kvm_mips_callbacks kvm_trap_emul_callbacks = {
1270        /* exit handlers */
1271        .handle_cop_unusable = kvm_trap_emul_handle_cop_unusable,
1272        .handle_tlb_mod = kvm_trap_emul_handle_tlb_mod,
1273        .handle_tlb_st_miss = kvm_trap_emul_handle_tlb_st_miss,
1274        .handle_tlb_ld_miss = kvm_trap_emul_handle_tlb_ld_miss,
1275        .handle_addr_err_st = kvm_trap_emul_handle_addr_err_st,
1276        .handle_addr_err_ld = kvm_trap_emul_handle_addr_err_ld,
1277        .handle_syscall = kvm_trap_emul_handle_syscall,
1278        .handle_res_inst = kvm_trap_emul_handle_res_inst,
1279        .handle_break = kvm_trap_emul_handle_break,
1280        .handle_trap = kvm_trap_emul_handle_trap,
1281        .handle_msa_fpe = kvm_trap_emul_handle_msa_fpe,
1282        .handle_fpe = kvm_trap_emul_handle_fpe,
1283        .handle_msa_disabled = kvm_trap_emul_handle_msa_disabled,
1284        .handle_guest_exit = kvm_trap_emul_no_handler,
1285
1286        .hardware_enable = kvm_trap_emul_hardware_enable,
1287        .hardware_disable = kvm_trap_emul_hardware_disable,
1288        .check_extension = kvm_trap_emul_check_extension,
1289        .vcpu_init = kvm_trap_emul_vcpu_init,
1290        .vcpu_uninit = kvm_trap_emul_vcpu_uninit,
1291        .vcpu_setup = kvm_trap_emul_vcpu_setup,
1292        .flush_shadow_all = kvm_trap_emul_flush_shadow_all,
1293        .flush_shadow_memslot = kvm_trap_emul_flush_shadow_memslot,
1294        .gva_to_gpa = kvm_trap_emul_gva_to_gpa_cb,
1295        .queue_timer_int = kvm_mips_queue_timer_int_cb,
1296        .dequeue_timer_int = kvm_mips_dequeue_timer_int_cb,
1297        .queue_io_int = kvm_mips_queue_io_int_cb,
1298        .dequeue_io_int = kvm_mips_dequeue_io_int_cb,
1299        .irq_deliver = kvm_mips_irq_deliver_cb,
1300        .irq_clear = kvm_mips_irq_clear_cb,
1301        .num_regs = kvm_trap_emul_num_regs,
1302        .copy_reg_indices = kvm_trap_emul_copy_reg_indices,
1303        .get_one_reg = kvm_trap_emul_get_one_reg,
1304        .set_one_reg = kvm_trap_emul_set_one_reg,
1305        .vcpu_load = kvm_trap_emul_vcpu_load,
1306        .vcpu_put = kvm_trap_emul_vcpu_put,
1307        .vcpu_run = kvm_trap_emul_vcpu_run,
1308        .vcpu_reenter = kvm_trap_emul_vcpu_reenter,
1309};
1310
1311int kvm_mips_emulation_init(struct kvm_mips_callbacks **install_callbacks)
1312{
1313        *install_callbacks = &kvm_trap_emul_callbacks;
1314        return 0;
1315}
1316