From: Sean Christopherson <seanjc@google.com>
To: "Maciej W. Rozycki" <macro@orcam.me.uk>
Cc: "Paolo Bonzini" <pbonzini@redhat.com>,
kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
"Carlos López" <clopez@suse.de>
Subject: Re: [PATCH v2 2/6] KVM: x86: Prioritize DR7.GD #DB over #GP due to illegal DR6/7 value
Date: Tue, 9 Jun 2026 09:21:06 -0700 [thread overview]
Message-ID: <aig9ckd1f6oZaYgA@google.com> (raw)
In-Reply-To: <alpine.DEB.2.21.2606040048520.22659@angie.orcam.me.uk>
On Thu, Jun 04, 2026, Maciej W. Rozycki wrote:
> On Wed, 3 Jun 2026, Sean Christopherson wrote:
>
> > When emulating a MOV DR, specifically a write to DR6 or DR7, treat a #DB
> > due to DR7.GD (General Detect) as higher priority than a #GP due to an
> > illegal value. While neither Intel's SDM nor AMD's APM says anything
> > about the relative priority, empirical testing on Intel and AMD shows that
> > the #DB has higher priority.
>
> It has to.
Not super strictly speaking though, because ucode _could_ check for an illegal
value before enforcing DR7.GD.
OMG, Intel and AMD don't even behave the same. I _was_ going to say that
"obviously the CPL #GP check has priority over DR7.GD", but on Intel the DR7.GD
#DB has priority over the CPL check, whereas on AMD the CPL check has priority.
Which actually proves my point: hardware/ucode doesn't _have to_ treat DR7.GD
with the absolute highest priority.
Ugh, and KVM's emulator doesn't get the priority between the #UD checks and the
CPL check. Double ugh, half of the instructions that #GP at CPL>0 don't get the
priority right.
> The primary reason for the existence of DR7.GD is to prevent
> software being debugged such as an OS kernel from clobbering the debug
> register state when executed under the control of an ICE or a JTAG (XDP)
> debug probe. Under these circumstances #GP remains an ordinary exception
> routed via the IDT to a handler provided by the OS, however #DB traps into
> the ICE or SMM mode instead and the OS handler is never reached.
>
> This is also the reason why DR7.GD gets cleared at the same time -- so
> that the debug firmware can then access the debug state rather than making
> the exception trigger again -- and for the existence of the ICEBP aka INT1
> instruction -- so that #DB can be triggered and control regained by the
> debug firmware via a software breakpoint, since the number of hardware
> breakpoints is limited (and #BP is an ordinary exception).
>
> It's unsurprising that the priority of these exceptions is not documented
> well in the processor developer's manuals given that x86 hardware debug
> features remain vaguely documented overall in public resources. Though I
> note the Intel wording for the GD bit is "[it] causes a debug exception to
> be generated prior to any MOV instruction that accesses a debug register."
Define "accesses" though. MOV DR at CPL>0 definitely isn't going to access
anything, and so that statement still holds true if the #GP due to CPL>0 had higher
priority, as there wouldn't be any DR access to prevent.
> so I think it actually implies no action resulting from the execution of
> the affected instruction happens, including in particular any exception it
> might otherwise trigger.
>
> FWIW,
>
> Maciej
next prev parent reply other threads:[~2026-06-09 16:21 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-03 23:07 [PATCH v2 0/6] KVM: x86: Fix emulated MOV DR{4,5} #GP bugs Sean Christopherson
2026-06-03 23:07 ` [PATCH v2 1/6] KVM: x86: Treat any non-zero return from set_dr() as a faulting condition Sean Christopherson
2026-06-03 23:07 ` [PATCH v2 2/6] KVM: x86: Prioritize DR7.GD #DB over #GP due to illegal DR6/7 value Sean Christopherson
2026-06-04 0:40 ` Maciej W. Rozycki
2026-06-09 16:21 ` Sean Christopherson [this message]
2026-06-03 23:07 ` [PATCH v2 3/6] KVM: x86: Manually check DR4/5 write values to fix SVM intercept priority Sean Christopherson
2026-06-03 23:07 ` [PATCH v2 4/6] KVM: x86: Use kvm_dr{6,7}_valid() to check DR{4,5,6,7} write values in emulator Sean Christopherson
2026-06-03 23:07 ` [PATCH v2 5/6] KVM: x86: WARN if MOV DR emulation hits a "too late" #GP Sean Christopherson
2026-06-03 23:07 ` [PATCH v2 6/6] KVM: x86: Read CR4.DE in emulator if and only if accessing DR4 or DR5 Sean Christopherson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aig9ckd1f6oZaYgA@google.com \
--to=seanjc@google.com \
--cc=clopez@suse.de \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=macro@orcam.me.uk \
--cc=pbonzini@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.