We removed support for MIPS host. The KVM MIPS code
is now unreachable, remove it.

Signed-off-by: Philippe Mathieu-Daudé <[email protected]>
Reviewed-by: Richard Henderson <[email protected]>
Message-Id: <[email protected]>
---
 MAINTAINERS                    |    6 -
 docs/system/target-mips.rst    |    2 -
 meson.build                    |    2 -
 target/mips/kvm_mips.h         |   28 -
 hw/intc/mips_gic.c             |   11 +-
 hw/mips/loongson3_virt.c       |   66 +-
 hw/mips/malta.c                |    1 -
 hw/mips/mips_int.c             |    6 -
 target/mips/cpu.c              |    5 -
 target/mips/kvm.c              | 1283 --------------------------------
 target/mips/system/cp0_timer.c |   12 +-
 target/mips/system/physaddr.c  |    1 -
 target/mips/meson.build        |    6 +-
 13 files changed, 21 insertions(+), 1408 deletions(-)
 delete mode 100644 target/mips/kvm_mips.h
 delete mode 100644 target/mips/kvm.c

diff --git a/MAINTAINERS b/MAINTAINERS
index b75f3222f2f..bd7ea53f950 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -483,12 +483,6 @@ S: Supported
 F: target/arm/kvm.c
 F: tests/functional/aarch64/test_kvm.py
 
-MIPS KVM CPUs
-M: Huacai Chen <[email protected]>
-S: Odd Fixes
-F: target/mips/kvm*
-F: target/mips/system/
-
 PPC KVM CPUs
 M: Nicholas Piggin <[email protected]>
 R: Harsh Prateek Bora <[email protected]>
diff --git a/docs/system/target-mips.rst b/docs/system/target-mips.rst
index 2a152e13380..aebad0c86e9 100644
--- a/docs/system/target-mips.rst
+++ b/docs/system/target-mips.rst
@@ -76,8 +76,6 @@ The Loongson-3 virtual platform emulation supports:
 
 -  GPEX and virtio as peripheral devices
 
--  Both KVM and TCG supported
-
 .. include:: cpu-models-mips.rst.inc
 
 .. _nanoMIPS-System-emulator:
diff --git a/meson.build b/meson.build
index fe5211b2122..eb074918193 100644
--- a/meson.build
+++ b/meson.build
@@ -282,8 +282,6 @@ elif cpu == 's390x'
   kvm_targets = ['s390x-softmmu']
 elif cpu == 'ppc64'
   kvm_targets = ['ppc-softmmu', 'ppc64-softmmu']
-elif cpu == 'mips64'
-  kvm_targets = ['mips-softmmu', 'mipsel-softmmu', 'mips64-softmmu', 
'mips64el-softmmu']
 elif cpu == 'riscv64'
   kvm_targets = ['riscv64-softmmu']
 elif cpu == 'loongarch64'
diff --git a/target/mips/kvm_mips.h b/target/mips/kvm_mips.h
deleted file mode 100644
index c711269d0af..00000000000
--- a/target/mips/kvm_mips.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * KVM/MIPS: MIPS specific KVM APIs
- *
- * Copyright (C) 2012-2014 Imagination Technologies Ltd.
- * Authors: Sanjay Lal <[email protected]>
- */
-
-#ifndef KVM_MIPS_H
-#define KVM_MIPS_H
-
-#include "cpu.h"
-
-/**
- * kvm_mips_reset_vcpu:
- * @cpu: MIPSCPU
- *
- * Called at reset time to set kernel registers to their initial values.
- */
-void kvm_mips_reset_vcpu(MIPSCPU *cpu);
-
-int kvm_mips_set_interrupt(MIPSCPU *cpu, int irq, int level);
-int kvm_mips_set_ipi_interrupt(MIPSCPU *cpu, int irq, int level);
-
-#endif /* KVM_MIPS_H */
diff --git a/hw/intc/mips_gic.c b/hw/intc/mips_gic.c
index ad9363a4c7d..23478df4b46 100644
--- a/hw/intc/mips_gic.c
+++ b/hw/intc/mips_gic.c
@@ -15,9 +15,7 @@
 #include "qapi/error.h"
 #include "hw/core/sysbus.h"
 #include "system/memory.h"
-#include "system/kvm.h"
 #include "system/reset.h"
-#include "kvm_mips.h"
 #include "hw/intc/mips_gic.h"
 #include "hw/core/irq.h"
 #include "hw/core/qdev-properties.h"
@@ -45,14 +43,7 @@ static void mips_gic_set_vp_irq(MIPSGICState *gic, int vp, 
int pin)
         ored_level |= (gic->vps[vp].pend & GIC_VP_MASK_CMP_MSK) >>
                       GIC_VP_MASK_CMP_SHF;
     }
-    if (kvm_enabled())  {
-        kvm_mips_set_ipi_interrupt(env_archcpu(gic->vps[vp].env),
-                                   pin + GIC_CPU_PIN_OFFSET,
-                                   ored_level);
-    } else {
-        qemu_set_irq(gic->vps[vp].env->irq[pin + GIC_CPU_PIN_OFFSET],
-                     ored_level);
-    }
+    qemu_set_irq(gic->vps[vp].env->irq[pin + GIC_CPU_PIN_OFFSET], ored_level);
 }
 
 static void gic_update_pin_for_irq(MIPSGICState *gic, int n_IRQ)
diff --git a/hw/mips/loongson3_virt.c b/hw/mips/loongson3_virt.c
index c29cae86872..7de3fb09c17 100644
--- a/hw/mips/loongson3_virt.c
+++ b/hw/mips/loongson3_virt.c
@@ -45,7 +45,6 @@
 #include "hw/pci-host/gpex.h"
 #include "hw/usb/usb.h"
 #include "net/net.h"
-#include "system/kvm.h"
 #include "system/qtest.h"
 #include "system/reset.h"
 #include "system/runstate.h"
