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, ®s); 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, ®s); 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}