CC: [email protected] CC: [email protected] TO: Joerg Roedel <[email protected]> CC: Paolo Bonzini <[email protected]>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 5d30bcacd91af6874481129797af364a53cd9b46 commit: ef0f64960d012cbab8f55f305ef36bb6de4e1a9b KVM: SVM: Move AVIC code to separate file date: 6 days ago :::::: branch date: 16 hours ago :::::: commit date: 6 days ago If you fix the issue, kindly add following tag as appropriate Reported-by: kbuild test robot <[email protected]> cppcheck warnings: (new ones prefixed by >>) >> arch/x86/kvm/svm/avic.c:579:9: warning: Identical condition and return >> expression 'ret', return value is always 0 [identicalConditionAfterEarlyExit] return ret; ^ arch/x86/kvm/svm/avic.c:572:6: note: If condition 'ret' is true, the function will return/exit if (ret) ^ arch/x86/kvm/svm/avic.c:579:9: note: Returning identical expression 'ret' return ret; ^ >> arch/x86/kvm/svm/avic.c:330:21: warning: Local variable 'apic' shadows outer >> variable [shadowVariable] struct kvm_lapic *apic = svm->vcpu.arch.apic; ^ arch/x86/kvm/svm/avic.c:306:20: note: Shadowed declaration struct kvm_lapic *apic = svm->vcpu.arch.apic; ^ arch/x86/kvm/svm/avic.c:330:21: note: Shadow variable struct kvm_lapic *apic = svm->vcpu.arch.apic; ^ >> arch/x86/kvm/svm/avic.c:404:15: warning: Shifting signed 32-bit value by 31 >> bits is implementation-defined behaviour [shiftTooManyBitsSigned] new_entry |= AVIC_LOGICAL_ID_ENTRY_VALID_MASK; ^ # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ef0f64960d012cbab8f55f305ef36bb6de4e1a9b git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git remote update linus git checkout ef0f64960d012cbab8f55f305ef36bb6de4e1a9b vim +/ret +579 arch/x86/kvm/svm/avic.c ef0f64960d012c Joerg Roedel 2020-03-31 390 ef0f64960d012c Joerg Roedel 2020-03-31 391 static int avic_ldr_write(struct kvm_vcpu *vcpu, u8 g_physical_id, u32 ldr) ef0f64960d012c Joerg Roedel 2020-03-31 392 { ef0f64960d012c Joerg Roedel 2020-03-31 393 bool flat; ef0f64960d012c Joerg Roedel 2020-03-31 394 u32 *entry, new_entry; ef0f64960d012c Joerg Roedel 2020-03-31 395 ef0f64960d012c Joerg Roedel 2020-03-31 396 flat = kvm_lapic_get_reg(vcpu->arch.apic, APIC_DFR) == APIC_DFR_FLAT; ef0f64960d012c Joerg Roedel 2020-03-31 397 entry = avic_get_logical_id_entry(vcpu, ldr, flat); ef0f64960d012c Joerg Roedel 2020-03-31 398 if (!entry) ef0f64960d012c Joerg Roedel 2020-03-31 399 return -EINVAL; ef0f64960d012c Joerg Roedel 2020-03-31 400 ef0f64960d012c Joerg Roedel 2020-03-31 401 new_entry = READ_ONCE(*entry); ef0f64960d012c Joerg Roedel 2020-03-31 402 new_entry &= ~AVIC_LOGICAL_ID_ENTRY_GUEST_PHYSICAL_ID_MASK; ef0f64960d012c Joerg Roedel 2020-03-31 403 new_entry |= (g_physical_id & AVIC_LOGICAL_ID_ENTRY_GUEST_PHYSICAL_ID_MASK); ef0f64960d012c Joerg Roedel 2020-03-31 @404 new_entry |= AVIC_LOGICAL_ID_ENTRY_VALID_MASK; ef0f64960d012c Joerg Roedel 2020-03-31 405 WRITE_ONCE(*entry, new_entry); ef0f64960d012c Joerg Roedel 2020-03-31 406 ef0f64960d012c Joerg Roedel 2020-03-31 407 return 0; ef0f64960d012c Joerg Roedel 2020-03-31 408 } ef0f64960d012c Joerg Roedel 2020-03-31 409 ef0f64960d012c Joerg Roedel 2020-03-31 410 static void avic_invalidate_logical_id_entry(struct kvm_vcpu *vcpu) ef0f64960d012c Joerg Roedel 2020-03-31 411 { ef0f64960d012c Joerg Roedel 2020-03-31 412 struct vcpu_svm *svm = to_svm(vcpu); ef0f64960d012c Joerg Roedel 2020-03-31 413 bool flat = svm->dfr_reg == APIC_DFR_FLAT; ef0f64960d012c Joerg Roedel 2020-03-31 414 u32 *entry = avic_get_logical_id_entry(vcpu, svm->ldr_reg, flat); ef0f64960d012c Joerg Roedel 2020-03-31 415 ef0f64960d012c Joerg Roedel 2020-03-31 416 if (entry) ef0f64960d012c Joerg Roedel 2020-03-31 417 clear_bit(AVIC_LOGICAL_ID_ENTRY_VALID_BIT, (unsigned long *)entry); ef0f64960d012c Joerg Roedel 2020-03-31 418 } ef0f64960d012c Joerg Roedel 2020-03-31 419 ef0f64960d012c Joerg Roedel 2020-03-31 420 static int avic_handle_ldr_update(struct kvm_vcpu *vcpu) ef0f64960d012c Joerg Roedel 2020-03-31 421 { ef0f64960d012c Joerg Roedel 2020-03-31 422 int ret = 0; ef0f64960d012c Joerg Roedel 2020-03-31 423 struct vcpu_svm *svm = to_svm(vcpu); ef0f64960d012c Joerg Roedel 2020-03-31 424 u32 ldr = kvm_lapic_get_reg(vcpu->arch.apic, APIC_LDR); ef0f64960d012c Joerg Roedel 2020-03-31 425 u32 id = kvm_xapic_id(vcpu->arch.apic); ef0f64960d012c Joerg Roedel 2020-03-31 426 ef0f64960d012c Joerg Roedel 2020-03-31 427 if (ldr == svm->ldr_reg) ef0f64960d012c Joerg Roedel 2020-03-31 428 return 0; ef0f64960d012c Joerg Roedel 2020-03-31 429 ef0f64960d012c Joerg Roedel 2020-03-31 430 avic_invalidate_logical_id_entry(vcpu); ef0f64960d012c Joerg Roedel 2020-03-31 431 ef0f64960d012c Joerg Roedel 2020-03-31 432 if (ldr) ef0f64960d012c Joerg Roedel 2020-03-31 433 ret = avic_ldr_write(vcpu, id, ldr); ef0f64960d012c Joerg Roedel 2020-03-31 434 ef0f64960d012c Joerg Roedel 2020-03-31 435 if (!ret) ef0f64960d012c Joerg Roedel 2020-03-31 436 svm->ldr_reg = ldr; ef0f64960d012c Joerg Roedel 2020-03-31 437 ef0f64960d012c Joerg Roedel 2020-03-31 438 return ret; ef0f64960d012c Joerg Roedel 2020-03-31 439 } ef0f64960d012c Joerg Roedel 2020-03-31 440 ef0f64960d012c Joerg Roedel 2020-03-31 441 static int avic_handle_apic_id_update(struct kvm_vcpu *vcpu) ef0f64960d012c Joerg Roedel 2020-03-31 442 { ef0f64960d012c Joerg Roedel 2020-03-31 443 u64 *old, *new; ef0f64960d012c Joerg Roedel 2020-03-31 444 struct vcpu_svm *svm = to_svm(vcpu); ef0f64960d012c Joerg Roedel 2020-03-31 445 u32 id = kvm_xapic_id(vcpu->arch.apic); ef0f64960d012c Joerg Roedel 2020-03-31 446 ef0f64960d012c Joerg Roedel 2020-03-31 447 if (vcpu->vcpu_id == id) ef0f64960d012c Joerg Roedel 2020-03-31 448 return 0; ef0f64960d012c Joerg Roedel 2020-03-31 449 ef0f64960d012c Joerg Roedel 2020-03-31 450 old = avic_get_physical_id_entry(vcpu, vcpu->vcpu_id); ef0f64960d012c Joerg Roedel 2020-03-31 451 new = avic_get_physical_id_entry(vcpu, id); ef0f64960d012c Joerg Roedel 2020-03-31 452 if (!new || !old) ef0f64960d012c Joerg Roedel 2020-03-31 453 return 1; ef0f64960d012c Joerg Roedel 2020-03-31 454 ef0f64960d012c Joerg Roedel 2020-03-31 455 /* We need to move physical_id_entry to new offset */ ef0f64960d012c Joerg Roedel 2020-03-31 456 *new = *old; ef0f64960d012c Joerg Roedel 2020-03-31 457 *old = 0ULL; ef0f64960d012c Joerg Roedel 2020-03-31 458 to_svm(vcpu)->avic_physical_id_cache = new; ef0f64960d012c Joerg Roedel 2020-03-31 459 ef0f64960d012c Joerg Roedel 2020-03-31 460 /* ef0f64960d012c Joerg Roedel 2020-03-31 461 * Also update the guest physical APIC ID in the logical ef0f64960d012c Joerg Roedel 2020-03-31 462 * APIC ID table entry if already setup the LDR. ef0f64960d012c Joerg Roedel 2020-03-31 463 */ ef0f64960d012c Joerg Roedel 2020-03-31 464 if (svm->ldr_reg) ef0f64960d012c Joerg Roedel 2020-03-31 465 avic_handle_ldr_update(vcpu); ef0f64960d012c Joerg Roedel 2020-03-31 466 ef0f64960d012c Joerg Roedel 2020-03-31 467 return 0; ef0f64960d012c Joerg Roedel 2020-03-31 468 } ef0f64960d012c Joerg Roedel 2020-03-31 469 ef0f64960d012c Joerg Roedel 2020-03-31 470 static void avic_handle_dfr_update(struct kvm_vcpu *vcpu) ef0f64960d012c Joerg Roedel 2020-03-31 471 { ef0f64960d012c Joerg Roedel 2020-03-31 472 struct vcpu_svm *svm = to_svm(vcpu); ef0f64960d012c Joerg Roedel 2020-03-31 473 u32 dfr = kvm_lapic_get_reg(vcpu->arch.apic, APIC_DFR); ef0f64960d012c Joerg Roedel 2020-03-31 474 ef0f64960d012c Joerg Roedel 2020-03-31 475 if (svm->dfr_reg == dfr) ef0f64960d012c Joerg Roedel 2020-03-31 476 return; ef0f64960d012c Joerg Roedel 2020-03-31 477 ef0f64960d012c Joerg Roedel 2020-03-31 478 avic_invalidate_logical_id_entry(vcpu); ef0f64960d012c Joerg Roedel 2020-03-31 479 svm->dfr_reg = dfr; ef0f64960d012c Joerg Roedel 2020-03-31 480 } ef0f64960d012c Joerg Roedel 2020-03-31 481 ef0f64960d012c Joerg Roedel 2020-03-31 482 static int avic_unaccel_trap_write(struct vcpu_svm *svm) ef0f64960d012c Joerg Roedel 2020-03-31 483 { ef0f64960d012c Joerg Roedel 2020-03-31 484 struct kvm_lapic *apic = svm->vcpu.arch.apic; ef0f64960d012c Joerg Roedel 2020-03-31 485 u32 offset = svm->vmcb->control.exit_info_1 & ef0f64960d012c Joerg Roedel 2020-03-31 486 AVIC_UNACCEL_ACCESS_OFFSET_MASK; ef0f64960d012c Joerg Roedel 2020-03-31 487 ef0f64960d012c Joerg Roedel 2020-03-31 488 switch (offset) { ef0f64960d012c Joerg Roedel 2020-03-31 489 case APIC_ID: ef0f64960d012c Joerg Roedel 2020-03-31 490 if (avic_handle_apic_id_update(&svm->vcpu)) ef0f64960d012c Joerg Roedel 2020-03-31 491 return 0; ef0f64960d012c Joerg Roedel 2020-03-31 492 break; ef0f64960d012c Joerg Roedel 2020-03-31 493 case APIC_LDR: ef0f64960d012c Joerg Roedel 2020-03-31 494 if (avic_handle_ldr_update(&svm->vcpu)) ef0f64960d012c Joerg Roedel 2020-03-31 495 return 0; ef0f64960d012c Joerg Roedel 2020-03-31 496 break; ef0f64960d012c Joerg Roedel 2020-03-31 497 case APIC_DFR: ef0f64960d012c Joerg Roedel 2020-03-31 498 avic_handle_dfr_update(&svm->vcpu); ef0f64960d012c Joerg Roedel 2020-03-31 499 break; ef0f64960d012c Joerg Roedel 2020-03-31 500 default: ef0f64960d012c Joerg Roedel 2020-03-31 501 break; ef0f64960d012c Joerg Roedel 2020-03-31 502 } ef0f64960d012c Joerg Roedel 2020-03-31 503 ef0f64960d012c Joerg Roedel 2020-03-31 504 kvm_lapic_reg_write(apic, offset, kvm_lapic_get_reg(apic, offset)); ef0f64960d012c Joerg Roedel 2020-03-31 505 ef0f64960d012c Joerg Roedel 2020-03-31 506 return 1; ef0f64960d012c Joerg Roedel 2020-03-31 507 } ef0f64960d012c Joerg Roedel 2020-03-31 508 ef0f64960d012c Joerg Roedel 2020-03-31 509 static bool is_avic_unaccelerated_access_trap(u32 offset) ef0f64960d012c Joerg Roedel 2020-03-31 510 { ef0f64960d012c Joerg Roedel 2020-03-31 511 bool ret = false; ef0f64960d012c Joerg Roedel 2020-03-31 512 ef0f64960d012c Joerg Roedel 2020-03-31 513 switch (offset) { ef0f64960d012c Joerg Roedel 2020-03-31 514 case APIC_ID: ef0f64960d012c Joerg Roedel 2020-03-31 515 case APIC_EOI: ef0f64960d012c Joerg Roedel 2020-03-31 516 case APIC_RRR: ef0f64960d012c Joerg Roedel 2020-03-31 517 case APIC_LDR: ef0f64960d012c Joerg Roedel 2020-03-31 518 case APIC_DFR: ef0f64960d012c Joerg Roedel 2020-03-31 519 case APIC_SPIV: ef0f64960d012c Joerg Roedel 2020-03-31 520 case APIC_ESR: ef0f64960d012c Joerg Roedel 2020-03-31 521 case APIC_ICR: ef0f64960d012c Joerg Roedel 2020-03-31 522 case APIC_LVTT: ef0f64960d012c Joerg Roedel 2020-03-31 523 case APIC_LVTTHMR: ef0f64960d012c Joerg Roedel 2020-03-31 524 case APIC_LVTPC: ef0f64960d012c Joerg Roedel 2020-03-31 525 case APIC_LVT0: ef0f64960d012c Joerg Roedel 2020-03-31 526 case APIC_LVT1: ef0f64960d012c Joerg Roedel 2020-03-31 527 case APIC_LVTERR: ef0f64960d012c Joerg Roedel 2020-03-31 528 case APIC_TMICT: ef0f64960d012c Joerg Roedel 2020-03-31 529 case APIC_TDCR: ef0f64960d012c Joerg Roedel 2020-03-31 530 ret = true; ef0f64960d012c Joerg Roedel 2020-03-31 531 break; ef0f64960d012c Joerg Roedel 2020-03-31 532 default: ef0f64960d012c Joerg Roedel 2020-03-31 533 break; ef0f64960d012c Joerg Roedel 2020-03-31 534 } ef0f64960d012c Joerg Roedel 2020-03-31 535 return ret; ef0f64960d012c Joerg Roedel 2020-03-31 536 } ef0f64960d012c Joerg Roedel 2020-03-31 537 ef0f64960d012c Joerg Roedel 2020-03-31 538 int avic_unaccelerated_access_interception(struct vcpu_svm *svm) ef0f64960d012c Joerg Roedel 2020-03-31 539 { ef0f64960d012c Joerg Roedel 2020-03-31 540 int ret = 0; ef0f64960d012c Joerg Roedel 2020-03-31 541 u32 offset = svm->vmcb->control.exit_info_1 & ef0f64960d012c Joerg Roedel 2020-03-31 542 AVIC_UNACCEL_ACCESS_OFFSET_MASK; ef0f64960d012c Joerg Roedel 2020-03-31 543 u32 vector = svm->vmcb->control.exit_info_2 & ef0f64960d012c Joerg Roedel 2020-03-31 544 AVIC_UNACCEL_ACCESS_VECTOR_MASK; ef0f64960d012c Joerg Roedel 2020-03-31 545 bool write = (svm->vmcb->control.exit_info_1 >> 32) & ef0f64960d012c Joerg Roedel 2020-03-31 546 AVIC_UNACCEL_ACCESS_WRITE_MASK; ef0f64960d012c Joerg Roedel 2020-03-31 547 bool trap = is_avic_unaccelerated_access_trap(offset); ef0f64960d012c Joerg Roedel 2020-03-31 548 ef0f64960d012c Joerg Roedel 2020-03-31 549 trace_kvm_avic_unaccelerated_access(svm->vcpu.vcpu_id, offset, ef0f64960d012c Joerg Roedel 2020-03-31 550 trap, write, vector); ef0f64960d012c Joerg Roedel 2020-03-31 551 if (trap) { ef0f64960d012c Joerg Roedel 2020-03-31 552 /* Handling Trap */ ef0f64960d012c Joerg Roedel 2020-03-31 553 WARN_ONCE(!write, "svm: Handling trap read.\n"); ef0f64960d012c Joerg Roedel 2020-03-31 554 ret = avic_unaccel_trap_write(svm); ef0f64960d012c Joerg Roedel 2020-03-31 555 } else { ef0f64960d012c Joerg Roedel 2020-03-31 556 /* Handling Fault */ ef0f64960d012c Joerg Roedel 2020-03-31 557 ret = kvm_emulate_instruction(&svm->vcpu, 0); ef0f64960d012c Joerg Roedel 2020-03-31 558 } ef0f64960d012c Joerg Roedel 2020-03-31 559 ef0f64960d012c Joerg Roedel 2020-03-31 560 return ret; ef0f64960d012c Joerg Roedel 2020-03-31 561 } ef0f64960d012c Joerg Roedel 2020-03-31 562 ef0f64960d012c Joerg Roedel 2020-03-31 563 int avic_init_vcpu(struct vcpu_svm *svm) ef0f64960d012c Joerg Roedel 2020-03-31 564 { ef0f64960d012c Joerg Roedel 2020-03-31 565 int ret; ef0f64960d012c Joerg Roedel 2020-03-31 566 struct kvm_vcpu *vcpu = &svm->vcpu; ef0f64960d012c Joerg Roedel 2020-03-31 567 ef0f64960d012c Joerg Roedel 2020-03-31 568 if (!avic || !irqchip_in_kernel(vcpu->kvm)) ef0f64960d012c Joerg Roedel 2020-03-31 569 return 0; ef0f64960d012c Joerg Roedel 2020-03-31 570 ef0f64960d012c Joerg Roedel 2020-03-31 571 ret = avic_init_backing_page(&svm->vcpu); ef0f64960d012c Joerg Roedel 2020-03-31 572 if (ret) ef0f64960d012c Joerg Roedel 2020-03-31 573 return ret; ef0f64960d012c Joerg Roedel 2020-03-31 574 ef0f64960d012c Joerg Roedel 2020-03-31 575 INIT_LIST_HEAD(&svm->ir_list); ef0f64960d012c Joerg Roedel 2020-03-31 576 spin_lock_init(&svm->ir_list_lock); ef0f64960d012c Joerg Roedel 2020-03-31 577 svm->dfr_reg = APIC_DFR_FLAT; ef0f64960d012c Joerg Roedel 2020-03-31 578 ef0f64960d012c Joerg Roedel 2020-03-31 @579 return ret; ef0f64960d012c Joerg Roedel 2020-03-31 580 } ef0f64960d012c Joerg Roedel 2020-03-31 581 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/[email protected] _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