@@ -157,21 +156,6 @@ static const MemoryRegionOps loongson3_pm_ops = {
 
 static uint64_t get_cpu_freq_hz(const MIPSCPU *cpu)
 {
-#ifdef CONFIG_KVM
-    int ret;
-    uint64_t freq;
-    struct kvm_one_reg freq_reg = {
-        .id = KVM_REG_MIPS_COUNT_HZ,
-        .addr = (uintptr_t)(&freq)
-    };
-
-    if (kvm_enabled()) {
-        ret = kvm_vcpu_ioctl(CPU(cpu), KVM_GET_ONE_REG, &freq_reg);
-        if (ret >= 0) {
-            return freq * 2;
-        }
-    }
-#endif
     return DEF_LOONGSON3_FREQ;
 }
 
@@ -511,23 +495,13 @@ static void mips_loongson3_virt_init(MachineState 
*machine)
     MemoryRegion *iomem = g_new(MemoryRegion, 1);
     MemoryRegion *iocsr = g_new(MemoryRegion, 1);
 
-    /* TODO: TCG will support all CPU types */
-    if (!kvm_enabled()) {
-        if (!machine->cpu_type) {
-            machine->cpu_type = MIPS_CPU_TYPE_NAME("Loongson-3A1000");
-        }
-        if (!cpu_type_supports_isa(machine->cpu_type, INSN_LOONGSON3A)) {
-            error_report("Loongson-3/TCG needs a Loongson-3 series cpu");
-            exit(1);
-        }
-    } else {
-        if (!machine->cpu_type) {
-            machine->cpu_type = MIPS_CPU_TYPE_NAME("Loongson-3A4000");
-        }
-        if (!strstr(machine->cpu_type, "Loongson-3A4000")) {
-            error_report("Loongson-3/KVM needs cpu type Loongson-3A4000");
-            exit(1);
-        }
+    /* TODO: Support all CPU types */
+    if (!machine->cpu_type) {
+        machine->cpu_type = MIPS_CPU_TYPE_NAME("Loongson-3A1000");
+    }
+    if (!cpu_type_supports_isa(machine->cpu_type, INSN_LOONGSON3A)) {
+        error_report("Loongson-3/TCG needs a Loongson-3 series cpu");
+        exit(1);
     }
 
     if (ram_size < 512 * MiB) {
@@ -545,16 +519,13 @@ static void mips_loongson3_virt_init(MachineState 
*machine)
 
     memory_region_init(iocsr, OBJECT(machine), "loongson3.iocsr", UINT32_MAX);
 
-    /* IPI controller is in kernel for KVM */
-    if (!kvm_enabled()) {
-        ipi = qdev_new(TYPE_LOONGSON_IPI);
-        qdev_prop_set_uint32(ipi, "num-cpu", machine->smp.cpus);
-        sysbus_realize_and_unref(SYS_BUS_DEVICE(ipi), &error_fatal);
-        memory_region_add_subregion(iocsr, SMP_IPI_MAILBOX,
-                                sysbus_mmio_get_region(SYS_BUS_DEVICE(ipi), 
0));
-        memory_region_add_subregion(iocsr, MAIL_SEND_ADDR,
-                                sysbus_mmio_get_region(SYS_BUS_DEVICE(ipi), 
1));
-    }
+    ipi = qdev_new(TYPE_LOONGSON_IPI);
+    qdev_prop_set_uint32(ipi, "num-cpu", machine->smp.cpus);
+    sysbus_realize_and_unref(SYS_BUS_DEVICE(ipi), &error_fatal);
+    memory_region_add_subregion(iocsr, SMP_IPI_MAILBOX,
+                            sysbus_mmio_get_region(SYS_BUS_DEVICE(ipi), 0));
+    memory_region_add_subregion(iocsr, MAIL_SEND_ADDR,
+                            sysbus_mmio_get_region(SYS_BUS_DEVICE(ipi), 1));
 
     liointc = qdev_new("loongson.liointc");
     sysbus_realize_and_unref(SYS_BUS_DEVICE(liointc), &error_fatal);
@@ -575,6 +546,7 @@ static void mips_loongson3_virt_init(MachineState *machine)
         int node = i / LOONGSON3_CORE_PER_NODE;
         int core = i % LOONGSON3_CORE_PER_NODE;
         int ip;
+        hwaddr ipi_base = ((hwaddr)node << 44) + virt_memmap[VIRT_IPI].base;
 
         /* init CPUs */
         cpu = mips_cpu_create_with_clock(machine->cpu_type, cpuclk, false);
@@ -584,12 +556,8 @@ static void mips_loongson3_virt_init(MachineState *machine)
         cpu_mips_clock_init(cpu);
         qemu_register_reset(i ? generic_cpu_reset : main_cpu_reset, cpu);
 
-        if (!kvm_enabled()) {
-            hwaddr base = ((hwaddr)node << 44) + virt_memmap[VIRT_IPI].base;
-            base += core * 0x100;
-            qdev_connect_gpio_out(ipi, i, cpu->env.irq[6]);
-            sysbus_mmio_map(SYS_BUS_DEVICE(ipi), i + 2, base);
-        }
+        qdev_connect_gpio_out(ipi, i, cpu->env.irq[6]);
+        sysbus_mmio_map(SYS_BUS_DEVICE(ipi), i + 2, ipi_base + core * 0x100);
 
         if (ase_lcsr_available(&MIPS_CPU(cpu)->env)) {
             MemoryRegion *core_iocsr = g_new(MemoryRegion, 1);
diff --git a/hw/mips/malta.c b/hw/mips/malta.c
index 845b8d339e8..38c71f66f2e 100644
--- a/hw/mips/malta.c
+++ b/hw/mips/malta.c
@@ -55,7 +55,6 @@
 #include "system/system.h"
 #include "qapi/error.h"
 #include "qemu/error-report.h"
-#include "system/kvm.h"
 #include "semihosting/semihost.h"
 #include "hw/mips/cps.h"
 #include "hw/core/qdev-clock.h"
diff --git a/hw/mips/mips_int.c b/hw/mips/mips_int.c
index fa9c78e74de..26e7dd6d5f5 100644
--- a/hw/mips/mips_int.c
+++ b/hw/mips/mips_int.c
@@ -23,8 +23,6 @@
 #include "qemu/osdep.h"
 #include "qemu/main-loop.h"
 #include "hw/core/irq.h"
-#include "system/kvm.h"
-#include "kvm_mips.h"
 #include "target/mips/cpu.h"
 
 static void cpu_mips_irq_request(void *opaque, int irq, int level)
@@ -45,10 +43,6 @@ static void cpu_mips_irq_request(void *opaque, int irq, int 
level)
         env->CP0_Cause &= ~(1 << (irq + CP0Ca_IP));
     }
 
-    if (kvm_enabled() && (irq == 2 || irq == 3)) {
-        kvm_mips_set_interrupt(cpu, irq, level);
-    }
-
     if (env->CP0_Cause & CP0Ca_IP_mask) {
         cpu_interrupt(cs, CPU_INTERRUPT_HARD);
     } else {
diff --git a/target/mips/cpu.c b/target/mips/cpu.c
index 88bb59d506b..99d43613828 100644
--- a/target/mips/cpu.c
+++ b/target/mips/cpu.c
@@ -25,9 +25,7 @@
 #include "qapi/error.h"
 #include "cpu.h"
 #include "internal.h"
-#include "kvm_mips.h"
 #include "qemu/module.h"
-#include "system/kvm.h"
 #include "system/qtest.h"
 #include "hw/core/qdev-properties.h"
 #include "hw/core/qdev-clock.h"
@@ -416,9 +414,6 @@ static void mips_cpu_reset_hold(Object *obj, ResetType type)
         /* UHI interface can be used to obtain argc and argv */
         env->active_tc.gpr[4] = -1;
     }
-    if (kvm_enabled()) {
-        kvm_mips_reset_vcpu(cpu);
-    }
 #endif
 }
 
diff --git a/target/mips/kvm.c b/target/mips/kvm.c
deleted file mode 100644
index a85e162409c..00000000000
--- a/target/mips/kvm.c
+++ /dev/null
@@ -1,1283 +0,0 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License.  See the file "COPYING" in the main directory of this archive
- * for more details.
- *
- * KVM/MIPS: MIPS specific KVM APIs
- *
- * Copyright (C) 2012-2014 Imagination Technologies Ltd.
- * Authors: Sanjay Lal <[email protected]>
-*/
-
-#include "qemu/osdep.h"
-#include <sys/ioctl.h>
-
-#include <linux/kvm.h>
-
-#include "cpu.h"
-#include "internal.h"
-#include "qemu/error-report.h"
-#include "qemu/main-loop.h"
-#include "system/kvm.h"
-#include "system/kvm_int.h"
-#include "system/runstate.h"
-#include "kvm_mips.h"
-#include "hw/core/boards.h"
-#include "fpu_helper.h"
-
-#define DEBUG_KVM 0
-
-#define DPRINTF(fmt, ...) \
-    do { if (DEBUG_KVM) { fprintf(stderr, fmt, ## __VA_ARGS__); } } while (0)
-
-static int kvm_mips_fpu_cap;
-static int kvm_mips_msa_cap;
-
-const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
-    KVM_CAP_LAST_INFO
-};
-
-static void kvm_mips_update_state(void *opaque, bool running, RunState state);
-
-unsigned long kvm_arch_vcpu_id(CPUState *cs)
-{
-    return cs->cpu_index;
-}
-
-int kvm_arch_init(MachineState *ms, KVMState *s)
-{
-    /* MIPS has 128 signals */
-    kvm_set_sigmask_len(s, 16);
-
-    kvm_mips_fpu_cap = kvm_check_extension(s, KVM_CAP_MIPS_FPU);
-    kvm_mips_msa_cap = kvm_check_extension(s, KVM_CAP_MIPS_MSA);
-
-    DPRINTF("%s\n", __func__);
-    return 0;
-}
-
-int kvm_arch_irqchip_create(KVMState *s)
-{
-    return 0;
-}
-
-int kvm_arch_pre_create_vcpu(CPUState *cpu, Error **errp)
-{
-    return 0;
-}
-
-int kvm_arch_init_vcpu(CPUState *cs)
-{
-    CPUMIPSState *env = cpu_env(cs);
-    int ret = 0;
-
-    qemu_add_vm_change_state_handler(kvm_mips_update_state, cs);
-
-    if (kvm_mips_fpu_cap && env->CP0_Config1 & (1 << CP0C1_FP)) {
-        ret = kvm_vcpu_enable_cap(cs, KVM_CAP_MIPS_FPU, 0, 0);
-        if (ret < 0) {
-            /* mark unsupported so it gets disabled on reset */
-            kvm_mips_fpu_cap = 0;
-            ret = 0;
-        }
-    }
-
-    if (kvm_mips_msa_cap && ase_msa_available(env)) {
-        ret = kvm_vcpu_enable_cap(cs, KVM_CAP_MIPS_MSA, 0, 0);
-        if (ret < 0) {
-            /* mark unsupported so it gets disabled on reset */
-            kvm_mips_msa_cap = 0;
-            ret = 0;
-        }
-    }
-
-    DPRINTF("%s\n", __func__);
-    return ret;
-}
-
-int kvm_arch_destroy_vcpu(CPUState *cs)
-{
-    return 0;
-}
-
-void kvm_mips_reset_vcpu(MIPSCPU *cpu)
-{
-    CPUMIPSState *env = &cpu->env;
-
-    if (!kvm_mips_fpu_cap && env->CP0_Config1 & (1 << CP0C1_FP)) {
-        warn_report("KVM does not support FPU, disabling");
-        env->CP0_Config1 &= ~(1 << CP0C1_FP);
-    }
-    if (!kvm_mips_msa_cap && ase_msa_available(env)) {
-        warn_report("KVM does not support MSA, disabling");
-        env->CP0_Config3 &= ~(1 << CP0C3_MSAP);
-    }
-
-    DPRINTF("%s\n", __func__);
-}
-
-int kvm_arch_insert_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
-{
-    DPRINTF("%s\n", __func__);
-    return 0;
-}
-
-int kvm_arch_remove_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
-{
-    DPRINTF("%s\n", __func__);
-    return 0;
-}
-
-static inline int cpu_mips_io_interrupts_pending(MIPSCPU *cpu)
-{
-    CPUMIPSState *env = &cpu->env;
-
-    return env->CP0_Cause & (0x1 << (2 + CP0Ca_IP));
-}
-
-
-void kvm_arch_pre_run(CPUState *cs, struct kvm_run *run)
-{
-    MIPSCPU *cpu = MIPS_CPU(cs);
-    int r;
-    struct kvm_mips_interrupt intr;
-
-    bql_lock();
-
-    if (cpu_test_interrupt(cs, CPU_INTERRUPT_HARD) &&
-            cpu_mips_io_interrupts_pending(cpu)) {
-        intr.cpu = -1;
-        intr.irq = 2;
-        r = kvm_vcpu_ioctl(cs, KVM_INTERRUPT, &intr);
-        if (r < 0) {
-            error_report("%s: cpu %d: failed to inject IRQ %x",
-                         __func__, cs->cpu_index, intr.irq);
-        }
-    }
-
-    bql_unlock();
-}
-
-MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run)
-{
-    return MEMTXATTRS_UNSPECIFIED;
-}
-
-int kvm_arch_process_async_events(CPUState *cs)
-{
-    return cs->halted;
-}
-
-int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
-{
-    int ret;
-
-    DPRINTF("%s\n", __func__);
-    switch (run->exit_reason) {
-    default:
-        error_report("%s: unknown exit reason %d",
-                     __func__, run->exit_reason);
-        ret = -1;
-        break;
-    }
-
-    return ret;
-}
-
-bool kvm_arch_stop_on_emulation_error(CPUState *cs)
-{
-    DPRINTF("%s\n", __func__);
-    return true;
-}
-
-void kvm_arch_init_irq_routing(KVMState *s)
-{
-}
-
-int kvm_mips_set_interrupt(MIPSCPU *cpu, int irq, int level)
-{
-    CPUState *cs = CPU(cpu);
-    struct kvm_mips_interrupt intr;
-
-    assert(kvm_enabled());
-
-    intr.cpu = -1;
-
-    if (level) {
-        intr.irq = irq;
-    } else {
-        intr.irq = -irq;
-    }
-
-    kvm_vcpu_ioctl(cs, KVM_INTERRUPT, &intr);
-
-    return 0;
-}
-
-int kvm_mips_set_ipi_interrupt(MIPSCPU *cpu, int irq, int level)
-{
-    CPUState *cs = current_cpu;
-    CPUState *dest_cs = CPU(cpu);
-    struct kvm_mips_interrupt intr;
-
-    assert(kvm_enabled());
-
-    intr.cpu = dest_cs->cpu_index;
-
-    if (level) {
-        intr.irq = irq;
-    } else {
-        intr.irq = -irq;
-    }
-
-    DPRINTF("%s: CPU %d, IRQ: %d\n", __func__, intr.cpu, intr.irq);
-
-    kvm_vcpu_ioctl(cs, KVM_INTERRUPT, &intr);
-
-    return 0;
-}
-
-#define MIPS_CP0_32(_R, _S)                                     \
-    (KVM_REG_MIPS_CP0 | KVM_REG_SIZE_U32 | (8 * (_R) + (_S)))
-
-#define MIPS_CP0_64(_R, _S)                                     \
-    (KVM_REG_MIPS_CP0 | KVM_REG_SIZE_U64 | (8 * (_R) + (_S)))
-
-#define KVM_REG_MIPS_CP0_INDEX          MIPS_CP0_32(0, 0)
-#define KVM_REG_MIPS_CP0_RANDOM         MIPS_CP0_32(1, 0)
-#define KVM_REG_MIPS_CP0_CONTEXT        MIPS_CP0_64(4, 0)
-#define KVM_REG_MIPS_CP0_USERLOCAL      MIPS_CP0_64(4, 2)
-#define KVM_REG_MIPS_CP0_PAGEMASK       MIPS_CP0_32(5, 0)
-#define KVM_REG_MIPS_CP0_PAGEGRAIN      MIPS_CP0_32(5, 1)
-#define KVM_REG_MIPS_CP0_PWBASE         MIPS_CP0_64(5, 5)
-#define KVM_REG_MIPS_CP0_PWFIELD        MIPS_CP0_64(5, 6)
-#define KVM_REG_MIPS_CP0_PWSIZE         MIPS_CP0_64(5, 7)
-#define KVM_REG_MIPS_CP0_WIRED          MIPS_CP0_32(6, 0)
-#define KVM_REG_MIPS_CP0_PWCTL          MIPS_CP0_32(6, 6)
-#define KVM_REG_MIPS_CP0_HWRENA         MIPS_CP0_32(7, 0)
-#define KVM_REG_MIPS_CP0_BADVADDR       MIPS_CP0_64(8, 0)
-#define KVM_REG_MIPS_CP0_COUNT          MIPS_CP0_32(9, 0)
-#define KVM_REG_MIPS_CP0_ENTRYHI        MIPS_CP0_64(10, 0)
-#define KVM_REG_MIPS_CP0_COMPARE        MIPS_CP0_32(11, 0)
-#define KVM_REG_MIPS_CP0_STATUS         MIPS_CP0_32(12, 0)
-#define KVM_REG_MIPS_CP0_CAUSE          MIPS_CP0_32(13, 0)
-#define KVM_REG_MIPS_CP0_EPC            MIPS_CP0_64(14, 0)
-#define KVM_REG_MIPS_CP0_PRID           MIPS_CP0_32(15, 0)
-#define KVM_REG_MIPS_CP0_EBASE          MIPS_CP0_64(15, 1)
-#define KVM_REG_MIPS_CP0_CONFIG         MIPS_CP0_32(16, 0)
-#define KVM_REG_MIPS_CP0_CONFIG1        MIPS_CP0_32(16, 1)
-#define KVM_REG_MIPS_CP0_CONFIG2        MIPS_CP0_32(16, 2)
-#define KVM_REG_MIPS_CP0_CONFIG3        MIPS_CP0_32(16, 3)
-#define KVM_REG_MIPS_CP0_CONFIG4        MIPS_CP0_32(16, 4)
-#define KVM_REG_MIPS_CP0_CONFIG5        MIPS_CP0_32(16, 5)
-#define KVM_REG_MIPS_CP0_CONFIG6        MIPS_CP0_32(16, 6)
-#define KVM_REG_MIPS_CP0_XCONTEXT       MIPS_CP0_64(20, 0)
-#define KVM_REG_MIPS_CP0_ERROREPC       MIPS_CP0_64(30, 0)
-#define KVM_REG_MIPS_CP0_KSCRATCH1      MIPS_CP0_64(31, 2)
-#define KVM_REG_MIPS_CP0_KSCRATCH2      MIPS_CP0_64(31, 3)
-#define KVM_REG_MIPS_CP0_KSCRATCH3      MIPS_CP0_64(31, 4)
-#define KVM_REG_MIPS_CP0_KSCRATCH4      MIPS_CP0_64(31, 5)
-#define KVM_REG_MIPS_CP0_KSCRATCH5      MIPS_CP0_64(31, 6)
-#define KVM_REG_MIPS_CP0_KSCRATCH6      MIPS_CP0_64(31, 7)
-
-static inline int kvm_mips_put_one_reg(CPUState *cs, uint64_t reg_id,
-                                       int32_t *addr)
-{
-    struct kvm_one_reg cp0reg = {
-        .id = reg_id,
-        .addr = (uintptr_t)addr
-    };
-
-    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg);
-}
-
-static inline int kvm_mips_put_one_ureg(CPUState *cs, uint64_t reg_id,
-                                        uint32_t *addr)
-{
-    struct kvm_one_reg cp0reg = {
-        .id = reg_id,
-        .addr = (uintptr_t)addr
-    };
-
-    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg);
-}
-
-static inline int kvm_mips_put_one_ulreg(CPUState *cs, uint64_t reg_id,
-                                         target_ulong *addr)
-{
-    uint64_t val64 = *addr;
-    struct kvm_one_reg cp0reg = {
-        .id = reg_id,
-        .addr = (uintptr_t)&val64
-    };
-
-    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg);
-}
-
-static inline int kvm_mips_put_one_reg64(CPUState *cs, uint64_t reg_id,
-                                         int64_t *addr)
-{
-    struct kvm_one_reg cp0reg = {
-        .id = reg_id,
-        .addr = (uintptr_t)addr
-    };
-
-    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg);
-}
-
-static inline int kvm_mips_put_one_ureg64(CPUState *cs, uint64_t reg_id,
-                                          uint64_t *addr)
-{
-    struct kvm_one_reg cp0reg = {
-        .id = reg_id,
-        .addr = (uintptr_t)addr
-    };
-
-    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg);
-}
-
-static inline int kvm_mips_get_one_reg(CPUState *cs, uint64_t reg_id,
-                                       int32_t *addr)
-{
-    struct kvm_one_reg cp0reg = {
-        .id = reg_id,
-        .addr = (uintptr_t)addr
-    };
-
-    return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg);
-}
-
-static inline int kvm_mips_get_one_ureg(CPUState *cs, uint64_t reg_id,
-                                        uint32_t *addr)
-{
-    struct kvm_one_reg cp0reg = {
-        .id = reg_id,
-        .addr = (uintptr_t)addr
-    };
-
-    return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg);
-}
-
-static inline int kvm_mips_get_one_ulreg(CPUState *cs, uint64_t reg_id,
-                                         target_ulong *addr)
-{
-    int ret;
-    uint64_t val64 = 0;
-    struct kvm_one_reg cp0reg = {
-        .id = reg_id,
-        .addr = (uintptr_t)&val64
-    };
-
-    ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg);
-    if (ret >= 0) {
-        *addr = val64;
-    }
-    return ret;
-}
-
-static inline int kvm_mips_get_one_reg64(CPUState *cs, uint64_t reg_id,
-                                         int64_t *addr)
-{
-    struct kvm_one_reg cp0reg = {
-        .id = reg_id,
-        .addr = (uintptr_t)addr
-    };
-
-    return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg);
-}
-
-static inline int kvm_mips_get_one_ureg64(CPUState *cs, uint64_t reg_id,
-                                          uint64_t *addr)
-{
-    struct kvm_one_reg cp0reg = {
-        .id = reg_id,
-        .addr = (uintptr_t)addr
-    };
-
-    return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg);
-}
-
-#define KVM_REG_MIPS_CP0_CONFIG_MASK    (1U << CP0C0_M)
-#define KVM_REG_MIPS_CP0_CONFIG1_MASK   ((1U << CP0C1_M) | \
-                                         (1U << CP0C1_FP))
-#define KVM_REG_MIPS_CP0_CONFIG2_MASK   (1U << CP0C2_M)
-#define KVM_REG_MIPS_CP0_CONFIG3_MASK   ((1U << CP0C3_M) | \
-                                         (1U << CP0C3_MSAP))
-#define KVM_REG_MIPS_CP0_CONFIG4_MASK   (1U << CP0C4_M)
-#define KVM_REG_MIPS_CP0_CONFIG5_MASK   ((1U << CP0C5_MSAEn) | \
-                                         (1U << CP0C5_UFE) | \
-                                         (1U << CP0C5_FRE) | \
-                                         (1U << CP0C5_UFR))
-#define KVM_REG_MIPS_CP0_CONFIG6_MASK   ((1U << CP0C6_BPPASS) | \
-                                         (0x3fU << CP0C6_KPOS) | \
-                                         (1U << CP0C6_KE) | \
-                                         (1U << CP0C6_VTLBONLY) | \
-                                         (1U << CP0C6_LASX) | \
-                                         (1U << CP0C6_SSEN) | \
-                                         (1U << CP0C6_DISDRTIME) | \
-                                         (1U << CP0C6_PIXNUEN) | \
-                                         (1U << CP0C6_SCRAND) | \
-                                         (1U << CP0C6_LLEXCEN) | \
-                                         (1U << CP0C6_DISVC) | \
-                                         (1U << CP0C6_VCLRU) | \
-                                         (1U << CP0C6_DCLRU) | \
-                                         (1U << CP0C6_PIXUEN) | \
-                                         (1U << CP0C6_DISBLKLYEN) | \
-                                         (1U << CP0C6_UMEMUALEN) | \
-                                         (1U << CP0C6_SFBEN) | \
-                                         (1U << CP0C6_FLTINT) | \
-                                         (1U << CP0C6_VLTINT) | \
-                                         (1U << CP0C6_DISBTB) | \
-                                         (3U << CP0C6_STPREFCTL) | \
-                                         (1U << CP0C6_INSTPREF) | \
-                                         (1U << CP0C6_DATAPREF))
-
-static inline int kvm_mips_change_one_reg(CPUState *cs, uint64_t reg_id,
-                                          int32_t *addr, int32_t mask)
-{
-    int err;
-    int32_t tmp, change;
-
-    err = kvm_mips_get_one_reg(cs, reg_id, &tmp);
-    if (err < 0) {
-        return err;
-    }
-
-    /* only change bits in mask */
-    change = (*addr ^ tmp) & mask;
-    if (!change) {
-        return 0;
-    }
-
-    tmp = tmp ^ change;
-    return kvm_mips_put_one_reg(cs, reg_id, &tmp);
-}
-
-/*
- * We freeze the KVM timer when either the VM clock is stopped or the state is
- * saved (the state is dirty).
- */
-
-/*
- * Save the state of the KVM timer when VM clock is stopped or state is synced
- * to QEMU.
- */
-static int kvm_mips_save_count(CPUState *cs)
-{
-    CPUMIPSState *env = cpu_env(cs);
-    uint64_t count_ctl;
-    int err, ret = 0;
-
-    /* freeze KVM timer */
-    err = kvm_mips_get_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get COUNT_CTL (%d)\n", __func__, err);
-        ret = err;
-    } else if (!(count_ctl & KVM_REG_MIPS_COUNT_CTL_DC)) {
-        count_ctl |= KVM_REG_MIPS_COUNT_CTL_DC;
-        err = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
-        if (err < 0) {
-            DPRINTF("%s: Failed to set COUNT_CTL.DC=1 (%d)\n", __func__, err);
-            ret = err;
-        }
-    }
-
-    /* read CP0_Cause */
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CAUSE, &env->CP0_Cause);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_CAUSE (%d)\n", __func__, err);
-        ret = err;
-    }
-
-    /* read CP0_Count */
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_COUNT, &env->CP0_Count);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_COUNT (%d)\n", __func__, err);
-        ret = err;
-    }
-
-    return ret;
-}
-
-/*
- * Restore the state of the KVM timer when VM clock is restarted or state is
- * synced to KVM.
- */
-static int kvm_mips_restore_count(CPUState *cs)
-{
-    CPUMIPSState *env = cpu_env(cs);
-    uint64_t count_ctl;
-    int err_dc, err, ret = 0;
-
-    /* check the timer is frozen */
-    err_dc = kvm_mips_get_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
-    if (err_dc < 0) {
-        DPRINTF("%s: Failed to get COUNT_CTL (%d)\n", __func__, err_dc);
-        ret = err_dc;
-    } else if (!(count_ctl & KVM_REG_MIPS_COUNT_CTL_DC)) {
-        /* freeze timer (sets COUNT_RESUME for us) */
-        count_ctl |= KVM_REG_MIPS_COUNT_CTL_DC;
-        err = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
-        if (err < 0) {
-            DPRINTF("%s: Failed to set COUNT_CTL.DC=1 (%d)\n", __func__, err);
-            ret = err;
-        }
-    }
-
-    /* load CP0_Cause */
-    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_CAUSE, &env->CP0_Cause);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_CAUSE (%d)\n", __func__, err);
-        ret = err;
-    }
-
-    /* load CP0_Count */
-    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_COUNT, &env->CP0_Count);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_COUNT (%d)\n", __func__, err);
-        ret = err;
-    }
-
-    /* resume KVM timer */
-    if (err_dc >= 0) {
-        count_ctl &= ~KVM_REG_MIPS_COUNT_CTL_DC;
-        err = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
-        if (err < 0) {
-            DPRINTF("%s: Failed to set COUNT_CTL.DC=0 (%d)\n", __func__, err);
-            ret = err;
-        }
-    }
-
-    return ret;
-}
-
-/*
- * Handle the VM clock being started or stopped
- */
-static void kvm_mips_update_state(void *opaque, bool running, RunState state)
-{
-    CPUState *cs = opaque;
-    int ret;
-    uint64_t count_resume;
-
-    /*
-     * If state is already dirty (synced to QEMU) then the KVM timer state is
-     * already saved and can be restored when it is synced back to KVM.
-     */
-    if (!running) {
-        if (!cs->vcpu_dirty) {
-            ret = kvm_mips_save_count(cs);
-            if (ret < 0) {
-                warn_report("Failed saving count");
-            }
-        }
-    } else {
-        /* Set clock restore time to now */
-        count_resume = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
-        ret = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_COUNT_RESUME,
-                                      &count_resume);
-        if (ret < 0) {
-            warn_report("Failed setting COUNT_RESUME");
-            return;
-        }
-
-        if (!cs->vcpu_dirty) {
-            ret = kvm_mips_restore_count(cs);
-            if (ret < 0) {
-                warn_report("Failed restoring count");
-            }
-        }
-    }
-}
-
-static int kvm_mips_put_fpu_registers(CPUState *cs, KvmPutState level)
-{
-    CPUMIPSState *env = cpu_env(cs);
-    int err, ret = 0;
-    unsigned int i;
-
-    /* Only put FPU state if we're emulating a CPU with an FPU */
-    if (env->CP0_Config1 & (1 << CP0C1_FP)) {
-        /* FPU Control Registers */
-        if (level == KVM_PUT_FULL_STATE) {
-            err = kvm_mips_put_one_ureg(cs, KVM_REG_MIPS_FCR_IR,
-                                        &env->active_fpu.fcr0);
-            if (err < 0) {
-                DPRINTF("%s: Failed to put FCR_IR (%d)\n", __func__, err);
-                ret = err;
-            }
-        }
-        err = kvm_mips_put_one_ureg(cs, KVM_REG_MIPS_FCR_CSR,
-                                    &env->active_fpu.fcr31);
-        if (err < 0) {
-            DPRINTF("%s: Failed to put FCR_CSR (%d)\n", __func__, err);
-            ret = err;
-        }
-
-        /*
-         * FPU register state is a subset of MSA vector state, so don't put FPU
-         * registers if we're emulating a CPU with MSA.
-         */
-        if (!ase_msa_available(env)) {
-            /* Floating point registers */
-            for (i = 0; i < 32; ++i) {
-                if (env->CP0_Status & (1 << CP0St_FR)) {
-                    err = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_FPR_64(i),
-                                                  &env->active_fpu.fpr[i].d);
-                } else {
-                    err = kvm_mips_get_one_ureg(cs, KVM_REG_MIPS_FPR_32(i),
-                                    &env->active_fpu.fpr[i].w[FP_ENDIAN_IDX]);
-                }
-                if (err < 0) {
-                    DPRINTF("%s: Failed to put FPR%u (%d)\n", __func__, i, 
err);
-                    ret = err;
-                }
-            }
-        }
-    }
-
-    /* Only put MSA state if we're emulating a CPU with MSA */
-    if (ase_msa_available(env)) {
-        /* MSA Control Registers */
-        if (level == KVM_PUT_FULL_STATE) {
-            err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_MSA_IR,
-                                       &env->msair);
-            if (err < 0) {
-                DPRINTF("%s: Failed to put MSA_IR (%d)\n", __func__, err);
-                ret = err;
-            }
-        }
-        err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_MSA_CSR,
-                                   &env->active_tc.msacsr);
-        if (err < 0) {
-            DPRINTF("%s: Failed to put MSA_CSR (%d)\n", __func__, err);
-            ret = err;
-        }
-
-        /* Vector registers (includes FP registers) */
-        for (i = 0; i < 32; ++i) {
-            /* Big endian MSA not supported by QEMU yet anyway */
-            err = kvm_mips_put_one_reg64(cs, KVM_REG_MIPS_VEC_128(i),
-                                         env->active_fpu.fpr[i].wr.d);
-            if (err < 0) {
-                DPRINTF("%s: Failed to put VEC%u (%d)\n", __func__, i, err);
-                ret = err;
-            }
-        }
-    }
-
-    return ret;
-}
-
-static int kvm_mips_get_fpu_registers(CPUState *cs)
-{
-    CPUMIPSState *env = cpu_env(cs);
-    int err, ret = 0;
-    unsigned int i;
-
-    /* Only get FPU state if we're emulating a CPU with an FPU */
-    if (env->CP0_Config1 & (1 << CP0C1_FP)) {
-        /* FPU Control Registers */
-        err = kvm_mips_get_one_ureg(cs, KVM_REG_MIPS_FCR_IR,
-                                    &env->active_fpu.fcr0);
-        if (err < 0) {
-            DPRINTF("%s: Failed to get FCR_IR (%d)\n", __func__, err);
-            ret = err;
-        }
-        err = kvm_mips_get_one_ureg(cs, KVM_REG_MIPS_FCR_CSR,
-                                    &env->active_fpu.fcr31);
-        if (err < 0) {
-            DPRINTF("%s: Failed to get FCR_CSR (%d)\n", __func__, err);
-            ret = err;
-        } else {
-            restore_fp_status(env);
-        }
-
-        /*
-         * FPU register state is a subset of MSA vector state, so don't save 
FPU
-         * registers if we're emulating a CPU with MSA.
-         */
-        if (!ase_msa_available(env)) {
-            /* Floating point registers */
-            for (i = 0; i < 32; ++i) {
-                if (env->CP0_Status & (1 << CP0St_FR)) {
-                    err = kvm_mips_get_one_ureg64(cs, KVM_REG_MIPS_FPR_64(i),
-                                                  &env->active_fpu.fpr[i].d);
-                } else {
-                    err = kvm_mips_get_one_ureg(cs, KVM_REG_MIPS_FPR_32(i),
-                                    &env->active_fpu.fpr[i].w[FP_ENDIAN_IDX]);
-                }
-                if (err < 0) {
-                    DPRINTF("%s: Failed to get FPR%u (%d)\n", __func__, i, 
err);
-                    ret = err;
-                }
-            }
-        }
-    }
-
-    /* Only get MSA state if we're emulating a CPU with MSA */
-    if (ase_msa_available(env)) {
-        /* MSA Control Registers */
-        err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_MSA_IR,
-                                   &env->msair);
-        if (err < 0) {
-            DPRINTF("%s: Failed to get MSA_IR (%d)\n", __func__, err);
-            ret = err;
-        }
-        err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_MSA_CSR,
-                                   &env->active_tc.msacsr);
-        if (err < 0) {
-            DPRINTF("%s: Failed to get MSA_CSR (%d)\n", __func__, err);
-            ret = err;
-        } else {
-            restore_msa_fp_status(env);
-        }
-
-        /* Vector registers (includes FP registers) */
-        for (i = 0; i < 32; ++i) {
-            /* Big endian MSA not supported by QEMU yet anyway */
-            err = kvm_mips_get_one_reg64(cs, KVM_REG_MIPS_VEC_128(i),
-                                         env->active_fpu.fpr[i].wr.d);
-            if (err < 0) {
-                DPRINTF("%s: Failed to get VEC%u (%d)\n", __func__, i, err);
-                ret = err;
-            }
-        }
-    }
-
-    return ret;
-}
-
-
-static int kvm_mips_put_cp0_registers(CPUState *cs, KvmPutState level)
-{
-    CPUMIPSState *env = cpu_env(cs);
-    int err, ret = 0;
-
-    (void)level;
-
-    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_INDEX, &env->CP0_Index);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_INDEX (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_RANDOM, &env->CP0_Random);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_RANDOM (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_CONTEXT,
-                                 &env->CP0_Context);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_CONTEXT (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_USERLOCAL,
-                                 &env->active_tc.CP0_UserLocal);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_USERLOCAL (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_PAGEMASK,
-                               &env->CP0_PageMask);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_PAGEMASK (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_PAGEGRAIN,
-                               &env->CP0_PageGrain);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_PAGEGRAIN (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_PWBASE,
-                               &env->CP0_PWBase);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_PWBASE (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_PWFIELD,
-                               &env->CP0_PWField);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_PWField (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_PWSIZE,
-                               &env->CP0_PWSize);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_PWSIZE (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_WIRED, &env->CP0_Wired);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_WIRED (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_PWCTL, &env->CP0_PWCtl);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_PWCTL (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_HWRENA, &env->CP0_HWREna);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_HWRENA (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_BADVADDR,
-                                 &env->CP0_BadVAddr);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_BADVADDR (%d)\n", __func__, err);
-        ret = err;
-    }
-
-    /* If VM clock stopped then state will be restored when it is restarted */
-    if (runstate_is_running()) {
-        err = kvm_mips_restore_count(cs);
-        if (err < 0) {
-            ret = err;
-        }
-    }
-
-    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_ENTRYHI,
-                                 &env->CP0_EntryHi);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_ENTRYHI (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_COMPARE,
-                               &env->CP0_Compare);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_COMPARE (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_STATUS, &env->CP0_Status);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_STATUS (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_EPC, &env->CP0_EPC);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_EPC (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_PRID, &env->CP0_PRid);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_PRID (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_EBASE, &env->CP0_EBase);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_EBASE (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG,
-                                  &env->CP0_Config0,
-                                  KVM_REG_MIPS_CP0_CONFIG_MASK);
-    if (err < 0) {
-        DPRINTF("%s: Failed to change CP0_CONFIG (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG1,
-                                  &env->CP0_Config1,
-                                  KVM_REG_MIPS_CP0_CONFIG1_MASK);
-    if (err < 0) {
-        DPRINTF("%s: Failed to change CP0_CONFIG1 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG2,
-                                  &env->CP0_Config2,
-                                  KVM_REG_MIPS_CP0_CONFIG2_MASK);
-    if (err < 0) {
-        DPRINTF("%s: Failed to change CP0_CONFIG2 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG3,
-                                  &env->CP0_Config3,
-                                  KVM_REG_MIPS_CP0_CONFIG3_MASK);
-    if (err < 0) {
-        DPRINTF("%s: Failed to change CP0_CONFIG3 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG4,
-                                  &env->CP0_Config4,
-                                  KVM_REG_MIPS_CP0_CONFIG4_MASK);
-    if (err < 0) {
-        DPRINTF("%s: Failed to change CP0_CONFIG4 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG5,
-                                  &env->CP0_Config5,
-                                  KVM_REG_MIPS_CP0_CONFIG5_MASK);
-    if (err < 0) {
-        DPRINTF("%s: Failed to change CP0_CONFIG5 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG6,
-                                  &env->CP0_Config6,
-                                  KVM_REG_MIPS_CP0_CONFIG6_MASK);
-    if (err < 0) {
-        DPRINTF("%s: Failed to change CP0_CONFIG6 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_XCONTEXT,
-                                 &env->CP0_XContext);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_XCONTEXT (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_ERROREPC,
-                                 &env->CP0_ErrorEPC);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_ERROREPC (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH1,
-                                 &env->CP0_KScratch[0]);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_KSCRATCH1 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH2,
-                                 &env->CP0_KScratch[1]);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_KSCRATCH2 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH3,
-                                 &env->CP0_KScratch[2]);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_KSCRATCH3 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH4,
-                                 &env->CP0_KScratch[3]);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_KSCRATCH4 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH5,
-                                 &env->CP0_KScratch[4]);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_KSCRATCH5 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH6,
-                                 &env->CP0_KScratch[5]);
-    if (err < 0) {
-        DPRINTF("%s: Failed to put CP0_KSCRATCH6 (%d)\n", __func__, err);
-        ret = err;
-    }
-
-    return ret;
-}
-
-static int kvm_mips_get_cp0_registers(CPUState *cs)
-{
-    CPUMIPSState *env = cpu_env(cs);
-    int err, ret = 0;
-
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_INDEX, &env->CP0_Index);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_INDEX (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_RANDOM, &env->CP0_Random);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_RANDOM (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_CONTEXT,
-                                 &env->CP0_Context);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_CONTEXT (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_USERLOCAL,
-                                 &env->active_tc.CP0_UserLocal);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_USERLOCAL (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_PAGEMASK,
-                               &env->CP0_PageMask);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_PAGEMASK (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_PAGEGRAIN,
-                               &env->CP0_PageGrain);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_PAGEGRAIN (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_PWBASE,
-                               &env->CP0_PWBase);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_PWBASE (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_PWFIELD,
-                               &env->CP0_PWField);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_PWFIELD (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_PWSIZE,
-                               &env->CP0_PWSize);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_PWSIZE (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_WIRED, &env->CP0_Wired);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_WIRED (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_PWCTL, &env->CP0_PWCtl);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_PWCtl (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_HWRENA, &env->CP0_HWREna);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_HWRENA (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_BADVADDR,
-                                 &env->CP0_BadVAddr);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_BADVADDR (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_ENTRYHI,
-                                 &env->CP0_EntryHi);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_ENTRYHI (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_COMPARE,
-                               &env->CP0_Compare);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_COMPARE (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_STATUS, &env->CP0_Status);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_STATUS (%d)\n", __func__, err);
-        ret = err;
-    }
-
-    /* If VM clock stopped then state was already saved when it was stopped */
-    if (runstate_is_running()) {
-        err = kvm_mips_save_count(cs);
-        if (err < 0) {
-            ret = err;
-        }
-    }
-
-    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_EPC, &env->CP0_EPC);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_EPC (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_PRID, &env->CP0_PRid);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_PRID (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_EBASE, &env->CP0_EBase);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_EBASE (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG, &env->CP0_Config0);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_CONFIG (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG1, 
&env->CP0_Config1);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_CONFIG1 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG2, 
&env->CP0_Config2);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_CONFIG2 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG3, 
&env->CP0_Config3);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_CONFIG3 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG4, 
&env->CP0_Config4);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_CONFIG4 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG5, 
&env->CP0_Config5);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_CONFIG5 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG6, 
&env->CP0_Config6);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_CONFIG6 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_XCONTEXT,
-                                 &env->CP0_XContext);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_XCONTEXT (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_ERROREPC,
-                                 &env->CP0_ErrorEPC);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_ERROREPC (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH1,
-                                 &env->CP0_KScratch[0]);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_KSCRATCH1 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH2,
-                                 &env->CP0_KScratch[1]);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_KSCRATCH2 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH3,
-                                 &env->CP0_KScratch[2]);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_KSCRATCH3 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH4,
-                                 &env->CP0_KScratch[3]);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_KSCRATCH4 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH5,
-                                 &env->CP0_KScratch[4]);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_KSCRATCH5 (%d)\n", __func__, err);
-        ret = err;
-    }
-    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH6,
-                                 &env->CP0_KScratch[5]);
-    if (err < 0) {
-        DPRINTF("%s: Failed to get CP0_KSCRATCH6 (%d)\n", __func__, err);
-        ret = err;
-    }
-
-    return ret;
-}
-
-int kvm_arch_put_registers(CPUState *cs, KvmPutState level, Error **errp)
-{
-    CPUMIPSState *env = cpu_env(cs);
-    struct kvm_regs regs;
-    int ret;
-    int i;
-
-    /* Set the registers based on QEMU's view of things */
-    for (i = 0; i < 32; i++) {
-        regs.gpr[i] = (int64_t)(target_long)env->active_tc.gpr[i];
-    }
-
-    regs.hi = (int64_t)(target_long)env->active_tc.HI[0];
-    regs.lo = (int64_t)(target_long)env->active_tc.LO[0];
-    regs.pc = (int64_t)(target_long)env->active_tc.PC;
-
-    ret = kvm_vcpu_ioctl(cs, KVM_SET_REGS, &regs);
-
-    if (ret < 0) {
-        return ret;
-    }
-
-    ret = kvm_mips_put_cp0_registers(cs, level);
-    if (ret < 0) {
-        return ret;
-    }
-
-    ret = kvm_mips_put_fpu_registers(cs, level);
-    if (ret < 0) {
-        return ret;
-    }
-
-    return ret;
-}
-
-int kvm_arch_get_registers(CPUState *cs, Error **errp)
-{
-    CPUMIPSState *env = cpu_env(cs);
-    int ret = 0;
-    struct kvm_regs regs;
-    int i;
-
-    /* Get the current register set as KVM seems it */
-    ret = kvm_vcpu_ioctl(cs, KVM_GET_REGS, &regs);
-
-    if (ret < 0) {
-        return ret;
-    }
-
-    for (i = 0; i < 32; i++) {
-        env->active_tc.gpr[i] = regs.gpr[i];
-    }
-
-    env->active_tc.HI[0] = regs.hi;
-    env->active_tc.LO[0] = regs.lo;
-    env->active_tc.PC = regs.pc;
-
-    kvm_mips_get_cp0_registers(cs);
-    kvm_mips_get_fpu_registers(cs);
-
-    return ret;
-}
-
-int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route,
-                             uint64_t address, uint32_t data, PCIDevice *dev)
-{
-    return 0;
-}
-
-int kvm_arch_add_msi_route_post(struct kvm_irq_routing_entry *route,
-                                int vector, PCIDevice *dev)
-{
-    return 0;
-}
-
-int kvm_arch_release_virq_post(int virq)
-{
-    return 0;
-}
-
-int kvm_arch_msi_data_to_gsi(uint32_t data)
-{
-    abort();
-}
-
-int kvm_arch_get_default_type(MachineState *machine)
-{
-#if defined(KVM_CAP_MIPS_VZ)
-    int r;
-    KVMState *s = KVM_STATE(machine->accelerator);
-
-    r = kvm_check_extension(s, KVM_CAP_MIPS_VZ);
-    if (r > 0) {
-        return KVM_VM_MIPS_VZ;
-    }
-#endif
-
-    error_report("KVM_VM_MIPS_VZ type is not available");
-    return -1;
-}
-
-void kvm_arch_accel_class_init(ObjectClass *oc)
-{
-}
diff --git a/target/mips/system/cp0_timer.c b/target/mips/system/cp0_timer.c
index 634c2a66bbd..6aed5d3af24 100644
--- a/target/mips/system/cp0_timer.c
+++ b/target/mips/system/cp0_timer.c
@@ -23,7 +23,6 @@
 #include "qemu/osdep.h"
 #include "hw/core/irq.h"
 #include "qemu/timer.h"
