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>
#define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); })
#define setCx86(reg, data) do { \
+ unsigned char _tmp_data = (data); \
outb((reg), 0x22); \
- outb((data), 0x23); \
+ outb(_tmp_data, 0x23); \
} while (0)
/*