|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 08/11] x86/hvm: RFC - PROBABLY BROKEN - Defer all debugging/monitor actions to {svm, vmx}_inject_event()
On Mon, Jun 04, 2018 at 02:59:12PM +0100, Andrew Cooper wrote:
> Currently, there is a lot of functionality in the #DB intercepts, and some
> repeated functionality in the *_inject_event() logic.
>
> The gdbsx code is implemented at both levels (albeit differently for #BP,
> which is presumably due to the fact that the old emulator behaviour used to be
> to move %rip forwards for traps), while the monitor behaviour only exists at
> the intercept level.
>
> Updating of %dr6 is implemented (buggily) at both levels, but having it at
> both levels is problematic to implement correctly.
>
> Rearrange the logic to have nothing interesting at the intercept level, and
> everything implemented at the injection level. Amongst other things, this
> means that the monitor subsystem will pick up debug actions from emulated
> events.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> @@ -1797,16 +1803,39 @@ static void vmx_inject_event(const struct x86_event
> *event)
> __vmread(GUEST_IA32_DEBUGCTL, &val);
> __vmwrite(GUEST_IA32_DEBUGCTL, val & ~IA32_DEBUGCTLMSR_LBR);
> }
> - if ( cpu_has_monitor_trap_flag )
> - break;
> +
> /* fall through */
> case TRAP_int3:
> if ( curr->domain->debugger_attached )
> {
> /* Debug/Int3: Trap to debugger. */
> + if ( _event.vector == TRAP_int3 )
> + {
> + /* N.B. Can't use __update_guest_eip() for risk of recusion.
> */
> + regs->rip += _event.insn_len;
> + regs->eflags &= ~X86_EFLAGS_RF;
> + curr->arch.gdbsx_vcpu_event = TRAP_int3;
> + }
> +
> domain_pause_for_debugger();
> return;
> }
> + else
> + {
> + int rc = hvm_monitor_debug(regs->rip,
> + _event.vector == TRAP_debug
> + ? HVM_MONITOR_DEBUG_EXCEPTION
> + : HVM_MONITOR_SOFTWARE_BREAKPOINT,
> + _event.type, _event.insn_len);
> + if ( rc < 0 )
> + {
> + gprintk(XENLOG_ERR, "Monitor debug error %d\n", rc);
> + domain_crash(curr->domain);
> + return;
> + }
> + if ( rc )
> + return; /* VCPU paused. Wait for monitor. */
> + }
> break;
This look fairly similar to the svm_inject_event code, I wonder if
those could be merged somehow (or certain part of it shared).
Roger.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |