I had a customer on x86 notice that sometimes offset 0xf in the CMOS RAM was getting set to invalid values. Their BIOS used this for information about how to boot, and this caused the BIOS to lock up. They traced it down to the following code in arch/kernel/traps.c (now in include/asm-i386/mach-default/mach_traps.c): outb(0x8f, 0x70); inb(0x71); /* dummy */ outb(0x0f, 0x70); inb(0x71); /* dummy */ This code is done at the end of NMI handling and is done without locks. 0x70 is the CMOS RAM index register, 0x71 is the data register. The RTC driver uses the same registers to set the RTC. Obviously, this is bad. I'm not exactly how this code does its function, but it is definately conflicting with the RTC driver. Fixing it is not so easy since you can't claim a lock inside the NMI code that is also claimed by non-NMI code. However, it is fixable, it just requires some special handling (and support of compare-and-exchange). I have attached a first shot at fixing it, relative to 2.6.9. This creates a special lock that is owned by a CPU that also stores the index register being read/written. This is moderatly ugly, I guess, but everything dealing with NMIs is ugly and I couldn't think of a better solution. -Corey