2010-04-26 18:43:37

by Ondrej Zary

[permalink] [raw]
Subject: Invalid opcode on resume from STR on Asus P4P800-VM

Hello,
I'm trying to debug oops on resume from suspend-to-RAM on Asus P4P800-VM
mainboard. It crashes with invalid opcode (see below). The kernel is
2.6.32-trunk from Debian but the same problem is present with vanilla
kernels - both newer and older (but screen remains blank most of the time,
only keyboard LEDs blink indicating an oops).

What can cause this problem?

8.000339 invalid opcode: 0000 [#1] SMP
8.003529 last sysfs file: /sys/power/state
8.004265 Modules linked in: sco bridge stp bnep l2cacp crc16 bluetooth rfkill loop i2c_i801 snd_intel8x0 snd_ac97_codec shpchp ac97_bus
parport_pc parport
rng_core pci_hotplug snd_pcsp snd_pcm snd_timer snd soundcore psmouse snd_page_alloc serio_raw evdev processor ext3 jbd mbcache ide_gd_mod
ata_generic libata scsi_mod
ide_pci_generic i915 drm_kms_helper uhci_hcd drm i2c_algo_bit piix i2c_core ehci_hcd intel_agp e100 video ide_core mii floppy agpgart output
usbcore nls_base button
thermal fan thermal_sys [last unloaded: scsi_wait_scan]
[ 148.004265]
[ 148.004265] Pid: 0, comm: swapper Not tainted (2.6.32-trunk-686 #1) To Be Filled By O.E.M.
[ 148.004265] EIP: 0060:[<c1008ff3>] EFLAGS: 00010086 CPU: 0
[ 148.004265] EIP is at mwait_idle+0x4e/0x6c
[ 148.004265] EAX: c1336008 EBX: c1336008 ECX: 00000000 EDX: 00000000
[ 148.004265] ESI: 00000000 EDI: c1339000 EBP: 01642003 ESP: c1337fd0
[ 148.004265] DS: 0068 ES: 007b FS: 00d8 GS: 00e0 SS: 0068
[ 148.004265] Process swapper (pid: 0, ti=c1336000 task=c1364ba0 task.ti=c1336000)
[ 148.004265] Stack:
[ 148.004265] c1396004 c1002388 4176f186 d147e8ee c13c61e8 00099800 c1399800 a05e3121
[ 148.004265] <0> 46258193 c13c61e8 00010800 00000000
[ 148.004265] Call Trace:
[ 148.004265] [<c1002388>] ? cpu_idle+0x89/0xa5
[ 148.004265] [<c1399800>] ? start_kernel+0x30c/0x311
[ 148.004265] Code: 8b 15 50 e9 3e c1 f6 44 10 27 02 74 0f 89 e2 81 e2 00 e0 ff ff 8d 42 08 0f ae 7a 08 89 e3 31 c9 81 e3 00 e0 ff ff 89 ca
8d 43 08 <0f> 01 c8
0f ae f0 89 f6 f6 43 08 08 75 08 89 c8 fb 0f 01 c9 eb
[ 148.004265] EIP: [<c1008ff3>] mwait_idle+0x4e/0x6c SS:ESP 0068:c1337fd0
[ 148.004265] ---[ end trace b2f32b48d4fa5394 ]---
[ 148.004265] Kernel panic - not syncing: Attempted to kill the idle task!
[ 148.004265] Pid: 0, comm: swapper Tainted: G D 2.6.32-trunk-686 #1
[ 148.004265] Call Trace:
[ 148.004265] [<c1259284>] ? panic+0x38/0xe4
[ 148.004265] [<c1033805>] ? do_exit+0x5a/0x5c6
[ 148.004265] [<c1259ee3>] ? printk+0xe/0x18
[ 148.004265] [<c100509d>] ? oops_end+0x98/0x9d
[ 148.004265] [<c100424b>] ? do_invalid_op+0x0/0x75
[ 148.004265] [<c10042b7>] ? do_invalid_op+0x6c/0x75
[ 148.004265] [<c1008ff3>] ? mwait_idle+0x4e/0x6c
[ 148.004265] [<c1001f10>] ? __switch_to+0xcf/0x141
[ 148.004265] [<c1046e9b>] ? hrtimer_get_next_event+0x8c/0xa0
[ 148.004265] [<c103b9da>] ? get_next_timer_interrupt+0x16f/0x1da
[ 148.004265] [<c1007fd1>] ? sched_clock+0x5/0x7
[ 148.004265] [<c104829f>] ? sched_clock_local+0x15/0x11b
[ 148.004265] [<c125af7b>] ? error_code+0x73/0x78
[ 148.004265] [<c1008ff3>] ? mwait_idle+0x4e/0x6c
[ 148.004265] [<c1002388>] ? cpu_idle+0x89/0xa5
[ 148.004265] [<c1399800>] ? start_kernel+0x30c/0x311
[ 148.004265] [drm:drm_fb_helper_panic] *ERROR* panic occured, switching back to text console


--
Ondrej Zary


2010-04-26 19:17:30

by Alan Stern

[permalink] [raw]
Subject: Re: [linux-pm] Invalid opcode on resume from STR on Asus P4P800-VM

On Mon, 26 Apr 2010, Ondrej Zary wrote:

> Hello,
> I'm trying to debug oops on resume from suspend-to-RAM on Asus P4P800-VM
> mainboard. It crashes with invalid opcode (see below). The kernel is
> 2.6.32-trunk from Debian but the same problem is present with vanilla
> kernels - both newer and older (but screen remains blank most of the time,
> only keyboard LEDs blink indicating an oops).
>
> What can cause this problem?
>
> 8.000339 invalid opcode: 0000 [#1] SMP
> 8.003529 last sysfs file: /sys/power/state
> 8.004265 Modules linked in: sco bridge stp bnep l2cacp crc16 bluetooth rfkill loop i2c_i801 snd_intel8x0 snd_ac97_codec shpchp ac97_bus
> parport_pc parport
> rng_core pci_hotplug snd_pcsp snd_pcm snd_timer snd soundcore psmouse snd_page_alloc serio_raw evdev processor ext3 jbd mbcache ide_gd_mod
> ata_generic libata scsi_mod
> ide_pci_generic i915 drm_kms_helper uhci_hcd drm i2c_algo_bit piix i2c_core ehci_hcd intel_agp e100 video ide_core mii floppy agpgart output
> usbcore nls_base button
> thermal fan thermal_sys [last unloaded: scsi_wait_scan]
> [ 148.004265]
> [ 148.004265] Pid: 0, comm: swapper Not tainted (2.6.32-trunk-686 #1) To Be Filled By O.E.M.
> [ 148.004265] EIP: 0060:[<c1008ff3>] EFLAGS: 00010086 CPU: 0
> [ 148.004265] EIP is at mwait_idle+0x4e/0x6c

I had exactly the same problem (on an HP computer with an Intel
chipset). As far as anyone could figure out, it is caused by a bug in
the BIOS. It's not entirely clear that this is the complete answer,
but nothing else turned up. See

http://bugzilla.kernel.org/show_bug.cgi?id=15385

for the complete record. The best solution I could find was to boot
with "idle=halt" on the command line. You might check to see if any
BIOS updates are available.

Alan Stern

2010-04-26 19:55:20

by Ondrej Zary

[permalink] [raw]
Subject: Re: [linux-pm] Invalid opcode on resume from STR on Asus P4P800-VM

On Monday 26 April 2010 21:17:27 Alan Stern wrote:
> On Mon, 26 Apr 2010, Ondrej Zary wrote:
> > Hello,
> > I'm trying to debug oops on resume from suspend-to-RAM on Asus P4P800-VM
> > mainboard. It crashes with invalid opcode (see below). The kernel is
> > 2.6.32-trunk from Debian but the same problem is present with vanilla
> > kernels - both newer and older (but screen remains blank most of the
> > time, only keyboard LEDs blink indicating an oops).
> >
> > What can cause this problem?
> >
> > 8.000339 invalid opcode: 0000 [#1] SMP
> > 8.003529 last sysfs file: /sys/power/state
> > 8.004265 Modules linked in: sco bridge stp bnep l2cacp crc16
> > bluetooth rfkill loop i2c_i801 snd_intel8x0 snd_ac97_codec shpchp
> > ac97_bus parport_pc parport
> > rng_core pci_hotplug snd_pcsp snd_pcm snd_timer snd soundcore psmouse
> > snd_page_alloc serio_raw evdev processor ext3 jbd mbcache ide_gd_mod
> > ata_generic libata scsi_mod
> > ide_pci_generic i915 drm_kms_helper uhci_hcd drm i2c_algo_bit piix
> > i2c_core ehci_hcd intel_agp e100 video ide_core mii floppy agpgart output
> > usbcore nls_base button
> > thermal fan thermal_sys [last unloaded: scsi_wait_scan]
> > [ 148.004265]
> > [ 148.004265] Pid: 0, comm: swapper Not tainted (2.6.32-trunk-686 #1) To
> > Be Filled By O.E.M. [ 148.004265] EIP: 0060:[<c1008ff3>] EFLAGS:
> > 00010086 CPU: 0
> > [ 148.004265] EIP is at mwait_idle+0x4e/0x6c
>
> I had exactly the same problem (on an HP computer with an Intel
> chipset). As far as anyone could figure out, it is caused by a bug in
> the BIOS. It's not entirely clear that this is the complete answer,
> but nothing else turned up. See
>
> http://bugzilla.kernel.org/show_bug.cgi?id=15385
>
> for the complete record. The best solution I could find was to boot
> with "idle=halt" on the command line. You might check to see if any
> BIOS updates are available.

Thanks, it does not crash with "idle=halt" or "idle=poll". According to this:
http://siyobik.info/index.php?module=x86&id=215
the MWAIT instruction can be enabled/disabled in IA32_MISC_ENABLES MSR. Kernel
probably should enable it at boot and also on resume.
Here's some more info:
http://software.intel.com/en-us/forums/showthread.php?t=63654

--
Ondrej Zary

2010-04-26 20:34:36

by Alan Stern

[permalink] [raw]
Subject: Re: [linux-pm] Invalid opcode on resume from STR on Asus P4P800-VM

On Mon, 26 Apr 2010, Ondrej Zary wrote:

> On Monday 26 April 2010 21:17:27 Alan Stern wrote:
> > On Mon, 26 Apr 2010, Ondrej Zary wrote:
> > > Hello,
> > > I'm trying to debug oops on resume from suspend-to-RAM on Asus P4P800-VM
> > > mainboard. It crashes with invalid opcode (see below). The kernel is
> > > 2.6.32-trunk from Debian but the same problem is present with vanilla
> > > kernels - both newer and older (but screen remains blank most of the
> > > time, only keyboard LEDs blink indicating an oops).
> > >
> > > What can cause this problem?
> > >
> > > 8.000339 invalid opcode: 0000 [#1] SMP
> > > 8.003529 last sysfs file: /sys/power/state
> > > 8.004265 Modules linked in: sco bridge stp bnep l2cacp crc16
> > > bluetooth rfkill loop i2c_i801 snd_intel8x0 snd_ac97_codec shpchp
> > > ac97_bus parport_pc parport
> > > rng_core pci_hotplug snd_pcsp snd_pcm snd_timer snd soundcore psmouse
> > > snd_page_alloc serio_raw evdev processor ext3 jbd mbcache ide_gd_mod
> > > ata_generic libata scsi_mod
> > > ide_pci_generic i915 drm_kms_helper uhci_hcd drm i2c_algo_bit piix
> > > i2c_core ehci_hcd intel_agp e100 video ide_core mii floppy agpgart output
> > > usbcore nls_base button
> > > thermal fan thermal_sys [last unloaded: scsi_wait_scan]
> > > [ 148.004265]
> > > [ 148.004265] Pid: 0, comm: swapper Not tainted (2.6.32-trunk-686 #1) To
> > > Be Filled By O.E.M. [ 148.004265] EIP: 0060:[<c1008ff3>] EFLAGS:
> > > 00010086 CPU: 0
> > > [ 148.004265] EIP is at mwait_idle+0x4e/0x6c
> >
> > I had exactly the same problem (on an HP computer with an Intel
> > chipset). As far as anyone could figure out, it is caused by a bug in
> > the BIOS. It's not entirely clear that this is the complete answer,
> > but nothing else turned up. See
> >
> > http://bugzilla.kernel.org/show_bug.cgi?id=15385
> >
> > for the complete record. The best solution I could find was to boot
> > with "idle=halt" on the command line. You might check to see if any
> > BIOS updates are available.
>
> Thanks, it does not crash with "idle=halt" or "idle=poll". According to this:
> http://siyobik.info/index.php?module=x86&id=215
> the MWAIT instruction can be enabled/disabled in IA32_MISC_ENABLES MSR. Kernel
> probably should enable it at boot and also on resume.
> Here's some more info:
> http://software.intel.com/en-us/forums/showthread.php?t=63654

That could be the answer. Clearly this should be handled by the
arch-specific boot/setup code. I don't know enough about it, but other
people do.

Alan Stern

2010-04-27 01:07:39

by Robert Hancock

[permalink] [raw]
Subject: Re: [linux-pm] Invalid opcode on resume from STR on Asus P4P800-VM

On 04/26/2010 02:34 PM, Alan Stern wrote:
> On Mon, 26 Apr 2010, Ondrej Zary wrote:
>
>> On Monday 26 April 2010 21:17:27 Alan Stern wrote:
>>> On Mon, 26 Apr 2010, Ondrej Zary wrote:
>>>> Hello,
>>>> I'm trying to debug oops on resume from suspend-to-RAM on Asus P4P800-VM
>>>> mainboard. It crashes with invalid opcode (see below). The kernel is
>>>> 2.6.32-trunk from Debian but the same problem is present with vanilla
>>>> kernels - both newer and older (but screen remains blank most of the
>>>> time, only keyboard LEDs blink indicating an oops).
>>>>
>>>> What can cause this problem?
>>>>
>>>> 8.000339 invalid opcode: 0000 [#1] SMP
>>>> 8.003529 last sysfs file: /sys/power/state
>>>> 8.004265 Modules linked in: sco bridge stp bnep l2cacp crc16
>>>> bluetooth rfkill loop i2c_i801 snd_intel8x0 snd_ac97_codec shpchp
>>>> ac97_bus parport_pc parport
>>>> rng_core pci_hotplug snd_pcsp snd_pcm snd_timer snd soundcore psmouse
>>>> snd_page_alloc serio_raw evdev processor ext3 jbd mbcache ide_gd_mod
>>>> ata_generic libata scsi_mod
>>>> ide_pci_generic i915 drm_kms_helper uhci_hcd drm i2c_algo_bit piix
>>>> i2c_core ehci_hcd intel_agp e100 video ide_core mii floppy agpgart output
>>>> usbcore nls_base button
>>>> thermal fan thermal_sys [last unloaded: scsi_wait_scan]
>>>> [ 148.004265]
>>>> [ 148.004265] Pid: 0, comm: swapper Not tainted (2.6.32-trunk-686 #1) To
>>>> Be Filled By O.E.M. [ 148.004265] EIP: 0060:[<c1008ff3>] EFLAGS:
>>>> 00010086 CPU: 0
>>>> [ 148.004265] EIP is at mwait_idle+0x4e/0x6c
>>>
>>> I had exactly the same problem (on an HP computer with an Intel
>>> chipset). As far as anyone could figure out, it is caused by a bug in
>>> the BIOS. It's not entirely clear that this is the complete answer,
>>> but nothing else turned up. See
>>>
>>> http://bugzilla.kernel.org/show_bug.cgi?id=15385
>>>
>>> for the complete record. The best solution I could find was to boot
>>> with "idle=halt" on the command line. You might check to see if any
>>> BIOS updates are available.
>>
>> Thanks, it does not crash with "idle=halt" or "idle=poll". According to this:
>> http://siyobik.info/index.php?module=x86&id=215
>> the MWAIT instruction can be enabled/disabled in IA32_MISC_ENABLES MSR. Kernel
>> probably should enable it at boot and also on resume.
>> Here's some more info:
>> http://software.intel.com/en-us/forums/showthread.php?t=63654
>
> That could be the answer. Clearly this should be handled by the
> arch-specific boot/setup code. I don't know enough about it, but other
> people do.

It looks like idle=nomwait should be the workaround with the least
impact at the moment..

2010-04-27 10:05:24

by Ondrej Zary

[permalink] [raw]
Subject: Re: [linux-pm] Invalid opcode on resume from STR on Asus P4P800-VM

On Tuesday 27 April 2010 03:07:35 Robert Hancock wrote:
> On 04/26/2010 02:34 PM, Alan Stern wrote:
> > On Mon, 26 Apr 2010, Ondrej Zary wrote:
> >> On Monday 26 April 2010 21:17:27 Alan Stern wrote:
> >>> On Mon, 26 Apr 2010, Ondrej Zary wrote:
> >>>> Hello,
> >>>> I'm trying to debug oops on resume from suspend-to-RAM on Asus
> >>>> P4P800-VM mainboard. It crashes with invalid opcode (see below). The
> >>>> kernel is 2.6.32-trunk from Debian but the same problem is present
> >>>> with vanilla kernels - both newer and older (but screen remains blank
> >>>> most of the time, only keyboard LEDs blink indicating an oops).
> >>>>
> >>>> What can cause this problem?
> >>>>
> >>>> 8.000339 invalid opcode: 0000 [#1] SMP
> >>>> 8.003529 last sysfs file: /sys/power/state
> >>>> 8.004265 Modules linked in: sco bridge stp bnep l2cacp crc16
> >>>> bluetooth rfkill loop i2c_i801 snd_intel8x0 snd_ac97_codec shpchp
> >>>> ac97_bus parport_pc parport
> >>>> rng_core pci_hotplug snd_pcsp snd_pcm snd_timer snd soundcore psmouse
> >>>> snd_page_alloc serio_raw evdev processor ext3 jbd mbcache ide_gd_mod
> >>>> ata_generic libata scsi_mod
> >>>> ide_pci_generic i915 drm_kms_helper uhci_hcd drm i2c_algo_bit piix
> >>>> i2c_core ehci_hcd intel_agp e100 video ide_core mii floppy agpgart
> >>>> output usbcore nls_base button
> >>>> thermal fan thermal_sys [last unloaded: scsi_wait_scan]
> >>>> [ 148.004265]
> >>>> [ 148.004265] Pid: 0, comm: swapper Not tainted (2.6.32-trunk-686 #1)
> >>>> To Be Filled By O.E.M. [ 148.004265] EIP: 0060:[<c1008ff3>] EFLAGS:
> >>>> 00010086 CPU: 0
> >>>> [ 148.004265] EIP is at mwait_idle+0x4e/0x6c
> >>>
> >>> I had exactly the same problem (on an HP computer with an Intel
> >>> chipset). As far as anyone could figure out, it is caused by a bug in
> >>> the BIOS. It's not entirely clear that this is the complete answer,
> >>> but nothing else turned up. See
> >>>
> >>> http://bugzilla.kernel.org/show_bug.cgi?id=15385
> >>>
> >>> for the complete record. The best solution I could find was to boot
> >>> with "idle=halt" on the command line. You might check to see if any
> >>> BIOS updates are available.
> >>
> >> Thanks, it does not crash with "idle=halt" or "idle=poll". According to
> >> this: http://siyobik.info/index.php?module=x86&id=215
> >> the MWAIT instruction can be enabled/disabled in IA32_MISC_ENABLES MSR.
> >> Kernel probably should enable it at boot and also on resume.
> >> Here's some more info:
> >> http://software.intel.com/en-us/forums/showthread.php?t=63654
> >
> > That could be the answer. Clearly this should be handled by the
> > arch-specific boot/setup code. I don't know enough about it, but other
> > people do.
>
> It looks like idle=nomwait should be the workaround with the least
> impact at the moment..

It does not work for me.

--
Ondrej Zary

2010-04-27 18:23:45

by Alan Stern

[permalink] [raw]
Subject: Re: [linux-pm] Invalid opcode on resume from STR on Asus P4P800-VM

On Tue, 27 Apr 2010, Ondrej Zary wrote:

> > It looks like idle=nomwait should be the workaround with the least
> > impact at the moment..
>
> It does not work for me.

Not surpisingly, since mwait_usable() ignores the idle_nomwait flag.
Maybe that's a bug and should be fixed -- I don't know.

Alan Stern

2010-06-04 22:29:39

by Ondrej Zary

[permalink] [raw]
Subject: [PATCH] Re: [linux-pm] Invalid opcode on resume from STR on Asus P4P800-VM

On Monday 26 April 2010 22:34:35 Alan Stern wrote:
> On Mon, 26 Apr 2010, Ondrej Zary wrote:
> > On Monday 26 April 2010 21:17:27 Alan Stern wrote:
> > > On Mon, 26 Apr 2010, Ondrej Zary wrote:
> > > > Hello,
> > > > I'm trying to debug oops on resume from suspend-to-RAM on Asus
> > > > P4P800-VM mainboard. It crashes with invalid opcode (see below). The
> > > > kernel is 2.6.32-trunk from Debian but the same problem is present
> > > > with vanilla kernels - both newer and older (but screen remains blank
> > > > most of the time, only keyboard LEDs blink indicating an oops).
> > > >
> > > > What can cause this problem?
> > > >
> > > > 8.000339 invalid opcode: 0000 [#1] SMP
> > > > 8.003529 last sysfs file: /sys/power/state
> > > > 8.004265 Modules linked in: sco bridge stp bnep l2cacp crc16
> > > > bluetooth rfkill loop i2c_i801 snd_intel8x0 snd_ac97_codec shpchp
> > > > ac97_bus parport_pc parport
> > > > rng_core pci_hotplug snd_pcsp snd_pcm snd_timer snd soundcore psmouse
> > > > snd_page_alloc serio_raw evdev processor ext3 jbd mbcache ide_gd_mod
> > > > ata_generic libata scsi_mod
> > > > ide_pci_generic i915 drm_kms_helper uhci_hcd drm i2c_algo_bit piix
> > > > i2c_core ehci_hcd intel_agp e100 video ide_core mii floppy agpgart
> > > > output usbcore nls_base button
> > > > thermal fan thermal_sys [last unloaded: scsi_wait_scan]
> > > > [ 148.004265]
> > > > [ 148.004265] Pid: 0, comm: swapper Not tainted (2.6.32-trunk-686
> > > > #1) To Be Filled By O.E.M. [ 148.004265] EIP: 0060:[<c1008ff3>]
> > > > EFLAGS: 00010086 CPU: 0
> > > > [ 148.004265] EIP is at mwait_idle+0x4e/0x6c
> > >
> > > I had exactly the same problem (on an HP computer with an Intel
> > > chipset). As far as anyone could figure out, it is caused by a bug in
> > > the BIOS. It's not entirely clear that this is the complete answer,
> > > but nothing else turned up. See
> > >
> > > http://bugzilla.kernel.org/show_bug.cgi?id=15385
> > >
> > > for the complete record. The best solution I could find was to boot
> > > with "idle=halt" on the command line. You might check to see if any
> > > BIOS updates are available.
> >
> > Thanks, it does not crash with "idle=halt" or "idle=poll". According to
> > this: http://siyobik.info/index.php?module=x86&id=215
> > the MWAIT instruction can be enabled/disabled in IA32_MISC_ENABLES MSR.
> > Kernel probably should enable it at boot and also on resume.
> > Here's some more info:
> > http://software.intel.com/en-us/forums/showthread.php?t=63654
>
> That could be the answer. Clearly this should be handled by the
> arch-specific boot/setup code. I don't know enough about it, but other
> people do.

Here's a patch that fixes the problem. I don't know how many machines will
it break...


diff -urp linux-2.6.35-rc1-git2-orig/arch/x86/include/asm/suspend_32.h linux-2.6.35-rc1-git2/arch/x86/include/asm/suspend_32.h
--- linux-2.6.35-rc1-git2-orig/arch/x86/include/asm/suspend_32.h 2010-05-30 22:21:02.000000000 +0200
+++ linux-2.6.35-rc1-git2/arch/x86/include/asm/suspend_32.h 2010-06-04 23:52:22.000000000 +0200
@@ -15,6 +15,7 @@ static inline int arch_prepare_suspend(v
struct saved_context {
u16 es, fs, gs, ss;
unsigned long cr0, cr2, cr3, cr4;
+ unsigned long misc_enable;
struct desc_ptr gdt;
struct desc_ptr idt;
u16 ldt;
diff -urp linux-2.6.35-rc1-git2-orig/arch/x86/include/asm/suspend_64.h linux-2.6.35-rc1-git2/arch/x86/include/asm/suspend_64.h
--- linux-2.6.35-rc1-git2-orig/arch/x86/include/asm/suspend_64.h 2010-05-30 22:21:02.000000000 +0200
+++ linux-2.6.35-rc1-git2/arch/x86/include/asm/suspend_64.h 2010-06-04 23:52:21.000000000 +0200
@@ -27,6 +27,7 @@ struct saved_context {
u16 ds, es, fs, gs, ss;
unsigned long gs_base, gs_kernel_base, fs_base;
unsigned long cr0, cr2, cr3, cr4, cr8;
+ unsigned long misc_enable;
unsigned long efer;
u16 gdt_pad;
u16 gdt_limit;
diff -urp linux-2.6.35-rc1-git2-orig/arch/x86/power/cpu.c linux-2.6.35-rc1-git2/arch/x86/power/cpu.c
--- linux-2.6.35-rc1-git2-orig/arch/x86/power/cpu.c 2010-05-30 22:21:02.000000000 +0200
+++ linux-2.6.35-rc1-git2/arch/x86/power/cpu.c 2010-06-04 23:50:52.000000000 +0200
@@ -105,6 +105,7 @@ static void __save_processor_state(struc
ctxt->cr4 = read_cr4();
ctxt->cr8 = read_cr8();
#endif
+ rdmsrl(MSR_IA32_MISC_ENABLE, ctxt->misc_enable);
}

/* Needed by apm.c */
@@ -152,6 +153,7 @@ static void fix_processor_context(void)
*/
static void __restore_processor_state(struct saved_context *ctxt)
{
+ wrmsrl(MSR_IA32_MISC_ENABLE, ctxt->misc_enable);
/*
* control registers
*/


--
Ondrej Zary

2010-06-05 01:45:43

by Alan Stern

[permalink] [raw]
Subject: Re: [PATCH] Re: [linux-pm] Invalid opcode on resume from STR on Asus P4P800-VM

On Sat, 5 Jun 2010, Ondrej Zary wrote:

> Here's a patch that fixes the problem. I don't know how many machines will
> it break...
>
>
> diff -urp linux-2.6.35-rc1-git2-orig/arch/x86/include/asm/suspend_32.h linux-2.6.35-rc1-git2/arch/x86/include/asm/suspend_32.h
> --- linux-2.6.35-rc1-git2-orig/arch/x86/include/asm/suspend_32.h 2010-05-30 22:21:02.000000000 +0200
> +++ linux-2.6.35-rc1-git2/arch/x86/include/asm/suspend_32.h 2010-06-04 23:52:22.000000000 +0200
> @@ -15,6 +15,7 @@ static inline int arch_prepare_suspend(v
> struct saved_context {
> u16 es, fs, gs, ss;
> unsigned long cr0, cr2, cr3, cr4;
> + unsigned long misc_enable;
> struct desc_ptr gdt;
> struct desc_ptr idt;
> u16 ldt;
> diff -urp linux-2.6.35-rc1-git2-orig/arch/x86/include/asm/suspend_64.h linux-2.6.35-rc1-git2/arch/x86/include/asm/suspend_64.h
> --- linux-2.6.35-rc1-git2-orig/arch/x86/include/asm/suspend_64.h 2010-05-30 22:21:02.000000000 +0200
> +++ linux-2.6.35-rc1-git2/arch/x86/include/asm/suspend_64.h 2010-06-04 23:52:21.000000000 +0200
> @@ -27,6 +27,7 @@ struct saved_context {
> u16 ds, es, fs, gs, ss;
> unsigned long gs_base, gs_kernel_base, fs_base;
> unsigned long cr0, cr2, cr3, cr4, cr8;
> + unsigned long misc_enable;
> unsigned long efer;
> u16 gdt_pad;
> u16 gdt_limit;
> diff -urp linux-2.6.35-rc1-git2-orig/arch/x86/power/cpu.c linux-2.6.35-rc1-git2/arch/x86/power/cpu.c
> --- linux-2.6.35-rc1-git2-orig/arch/x86/power/cpu.c 2010-05-30 22:21:02.000000000 +0200
> +++ linux-2.6.35-rc1-git2/arch/x86/power/cpu.c 2010-06-04 23:50:52.000000000 +0200
> @@ -105,6 +105,7 @@ static void __save_processor_state(struc
> ctxt->cr4 = read_cr4();
> ctxt->cr8 = read_cr8();
> #endif
> + rdmsrl(MSR_IA32_MISC_ENABLE, ctxt->misc_enable);
> }
>
> /* Needed by apm.c */
> @@ -152,6 +153,7 @@ static void fix_processor_context(void)
> */
> static void __restore_processor_state(struct saved_context *ctxt)
> {
> + wrmsrl(MSR_IA32_MISC_ENABLE, ctxt->misc_enable);
> /*
> * control registers
> */

Great! I'll try it out early next week.

Alan Stern

2010-06-07 15:17:38

by Alan Stern

[permalink] [raw]
Subject: Re: [PATCH] Re: [linux-pm] Invalid opcode on resume from STR on Asus P4P800-VM

On Sat, 5 Jun 2010, Ondrej Zary wrote:

> > > Thanks, it does not crash with "idle=halt" or "idle=poll". According to
> > > this: http://siyobik.info/index.php?module=x86&id=215
> > > the MWAIT instruction can be enabled/disabled in IA32_MISC_ENABLES MSR.
> > > Kernel probably should enable it at boot and also on resume.
> > > Here's some more info:
> > > http://software.intel.com/en-us/forums/showthread.php?t=63654
> >
> > That could be the answer. Clearly this should be handled by the
> > arch-specific boot/setup code. I don't know enough about it, but other
> > people do.
>
> Here's a patch that fixes the problem. I don't know how many machines will
> it break...
>
>
> diff -urp linux-2.6.35-rc1-git2-orig/arch/x86/include/asm/suspend_32.h linux-2.6.35-rc1-git2/arch/x86/include/asm/suspend_32.h
> --- linux-2.6.35-rc1-git2-orig/arch/x86/include/asm/suspend_32.h 2010-05-30 22:21:02.000000000 +0200
> +++ linux-2.6.35-rc1-git2/arch/x86/include/asm/suspend_32.h 2010-06-04 23:52:22.000000000 +0200
> @@ -15,6 +15,7 @@ static inline int arch_prepare_suspend(v
> struct saved_context {
> u16 es, fs, gs, ss;
> unsigned long cr0, cr2, cr3, cr4;
> + unsigned long misc_enable;
> struct desc_ptr gdt;
> struct desc_ptr idt;
> u16 ldt;
> diff -urp linux-2.6.35-rc1-git2-orig/arch/x86/include/asm/suspend_64.h linux-2.6.35-rc1-git2/arch/x86/include/asm/suspend_64.h
> --- linux-2.6.35-rc1-git2-orig/arch/x86/include/asm/suspend_64.h 2010-05-30 22:21:02.000000000 +0200
> +++ linux-2.6.35-rc1-git2/arch/x86/include/asm/suspend_64.h 2010-06-04 23:52:21.000000000 +0200
> @@ -27,6 +27,7 @@ struct saved_context {
> u16 ds, es, fs, gs, ss;
> unsigned long gs_base, gs_kernel_base, fs_base;
> unsigned long cr0, cr2, cr3, cr4, cr8;
> + unsigned long misc_enable;
> unsigned long efer;
> u16 gdt_pad;
> u16 gdt_limit;
> diff -urp linux-2.6.35-rc1-git2-orig/arch/x86/power/cpu.c linux-2.6.35-rc1-git2/arch/x86/power/cpu.c
> --- linux-2.6.35-rc1-git2-orig/arch/x86/power/cpu.c 2010-05-30 22:21:02.000000000 +0200
> +++ linux-2.6.35-rc1-git2/arch/x86/power/cpu.c 2010-06-04 23:50:52.000000000 +0200
> @@ -105,6 +105,7 @@ static void __save_processor_state(struc
> ctxt->cr4 = read_cr4();
> ctxt->cr8 = read_cr8();
> #endif
> + rdmsrl(MSR_IA32_MISC_ENABLE, ctxt->misc_enable);
> }
>
> /* Needed by apm.c */
> @@ -152,6 +153,7 @@ static void fix_processor_context(void)
> */
> static void __restore_processor_state(struct saved_context *ctxt)
> {
> + wrmsrl(MSR_IA32_MISC_ENABLE, ctxt->misc_enable);
> /*
> * control registers
> */

It fixes the problem on my machine! I say go ahead and submit it.

Tested-by: Alan Stern <[email protected]>

Alan Stern