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