All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Jan Beulich <JBeulich@suse.com>
Cc: "xen-devel@lists.xen.org" <xen-devel@lists.xen.org>
Subject: Re: [PATCH 2 of 2 V3] x86/kexec: Change NMI and MCE handling on kexec path
Date: Mon, 10 Dec 2012 12:54:36 +0000	[thread overview]
Message-ID: <50C5DB8C.4050601@citrix.com> (raw)
In-Reply-To: <50C5BA2A02000078000AF4F4@nat28.tlf.novell.com>

On 10/12/12 09:32, Jan Beulich wrote:
>>>> On 07.12.12 at 22:18, Andrew Cooper<andrew.cooper3@citrix.com>  wrote:
>> On 07/12/2012 11:52, Jan Beulich wrote:
>>>>>> On 06.12.12 at 22:42, Andrew Cooper<andrew.cooper3@citrix.com>  wrote:
>>>> +
>>>> +    /* Change NMI trap handlers.  Non-crashing pcpus get nmi_crash which
>>>> +     * invokes do_nmi_crash (above), which cause them to write state and
>>>> +     * fall into a loop.  The crashing pcpu gets the nop handler to
>>>> +     * cause it to return to this function ASAP.
>>>> +     */
>>>> +    for ( i = 0; i<  nr_cpu_ids; ++i )
>>>> +        if ( idt_tables[i] )
>>>> +        {
>>>> +
>>>> +            if ( i == cpu )
>>>> +            {
>>>> +                /* Disable the interrupt stack tables for this MCE and
>>>> +                 * NMI handler (shortly to become a nop) as there is a 1
>>>> +                 * instruction race window where NMIs could be
>>>> +                 * re-enabled and corrupt the exception frame, leaving
>>>> +                 * us unable to continue on this crash path (which half
>>>> +                 * defeats the point of using the nop handler in the
>>>> +                 * first place).
>>>> +                 *
>>>> +                 * This update is safe from a security point of view, as
>>>> +                 * this pcpu is never going to try to sysret back to a
>>>> +                 * PV vcpu.
>>>> +                 */
>>>> +                set_ist(&idt_tables[i][TRAP_nmi],           IST_NONE);
>>>> +                set_ist(&idt_tables[i][TRAP_machine_check], IST_NONE);
>>>> +
>>>> +                _set_gate(&idt_tables[i][TRAP_nmi], 14, 0,&trap_nop);
>>> This makes the first set_ist() above pointless, doesn't it?
>> No.  The set_ist() is to remove the possibility of stack corruption from
>> reentrant NMIs, while the trap_nop handler is so we don't get diverted
>> into the regular NMI handler.  There is nothing the NMI handler would do
>> which could alter the outcome, and there are many cases where the
>> regular NMI handler would try to panic, starting us reentrantly on the
>> kexec path again (where we would deadlock on the one_cpu_only() check).
> I think you didn't get the point of the question: _set_gate() clears
> the IST field of the descriptor anyway, so why clear it separately
> first, and then overwrite it again?

Ah - my apologies.  I indeed was not understanding the point.

I will need to fix up the calls then.  Having _set_gate() change the IST 
as well reintroduces the security vulnerability.  I will create a new 
function similar to _set_gate() which only changes the handler and 
nothing else.

>
>>>> +            }
>>>> +            else
>>>> +                _set_gate(&idt_tables[i][TRAP_nmi], 14, 0,&nmi_crash);
>>>> +        }
>>>> +
>>>>       /* Ensure the new callback function is set before sending out the NMI.
>> */
>>>>       wmb();
>>>>   ...
>>>> +/* Enable NMIs.  No special register assumptions, and all preserved. */
>>>> +ENTRY(enable_nmis)
>>>> +        pushq %rax
>>> What's the point of saving %rax here, btw?
>>>
>>> Jan
>> Because at the moment I believe I might need to call it from asm
>> context, when doing some of the later fixes.  I figured that it was
>> better to make it safe now, rather than patch it up later.
> I don't think that's good practice - if you end up not calling the
> thing from assembly code, the question on the purpose of saving
> %rax will re-surface sooner or later. Plus the patch by itself
> wouldn't really explain either why this is so (which might be
> of interest in the context of backporting it to older trees).
>
> Jan
>

Ok - will remove.

~Andrew

      reply	other threads:[~2012-12-10 12:54 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-06 21:42 [PATCH 0 of 2 V3] Kexec alterations Andrew Cooper
2012-12-06 21:42 ` [PATCH 1 of 2 V3] x86/IST: Create set_ist() helper function Andrew Cooper
2012-12-07 11:45   ` Jan Beulich
2012-12-07 21:01     ` Andrew Cooper
2012-12-06 21:42 ` [PATCH 2 of 2 V3] x86/kexec: Change NMI and MCE handling on kexec path Andrew Cooper
2012-12-07 11:52   ` Jan Beulich
2012-12-07 21:18     ` Andrew Cooper
2012-12-10  9:32       ` Jan Beulich
2012-12-10 12:54         ` Andrew Cooper [this message]

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=50C5DB8C.4050601@citrix.com \
    --to=andrew.cooper3@citrix.com \
    --cc=JBeulich@suse.com \
    --cc=xen-devel@lists.xen.org \
    /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.