diff options
Diffstat (limited to 'gitlab/issues_text/target_missing/host_missing/accel_KVM/2710')
| -rw-r--r-- | gitlab/issues_text/target_missing/host_missing/accel_KVM/2710 | 126 |
1 files changed, 0 insertions, 126 deletions
diff --git a/gitlab/issues_text/target_missing/host_missing/accel_KVM/2710 b/gitlab/issues_text/target_missing/host_missing/accel_KVM/2710 deleted file mode 100644 index 54d0fe8cf..000000000 --- a/gitlab/issues_text/target_missing/host_missing/accel_KVM/2710 +++ /dev/null @@ -1,126 +0,0 @@ -QEMU can't detect guest debug support on older (pre v5.7) x86 host kernels due to missing KVM_CAP_SET_GUEST_DEBUG -Description of problem: -``` -qemu-system-x86_64: -s: gdbstub: current accelerator doesn't support guest debugging -``` -Additional information: -I initially located the QEMU source code to determine whether KVM supports gdbstub by checking for `KVM_CAP_SET_GUEST_DEBUG`. The corresponding code can be found at: -```c -// qemu/accel/kvm/kvm-all.c:2695 -#ifdef TARGET_KVM_HAVE_GUEST_DEBUG - kvm_has_guest_debug = - (kvm_check_extension(s, KVM_CAP_SET_GUEST_DEBUG) > 0); -#endif -``` -It can be observed that if the return value is <= 0 (in practice, this function only returns 0 on failure), the debug_flag is set to false. - -Upon further investigation of the Linux 4.15 kernel code, I discovered that in earlier versions, support for checking VM debugging capabilities via `KVM_CAP_SET_GUEST_DEBUG` was almost non-existent (it was only supported on arm64). However, for x86_64, VM debugging is supported on the 4.15 kernel. - -```c -// linu4.15/arch/x86/kvm/x86.c:2672 -int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) -{ - int r; - - switch (ext) { - case KVM_CAP_IRQCHIP: - case KVM_CAP_HLT: - case KVM_CAP_MMU_SHADOW_CACHE_CONTROL: - case KVM_CAP_SET_TSS_ADDR: - case KVM_CAP_EXT_CPUID: - case KVM_CAP_EXT_EMUL_CPUID: - case KVM_CAP_CLOCKSOURCE: - case KVM_CAP_PIT: - case KVM_CAP_NOP_IO_DELAY: - case KVM_CAP_MP_STATE: - case KVM_CAP_SYNC_MMU: - case KVM_CAP_USER_NMI: - case KVM_CAP_REINJECT_CONTROL: - case KVM_CAP_IRQ_INJECT_STATUS: - case KVM_CAP_IOEVENTFD: - case KVM_CAP_IOEVENTFD_NO_LENGTH: - case KVM_CAP_PIT2: - case KVM_CAP_PIT_STATE2: - case KVM_CAP_SET_IDENTITY_MAP_ADDR: - case KVM_CAP_XEN_HVM: - case KVM_CAP_VCPU_EVENTS: - case KVM_CAP_HYPERV: - case KVM_CAP_HYPERV_VAPIC: - case KVM_CAP_HYPERV_SPIN: - case KVM_CAP_HYPERV_SYNIC: - case KVM_CAP_HYPERV_SYNIC2: - case KVM_CAP_HYPERV_VP_INDEX: - case KVM_CAP_PCI_SEGMENT: - case KVM_CAP_DEBUGREGS: - case KVM_CAP_X86_ROBUST_SINGLESTEP: - case KVM_CAP_XSAVE: - case KVM_CAP_ASYNC_PF: - case KVM_CAP_GET_TSC_KHZ: - case KVM_CAP_KVMCLOCK_CTRL: - case KVM_CAP_READONLY_MEM: - case KVM_CAP_HYPERV_TIME: - case KVM_CAP_IOAPIC_POLARITY_IGNORED: - case KVM_CAP_TSC_DEADLINE_TIMER: - case KVM_CAP_ENABLE_CAP_VM: - case KVM_CAP_DISABLE_QUIRKS: - case KVM_CAP_SET_BOOT_CPU_ID: - case KVM_CAP_SPLIT_IRQCHIP: - case KVM_CAP_IMMEDIATE_EXIT: - r = 1; - break; - case KVM_CAP_ADJUST_CLOCK: - r = KVM_CLOCK_TSC_STABLE; - break; - case KVM_CAP_X86_GUEST_MWAIT: - r = kvm_mwait_in_guest(); - break; - case KVM_CAP_X86_SMM: - /* SMBASE is usually relocated above 1M on modern chipsets, - * and SMM handlers might indeed rely on 4G segment limits, - * so do not report SMM to be available if real mode is - * emulated via vm86 mode. Still, do not go to great lengths - * to avoid userspace's usage of the feature, because it is a - * fringe case that is not enabled except via specific settings - * of the module parameters. - */ - r = kvm_x86_ops->cpu_has_high_real_mode_segbase(); - break; - case KVM_CAP_VAPIC: - r = !kvm_x86_ops->cpu_has_accelerated_tpr(); - break; - case KVM_CAP_NR_VCPUS: - r = KVM_SOFT_MAX_VCPUS; - break; - case KVM_CAP_MAX_VCPUS: - r = KVM_MAX_VCPUS; - break; - case KVM_CAP_NR_MEMSLOTS: - r = KVM_USER_MEM_SLOTS; - break; - case KVM_CAP_PV_MMU: /* obsolete */ - r = 0; - break; - case KVM_CAP_MCE: - r = KVM_MAX_MCE_BANKS; - break; - case KVM_CAP_XCRS: - r = boot_cpu_has(X86_FEATURE_XSAVE); - break; - case KVM_CAP_TSC_CONTROL: - r = kvm_has_tsc_control; - break; - case KVM_CAP_X2APIC_API: - r = KVM_X2APIC_API_VALID_FLAGS; - break; - default: - r = 0; - break; - } - return r; - -} -``` - -I attempted to bypass this check in QEMU and verified that the QEMU gdbstub works normally on the 4.15 kernel. - -For modifications related to this part in QEMU, you can refer to the email: https://lore.kernel.org/all/20211111110604.207376-5-pbonzini@redhat.com/. |