Re: Dealing with the NMI mess

From: Maciej W. Rozycki
Date: Mon Sep 07 2015 - 13:01:17 EST


On Mon, 7 Sep 2015, Paolo Bonzini wrote:

> > I didn't do stuff at the probe firmware level so I can't say for sure,
> > but my gut feeling is the debug mode is indeed very close if not the same
> > as SMM. I think duplicating the logic would be an unnecessary waste of
> > silicon.
>
> I researched SMM a bit recently in order to implement it in KVM, and the
> best source of folklore seems to be http://www.rcollins.org/ddj (which I
> also have on paper :)).

Robert did an excellent job figuring it all, but his stuff is a bit
dated, things may have changed since, especially as JTAG debugging has
since become ubiquitous in the embedded world and consequently better
developed.

> The author there says that SMM design was roughly based on the 386's
> probe/ICE mode design, but it's actually separate. Most notably, on the
> 386 the state save areas almost mirror each other, but when I say
> mirror... I do mean mirror: directions are reversed, and what is on top
> for probe mode is on bottom for SMM. :)

That might be a minor implementation detail, needed for whatever reason.

> In addition, AMD tried reusing ICE mode for SMM, and was sued by Intel
> who actually won the lawsuit. I couldn't find more information about
> the lawsuit.
>
> It's probably diverged more and more over time, for example because SMM
> is now considered security-sensitive while probe mode isn't. In
> addition, the same DDJ article says that Pentium JTAG probe mode
> "doesn't resemble SMM at all, doesn't use a state save map, or even
> execute any code of its own", whatever that means.

At least I am fairly sure the RSM instruction is used to quit the debug
mode just like with SMM, so I'd be surprised if they bothered implementing
separate state save area structures for the two modes. Some control bits
in the CPU may well be set differently between the two modes though,
addressing issues like security sensitivity you mentioned.

A state save/restore approach is definitely used (unlike with some other
processors that expose internal registers through JTAG directly) as you
cannot switch between operation modes (e.g. real vs protected) on the fly
while in the debug mode. You actually need to return to the regular mode
(e.g. ask to single-step a NOP) for a mode change to take effect. Ditto
about other registers -- any read-only bits are only masked out in the
register state once a regular-mode instruction has executed.

The use of RSM also prompts a question whether you can nest debug mode in
SMM (to debug SMM code) -- this is actually similar to the NMI vs IRET
issue considered in this thread -- or nest debug mode in debug mode, e.g.
by taking a #DB exception from an INT1 instruction while in either mode.
I don't know. Some other processors (MIPS) that implement a JTAG debug
mode allow such nesting and care has to be taken in probe firmware to
handle it correctly and ensure the context to return to is not clobbered
if such a situation is to be arranged. And also -- as you may have
expected -- the debug mode return instruction has to be avoided in the
nested handler.

These are all implementation-specific details, including the INT1
instruction, which is why I am not at all surprised that they are omitted
from architecture manuals. The JTAG debug mode itself is no rocket
science though, everybody seems to have it these days. Though for cost
and power consumption saving reasons the RTL block implementing the debug
module may obviously be omitted from production silicon known, perhaps by
definition, to never require one.

Maciej
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/