2.4.36-stable kernel tree
Revision | ba89d5a7c93fd275487ab58268ca53cf14b426bd (tree) |
---|---|
Zeit | 2008-02-11 06:54:44 |
Autor | Willy Tarreau <w@1wt....> |
Commiter | Willy Tarreau |
i386: fix setCx86/getCx86 race in macros
Because of the way the setCx86 macro is defined, a call to
setCx86(XXXX, getCx86(XXXX)) will produce the wrong output sequence.
This affects at least one place in arch/i386/kernel/setup.c :
/* Enable MMX extensions (App note 108) */
setCx86(CX86_CCR7, getCx86(CX86_CCR7)|1);
A correct solution consists in passing the value argument via a
temporary variable. 2.6 has a different fix using inline functions,
which produce equivalent code though.
Signed-off-by: Willy Tarreau <w@1wt.eu>
@@ -234,8 +234,9 @@ static inline void clear_in_cr4 (unsigned long mask) | ||
234 | 234 | #define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); }) |
235 | 235 | |
236 | 236 | #define setCx86(reg, data) do { \ |
237 | + unsigned char _tmp_data = (data); \ | |
237 | 238 | outb((reg), 0x22); \ |
238 | - outb((data), 0x23); \ | |
239 | + outb(_tmp_data, 0x23); \ | |
239 | 240 | } while (0) |
240 | 241 | |
241 | 242 | /* |