x86: Use a read-only IDT alias on all CPUs
authorKees Cook <keescook@chromium.org>
Wed, 10 Apr 2013 19:24:22 +0000 (12:24 -0700)
committerH. Peter Anvin <hpa@linux.intel.com>
Thu, 11 Apr 2013 20:53:19 +0000 (13:53 -0700)
commit4eefbe792baedb474e256d35370849992fcf1c79
tree03a95dab4a014a7f36133f9660ca180b01df62d4
parent31880c37c11e28cb81c70757e38392b42e695dc6
x86: Use a read-only IDT alias on all CPUs

Make a copy of the IDT (as seen via the "sidt" instruction) read-only.
This primarily removes the IDT from being a target for arbitrary memory
write attacks, and has the added benefit of also not leaking the kernel
base offset, if it has been relocated.

We already did this on vendor == Intel and family == 5 because of the
F0 0F bug -- regardless of if a particular CPU had the F0 0F bug or
not.  Since the workaround was so cheap, there simply was no reason to
be very specific.  This patch extends the readonly alias to all CPUs,
but does not activate the #PF to #UD conversion code needed to deliver
the proper exception in the F0 0F case except on Intel family 5
processors.

Signed-off-by: Kees Cook <keescook@chromium.org>
Link: http://lkml.kernel.org/r/20130410192422.GA17344@www.outflux.net
Cc: Eric Northup <digitaleric@google.com>
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
arch/x86/include/asm/fixmap.h
arch/x86/kernel/cpu/intel.c
arch/x86/kernel/traps.c
arch/x86/xen/mmu.c