On 01.12.14 12:54, Alex Bennée wrote: > > Christoffer Dall <christoffer.dall@xxxxxxxxxx> writes: > >> On Tue, Nov 25, 2014 at 04:10:05PM +0000, Alex Bennée wrote: > <snip> >>> --- a/arch/arm64/kvm/hyp.S >>> +++ b/arch/arm64/kvm/hyp.S >>> @@ -18,6 +18,7 @@ >>> #include <linux/linkage.h> >>> #include <linux/kvm.h> >>> >>> +#include <uapi/asm/kvm.h> >>> #include <asm/assembler.h> >>> #include <asm/memory.h> >>> #include <asm/asm-offsets.h> >>> @@ -174,6 +175,7 @@ >>> ldr x3, [x0, #GUEST_DEBUG] >>> tbz x3, #KVM_GUESTDBG_ENABLE_SHIFT, 2f // No guest debug >>> >>> + // Both Step and HW BP/WP ops need to modify spsr_el2 and mdscr_el1 >>> // x0 - preserved as VCPU ptr >>> // x1 - spsr >>> // x2 - mdscr >>> @@ -191,6 +193,11 @@ >>> eor x1, x1, #DBG_SPSR_SS >>> eor x2, x2, #DBG_MDSCR_SS >>> 1: >>> + // If we are doing HW BP/WP - set MDSCR_EL1.KDE/MDE >>> + tbz x3, #KVM_GUESTDBG_USE_HW_BP_SHIFT, 3f >>> + orr x2, x2, #DBG_MDSCR_KDE >>> + orr x2, x2, #DBG_MDSCR_MDE >>> +3: >>> msr spsr_el2, x1 >>> msr mdscr_el1, x2 >>> 2: >>> @@ -815,6 +822,33 @@ __restore_debug: >>> >>> ret >>> >>> +/* Setup debug state for debug of guest */ >>> +__setup_debug: >>> + // x0: vcpu base address >>> + // x3: ptr to guest registers passed to setup_debug_registers >>> + // x5..x20/x26: trashed >>> + >>> + mrs x26, id_aa64dfr0_el1 >>> + ubfx x24, x26, #12, #4 // Extract BRPs >>> + ubfx x25, x26, #20, #4 // Extract WRPs >>> + mov w26, #15 >>> + sub w24, w26, w24 // How many BPs to skip >>> + sub w25, w26, w25 // How many WPs to skip >>> + >>> + mov x4, x24 >>> + add x3, x0, #GUEST_DEBUG_BCR >>> + setup_debug_registers dbgbcr >>> + add x3, x0, #GUEST_DEBUG_BVR >>> + setup_debug_registers dbgbvr >>> + >>> + mov x4, x25 >>> + add x3, x0, #GUEST_DEBUG_WCR >>> + setup_debug_registers dbgwcr >>> + add x3, x0, #GUEST_DEBUG_WVR >>> + setup_debug_registers dbgwvr >>> + >>> + ret >>> + >>> __save_fpsimd: >>> save_fpsimd >>> ret >>> @@ -861,6 +895,13 @@ ENTRY(__kvm_vcpu_run) >>> bl __restore_sysregs >>> bl __restore_fpsimd >>> >>> + // Now is the time to set-up the debug registers if we >>> + // are debugging the guest >>> + ldr x3, [x0, #GUEST_DEBUG] >>> + tbz x3, #KVM_GUESTDBG_USE_HW_BP_SHIFT, 2f >>> + bl __setup_debug >>> + b 1f >>> +2: >>> skip_debug_state x3, 1f >>> bl __restore_debug >>> 1: >>> @@ -881,6 +922,11 @@ __kvm_vcpu_return: >>> bl __save_fpsimd >>> bl __save_sysregs >>> >>> + // If we are debugging the guest don't save debug registers >>> + // otherwise we'll be trashing are only good copy we have. >>> + ldr x3, [x0, #GUEST_DEBUG] >>> + tbnz x3, #KVM_GUESTDBG_USE_HW_BP_SHIFT, 1f >>> + >> >> we're introducing an awful lot of conditionals in the assembly code with >> these patches, can you re-consider if there's a cleaner abstraction that >> allows us to deal with some of this stuff in C-code? > > See previous mail. It would be good but we need a place to do it before > we enter hyp.S on a KVM_RUN ioctl. I'm open to suggestions. Do you care about debug interrupts firing while you're running kvm code? If not, just save/restore the registers in vcpu_get/put. Alex _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm