[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 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 &. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |