Messages in this thread Patch in this message | | | Date | Wed, 26 Apr 2006 15:46:32 +0200 | From | "Jan Beulich" <> | Subject | [PATCH] i386: PAE entries must have their low word cleared first |
| |
During Xen development we noticed that writes to 64-bit variables may get coded as high-word-before-low-word writes by gcc. Consequently, when invalidating a PAE page table entry, the low word must be explicitly written first, as otherwise, as pointed out by Keir, speculative execution may result in a partially modified (and still valid) translation to be used, which has, according to the specification, the potential of dead-locking the machine.
Signed-off-by: Jan Beulich <jbeulich@novell.com> Cc: Keir Fraser <Keir.Fraser@cl.cam.ac.uk>
diff -Npru /home/jbeulich/tmp/linux-2.6.17-rc2/include/asm-i386/pgtable.h 2.6.17-rc2-i386-pae-ptep_get_and_clear_full/include/asm-i386/pgtable.h --- /home/jbeulich/tmp/linux-2.6.17-rc2/include/asm-i386/pgtable.h 2006-04-26 10:56:03.000000000 +0200 +++ 2.6.17-rc2-i386-pae-ptep_get_and_clear_full/include/asm-i386/pgtable.h 2006-04-24 12:28:37.000000000 +0200 @@ -268,7 +268,15 @@ static inline pte_t ptep_get_and_clear_f pte_t pte; if (full) { pte = *ptep; +#ifdef CONFIG_X86_PAE + /* Cannot do this in a single step, as the compiler + may issue the two stores in either order. */ + ptep->pte_low = 0; + barrier(); + ptep->pte_high = 0; +#else *ptep = __pte(0); +#endif } else { pte = ptep_get_and_clear(mm, addr, ptep); }
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |