qemu/target/mips/kvm.c
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * KVM/MIPS: 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 "qemu/timer.h"
  23#include "sysemu/kvm.h"
  24#include "sysemu/runstate.h"
  25#include "sysemu/cpus.h"
  26#include "kvm_mips.h"
  27#include "exec/memattrs.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, int 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(MachineState *ms, 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 && env->CP0_Config3 & (1 << CP0C3_MSAP)) {
  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 && env->CP0_Config3 & (1 << CP0C3_MSAP)) {
 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    if (!kvm_enabled()) {
 200        return 0;
 201    }
 202
 203    intr.cpu = -1;
 204
 205    if (level) {
 206        intr.irq = irq;
 207    } else {
 208        intr.irq = -irq;
 209    }
 210
 211    kvm_vcpu_ioctl(cs, KVM_INTERRUPT, &intr);
 212
 213    return 0;
 214}
 215
 216int kvm_mips_set_ipi_interrupt(MIPSCPU *cpu, int irq, int level)
 217{
 218    CPUState *cs = current_cpu;
 219    CPUState *dest_cs = CPU(cpu);
 220    struct kvm_mips_interrupt intr;
 221
 222    if (!kvm_enabled()) {
 223        return 0;
 224    }
 225
 226    intr.cpu = dest_cs->cpu_index;
 227
 228    if (level) {
 229        intr.irq = irq;
 230    } else {
 231        intr.irq = -irq;
 232    }
 233
 234    DPRINTF("%s: CPU %d, IRQ: %d\n", __func__, intr.cpu, intr.irq);
 235
 236    kvm_vcpu_ioctl(cs, KVM_INTERRUPT, &intr);
 237
 238    return 0;
 239}
 240
 241#define MIPS_CP0_32(_R, _S)                                     \
 242    (KVM_REG_MIPS_CP0 | KVM_REG_SIZE_U32 | (8 * (_R) + (_S)))
 243
 244#define MIPS_CP0_64(_R, _S)                                     \
 245    (KVM_REG_MIPS_CP0 | KVM_REG_SIZE_U64 | (8 * (_R) + (_S)))
 246
 247#define KVM_REG_MIPS_CP0_INDEX          MIPS_CP0_32(0, 0)
 248#define KVM_REG_MIPS_CP0_CONTEXT        MIPS_CP0_64(4, 0)
 249#define KVM_REG_MIPS_CP0_USERLOCAL      MIPS_CP0_64(4, 2)
 250#define KVM_REG_MIPS_CP0_PAGEMASK       MIPS_CP0_32(5, 0)
 251#define KVM_REG_MIPS_CP0_WIRED          MIPS_CP0_32(6, 0)
 252#define KVM_REG_MIPS_CP0_HWRENA         MIPS_CP0_32(7, 0)
 253#define KVM_REG_MIPS_CP0_BADVADDR       MIPS_CP0_64(8, 0)
 254#define KVM_REG_MIPS_CP0_COUNT          MIPS_CP0_32(9, 0)
 255#define KVM_REG_MIPS_CP0_ENTRYHI        MIPS_CP0_64(10, 0)
 256#define KVM_REG_MIPS_CP0_COMPARE        MIPS_CP0_32(11, 0)
 257#define KVM_REG_MIPS_CP0_STATUS         MIPS_CP0_32(12, 0)
 258#define KVM_REG_MIPS_CP0_CAUSE          MIPS_CP0_32(13, 0)
 259#define KVM_REG_MIPS_CP0_EPC            MIPS_CP0_64(14, 0)
 260#define KVM_REG_MIPS_CP0_PRID           MIPS_CP0_32(15, 0)
 261#define KVM_REG_MIPS_CP0_CONFIG         MIPS_CP0_32(16, 0)
 262#define KVM_REG_MIPS_CP0_CONFIG1        MIPS_CP0_32(16, 1)
 263#define KVM_REG_MIPS_CP0_CONFIG2        MIPS_CP0_32(16, 2)
 264#define KVM_REG_MIPS_CP0_CONFIG3        MIPS_CP0_32(16, 3)
 265#define KVM_REG_MIPS_CP0_CONFIG4        MIPS_CP0_32(16, 4)
 266#define KVM_REG_MIPS_CP0_CONFIG5        MIPS_CP0_32(16, 5)
 267#define KVM_REG_MIPS_CP0_ERROREPC       MIPS_CP0_64(30, 0)
 268
 269static inline int kvm_mips_put_one_reg(CPUState *cs, uint64_t reg_id,
 270                                       int32_t *addr)
 271{
 272    struct kvm_one_reg cp0reg = {
 273        .id = reg_id,
 274        .addr = (uintptr_t)addr
 275    };
 276
 277    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg);
 278}
 279
 280static inline int kvm_mips_put_one_ureg(CPUState *cs, uint64_t reg_id,
 281                                        uint32_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_ulreg(CPUState *cs, uint64_t reg_id,
 292                                         target_ulong *addr)
 293{
 294    uint64_t val64 = *addr;
 295    struct kvm_one_reg cp0reg = {
 296        .id = reg_id,
 297        .addr = (uintptr_t)&val64
 298    };
 299
 300    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg);
 301}
 302
 303static inline int kvm_mips_put_one_reg64(CPUState *cs, uint64_t reg_id,
 304                                         int64_t *addr)
 305{
 306    struct kvm_one_reg cp0reg = {
 307        .id = reg_id,
 308        .addr = (uintptr_t)addr
 309    };
 310
 311    return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg);
 312}
 313
 314static inline int kvm_mips_put_one_ureg64(CPUState *cs, uint64_t reg_id,
 315                                          uint64_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_get_one_reg(CPUState *cs, uint64_t reg_id,
 326                                       int32_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_GET_ONE_REG, &cp0reg);
 334}
 335
 336static inline int kvm_mips_get_one_ureg(CPUState *cs, uint64_t reg_id,
 337                                        uint32_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_ulreg(CPUState *cs, uint64_t reg_id,
 348                                         target_ulong *addr)
 349{
 350    int ret;
 351    uint64_t val64 = 0;
 352    struct kvm_one_reg cp0reg = {
 353        .id = reg_id,
 354        .addr = (uintptr_t)&val64
 355    };
 356
 357    ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg);
 358    if (ret >= 0) {
 359        *addr = val64;
 360    }
 361    return ret;
 362}
 363
 364static inline int kvm_mips_get_one_reg64(CPUState *cs, uint64_t reg_id,
 365                                         int64_t *addr)
 366{
 367    struct kvm_one_reg cp0reg = {
 368        .id = reg_id,
 369        .addr = (uintptr_t)addr
 370    };
 371
 372    return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg);
 373}
 374
 375static inline int kvm_mips_get_one_ureg64(CPUState *cs, uint64_t reg_id,
 376                                          uint64_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
 386#define KVM_REG_MIPS_CP0_CONFIG_MASK    (1U << CP0C0_M)
 387#define KVM_REG_MIPS_CP0_CONFIG1_MASK   ((1U << CP0C1_M) | \
 388                                         (1U << CP0C1_FP))
 389#define KVM_REG_MIPS_CP0_CONFIG2_MASK   (1U << CP0C2_M)
 390#define KVM_REG_MIPS_CP0_CONFIG3_MASK   ((1U << CP0C3_M) | \
 391                                         (1U << CP0C3_MSAP))
 392#define KVM_REG_MIPS_CP0_CONFIG4_MASK   (1U << CP0C4_M)
 393#define KVM_REG_MIPS_CP0_CONFIG5_MASK   ((1U << CP0C5_MSAEn) | \
 394                                         (1U << CP0C5_UFE) | \
 395                                         (1U << CP0C5_FRE) | \
 396                                         (1U << CP0C5_UFR))
 397
 398static inline int kvm_mips_change_one_reg(CPUState *cs, uint64_t reg_id,
 399                                          int32_t *addr, int32_t mask)
 400{
 401    int err;
 402    int32_t tmp, change;
 403
 404    err = kvm_mips_get_one_reg(cs, reg_id, &tmp);
 405    if (err < 0) {
 406        return err;
 407    }
 408
 409    /* only change bits in mask */
 410    change = (*addr ^ tmp) & mask;
 411    if (!change) {
 412        return 0;
 413    }
 414
 415    tmp = tmp ^ change;
 416    return kvm_mips_put_one_reg(cs, reg_id, &tmp);
 417}
 418
 419/*
 420 * We freeze the KVM timer when either the VM clock is stopped or the state is
 421 * saved (the state is dirty).
 422 */
 423
 424/*
 425 * Save the state of the KVM timer when VM clock is stopped or state is synced
 426 * to QEMU.
 427 */
 428static int kvm_mips_save_count(CPUState *cs)
 429{
 430    MIPSCPU *cpu = MIPS_CPU(cs);
 431    CPUMIPSState *env = &cpu->env;
 432    uint64_t count_ctl;
 433    int err, ret = 0;
 434
 435    /* freeze KVM timer */
 436    err = kvm_mips_get_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
 437    if (err < 0) {
 438        DPRINTF("%s: Failed to get COUNT_CTL (%d)\n", __func__, err);
 439        ret = err;
 440    } else if (!(count_ctl & KVM_REG_MIPS_COUNT_CTL_DC)) {
 441        count_ctl |= KVM_REG_MIPS_COUNT_CTL_DC;
 442        err = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
 443        if (err < 0) {
 444            DPRINTF("%s: Failed to set COUNT_CTL.DC=1 (%d)\n", __func__, err);
 445            ret = err;
 446        }
 447    }
 448
 449    /* read CP0_Cause */
 450    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CAUSE, &env->CP0_Cause);
 451    if (err < 0) {
 452        DPRINTF("%s: Failed to get CP0_CAUSE (%d)\n", __func__, err);
 453        ret = err;
 454    }
 455
 456    /* read CP0_Count */
 457    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_COUNT, &env->CP0_Count);
 458    if (err < 0) {
 459        DPRINTF("%s: Failed to get CP0_COUNT (%d)\n", __func__, err);
 460        ret = err;
 461    }
 462
 463    return ret;
 464}
 465
 466/*
 467 * Restore the state of the KVM timer when VM clock is restarted or state is
 468 * synced to KVM.
 469 */
 470static int kvm_mips_restore_count(CPUState *cs)
 471{
 472    MIPSCPU *cpu = MIPS_CPU(cs);
 473    CPUMIPSState *env = &cpu->env;
 474    uint64_t count_ctl;
 475    int err_dc, err, ret = 0;
 476
 477    /* check the timer is frozen */
 478    err_dc = kvm_mips_get_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
 479    if (err_dc < 0) {
 480        DPRINTF("%s: Failed to get COUNT_CTL (%d)\n", __func__, err_dc);
 481        ret = err_dc;
 482    } else if (!(count_ctl & KVM_REG_MIPS_COUNT_CTL_DC)) {
 483        /* freeze timer (sets COUNT_RESUME for us) */
 484        count_ctl |= KVM_REG_MIPS_COUNT_CTL_DC;
 485        err = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
 486        if (err < 0) {
 487            DPRINTF("%s: Failed to set COUNT_CTL.DC=1 (%d)\n", __func__, err);
 488            ret = err;
 489        }
 490    }
 491
 492    /* load CP0_Cause */
 493    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_CAUSE, &env->CP0_Cause);
 494    if (err < 0) {
 495        DPRINTF("%s: Failed to put CP0_CAUSE (%d)\n", __func__, err);
 496        ret = err;
 497    }
 498
 499    /* load CP0_Count */
 500    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_COUNT, &env->CP0_Count);
 501    if (err < 0) {
 502        DPRINTF("%s: Failed to put CP0_COUNT (%d)\n", __func__, err);
 503        ret = err;
 504    }
 505
 506    /* resume KVM timer */
 507    if (err_dc >= 0) {
 508        count_ctl &= ~KVM_REG_MIPS_COUNT_CTL_DC;
 509        err = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_COUNT_CTL, &count_ctl);
 510        if (err < 0) {
 511            DPRINTF("%s: Failed to set COUNT_CTL.DC=0 (%d)\n", __func__, err);
 512            ret = err;
 513        }
 514    }
 515
 516    return ret;
 517}
 518
 519/*
 520 * Handle the VM clock being started or stopped
 521 */
 522static void kvm_mips_update_state(void *opaque, int running, RunState state)
 523{
 524    CPUState *cs = opaque;
 525    int ret;
 526    uint64_t count_resume;
 527
 528    /*
 529     * If state is already dirty (synced to QEMU) then the KVM timer state is
 530     * already saved and can be restored when it is synced back to KVM.
 531     */
 532    if (!running) {
 533        if (!cs->vcpu_dirty) {
 534            ret = kvm_mips_save_count(cs);
 535            if (ret < 0) {
 536                warn_report("Failed saving count");
 537            }
 538        }
 539    } else {
 540        /* Set clock restore time to now */
 541        count_resume = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
 542        ret = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_COUNT_RESUME,
 543                                      &count_resume);
 544        if (ret < 0) {
 545            warn_report("Failed setting COUNT_RESUME");
 546            return;
 547        }
 548
 549        if (!cs->vcpu_dirty) {
 550            ret = kvm_mips_restore_count(cs);
 551            if (ret < 0) {
 552                warn_report("Failed restoring count");
 553            }
 554        }
 555    }
 556}
 557
 558static int kvm_mips_put_fpu_registers(CPUState *cs, int level)
 559{
 560    MIPSCPU *cpu = MIPS_CPU(cs);
 561    CPUMIPSState *env = &cpu->env;
 562    int err, ret = 0;
 563    unsigned int i;
 564
 565    /* Only put FPU state if we're emulating a CPU with an FPU */
 566    if (env->CP0_Config1 & (1 << CP0C1_FP)) {
 567        /* FPU Control Registers */
 568        if (level == KVM_PUT_FULL_STATE) {
 569            err = kvm_mips_put_one_ureg(cs, KVM_REG_MIPS_FCR_IR,
 570                                        &env->active_fpu.fcr0);
 571            if (err < 0) {
 572                DPRINTF("%s: Failed to put FCR_IR (%d)\n", __func__, err);
 573                ret = err;
 574            }
 575        }
 576        err = kvm_mips_put_one_ureg(cs, KVM_REG_MIPS_FCR_CSR,
 577                                    &env->active_fpu.fcr31);
 578        if (err < 0) {
 579            DPRINTF("%s: Failed to put FCR_CSR (%d)\n", __func__, err);
 580            ret = err;
 581        }
 582
 583        /*
 584         * FPU register state is a subset of MSA vector state, so don't put FPU
 585         * registers if we're emulating a CPU with MSA.
 586         */
 587        if (!(env->CP0_Config3 & (1 << CP0C3_MSAP))) {
 588            /* Floating point registers */
 589            for (i = 0; i < 32; ++i) {
 590                if (env->CP0_Status & (1 << CP0St_FR)) {
 591                    err = kvm_mips_put_one_ureg64(cs, KVM_REG_MIPS_FPR_64(i),
 592                                                  &env->active_fpu.fpr[i].d);
 593                } else {
 594                    err = kvm_mips_get_one_ureg(cs, KVM_REG_MIPS_FPR_32(i),
 595                                    &env->active_fpu.fpr[i].w[FP_ENDIAN_IDX]);
 596                }
 597                if (err < 0) {
 598                    DPRINTF("%s: Failed to put FPR%u (%d)\n", __func__, i, err);
 599                    ret = err;
 600                }
 601            }
 602        }
 603    }
 604
 605    /* Only put MSA state if we're emulating a CPU with MSA */
 606    if (env->CP0_Config3 & (1 << CP0C3_MSAP)) {
 607        /* MSA Control Registers */
 608        if (level == KVM_PUT_FULL_STATE) {
 609            err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_MSA_IR,
 610                                       &env->msair);
 611            if (err < 0) {
 612                DPRINTF("%s: Failed to put MSA_IR (%d)\n", __func__, err);
 613                ret = err;
 614            }
 615        }
 616        err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_MSA_CSR,
 617                                   &env->active_tc.msacsr);
 618        if (err < 0) {
 619            DPRINTF("%s: Failed to put MSA_CSR (%d)\n", __func__, err);
 620            ret = err;
 621        }
 622
 623        /* Vector registers (includes FP registers) */
 624        for (i = 0; i < 32; ++i) {
 625            /* Big endian MSA not supported by QEMU yet anyway */
 626            err = kvm_mips_put_one_reg64(cs, KVM_REG_MIPS_VEC_128(i),
 627                                         env->active_fpu.fpr[i].wr.d);
 628            if (err < 0) {
 629                DPRINTF("%s: Failed to put VEC%u (%d)\n", __func__, i, err);
 630                ret = err;
 631            }
 632        }
 633    }
 634
 635    return ret;
 636}
 637
 638static int kvm_mips_get_fpu_registers(CPUState *cs)
 639{
 640    MIPSCPU *cpu = MIPS_CPU(cs);
 641    CPUMIPSState *env = &cpu->env;
 642    int err, ret = 0;
 643    unsigned int i;
 644
 645    /* Only get FPU state if we're emulating a CPU with an FPU */
 646    if (env->CP0_Config1 & (1 << CP0C1_FP)) {
 647        /* FPU Control Registers */
 648        err = kvm_mips_get_one_ureg(cs, KVM_REG_MIPS_FCR_IR,
 649                                    &env->active_fpu.fcr0);
 650        if (err < 0) {
 651            DPRINTF("%s: Failed to get FCR_IR (%d)\n", __func__, err);
 652            ret = err;
 653        }
 654        err = kvm_mips_get_one_ureg(cs, KVM_REG_MIPS_FCR_CSR,
 655                                    &env->active_fpu.fcr31);
 656        if (err < 0) {
 657            DPRINTF("%s: Failed to get FCR_CSR (%d)\n", __func__, err);
 658            ret = err;
 659        } else {
 660            restore_fp_status(env);
 661        }
 662
 663        /*
 664         * FPU register state is a subset of MSA vector state, so don't save FPU
 665         * registers if we're emulating a CPU with MSA.
 666         */
 667        if (!(env->CP0_Config3 & (1 << CP0C3_MSAP))) {
 668            /* Floating point registers */
 669            for (i = 0; i < 32; ++i) {
 670                if (env->CP0_Status & (1 << CP0St_FR)) {
 671                    err = kvm_mips_get_one_ureg64(cs, KVM_REG_MIPS_FPR_64(i),
 672                                                  &env->active_fpu.fpr[i].d);
 673                } else {
 674                    err = kvm_mips_get_one_ureg(cs, KVM_REG_MIPS_FPR_32(i),
 675                                    &env->active_fpu.fpr[i].w[FP_ENDIAN_IDX]);
 676                }
 677                if (err < 0) {
 678                    DPRINTF("%s: Failed to get FPR%u (%d)\n", __func__, i, err);
 679                    ret = err;
 680                }
 681            }
 682        }
 683    }
 684
 685    /* Only get MSA state if we're emulating a CPU with MSA */
 686    if (env->CP0_Config3 & (1 << CP0C3_MSAP)) {
 687        /* MSA Control Registers */
 688        err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_MSA_IR,
 689                                   &env->msair);
 690        if (err < 0) {
 691            DPRINTF("%s: Failed to get MSA_IR (%d)\n", __func__, err);
 692            ret = err;
 693        }
 694        err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_MSA_CSR,
 695                                   &env->active_tc.msacsr);
 696        if (err < 0) {
 697            DPRINTF("%s: Failed to get MSA_CSR (%d)\n", __func__, err);
 698            ret = err;
 699        } else {
 700            restore_msa_fp_status(env);
 701        }
 702
 703        /* Vector registers (includes FP registers) */
 704        for (i = 0; i < 32; ++i) {
 705            /* Big endian MSA not supported by QEMU yet anyway */
 706            err = kvm_mips_get_one_reg64(cs, KVM_REG_MIPS_VEC_128(i),
 707                                         env->active_fpu.fpr[i].wr.d);
 708            if (err < 0) {
 709                DPRINTF("%s: Failed to get VEC%u (%d)\n", __func__, i, err);
 710                ret = err;
 711            }
 712        }
 713    }
 714
 715    return ret;
 716}
 717
 718
 719static int kvm_mips_put_cp0_registers(CPUState *cs, int level)
 720{
 721    MIPSCPU *cpu = MIPS_CPU(cs);
 722    CPUMIPSState *env = &cpu->env;
 723    int err, ret = 0;
 724
 725    (void)level;
 726
 727    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_INDEX, &env->CP0_Index);
 728    if (err < 0) {
 729        DPRINTF("%s: Failed to put CP0_INDEX (%d)\n", __func__, err);
 730        ret = err;
 731    }
 732    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_CONTEXT,
 733                                 &env->CP0_Context);
 734    if (err < 0) {
 735        DPRINTF("%s: Failed to put CP0_CONTEXT (%d)\n", __func__, err);
 736        ret = err;
 737    }
 738    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_USERLOCAL,
 739                                 &env->active_tc.CP0_UserLocal);
 740    if (err < 0) {
 741        DPRINTF("%s: Failed to put CP0_USERLOCAL (%d)\n", __func__, err);
 742        ret = err;
 743    }
 744    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_PAGEMASK,
 745                               &env->CP0_PageMask);
 746    if (err < 0) {
 747        DPRINTF("%s: Failed to put CP0_PAGEMASK (%d)\n", __func__, err);
 748        ret = err;
 749    }
 750    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_WIRED, &env->CP0_Wired);
 751    if (err < 0) {
 752        DPRINTF("%s: Failed to put CP0_WIRED (%d)\n", __func__, err);
 753        ret = err;
 754    }
 755    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_HWRENA, &env->CP0_HWREna);
 756    if (err < 0) {
 757        DPRINTF("%s: Failed to put CP0_HWRENA (%d)\n", __func__, err);
 758        ret = err;
 759    }
 760    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_BADVADDR,
 761                                 &env->CP0_BadVAddr);
 762    if (err < 0) {
 763        DPRINTF("%s: Failed to put CP0_BADVADDR (%d)\n", __func__, err);
 764        ret = err;
 765    }
 766
 767    /* If VM clock stopped then state will be restored when it is restarted */
 768    if (runstate_is_running()) {
 769        err = kvm_mips_restore_count(cs);
 770        if (err < 0) {
 771            ret = err;
 772        }
 773    }
 774
 775    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_ENTRYHI,
 776                                 &env->CP0_EntryHi);
 777    if (err < 0) {
 778        DPRINTF("%s: Failed to put CP0_ENTRYHI (%d)\n", __func__, err);
 779        ret = err;
 780    }
 781    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_COMPARE,
 782                               &env->CP0_Compare);
 783    if (err < 0) {
 784        DPRINTF("%s: Failed to put CP0_COMPARE (%d)\n", __func__, err);
 785        ret = err;
 786    }
 787    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_STATUS, &env->CP0_Status);
 788    if (err < 0) {
 789        DPRINTF("%s: Failed to put CP0_STATUS (%d)\n", __func__, err);
 790        ret = err;
 791    }
 792    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_EPC, &env->CP0_EPC);
 793    if (err < 0) {
 794        DPRINTF("%s: Failed to put CP0_EPC (%d)\n", __func__, err);
 795        ret = err;
 796    }
 797    err = kvm_mips_put_one_reg(cs, KVM_REG_MIPS_CP0_PRID, &env->CP0_PRid);
 798    if (err < 0) {
 799        DPRINTF("%s: Failed to put CP0_PRID (%d)\n", __func__, err);
 800        ret = err;
 801    }
 802    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG,
 803                                  &env->CP0_Config0,
 804                                  KVM_REG_MIPS_CP0_CONFIG_MASK);
 805    if (err < 0) {
 806        DPRINTF("%s: Failed to change CP0_CONFIG (%d)\n", __func__, err);
 807        ret = err;
 808    }
 809    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG1,
 810                                  &env->CP0_Config1,
 811                                  KVM_REG_MIPS_CP0_CONFIG1_MASK);
 812    if (err < 0) {
 813        DPRINTF("%s: Failed to change CP0_CONFIG1 (%d)\n", __func__, err);
 814        ret = err;
 815    }
 816    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG2,
 817                                  &env->CP0_Config2,
 818                                  KVM_REG_MIPS_CP0_CONFIG2_MASK);
 819    if (err < 0) {
 820        DPRINTF("%s: Failed to change CP0_CONFIG2 (%d)\n", __func__, err);
 821        ret = err;
 822    }
 823    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG3,
 824                                  &env->CP0_Config3,
 825                                  KVM_REG_MIPS_CP0_CONFIG3_MASK);
 826    if (err < 0) {
 827        DPRINTF("%s: Failed to change CP0_CONFIG3 (%d)\n", __func__, err);
 828        ret = err;
 829    }
 830    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG4,
 831                                  &env->CP0_Config4,
 832                                  KVM_REG_MIPS_CP0_CONFIG4_MASK);
 833    if (err < 0) {
 834        DPRINTF("%s: Failed to change CP0_CONFIG4 (%d)\n", __func__, err);
 835        ret = err;
 836    }
 837    err = kvm_mips_change_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG5,
 838                                  &env->CP0_Config5,
 839                                  KVM_REG_MIPS_CP0_CONFIG5_MASK);
 840    if (err < 0) {
 841        DPRINTF("%s: Failed to change CP0_CONFIG5 (%d)\n", __func__, err);
 842        ret = err;
 843    }
 844    err = kvm_mips_put_one_ulreg(cs, KVM_REG_MIPS_CP0_ERROREPC,
 845                                 &env->CP0_ErrorEPC);
 846    if (err < 0) {
 847        DPRINTF("%s: Failed to put CP0_ERROREPC (%d)\n", __func__, err);
 848        ret = err;
 849    }
 850
 851    return ret;
 852}
 853
 854static int kvm_mips_get_cp0_registers(CPUState *cs)
 855{
 856    MIPSCPU *cpu = MIPS_CPU(cs);
 857    CPUMIPSState *env = &cpu->env;
 858    int err, ret = 0;
 859
 860    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_INDEX, &env->CP0_Index);
 861    if (err < 0) {
 862        DPRINTF("%s: Failed to get CP0_INDEX (%d)\n", __func__, err);
 863        ret = err;
 864    }
 865    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_CONTEXT,
 866                                 &env->CP0_Context);
 867    if (err < 0) {
 868        DPRINTF("%s: Failed to get CP0_CONTEXT (%d)\n", __func__, err);
 869        ret = err;
 870    }
 871    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_USERLOCAL,
 872                                 &env->active_tc.CP0_UserLocal);
 873    if (err < 0) {
 874        DPRINTF("%s: Failed to get CP0_USERLOCAL (%d)\n", __func__, err);
 875        ret = err;
 876    }
 877    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_PAGEMASK,
 878                               &env->CP0_PageMask);
 879    if (err < 0) {
 880        DPRINTF("%s: Failed to get CP0_PAGEMASK (%d)\n", __func__, err);
 881        ret = err;
 882    }
 883    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_WIRED, &env->CP0_Wired);
 884    if (err < 0) {
 885        DPRINTF("%s: Failed to get CP0_WIRED (%d)\n", __func__, err);
 886        ret = err;
 887    }
 888    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_HWRENA, &env->CP0_HWREna);
 889    if (err < 0) {
 890        DPRINTF("%s: Failed to get CP0_HWRENA (%d)\n", __func__, err);
 891        ret = err;
 892    }
 893    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_BADVADDR,
 894                                 &env->CP0_BadVAddr);
 895    if (err < 0) {
 896        DPRINTF("%s: Failed to get CP0_BADVADDR (%d)\n", __func__, err);
 897        ret = err;
 898    }
 899    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_ENTRYHI,
 900                                 &env->CP0_EntryHi);
 901    if (err < 0) {
 902        DPRINTF("%s: Failed to get CP0_ENTRYHI (%d)\n", __func__, err);
 903        ret = err;
 904    }
 905    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_COMPARE,
 906                               &env->CP0_Compare);
 907    if (err < 0) {
 908        DPRINTF("%s: Failed to get CP0_COMPARE (%d)\n", __func__, err);
 909        ret = err;
 910    }
 911    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_STATUS, &env->CP0_Status);
 912    if (err < 0) {
 913        DPRINTF("%s: Failed to get CP0_STATUS (%d)\n", __func__, err);
 914        ret = err;
 915    }
 916
 917    /* If VM clock stopped then state was already saved when it was stopped */
 918    if (runstate_is_running()) {
 919        err = kvm_mips_save_count(cs);
 920        if (err < 0) {
 921            ret = err;
 922        }
 923    }
 924
 925    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_EPC, &env->CP0_EPC);
 926    if (err < 0) {
 927        DPRINTF("%s: Failed to get CP0_EPC (%d)\n", __func__, err);
 928        ret = err;
 929    }
 930    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_PRID, &env->CP0_PRid);
 931    if (err < 0) {
 932        DPRINTF("%s: Failed to get CP0_PRID (%d)\n", __func__, err);
 933        ret = err;
 934    }
 935    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG, &env->CP0_Config0);
 936    if (err < 0) {
 937        DPRINTF("%s: Failed to get CP0_CONFIG (%d)\n", __func__, err);
 938        ret = err;
 939    }
 940    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG1, &env->CP0_Config1);
 941    if (err < 0) {
 942        DPRINTF("%s: Failed to get CP0_CONFIG1 (%d)\n", __func__, err);
 943        ret = err;
 944    }
 945    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG2, &env->CP0_Config2);
 946    if (err < 0) {
 947        DPRINTF("%s: Failed to get CP0_CONFIG2 (%d)\n", __func__, err);
 948        ret = err;
 949    }
 950    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG3, &env->CP0_Config3);
 951    if (err < 0) {
 952        DPRINTF("%s: Failed to get CP0_CONFIG3 (%d)\n", __func__, err);
 953        ret = err;
 954    }
 955    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG4, &env->CP0_Config4);
 956    if (err < 0) {
 957        DPRINTF("%s: Failed to get CP0_CONFIG4 (%d)\n", __func__, err);
 958        ret = err;
 959    }
 960    err = kvm_mips_get_one_reg(cs, KVM_REG_MIPS_CP0_CONFIG5, &env->CP0_Config5);
 961    if (err < 0) {
 962        DPRINTF("%s: Failed to get CP0_CONFIG5 (%d)\n", __func__, err);
 963        ret = err;
 964    }
 965    err = kvm_mips_get_one_ulreg(cs, KVM_REG_MIPS_CP0_ERROREPC,
 966                                 &env->CP0_ErrorEPC);
 967    if (err < 0) {
 968        DPRINTF("%s: Failed to get CP0_ERROREPC (%d)\n", __func__, err);
 969        ret = err;
 970    }
 971
 972    return ret;
 973}
 974
 975int kvm_arch_put_registers(CPUState *cs, int level)
 976{
 977    MIPSCPU *cpu = MIPS_CPU(cs);
 978    CPUMIPSState *env = &cpu->env;
 979    struct kvm_regs regs;
 980    int ret;
 981    int i;
 982
 983    /* Set the registers based on QEMU's view of things */
 984    for (i = 0; i < 32; i++) {
 985        regs.gpr[i] = (int64_t)(target_long)env->active_tc.gpr[i];
 986    }
 987
 988    regs.hi = (int64_t)(target_long)env->active_tc.HI[0];
 989    regs.lo = (int64_t)(target_long)env->active_tc.LO[0];
 990    regs.pc = (int64_t)(target_long)env->active_tc.PC;
 991
 992    ret = kvm_vcpu_ioctl(cs, KVM_SET_REGS, &regs);
 993
 994    if (ret < 0) {
 995        return ret;
 996    }
 997
 998    ret = kvm_mips_put_cp0_registers(cs, level);
 999    if (ret < 0) {
1000        return ret;
1001    }
1002
1003    ret = kvm_mips_put_fpu_registers(cs, level);
1004    if (ret < 0) {
1005        return ret;
1006    }
1007
1008    return ret;
1009}
1010
1011int kvm_arch_get_registers(CPUState *cs)
1012{
1013    MIPSCPU *cpu = MIPS_CPU(cs);
1014    CPUMIPSState *env = &cpu->env;
1015    int ret = 0;
1016    struct kvm_regs regs;
1017    int i;
1018
1019    /* Get the current register set as KVM seems it */
1020    ret = kvm_vcpu_ioctl(cs, KVM_GET_REGS, &regs);
1021
1022    if (ret < 0) {
1023        return ret;
1024    }
1025
1026    for (i = 0; i < 32; i++) {
1027        env->active_tc.gpr[i] = regs.gpr[i];
1028    }
1029
1030    env->active_tc.HI[0] = regs.hi;
1031    env->active_tc.LO[0] = regs.lo;
1032    env->active_tc.PC = regs.pc;
1033
1034    kvm_mips_get_cp0_registers(cs);
1035    kvm_mips_get_fpu_registers(cs);
1036
1037    return ret;
1038}
1039
1040int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route,
1041                             uint64_t address, uint32_t data, PCIDevice *dev)
1042{
1043    return 0;
1044}
1045
1046int kvm_arch_add_msi_route_post(struct kvm_irq_routing_entry *route,
1047                                int vector, PCIDevice *dev)
1048{
1049    return 0;
1050}
1051
1052int kvm_arch_release_virq_post(int virq)
1053{
1054    return 0;
1055}
1056
1057int kvm_arch_msi_data_to_gsi(uint32_t data)
1058{
1059    abort();
1060}
1061