aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2012-10-10 13:25:48 -0400
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>2012-10-12 08:49:06 -0400
commit1a7bbda5b1ab0e02622761305a32dc38735b90b2 (patch)
tree2dca1fb5dadd1623d840fd5d4f474ef3db5413a7 /arch/x86
parentcd0608e71e9757f4dae35bcfb4e88f4d1a03a8ab (diff)
xen/bootup: allow {read|write}_cr8 pvops call.
We actually do not do anything about it. Just return a default value of zero and if the kernel tries to write anything but 0 we BUG_ON. This fixes the case when an user tries to suspend the machine and it blows up in save_processor_state b/c 'read_cr8' is set to NULL and we get: kernel BUG at /home/konrad/ssd/linux/arch/x86/include/asm/paravirt.h:100! invalid opcode: 0000 [#1] SMP Pid: 2687, comm: init.late Tainted: G O 3.6.0upstream-00002-gac264ac-dirty #4 Bochs Bochs RIP: e030:[<ffffffff814d5f42>] [<ffffffff814d5f42>] save_processor_state+0x212/0x270 .. snip.. Call Trace: [<ffffffff810733bf>] do_suspend_lowlevel+0xf/0xac [<ffffffff8107330c>] ? x86_acpi_suspend_lowlevel+0x10c/0x150 [<ffffffff81342ee2>] acpi_suspend_enter+0x57/0xd5 CC: stable@vger.kernel.org Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/xen/enlighten.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index 668bbfee0cce..4466feb4c69b 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -987,7 +987,16 @@ static void xen_write_cr4(unsigned long cr4)
987 987
988 native_write_cr4(cr4); 988 native_write_cr4(cr4);
989} 989}
990 990#ifdef CONFIG_X86_64
991static inline unsigned long xen_read_cr8(void)
992{
993 return 0;
994}
995static inline void xen_write_cr8(unsigned long val)
996{
997 BUG_ON(val);
998}
999#endif
991static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high) 1000static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high)
992{ 1001{
993 int ret; 1002 int ret;
@@ -1156,6 +1165,11 @@ static const struct pv_cpu_ops xen_cpu_ops __initconst = {
1156 .read_cr4_safe = native_read_cr4_safe, 1165 .read_cr4_safe = native_read_cr4_safe,
1157 .write_cr4 = xen_write_cr4, 1166 .write_cr4 = xen_write_cr4,
1158 1167
1168#ifdef CONFIG_X86_64
1169 .read_cr8 = xen_read_cr8,
1170 .write_cr8 = xen_write_cr8,
1171#endif
1172
1159 .wbinvd = native_wbinvd, 1173 .wbinvd = native_wbinvd,
1160 1174
1161 .read_msr = native_read_msr_safe, 1175 .read_msr = native_read_msr_safe,