-#include "system/kvm.h"
 #include "internal.h"
 
 /* MIPS R4K timer */
@@ -84,8 +83,7 @@ void cpu_mips_store_count(CPUMIPSState *env, uint32_t count)
 {
     /*
      * This gets called from cpu_state_reset(), potentially before timer init.
-     * So env->timer may be NULL, which is also the case with KVM enabled so
-     * treat timer as disabled in that case.
+     * So env->timer may be NULL, so treat timer as disabled in that case.
      */
     MIPSCPU *cpu = env_archcpu(env);
     if (env->CP0_Cause & (1 << CP0Ca_DC) || !env->timer) {
@@ -141,11 +139,5 @@ void cpu_mips_clock_init(MIPSCPU *cpu)
 {
     CPUMIPSState *env = &cpu->env;
 
-    /*
-     * If we're in KVM mode, don't create the periodic timer, that is handled 
in
-     * kernel.
-     */
-    if (!kvm_enabled()) {
-        env->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, &mips_timer_cb, env);
-    }
+    env->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, &mips_timer_cb, env);
 }
diff --git a/target/mips/system/physaddr.c b/target/mips/system/physaddr.c
index fbbbcf6e006..746dbf8aa4e 100644
--- a/target/mips/system/physaddr.c
+++ b/target/mips/system/physaddr.c
@@ -126,7 +126,6 @@ int get_physical_address(CPUMIPSState *env, hwaddr 
*physical,
     int KX = (env->CP0_Status & (1 << CP0St_KX)) != 0;
 #endif
     int ret = TLBRET_MATCH;
-    /* effective address (modified for KVM T&E kernel segments) */
     target_ulong address = real_address;
 
     if (address <= USEG_LIMIT) {
diff --git a/target/mips/meson.build b/target/mips/meson.build
index abf0ce3e8b9..5acb3a2dcf5 100644
--- a/target/mips/meson.build
+++ b/target/mips/meson.build
@@ -13,11 +13,7 @@ if have_system
   subdir('system')
 endif
 
-if 'CONFIG_TCG' in config_all_accel
-  subdir('tcg')
-endif
-
-mips_ss.add(when: 'CONFIG_KVM', if_true: files('kvm.c'))
+subdir('tcg')
 
 target_arch += {'mips': mips_ss}
 target_system_arch += {'mips': mips_system_ss}
-- 
2.53.0


Reply via email to