]> git.baikalelectronics.ru Git - kernel.git/commit
m68k: Disable/restore interrupts in hwreg_present()/hwreg_write()
authorGeert Uytterhoeven <geert@linux-m68k.org>
Sun, 28 Sep 2014 08:50:06 +0000 (10:50 +0200)
committerGeert Uytterhoeven <geert@linux-m68k.org>
Fri, 3 Oct 2014 08:50:56 +0000 (10:50 +0200)
commit5afc831fdbf9090b141e0e2a5f5397fe63334289
tree53d8c0365752e85cfe8491a91265944d64188cef
parente07116f6cd61d4465a899c72950e31181c1a83ea
m68k: Disable/restore interrupts in hwreg_present()/hwreg_write()

hwreg_present() and hwreg_write() temporarily change the VBR register to
another vector table. This table contains a valid bus error handler
only, all other entries point to arbitrary addresses.

If an interrupt comes in while the temporary table is active, the
processor will start executing at such an arbitrary address, and the
kernel will crash.

While most callers run early, before interrupts are enabled, or
explicitly disable interrupts, Finn Thain pointed out that macsonic has
one callsite that doesn't, causing intermittent boot crashes.
There's another unsafe callsite in hilkbd.

Fix this for good by disabling and restoring interrupts inside
hwreg_present() and hwreg_write().

Explicitly disabling interrupts can be removed from the callsites later.

Reported-by: Finn Thain <fthain@telegraphics.com.au>
Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: stable@vger.kernel.org
arch/m68k/mm/hwtest.c