KVM does not currently honor the trap flag when emulating instructions that cause VM exits. This is observable from guest userspace, try stepping on a CPUID instruction in gdb in a KVM guest. The program will stop two instructions after CPUID.
To fix this, in skip_emulated_instruction we can check for RFLAGS.TF. Patch 5 does this. To handle both the guest setting TF and the KVM_GUESTDBG_SINGLESTEP cases we need to be able to indicate to callees that an exit to userspace is required. Patches 1-4 are largely plumbing to make this possible. Traps triggered by task switch instructions require some additional handling and are not implemented. KVM_GUESTDBG_SINGLESTEP traps can be squashed by certain instructions which also trigger userspace exits, such as HALT, MOV CR8, and IO instructions. I believe (although I have not tested) that KVM will simply generate another trap on the next instruction, so this is no worse than the current behavior. These patches only fix this issue for VMX. I don't have AMD silicon to test on. A small patch to kvm-unit-tests is coming in a separate email.