cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

kvm.c (41826B)


      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: MIPS specific KVM APIs
      7 *
      8 * Copyright (C) 2012-2014 Imagination Technologies Ltd.
      9 * Authors: Sanjay Lal <sanjayl@kymasys.com>
     10*/
     11
     12#include "qemu/osdep.h"
     13#include <sys/ioctl.h>
     14
     15#include <linux/kvm.h>
     16
     17#include "qemu-common.h"
     18#include "cpu.h"
     19#include "internal.h"
     20#include "qemu/error-report.h"
     21#include "qemu/main-loop.h"
     22#include "sysemu/kvm.h"
     23#include "sysemu/kvm_int.h"
     24#include "sysemu/runstate.h"
     25#include "kvm_mips.h"
     26#include "hw/boards.h"
     27#include "fpu_helper.h"
     28
     29#define DEBUG_KVM 0
     30
     31#define DPRINTF(fmt, ...) \
     32    do { if (DEBUG_KVM) { fprintf(stderr, fmt, ## __VA_ARGS__); } } while (0)
     33
     34static int kvm_mips_fpu_cap;
     35static int kvm_mips_msa_cap;
     36
     37const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
     38    KVM_CAP_LAST_INFO
     39};
     40
     41static void kvm_mips_update_state(void *opaque, bool running, RunState state);
     42
     43unsigned long kvm_arch_vcpu_id(CPUState *cs)
     44{
     45    return cs->cpu_index;
     46}
     47
     48int kvm_arch_init(MachineState *ms, KVMState *s)
     49{
     50    /* MIPS has 128 signals */
     51    kvm_set_sigmask_len(s, 16);
     52
     53    kvm_mips_fpu_cap = kvm_check_extension(s, KVM_CAP_MIPS_FPU);
     54    kvm_mips_msa_cap = kvm_check_extension(s, KVM_CAP_MIPS_MSA);
     55
     56    DPRINTF("%s\n", __func__);
     57    return 0;
     58}
     59
     60int kvm_arch_irqchip_create(KVMState *s)
     61{
     62    return 0;
     63}
     64
     65int kvm_arch_init_vcpu(CPUState *cs)
     66{
     67    MIPSCPU *cpu = MIPS_CPU(cs);
     68    CPUMIPSState *env = &cpu->env;
     69    int ret = 0;
     70
     71    qemu_add_vm_change_state_handler(kvm_mips_update_state, cs);
     72
     73    if (kvm_mips_fpu_cap && env->CP0_Config1 & (1 << CP0C1_FP)) {
     74        ret = kvm_vcpu_enable_cap(cs, KVM_CAP_MIPS_FPU, 0, 0);
     75        if (ret < 0) {
     76            /* mark unsupported so it gets disabled on reset */
     77            kvm_mips_fpu_cap = 0;
     78            ret = 0;
     79        }
     80    }
     81
     82    if (kvm_mips_msa_cap && ase_msa_available(env)) {
     83        ret = kvm_vcpu_enable_cap(cs, KVM_CAP_MIPS_MSA, 0, 0);
     84        if (ret < 0) {
     85            /* mark unsupported so it gets disabled on reset */
     86            kvm_mips_msa_cap = 0;
     87            ret = 0;
     88        }
     89    }
     90
     91    DPRINTF("%s\n", __func__);
     92    return ret;
     93}
     94
     95int kvm_arch_destroy_vcpu(CPUState *cs)
     96{
     97    return 0;
     98}
     99
    100void kvm_mips_reset_vcpu(MIPSCPU *cpu)
    101{
    102    CPUMIPSState *env = &cpu->env;
    103
    104    if (!kvm_mips_fpu_cap && env->CP0_Config1 & (1 << CP0C1_FP)) {
    105        warn_report("KVM does not support FPU, disabling");
    106        env->CP0_Config1 &= ~(1 << CP0C1_FP);
    107    }
    108    if (!kvm_mips_msa_cap && ase_msa_available(env)) {
    109        warn_report("KVM does not support MSA, disabling");
    110        env->CP0_Config3 &= ~(1 << CP0C3_MSAP);
    111    }
    112
    113    DPRINTF("%s\n", __func__);
    114}
    115
    116int kvm_arch_insert_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
    117{
    118    DPRINTF("%s\n", __func__);
    119    return 0;
    120}
    121
    122int kvm_arch_remove_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
    123{
    124    DPRINTF("%s\n", __func__);
    125    return 0;
    126}
    127
    128static inline int cpu_mips_io_interrupts_pending(MIPSCPU *cpu)
    129{
    130    CPUMIPSState *env = &cpu->env;
    131
    132    return env->CP0_Cause & (0x1 << (2 + CP0Ca_IP));
    133}
    134
    135
    136void kvm_arch_pre_run(CPUState *cs, struct kvm_run *run)
    137{
    138    MIPSCPU *cpu = MIPS_CPU(cs);
    139    int r;
    140    struct kvm_mips_interrupt intr;
    141
    142    qemu_mutex_lock_iothread();
    143
    144    if ((cs->interrupt_request & CPU_INTERRUPT_HARD) &&
    145            cpu_mips_io_interrupts_pending(cpu)) {
    146        intr.cpu = -1;
    147        intr.irq = 2;
    148        r = kvm_vcpu_ioctl(cs, KVM_INTERRUPT, &intr);
    149        if (r < 0) {
    150            error_report("%s: cpu %d: failed to inject IRQ %x",
    151                         __func__, cs->cpu_index, intr.irq);
    152        }
    153    }
    154
    155    qemu_mutex_unlock_iothread();
    156}
    157
    158MemTxAttrs kvm_arch_post_run(CPUState *cs, struct kvm_run *run)
    159{
    160    return MEMTXATTRS_UNSPECIFIED;
    161}
    162
    163int kvm_arch_process_async_events(CPUState *cs)
    164{
    165    return cs->halted;
    166}
    167
    168int kvm_arch_handle_exit(CPUState *cs, struct kvm_run *run)
    169{
    170    int ret;
    171
    172    DPRINTF("%s\n", __func__);
    173    switch (run->exit_reason) {
    174    default:
    175        error_report("%s: unknown exit reason %d",
    176                     __func__, run->exit_reason);
    177        ret = -1;
    178        break;
    179    }
    180
    181    return ret;
    182}
    183
    184bool kvm_arch_stop_on_emulation_error(CPUState *cs)
    185{
    186    DPRINTF("%s\n", __func__);
    187    return true;
    188}
    189
    190void kvm_arch_init_irq_routing(KVMState *s)
    191{
    192}
    193
    194int kvm_mips_set_interrupt(MIPSCPU *cpu, int irq, int level)
    195{
    196    CPUState *cs = CPU(cpu);
    197    struct kvm_mips_interrupt intr;
    198
    199    assert(kvm_enabled());
    200
    201    intr.cpu = -1;
    202
    203    if (level) {
    204        intr.irq = irq;
    205    } else {
    206        intr.irq = -irq;
    207    }
    208
    209    kvm_vcpu_ioctl(cs, KVM_INTERRUPT, &intr);
    210
    211    return 0;
    212}
    213
    214int kvm_mips_set_ipi_interrupt(MIPSCPU *cpu, int irq, int level)
    215{
    216    CPUState *cs = current_cpu;
    217    CPUState *dest_cs = CPU(cpu);
    218    struct kvm_mips_interrupt intr;
    219
    220    assert(kvm_enabled());
    221
    222    intr.cpu = dest_cs->cpu_index;
    223
    224    if (level) {
    225        intr.irq = irq;
    226    } else {
    227        intr.irq = -irq;
    228    }
    229
    230    DPRINTF("%s: CPU %d, IRQ: %d\n", __func__, intr.cpu, intr.irq);
    231
    232    kvm_vcpu_ioctl(cs, KVM_INTERRUPT, &intr);
    233
    234    return 0;
    235}
    236
    237#define MIPS_CP0_32(_R, _S)                                     \
    238    (KVM_REG_MIPS_CP0 | KVM_REG_SIZE_U32 | (8 * (_R) + (_S)))
    239
    240#define MIPS_CP0_64(_R, _S)                                     \
    241    (KVM_REG_MIPS_CP0 | KVM_REG_SIZE_U64 | (8 * (_R) + (_S)))
    242
    243#define KVM_REG_MIPS_CP0_INDEX          MIPS_CP0_32(0, 0)
    244#define KVM_REG_MIPS_CP0_RANDOM         MIPS_CP0_32(1, 0)
    245#define KVM_REG_MIPS_CP0_CONTEXT        MIPS_CP0_64(4, 0)
    246#define KVM_REG_MIPS_CP0_USERLOCAL      MIPS_CP0_64(4, 2)
    247#define KVM_REG_MIPS_CP0_PAGEMASK       MIPS_CP0_32(5, 0)
    248#define KVM_REG_MIPS_CP0_PAGEGRAIN      MIPS_CP0_32(5, 1)
    249#define KVM_REG_MIPS_CP0_PWBASE         MIPS_CP0_64(5, 5)
    250#define KVM_REG_MIPS_CP0_PWFIELD        MIPS_CP0_64(5, 6)
    251#define KVM_REG_MIPS_CP0_PWSIZE         MIPS_CP0_64(5, 7)
    252#define KVM_REG_MIPS_CP0_WIRED          MIPS_CP0_32(6, 0)
    253#define KVM_REG_MIPS_CP0_PWCTL          MIPS_CP0_32(6, 6)
    254#define KVM_REG_MIPS_CP0_HWRENA         MIPS_CP0_32(7, 0)
    255#define KVM_REG_MIPS_CP0_BADVADDR       MIPS_CP0_64(8, 0)
    256#define KVM_REG_MIPS_CP0_COUNT          MIPS_CP0_32(9, 0)
    257#define KVM_REG_MIPS_CP0_ENTRYHI        MIPS_CP0_64(10, 0)
    258#define KVM_REG_MIPS_CP0_COMPARE        MIPS_CP0_32(11, 0)
    259#define KVM_REG_MIPS_CP0_STATUS         MIPS_CP0_32(12, 0)
    260#define KVM_REG_MIPS_CP0_CAUSE          MIPS_CP0_32(13, 0)
    261#define KVM_REG_MIPS_CP0_EPC            MIPS_CP0_64(14, 0)
    262#define KVM_REG_MIPS_CP0_PRID           MIPS_CP0_32(15, 0)
    263#define KVM_REG_MIPS_CP0_EBASE          MIPS_CP0_64(15, 1)
    264#define KVM_REG_MIPS_CP0_CONFIG         MIPS_CP0_32(16, 0)
    265#define KVM_REG_MIPS_CP0_CONFIG1        MIPS_CP0_32(16, 1)
    266#define KVM_REG_MIPS_CP0_CONFIG2        MIPS_CP0_32(16, 2)
    267#define KVM_REG_MIPS_CP0_CONFIG3        MIPS_CP0_32(16, 3)
    268#define KVM_REG_MIPS_CP0_CONFIG4        MIPS_CP0_32(16, 4)
    269#define KVM_REG_MIPS_CP0_CONFIG5        MIPS_CP0_32(16, 5)
    270#define KVM_REG_MIPS_CP0_CONFIG6        MIPS_CP0_32(16, 6)
    271#define KVM_REG_MIPS_CP0_XCONTEXT       MIPS_CP0_64(20, 0)
    272#define KVM_REG_MIPS_CP0_ERROREPC       MIPS_CP0_64(30, 0)
    273#define KVM_REG_MIPS_CP0_KSCRATCH1      MIPS_CP0_64(31, 2)
    274#define KVM_REG_MIPS_CP0_KSCRATCH2      MIPS_CP0_64(31, 3)
    275#define KVM_REG_MIPS_CP0_KSCRATCH3      MIPS_CP0_64(31, 4)
    276#define KVM_REG_MIPS_CP0_KSCRATCH4      MIPS_CP0_64(31, 5)
    277#define KVM_REG_MIPS_CP0_KSCRATCH5      MIPS_CP0_64(31, 6)
    278#define KVM_REG_MIPS_CP0_KSCRATCH6      MIPS_CP0_64(31, 7)
    279
    280static inline int kvm_mips_put_one_reg(CPUState *cs, uint64_t reg_id,
    281                                       int32_t *addr)
    282{
    283    struct kvm_one_reg cp0reg = {
    284        .id = reg_id,
    285        .addr = (uintptr_t)addr
    286    };
    287
    288    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg);
    289}
    290
    291static inline int kvm_mips_put_one_ureg(CPUState *cs, uint64_t reg_id,
    292                                        uint32_t *addr)
    293{
    294    struct kvm_one_reg cp0reg = {
    295        .id = reg_id,
    296        .addr = (uintptr_t)addr
    297    };
    298
    299    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg);
    300}
    301
    302static inline int kvm_mips_put_one_ulreg(CPUState *cs, uint64_t reg_id,
    303                                         target_ulong *addr)
    304{
    305    uint64_t val64 = *addr;
    306    struct kvm_one_reg cp0reg = {
    307        .id = reg_id,
    308        .addr = (uintptr_t)&val64
    309    };
    310
    311    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg);
    312}
    313
    314static inline int kvm_mips_put_one_reg64(CPUState *cs, uint64_t reg_id,
    315                                         int64_t *addr)
    316{
    317    struct kvm_one_reg cp0reg = {
    318        .id = reg_id,
    319        .addr = (uintptr_t)addr
    320    };
    321
    322    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg);
    323}
    324
    325static inline int kvm_mips_put_one_ureg64(CPUState *cs, uint64_t reg_id,
    326                                          uint64_t *addr)
    327{
    328    struct kvm_one_reg cp0reg = {
    329        .id = reg_id,
    330        .addr = (uintptr_t)addr
    331    };
    332
    333    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg);
    334}
    335
    336static inline int kvm_mips_get_one_reg(CPUState *cs, uint64_t reg_id,
    337                                       int32_t *addr)
    338{
    339    struct kvm_one_reg cp0reg = {
    340        .id = reg_id,
    341        .addr = (uintptr_t)addr
    342    };
    343
    344    return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg);
    345}
    346
    347static inline int kvm_mips_get_one_ureg(CPUState *cs, uint64_t reg_id,
    348                                        uint32_t *addr)
    349{
    350    struct kvm_one_reg cp0reg = {
    351        .id = reg_id,
    352        .addr = (uintptr_t)addr
    353    };
    354
    355    return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg);
    356}
    357
    358static inline int kvm_mips_get_one_ulreg(CPUState *cs, uint64_t reg_id,
    359                                         target_ulong *addr)
    360{
    361    int ret;
    362    uint64_t val64 = 0;
    363    struct kvm_one_reg cp0reg = {
    364        .id = reg_id,
    365        .addr = (uintptr_t)&val64
    366    };
    367
    368    ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg);
    369    if (ret >= 0) {
    370        *addr = val64;
    371    }
    372    return ret;
    373}
    374
    375static inline int kvm_mips_get_one_reg64(CPUState *cs, uint64_t reg_id,
    376                                         int64_t *addr)
    377{
    378    struct kvm_one_reg cp0reg = {
    379        .id = reg_id,
    380        .addr = (uintptr_t)addr
    381    };
    382
    383    return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg);
    384}
    385
    386static inline int kvm_mips_get_one_ureg64(CPUState *cs, uint64_t reg_id,
    387                                          uint64_t *addr)
    388{
    389    struct kvm_one_reg cp0reg = {
    390        .id = reg_id,
    391        .addr = (uintptr_t)addr
    392    };
    393
    394    return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg);
    395}
    396
    397#define KVM_REG_MIPS_CP0_CONFIG_MASK    (1U << CP0C0_M)
    398#define KVM_REG_MIPS_CP0_CONFIG1_MASK   ((1U << CP0C1_M) | \
    399                                         (1U << CP0C1_FP))
    400#define KVM_REG_MIPS_CP0_CONFIG2_MASK   (1U << CP0C2_M)
    401#define KVM_REG_MIPS_CP0_CONFIG3_MASK   ((1U << CP0C3_M) | \
    402                                         (1U << CP0C3_MSAP))
    403#define KVM_REG_MIPS_CP0_CONFIG4_MASK   (1U << CP0C4_M)
    404#define KVM_REG_MIPS_CP0_CONFIG5_MASK   ((1U << CP0C5_MSAEn) | \
    405                                         (1U << CP0C5_UFE) | \
    406                                         (1U << CP0C5_FRE) | \
    407                                         (1U << CP0C5_UFR))
    408#define KVM_REG_MIPS_CP0_CONFIG6_MASK   ((1U << CP0C6_BPPASS) | \
    409                                         (0x3fU << CP0C6_KPOS) | \
    410                                         (1U << CP0C6_KE) | \
    411                                         (1U << CP0C6_VTLBONLY) | \
    412                                         (1U << CP0C6_LASX) | \
    413                                         (1U << CP0C6_SSEN) | \
    414                                         (1U << CP0C6_DISDRTIME) | \
    415                                         (1U << CP0C6_PIXNUEN) | \
    416                                         (1U << CP0C6_SCRAND) | \
    417                                         (1U << CP0C6_LLEXCEN) | \
    418                                         (1U << CP0C6_DISVC) | \
    419                                         (1U << CP0C6_VCLRU) | \
    420                                         (1U << CP0C6_DCLRU) | \
    421                                         (1U << CP0C6_PIXUEN) | \
    422                                         (1U << CP0C6_DISBLKLYEN) | \
    423                                         (1U << CP0C6_UMEMUALEN) | \
    424                                         (1U << CP0C6_SFBEN) | \
    425                                         (1U << CP0C6_FLTINT) | \
    426                                         (1U << CP0C6_VLTINT) | \
    427                                         (1U << CP0C6_DISBTB) | \
    428                                         (3U << CP0C6_STPREFCTL) | \
    429                                         (1U << CP0C6_INSTPREF) | \
    430                                         (1U << CP0C6_DATAPREF))
    431
    432static inline int kvm_mips_change_one_reg(CPUState *cs, uint64_t reg_id,
    433                                          int32_t *addr, int32_t mask)
    434{
    435    int err;
    436    int32_t tmp, change;
    437
    438    err = kvm_mips_get_one_reg(cs, reg_id, &tmp);
    439    if (err < 0) {
    440        return err;
    441    }
    442
    443    /* only change bits in mask */
    444    change = (*addr ^ tmp) & mask;
    445    if (!change) {
    446        return 0;
    447    }
    448
    449    tmp = tmp ^ change;
    450    return kvm_mips_put_one_reg(cs, reg_id, &tmp);
    451}
    452
    453/*
    454 * We freeze the KVM timer when either the VM clock is stopped or the state is
    455 * saved (the state is dirty).
    456 */
    457
    458/*
    459 * Save the state of the KVM timer when VM clock is stopped or state is synced
    460 * to QEMU.
    461 */
    462static int kvm_mips_save_count(CPUState *cs)
    463{
    464    MIPSCPU *cpu = MIPS_CPU(cs);
    465    CPUMIPSState *env = &cpu->env;
    466    uint64_t count_ctl;
    467    int err, ret = 0;
    468
    469    /* freeze KVM timer */
    470    err = kvm_mips_get_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
    471    if (err < 0) {
    472        DPRINTF("%s: Failed to get COUNT_CTL (%d)\n", __func__, err);
    473        ret = err;
    474    } else if (!(count_ctl & KVM_REG_MIPS_COUNT_CTL_DC)) {
    475        count_ctl |= KVM_REG_MIPS_COUNT_CTL_DC;
    476        err = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
    477        if (err < 0) {
    478            DPRINTF("%s: Failed to set COUNT_CTL.DC=1 (%d)\n", __func__, err);
    479            ret = err;
    480        }
    481    }
    482
    483    /* read CP0_Cause */
    484    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CAUSE, &env->CP0_Cause);
    485    if (err < 0) {
    486        DPRINTF("%s: Failed to get CP0_CAUSE (%d)\n", __func__, err);
    487        ret = err;
    488    }
    489
    490    /* read CP0_Count */
    491    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_COUNT, &env->CP0_Count);
    492    if (err < 0) {
    493        DPRINTF("%s: Failed to get CP0_COUNT (%d)\n", __func__, err);
    494        ret = err;
    495    }
    496
    497    return ret;
    498}
    499
    500/*
    501 * Restore the state of the KVM timer when VM clock is restarted or state is
    502 * synced to KVM.
    503 */
    504static int kvm_mips_restore_count(CPUState *cs)
    505{
    506    MIPSCPU *cpu = MIPS_CPU(cs);
    507    CPUMIPSState *env = &cpu->env;
    508    uint64_t count_ctl;
    509    int err_dc, err, ret = 0;
    510
    511    /* check the timer is frozen */
    512    err_dc = kvm_mips_get_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
    513    if (err_dc < 0) {
    514        DPRINTF("%s: Failed to get COUNT_CTL (%d)\n", __func__, err_dc);
    515        ret = err_dc;
    516    } else if (!(count_ctl & KVM_REG_MIPS_COUNT_CTL_DC)) {
    517        /* freeze timer (sets COUNT_RESUME for us) */
    518        count_ctl |= KVM_REG_MIPS_COUNT_CTL_DC;
    519        err = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
    520        if (err < 0) {
    521            DPRINTF("%s: Failed to set COUNT_CTL.DC=1 (%d)\n", __func__, err);
    522            ret = err;
    523        }
    524    }
    525
    526    /* load CP0_Cause */
    527    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_CAUSE, &env->CP0_Cause);
    528    if (err < 0) {
    529        DPRINTF("%s: Failed to put CP0_CAUSE (%d)\n", __func__, err);
    530        ret = err;
    531    }
    532
    533    /* load CP0_Count */
    534    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_COUNT, &env->CP0_Count);
    535    if (err < 0) {
    536        DPRINTF("%s: Failed to put CP0_COUNT (%d)\n", __func__, err);
    537        ret = err;
    538    }
    539
    540    /* resume KVM timer */
    541    if (err_dc >= 0) {
    542        count_ctl &= ~KVM_REG_MIPS_COUNT_CTL_DC;
    543        err = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
    544        if (err < 0) {
    545            DPRINTF("%s: Failed to set COUNT_CTL.DC=0 (%d)\n", __func__, err);
    546            ret = err;
    547        }
    548    }
    549
    550    return ret;
    551}
    552
    553/*
    554 * Handle the VM clock being started or stopped
    555 */
    556static void kvm_mips_update_state(void *opaque, bool running, RunState state)
    557{
    558    CPUState *cs = opaque;
    559    int ret;
    560    uint64_t count_resume;
    561
    562    /*
    563     * If state is already dirty (synced to QEMU) then the KVM timer state is
    564     * already saved and can be restored when it is synced back to KVM.
    565     */
    566    if (!running) {
    567        if (!cs->vcpu_dirty) {
    568            ret = kvm_mips_save_count(cs);
    569            if (ret < 0) {
    570                warn_report("Failed saving count");
    571            }
    572        }
    573    } else {
    574        /* Set clock restore time to now */
    575        count_resume = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
    576        ret = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_COUNT_RESUME,
    577                                      &count_resume);
    578        if (ret < 0) {
    579            warn_report("Failed setting COUNT_RESUME");
    580            return;
    581        }
    582
    583        if (!cs->vcpu_dirty) {
    584            ret = kvm_mips_restore_count(cs);
    585            if (ret < 0) {
    586                warn_report("Failed restoring count");
    587            }
    588        }
    589    }
    590}
    591
    592static int kvm_mips_put_fpu_registers(CPUState *cs, int level)
    593{
    594    MIPSCPU *cpu = MIPS_CPU(cs);
    595    CPUMIPSState *env = &cpu->env;
    596    int err, ret = 0;
    597    unsigned int i;
    598
    599    /* Only put FPU state if we're emulating a CPU with an FPU */
    600    if (env->CP0_Config1 & (1 << CP0C1_FP)) {
    601        /* FPU Control Registers */
    602        if (level == KVM_PUT_FULL_STATE) {
    603            err = kvm_mips_put_one_ureg(cs, KVM_REG_MIPS_FCR_IR,
    604                                        &env->active_fpu.fcr0);
    605            if (err < 0) {
    606                DPRINTF("%s: Failed to put FCR_IR (%d)\n", __func__, err);
    607                ret = err;
    608            }
    609        }
    610        err = kvm_mips_put_one_ureg(cs, KVM_REG_MIPS_FCR_CSR,
    611                                    &env->active_fpu.fcr31);
    612        if (err < 0) {
    613            DPRINTF("%s: Failed to put FCR_CSR (%d)\n", __func__, err);
    614            ret = err;
    615        }
    616
    617        /*
    618         * FPU register state is a subset of MSA vector state, so don't put FPU
    619         * registers if we're emulating a CPU with MSA.
    620         */
    621        if (!ase_msa_available(env)) {
    622            /* Floating point registers */
    623            for (i = 0; i < 32; ++i) {
    624                if (env->CP0_Status & (1 << CP0St_FR)) {
    625                    err = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_FPR_64(i),
    626                                                  &env->active_fpu.fpr[i].d);
    627                } else {
    628                    err = kvm_mips_get_one_ureg(cs, KVM_REG_MIPS_FPR_32(i),
    629                                    &env->active_fpu.fpr[i].w[FP_ENDIAN_IDX]);
    630                }
    631                if (err < 0) {
    632                    DPRINTF("%s: Failed to put FPR%u (%d)\n", __func__, i, err);
    633                    ret = err;
    634                }
    635            }
    636        }
    637    }
    638
    639    /* Only put MSA state if we're emulating a CPU with MSA */
    640    if (ase_msa_available(env)) {
    641        /* MSA Control Registers */
    642        if (level == KVM_PUT_FULL_STATE) {
    643            err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_MSA_IR,
    644                                       &env->msair);
    645            if (err < 0) {
    646                DPRINTF("%s: Failed to put MSA_IR (%d)\n", __func__, err);
    647                ret = err;
    648            }
    649        }
    650        err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_MSA_CSR,
    651                                   &env->active_tc.msacsr);
    652        if (err < 0) {
    653            DPRINTF("%s: Failed to put MSA_CSR (%d)\n", __func__, err);
    654            ret = err;
    655        }
    656
    657        /* Vector registers (includes FP registers) */
    658        for (i = 0; i < 32; ++i) {
    659            /* Big endian MSA not supported by QEMU yet anyway */
    660            err = kvm_mips_put_one_reg64(cs, KVM_REG_MIPS_VEC_128(i),
    661                                         env->active_fpu.fpr[i].wr.d);
    662            if (err < 0) {
    663                DPRINTF("%s: Failed to put VEC%u (%d)\n", __func__, i, err);
    664                ret = err;
    665            }
    666        }
    667    }
    668
    669    return ret;
    670}
    671
    672static int kvm_mips_get_fpu_registers(CPUState *cs)
    673{
    674    MIPSCPU *cpu = MIPS_CPU(cs);
    675    CPUMIPSState *env = &cpu->env;
    676    int err, ret = 0;
    677    unsigned int i;
    678
    679    /* Only get FPU state if we're emulating a CPU with an FPU */
    680    if (env->CP0_Config1 & (1 << CP0C1_FP)) {
    681        /* FPU Control Registers */
    682        err = kvm_mips_get_one_ureg(cs, KVM_REG_MIPS_FCR_IR,
    683                                    &env->active_fpu.fcr0);
    684        if (err < 0) {
    685            DPRINTF("%s: Failed to get FCR_IR (%d)\n", __func__, err);
    686            ret = err;
    687        }
    688        err = kvm_mips_get_one_ureg(cs, KVM_REG_MIPS_FCR_CSR,
    689                                    &env->active_fpu.fcr31);
    690        if (err < 0) {
    691            DPRINTF("%s: Failed to get FCR_CSR (%d)\n", __func__, err);
    692            ret = err;
    693        } else {
    694            restore_fp_status(env);
    695        }
    696
    697        /*
    698         * FPU register state is a subset of MSA vector state, so don't save FPU
    699         * registers if we're emulating a CPU with MSA.
    700         */
    701        if (!ase_msa_available(env)) {
    702            /* Floating point registers */
    703            for (i = 0; i < 32; ++i) {
    704                if (env->CP0_Status & (1 << CP0St_FR)) {
    705                    err = kvm_mips_get_one_ureg64(cs, KVM_REG_MIPS_FPR_64(i),
    706                                                  &env->active_fpu.fpr[i].d);
    707                } else {
    708                    err = kvm_mips_get_one_ureg(cs, KVM_REG_MIPS_FPR_32(i),
    709                                    &env->active_fpu.fpr[i].w[FP_ENDIAN_IDX]);
    710                }
    711                if (err < 0) {
    712                    DPRINTF("%s: Failed to get FPR%u (%d)\n", __func__, i, err);
    713                    ret = err;
    714                }
    715            }
    716        }
    717    }
    718
    719    /* Only get MSA state if we're emulating a CPU with MSA */
    720    if (ase_msa_available(env)) {
    721        /* MSA Control Registers */
    722        err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_MSA_IR,
    723                                   &env->msair);
    724        if (err < 0) {
    725            DPRINTF("%s: Failed to get MSA_IR (%d)\n", __func__, err);
    726            ret = err;
    727        }
    728        err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_MSA_CSR,
    729                                   &env->active_tc.msacsr);
    730        if (err < 0) {
    731            DPRINTF("%s: Failed to get MSA_CSR (%d)\n", __func__, err);
    732            ret = err;
    733        } else {
    734            restore_msa_fp_status(env);
    735        }
    736
    737        /* Vector registers (includes FP registers) */
    738        for (i = 0; i < 32; ++i) {
    739            /* Big endian MSA not supported by QEMU yet anyway */
    740            err = kvm_mips_get_one_reg64(cs, KVM_REG_MIPS_VEC_128(i),
    741                                         env->active_fpu.fpr[i].wr.d);
    742            if (err < 0) {
    743                DPRINTF("%s: Failed to get VEC%u (%d)\n", __func__, i, err);
    744                ret = err;
    745            }
    746        }
    747    }
    748
    749    return ret;
    750}
    751
    752
    753static int kvm_mips_put_cp0_registers(CPUState *cs, int level)
    754{
    755    MIPSCPU *cpu = MIPS_CPU(cs);
    756    CPUMIPSState *env = &cpu->env;
    757    int err, ret = 0;
    758
    759    (void)level;
    760
    761    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_INDEX, &env->CP0_Index);
    762    if (err < 0) {
    763        DPRINTF("%s: Failed to put CP0_INDEX (%d)\n", __func__, err);
    764        ret = err;
    765    }
    766    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_RANDOM, &env->CP0_Random);
    767    if (err < 0) {
    768        DPRINTF("%s: Failed to put CP0_RANDOM (%d)\n", __func__, err);
    769        ret = err;
    770    }
    771    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_CONTEXT,
    772                                 &env->CP0_Context);
    773    if (err < 0) {
    774        DPRINTF("%s: Failed to put CP0_CONTEXT (%d)\n", __func__, err);
    775        ret = err;
    776    }
    777    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_USERLOCAL,
    778                                 &env->active_tc.CP0_UserLocal);
    779    if (err < 0) {
    780        DPRINTF("%s: Failed to put CP0_USERLOCAL (%d)\n", __func__, err);
    781        ret = err;
    782    }
    783    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_PAGEMASK,
    784                               &env->CP0_PageMask);
    785    if (err < 0) {
    786        DPRINTF("%s: Failed to put CP0_PAGEMASK (%d)\n", __func__, err);
    787        ret = err;
    788    }
    789    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_PAGEGRAIN,
    790                               &env->CP0_PageGrain);
    791    if (err < 0) {
    792        DPRINTF("%s: Failed to put CP0_PAGEGRAIN (%d)\n", __func__, err);
    793        ret = err;
    794    }
    795    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_PWBASE,
    796                               &env->CP0_PWBase);
    797    if (err < 0) {
    798        DPRINTF("%s: Failed to put CP0_PWBASE (%d)\n", __func__, err);
    799        ret = err;
    800    }
    801    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_PWFIELD,
    802                               &env->CP0_PWField);
    803    if (err < 0) {
    804        DPRINTF("%s: Failed to put CP0_PWField (%d)\n", __func__, err);
    805        ret = err;
    806    }
    807    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_PWSIZE,
    808                               &env->CP0_PWSize);
    809    if (err < 0) {
    810        DPRINTF("%s: Failed to put CP0_PWSIZE (%d)\n", __func__, err);
    811        ret = err;
    812    }
    813    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_WIRED, &env->CP0_Wired);
    814    if (err < 0) {
    815        DPRINTF("%s: Failed to put CP0_WIRED (%d)\n", __func__, err);
    816        ret = err;
    817    }
    818    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_PWCTL, &env->CP0_PWCtl);
    819    if (err < 0) {
    820        DPRINTF("%s: Failed to put CP0_PWCTL (%d)\n", __func__, err);
    821        ret = err;
    822    }
    823    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_HWRENA, &env->CP0_HWREna);
    824    if (err < 0) {
    825        DPRINTF("%s: Failed to put CP0_HWRENA (%d)\n", __func__, err);
    826        ret = err;
    827    }
    828    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_BADVADDR,
    829                                 &env->CP0_BadVAddr);
    830    if (err < 0) {
    831        DPRINTF("%s: Failed to put CP0_BADVADDR (%d)\n", __func__, err);
    832        ret = err;
    833    }
    834
    835    /* If VM clock stopped then state will be restored when it is restarted */
    836    if (runstate_is_running()) {
    837        err = kvm_mips_restore_count(cs);
    838        if (err < 0) {
    839            ret = err;
    840        }
    841    }
    842
    843    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_ENTRYHI,
    844                                 &env->CP0_EntryHi);
    845    if (err < 0) {
    846        DPRINTF("%s: Failed to put CP0_ENTRYHI (%d)\n", __func__, err);
    847        ret = err;
    848    }
    849    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_COMPARE,
    850                               &env->CP0_Compare);
    851    if (err < 0) {
    852        DPRINTF("%s: Failed to put CP0_COMPARE (%d)\n", __func__, err);
    853        ret = err;
    854    }
    855    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_STATUS, &env->CP0_Status);
    856    if (err < 0) {
    857        DPRINTF("%s: Failed to put CP0_STATUS (%d)\n", __func__, err);
    858        ret = err;
    859    }
    860    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_EPC, &env->CP0_EPC);
    861    if (err < 0) {
    862        DPRINTF("%s: Failed to put CP0_EPC (%d)\n", __func__, err);
    863        ret = err;
    864    }
    865    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_PRID, &env->CP0_PRid);
    866    if (err < 0) {
    867        DPRINTF("%s: Failed to put CP0_PRID (%d)\n", __func__, err);
    868        ret = err;
    869    }
    870    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_EBASE, &env->CP0_EBase);
    871    if (err < 0) {
    872        DPRINTF("%s: Failed to put CP0_EBASE (%d)\n", __func__, err);
    873        ret = err;
    874    }
    875    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG,
    876                                  &env->CP0_Config0,
    877                                  KVM_REG_MIPS_CP0_CONFIG_MASK);
    878    if (err < 0) {
    879        DPRINTF("%s: Failed to change CP0_CONFIG (%d)\n", __func__, err);
    880        ret = err;
    881    }
    882    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG1,
    883                                  &env->CP0_Config1,
    884                                  KVM_REG_MIPS_CP0_CONFIG1_MASK);
    885    if (err < 0) {
    886        DPRINTF("%s: Failed to change CP0_CONFIG1 (%d)\n", __func__, err);
    887        ret = err;
    888    }
    889    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG2,
    890                                  &env->CP0_Config2,
    891                                  KVM_REG_MIPS_CP0_CONFIG2_MASK);
    892    if (err < 0) {
    893        DPRINTF("%s: Failed to change CP0_CONFIG2 (%d)\n", __func__, err);
    894        ret = err;
    895    }
    896    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG3,
    897                                  &env->CP0_Config3,
    898                                  KVM_REG_MIPS_CP0_CONFIG3_MASK);
    899    if (err < 0) {
    900        DPRINTF("%s: Failed to change CP0_CONFIG3 (%d)\n", __func__, err);
    901        ret = err;
    902    }
    903    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG4,
    904                                  &env->CP0_Config4,
    905                                  KVM_REG_MIPS_CP0_CONFIG4_MASK);
    906    if (err < 0) {
    907        DPRINTF("%s: Failed to change CP0_CONFIG4 (%d)\n", __func__, err);
    908        ret = err;
    909    }
    910    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG5,
    911                                  &env->CP0_Config5,
    912                                  KVM_REG_MIPS_CP0_CONFIG5_MASK);
    913    if (err < 0) {
    914        DPRINTF("%s: Failed to change CP0_CONFIG5 (%d)\n", __func__, err);
    915        ret = err;
    916    }
    917    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG6,
    918                                  &env->CP0_Config6,
    919                                  KVM_REG_MIPS_CP0_CONFIG6_MASK);
    920    if (err < 0) {
    921        DPRINTF("%s: Failed to change CP0_CONFIG6 (%d)\n", __func__, err);
    922        ret = err;
    923    }
    924    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_XCONTEXT,
    925                                 &env->CP0_XContext);
    926    if (err < 0) {
    927        DPRINTF("%s: Failed to put CP0_XCONTEXT (%d)\n", __func__, err);
    928        ret = err;
    929    }
    930    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_ERROREPC,
    931                                 &env->CP0_ErrorEPC);
    932    if (err < 0) {
    933        DPRINTF("%s: Failed to put CP0_ERROREPC (%d)\n", __func__, err);
    934        ret = err;
    935    }
    936    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH1,
    937                                 &env->CP0_KScratch[0]);
    938    if (err < 0) {
    939        DPRINTF("%s: Failed to put CP0_KSCRATCH1 (%d)\n", __func__, err);
    940        ret = err;
    941    }
    942    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH2,
    943                                 &env->CP0_KScratch[1]);
    944    if (err < 0) {
    945        DPRINTF("%s: Failed to put CP0_KSCRATCH2 (%d)\n", __func__, err);
    946        ret = err;
    947    }
    948    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH3,
    949                                 &env->CP0_KScratch[2]);
    950    if (err < 0) {
    951        DPRINTF("%s: Failed to put CP0_KSCRATCH3 (%d)\n", __func__, err);
    952        ret = err;
    953    }
    954    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH4,
    955                                 &env->CP0_KScratch[3]);
    956    if (err < 0) {
    957        DPRINTF("%s: Failed to put CP0_KSCRATCH4 (%d)\n", __func__, err);
    958        ret = err;
    959    }
    960    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH5,
    961                                 &env->CP0_KScratch[4]);
    962    if (err < 0) {
    963        DPRINTF("%s: Failed to put CP0_KSCRATCH5 (%d)\n", __func__, err);
    964        ret = err;
    965    }
    966    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH6,
    967                                 &env->CP0_KScratch[5]);
    968    if (err < 0) {
    969        DPRINTF("%s: Failed to put CP0_KSCRATCH6 (%d)\n", __func__, err);
    970        ret = err;
    971    }
    972
    973    return ret;
    974}
    975
    976static int kvm_mips_get_cp0_registers(CPUState *cs)
    977{
    978    MIPSCPU *cpu = MIPS_CPU(cs);
    979    CPUMIPSState *env = &cpu->env;
    980    int err, ret = 0;
    981
    982    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_INDEX, &env->CP0_Index);
    983    if (err < 0) {
    984        DPRINTF("%s: Failed to get CP0_INDEX (%d)\n", __func__, err);
    985        ret = err;
    986    }
    987    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_RANDOM, &env->CP0_Random);
    988    if (err < 0) {
    989        DPRINTF("%s: Failed to get CP0_RANDOM (%d)\n", __func__, err);
    990        ret = err;
    991    }
    992    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_CONTEXT,
    993                                 &env->CP0_Context);
    994    if (err < 0) {
    995        DPRINTF("%s: Failed to get CP0_CONTEXT (%d)\n", __func__, err);
    996        ret = err;
    997    }
    998    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_USERLOCAL,
    999                                 &env->active_tc.CP0_UserLocal);
   1000    if (err < 0) {
   1001        DPRINTF("%s: Failed to get CP0_USERLOCAL (%d)\n", __func__, err);
   1002        ret = err;
   1003    }
   1004    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_PAGEMASK,
   1005                               &env->CP0_PageMask);
   1006    if (err < 0) {
   1007        DPRINTF("%s: Failed to get CP0_PAGEMASK (%d)\n", __func__, err);
   1008        ret = err;
   1009    }
   1010    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_PAGEGRAIN,
   1011                               &env->CP0_PageGrain);
   1012    if (err < 0) {
   1013        DPRINTF("%s: Failed to get CP0_PAGEGRAIN (%d)\n", __func__, err);
   1014        ret = err;
   1015    }
   1016    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_PWBASE,
   1017                               &env->CP0_PWBase);
   1018    if (err < 0) {
   1019        DPRINTF("%s: Failed to get CP0_PWBASE (%d)\n", __func__, err);
   1020        ret = err;
   1021    }
   1022    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_PWFIELD,
   1023                               &env->CP0_PWField);
   1024    if (err < 0) {
   1025        DPRINTF("%s: Failed to get CP0_PWFIELD (%d)\n", __func__, err);
   1026        ret = err;
   1027    }
   1028    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_PWSIZE,
   1029                               &env->CP0_PWSize);
   1030    if (err < 0) {
   1031        DPRINTF("%s: Failed to get CP0_PWSIZE (%d)\n", __func__, err);
   1032        ret = err;
   1033    }
   1034    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_WIRED, &env->CP0_Wired);
   1035    if (err < 0) {
   1036        DPRINTF("%s: Failed to get CP0_WIRED (%d)\n", __func__, err);
   1037        ret = err;
   1038    }
   1039    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_PWCTL, &env->CP0_PWCtl);
   1040    if (err < 0) {
   1041        DPRINTF("%s: Failed to get CP0_PWCtl (%d)\n", __func__, err);
   1042        ret = err;
   1043    }
   1044    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_HWRENA, &env->CP0_HWREna);
   1045    if (err < 0) {
   1046        DPRINTF("%s: Failed to get CP0_HWRENA (%d)\n", __func__, err);
   1047        ret = err;
   1048    }
   1049    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_BADVADDR,
   1050                                 &env->CP0_BadVAddr);
   1051    if (err < 0) {
   1052        DPRINTF("%s: Failed to get CP0_BADVADDR (%d)\n", __func__, err);
   1053        ret = err;
   1054    }
   1055    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_ENTRYHI,
   1056                                 &env->CP0_EntryHi);
   1057    if (err < 0) {
   1058        DPRINTF("%s: Failed to get CP0_ENTRYHI (%d)\n", __func__, err);
   1059        ret = err;
   1060    }
   1061    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_COMPARE,
   1062                               &env->CP0_Compare);
   1063    if (err < 0) {
   1064        DPRINTF("%s: Failed to get CP0_COMPARE (%d)\n", __func__, err);
   1065        ret = err;
   1066    }
   1067    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_STATUS, &env->CP0_Status);
   1068    if (err < 0) {
   1069        DPRINTF("%s: Failed to get CP0_STATUS (%d)\n", __func__, err);
   1070        ret = err;
   1071    }
   1072
   1073    /* If VM clock stopped then state was already saved when it was stopped */
   1074    if (runstate_is_running()) {
   1075        err = kvm_mips_save_count(cs);
   1076        if (err < 0) {
   1077            ret = err;
   1078        }
   1079    }
   1080
   1081    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_EPC, &env->CP0_EPC);
   1082    if (err < 0) {
   1083        DPRINTF("%s: Failed to get CP0_EPC (%d)\n", __func__, err);
   1084        ret = err;
   1085    }
   1086    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_PRID, &env->CP0_PRid);
   1087    if (err < 0) {
   1088        DPRINTF("%s: Failed to get CP0_PRID (%d)\n", __func__, err);
   1089        ret = err;
   1090    }
   1091    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_EBASE, &env->CP0_EBase);
   1092    if (err < 0) {
   1093        DPRINTF("%s: Failed to get CP0_EBASE (%d)\n", __func__, err);
   1094        ret = err;
   1095    }
   1096    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG, &env->CP0_Config0);
   1097    if (err < 0) {
   1098        DPRINTF("%s: Failed to get CP0_CONFIG (%d)\n", __func__, err);
   1099        ret = err;
   1100    }
   1101    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG1, &env->CP0_Config1);
   1102    if (err < 0) {
   1103        DPRINTF("%s: Failed to get CP0_CONFIG1 (%d)\n", __func__, err);
   1104        ret = err;
   1105    }
   1106    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG2, &env->CP0_Config2);
   1107    if (err < 0) {
   1108        DPRINTF("%s: Failed to get CP0_CONFIG2 (%d)\n", __func__, err);
   1109        ret = err;
   1110    }
   1111    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG3, &env->CP0_Config3);
   1112    if (err < 0) {
   1113        DPRINTF("%s: Failed to get CP0_CONFIG3 (%d)\n", __func__, err);
   1114        ret = err;
   1115    }
   1116    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG4, &env->CP0_Config4);
   1117    if (err < 0) {
   1118        DPRINTF("%s: Failed to get CP0_CONFIG4 (%d)\n", __func__, err);
   1119        ret = err;
   1120    }
   1121    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG5, &env->CP0_Config5);
   1122    if (err < 0) {
   1123        DPRINTF("%s: Failed to get CP0_CONFIG5 (%d)\n", __func__, err);
   1124        ret = err;
   1125    }
   1126    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG6, &env->CP0_Config6);
   1127    if (err < 0) {
   1128        DPRINTF("%s: Failed to get CP0_CONFIG6 (%d)\n", __func__, err);
   1129        ret = err;
   1130    }
   1131    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_XCONTEXT,
   1132                                 &env->CP0_XContext);
   1133    if (err < 0) {
   1134        DPRINTF("%s: Failed to get CP0_XCONTEXT (%d)\n", __func__, err);
   1135        ret = err;
   1136    }
   1137    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_ERROREPC,
   1138                                 &env->CP0_ErrorEPC);
   1139    if (err < 0) {
   1140        DPRINTF("%s: Failed to get CP0_ERROREPC (%d)\n", __func__, err);
   1141        ret = err;
   1142    }
   1143    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH1,
   1144                                 &env->CP0_KScratch[0]);
   1145    if (err < 0) {
   1146        DPRINTF("%s: Failed to get CP0_KSCRATCH1 (%d)\n", __func__, err);
   1147        ret = err;
   1148    }
   1149    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH2,
   1150                                 &env->CP0_KScratch[1]);
   1151    if (err < 0) {
   1152        DPRINTF("%s: Failed to get CP0_KSCRATCH2 (%d)\n", __func__, err);
   1153        ret = err;
   1154    }
   1155    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH3,
   1156                                 &env->CP0_KScratch[2]);
   1157    if (err < 0) {
   1158        DPRINTF("%s: Failed to get CP0_KSCRATCH3 (%d)\n", __func__, err);
   1159        ret = err;
   1160    }
   1161    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH4,
   1162                                 &env->CP0_KScratch[3]);
   1163    if (err < 0) {
   1164        DPRINTF("%s: Failed to get CP0_KSCRATCH4 (%d)\n", __func__, err);
   1165        ret = err;
   1166    }
   1167    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH5,
   1168                                 &env->CP0_KScratch[4]);
   1169    if (err < 0) {
   1170        DPRINTF("%s: Failed to get CP0_KSCRATCH5 (%d)\n", __func__, err);
   1171        ret = err;
   1172    }
   1173    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_KSCRATCH6,
   1174                                 &env->CP0_KScratch[5]);
   1175    if (err < 0) {
   1176        DPRINTF("%s: Failed to get CP0_KSCRATCH6 (%d)\n", __func__, err);
   1177        ret = err;
   1178    }
   1179
   1180    return ret;
   1181}
   1182
   1183int kvm_arch_put_registers(CPUState *cs, int level)
   1184{
   1185    MIPSCPU *cpu = MIPS_CPU(cs);
   1186    CPUMIPSState *env = &cpu->env;
   1187    struct kvm_regs regs;
   1188    int ret;
   1189    int i;
   1190
   1191    /* Set the registers based on QEMU's view of things */
   1192    for (i = 0; i < 32; i++) {
   1193        regs.gpr[i] = (int64_t)(target_long)env->active_tc.gpr[i];
   1194    }
   1195
   1196    regs.hi = (int64_t)(target_long)env->active_tc.HI[0];
   1197    regs.lo = (int64_t)(target_long)env->active_tc.LO[0];
   1198    regs.pc = (int64_t)(target_long)env->active_tc.PC;
   1199
   1200    ret = kvm_vcpu_ioctl(cs, KVM_SET_REGS, &regs);
   1201
   1202    if (ret < 0) {
   1203        return ret;
   1204    }
   1205
   1206    ret = kvm_mips_put_cp0_registers(cs, level);
   1207    if (ret < 0) {
   1208        return ret;
   1209    }
   1210
   1211    ret = kvm_mips_put_fpu_registers(cs, level);
   1212    if (ret < 0) {
   1213        return ret;
   1214    }
   1215
   1216    return ret;
   1217}
   1218
   1219int kvm_arch_get_registers(CPUState *cs)
   1220{
   1221    MIPSCPU *cpu = MIPS_CPU(cs);
   1222    CPUMIPSState *env = &cpu->env;
   1223    int ret = 0;
   1224    struct kvm_regs regs;
   1225    int i;
   1226
   1227    /* Get the current register set as KVM seems it */
   1228    ret = kvm_vcpu_ioctl(cs, KVM_GET_REGS, &regs);
   1229
   1230    if (ret < 0) {
   1231        return ret;
   1232    }
   1233
   1234    for (i = 0; i < 32; i++) {
   1235        env->active_tc.gpr[i] = regs.gpr[i];
   1236    }
   1237
   1238    env->active_tc.HI[0] = regs.hi;
   1239    env->active_tc.LO[0] = regs.lo;
   1240    env->active_tc.PC = regs.pc;
   1241
   1242    kvm_mips_get_cp0_registers(cs);
   1243    kvm_mips_get_fpu_registers(cs);
   1244
   1245    return ret;
   1246}
   1247
   1248int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route,
   1249                             uint64_t address, uint32_t data, PCIDevice *dev)
   1250{
   1251    return 0;
   1252}
   1253
   1254int kvm_arch_add_msi_route_post(struct kvm_irq_routing_entry *route,
   1255                                int vector, PCIDevice *dev)
   1256{
   1257    return 0;
   1258}
   1259
   1260int kvm_arch_release_virq_post(int virq)
   1261{
   1262    return 0;
   1263}
   1264
   1265int kvm_arch_msi_data_to_gsi(uint32_t data)
   1266{
   1267    abort();
   1268}
   1269
   1270int mips_kvm_type(MachineState *machine, const char *vm_type)
   1271{
   1272#if defined(KVM_CAP_MIPS_VZ) || defined(KVM_CAP_MIPS_TE)
   1273    int r;
   1274    KVMState *s = KVM_STATE(machine->accelerator);
   1275#endif
   1276
   1277#if defined(KVM_CAP_MIPS_VZ)
   1278    r = kvm_check_extension(s, KVM_CAP_MIPS_VZ);
   1279    if (r > 0) {
   1280        return KVM_VM_MIPS_VZ;
   1281    }
   1282#endif
   1283
   1284#if defined(KVM_CAP_MIPS_TE)
   1285    r = kvm_check_extension(s, KVM_CAP_MIPS_TE);
   1286    if (r > 0) {
   1287        return KVM_VM_MIPS_TE;
   1288    }
   1289#endif
   1290
   1291    return -1;
   1292}
   1293
   1294bool kvm_arch_cpu_check_are_resettable(void)
   1295{
   1296    return true;
   1297}