|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 3/3] x86/nmi: Fix shootdown of pcpus running in VMX non-root mode
On 11/02/15 11:02, Jan Beulich wrote:
>>>> On 10.02.15 at 18:12, <andrew.cooper3@xxxxxxxxxx> wrote:
>> @@ -127,38 +128,26 @@ static void nmi_shootdown_cpus(void)
>>
>> cpumask_andnot(&waiting_to_crash, &cpu_online_map, cpumask_of(cpu));
>>
>> - /* 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.
>> + /*
>> + * Disable IST for MCEs to avoid stack corruption race conditions, and
>> + * change the NMI hanlder to a nop to avoid deviation from this
>> codepath.
> handler
>
>> */
>> - for ( i = 0; i < nr_cpu_ids; i++ )
>> - {
>> - if ( idt_tables[i] == NULL )
>> - continue;
>> -
>> - if ( i == cpu )
>> - {
>> - /*
>> - * Disable the interrupt stack tables for this cpu's MCE and
>> NMI
>> - * handlers, and alter the NMI handler to have no operation.
>> - * Disabling the stack tables prevents stack corruption race
>> - * conditions, while changing the handler helps prevent
>> cascading
>> - * faults; we are certainly going to crash by this point.
>> - *
>> - * 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_gate_lower(&idt_tables[i][TRAP_nmi],
>> - SYS_DESC_irq_gate, 0, &trap_nop);
>> - set_ist(&idt_tables[i][TRAP_machine_check], IST_NONE);
>> - }
>> - else
>> - {
>> - /* Do not update stack table for other pcpus. */
>> - _update_gate_addr_lower(&idt_tables[i][TRAP_nmi], &nmi_crash);
>> - }
>> - }
>> + _set_gate_lower(&idt_tables[cpu][TRAP_nmi],
>> + SYS_DESC_irq_gate, 0, &trap_nop);
>> + set_ist(&idt_tables[cpu][TRAP_machine_check], IST_NONE);
>> +
>> + /*
>> + * Ideally would be:
>> + * exception_table[TRAP_nmi] = &do_nmi_crash;
>> + *
>> + * but the exception_table is read only. Borrow and unused fixmap entry
> ... an unused ...
>
>> + * to construct a writable mapping.
>> + */
>> + set_fixmap(FIX_TBOOT_MAP_ADDRESS, __pa(&exception_table[TRAP_nmi]));
>> + write_atomic((unsigned long *)
>> + (fix_to_virt(FIX_TBOOT_MAP_ADDRESS) +
>> + ((unsigned long)&exception_table[TRAP_nmi] & ~PAGE_MASK)),
>> + (unsigned long)&do_nmi_crash);
> By converting the first cast to (void **) or even
> (typeof(do_nmi_crash) **) it would seem possible to drop the last
> cast altogether. While at it you could also drop the unnecessary &.
None of these casts can be dropped, because write_atomic() uses explicit
uint??_t casts. Gcc objects because of -Werror=pointer-to-int-cast.
~Andrew
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |