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