properly lock nmi enable; delete comment about not locking nmi enable. Reference: /n/atom/patch/applied/nmilock Date: Tue Jan 7 17:39:00 CET 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/nix/k10/fns.h Tue Jan 7 17:38:31 2014 +++ /sys/src/nix/k10/fns.h Tue Jan 7 17:38:31 2014 @@ -75,6 +75,7 @@ uintmem mmuphysaddr(uintptr); int mmuwalk(PTE*, uintptr, int, PTE**, uintmem (*)(usize)); void ndnr(void); +void nmienable(void); void noerrorsleft(void); uchar nvramread(int); void nvramwrite(int, uchar); @@ -103,7 +104,6 @@ int vmapsync(uintptr); void vsvminit(int); void vunmap(void*, usize); -int ainc8(void*); u64int getcr0(void); void putcr0(u64int); @@ -122,6 +122,7 @@ void writeconf(void); void wrmsr(u32int, u64int); +int ainc8(void*); int cas32(void*, u32int, u32int); int cas64(void*, u64int, u64int); int tas32(void*); --- /sys/src/nix/k10/devrtc.c Tue Jan 7 17:38:31 2014 +++ /sys/src/nix/k10/devrtc.c Tue Jan 7 17:38:31 2014 @@ -458,3 +458,18 @@ outb(Pdata, data); iunlock(&nvrtlock); } + +void +nmienable(void) +{ + int x; + + ilock(&nvrtlock); + outb(0x70, 0x80); /* NMI latch clear */ + outb(0x70, 0); + + x = inb(0x61) & 0x07; /* Enable NMI */ + outb(0x61, 0x08|x); + outb(0x61, x); + iunlock(&nvrtlock); +} --- /sys/src/nix/k10/trap.c Tue Jan 7 17:38:32 2014 +++ /sys/src/nix/k10/trap.c Tue Jan 7 17:38:32 2014 @@ -166,22 +166,6 @@ return oldn - n; } -static void -nmienable(void) -{ - int x; - - /* - * Hack: should be locked with NVRAM access. - */ - outb(0x70, 0x80); /* NMI latch clear */ - outb(0x70, 0); - - x = inb(0x61) & 0x07; /* Enable NMI */ - outb(0x61, 0x08|x); - outb(0x61, x); -} - void trapinit(void) { @@ -343,14 +327,16 @@ } else if(vno >= VectorPIC && vno != VectorSYSCALL){ static ulong last; + static uvlong count[MACHMAX]; /* spurious interrupt. */ lapiceoi(vno); if(sys->ticks - last > 20*HZ){ last = sys->ticks; - iprint("cpu%d: spurious interrupt %d, last %d\n", - m->machno, vno, m->lastintr); + iprint("cpu%d: spurious interrupt %d, last %d %lld\n", + m->machno, vno, m->lastintr, count[m->machno]); } + count[m->machno]++; // intrtime(vno); if(user) kexit(ureg); @@ -376,7 +362,6 @@ sched(); splhi(); } - if(user){ if(up && up->procctl || up->nnote)