bug in __flush_tlb_global() ?

Mikael Pettersson mikpe en csd.uu.se
Dom Ene 30 05:33:10 CST 2000


I believe there's a bug in the __flush_tlb_global() macro
added to include/asm-i386/pgtable.h in 2.3.40:

#define __flush_tlb_global()						\
	do {								\
		__asm__ __volatile__(					\
			"movl %0, %%cr4; # turn off PGE \n"		\
			"mov %2, %%cr3;  # flush TLB \n"		\
			"mov %1, %%cr4;  # turn PGE back on \n"		\
			:						\
			: "r" (mmu_cr4_features),			\
			  "r" (mmu_cr4_features & ~X86_CR4_PGE),	\
			  "r" (__pa(current->active_mm->pgd))		\
			: "memory");					\
	} while (0)

Consider the comments. The macro uses input %1 to "turn PGE back on",
but input %1 is (mmu_cr4_features & ~X86_CR4_PGE), which cannot
possibly have the PGE bit on. Likewise, it's using input %0 to
"turn off PGE", but input %0 is (mmu_cr4_features), which probably
_does_ have the PGE bit on (see arch/i386/mm/init.c:pagetable_init()).

I may be wrong, but it looks to me as if inputs 0 and 1 have been
swapped. Proposed fix included below.

/Mikael

--- linux-2.3.41/include/asm-i386/pgtable.h.~1~	Sat Jan 29 14:16:35 2000
+++ linux-2.3.41/include/asm-i386/pgtable.h	Sat Jan 29 23:51:44 2000
@@ -48,8 +48,8 @@
 			"mov %2, %%cr3;  # flush TLB \n"		\
 			"mov %1, %%cr4;  # turn PGE back on \n"		\
 			:						\
-			: "r" (mmu_cr4_features),			\
-			  "r" (mmu_cr4_features & ~X86_CR4_PGE),	\
+			: "r" (mmu_cr4_features & ~X86_CR4_PGE),	\
+			  "r" (mmu_cr4_features),			\
 			  "r" (__pa(current->active_mm->pgd))		\
 			: "memory");					\
 	} while (0)

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo en vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/



Más información sobre la lista de distribución Ayuda