From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
Kees Cook <kees.cook@canonical.com>,
"H. Peter Anvin" <hpa@zytor.com>,
"Rafael J. Wysocki" <rjw@sisk.pl>
Subject: [049/107] x86, suspend: Restore MISC_ENABLE MSR in realmode wakeup
Date: Thu, 07 Jul 2011 17:16:21 -0700 [thread overview]
Message-ID: <20110708001657.465581186@clark.kroah.org> (raw)
In-Reply-To: <20110708001740.GA14031@kroah.com>
2.6.39-stable review patch. If anyone has any objections, please let us know.
------------------
From: Kees Cook <kees.cook@canonical.com>
commit 7a3136666bc0f0419f7aaa7b1fabb4b0e0a7fb76 upstream.
Some BIOSes will reset the Intel MISC_ENABLE MSR (specifically the
XD_DISABLE bit) when resuming from S3, which can interact poorly with
ebba638ae723d8a8fc2f7abce5ec18b688b791d7. In 32bit PAE mode, this can
lead to a fault when EFER is restored by the kernel wakeup routines,
due to it setting the NX bit for a CPU that (thanks to the BIOS reset)
now incorrectly thinks it lacks the NX feature. (64bit is not affected
because it uses a common CPU bring-up that specifically handles the
XD_DISABLE bit.)
The need for MISC_ENABLE being restored so early is specific to the S3
resume path. Normally, MISC_ENABLE is saved in save_processor_state(),
but this happens after the resume header is created, so just reproduce
the logic here. (acpi_suspend_lowlevel() creates the header, calls
do_suspend_lowlevel, which calls save_processor_state(), so the saved
processor context isn't available during resume header creation.)
[ hpa: Consider for stable if OK in mainline ]
Signed-off-by: Kees Cook <kees.cook@canonical.com>
Link: http://lkml.kernel.org/r/20110707011034.GA8523@outflux.net
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
arch/x86/kernel/acpi/realmode/wakeup.S | 14 ++++++++++++++
arch/x86/kernel/acpi/realmode/wakeup.h | 6 ++++++
arch/x86/kernel/acpi/sleep.c | 6 ++++++
3 files changed, 26 insertions(+)
--- a/arch/x86/kernel/acpi/realmode/wakeup.S
+++ b/arch/x86/kernel/acpi/realmode/wakeup.S
@@ -28,6 +28,8 @@ pmode_cr3: .long 0 /* Saved %cr3 */
pmode_cr4: .long 0 /* Saved %cr4 */
pmode_efer: .quad 0 /* Saved EFER */
pmode_gdt: .quad 0
+pmode_misc_en: .quad 0 /* Saved MISC_ENABLE MSR */
+pmode_behavior: .long 0 /* Wakeup behavior flags */
realmode_flags: .long 0
real_magic: .long 0
trampoline_segment: .word 0
@@ -91,6 +93,18 @@ wakeup_code:
/* Call the C code */
calll main
+ /* Restore MISC_ENABLE before entering protected mode, in case
+ BIOS decided to clear XD_DISABLE during S3. */
+ movl pmode_behavior, %eax
+ btl $WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE, %eax
+ jnc 1f
+
+ movl pmode_misc_en, %eax
+ movl pmode_misc_en + 4, %edx
+ movl $MSR_IA32_MISC_ENABLE, %ecx
+ wrmsr
+1:
+
/* Do any other stuff... */
#ifndef CONFIG_64BIT
--- a/arch/x86/kernel/acpi/realmode/wakeup.h
+++ b/arch/x86/kernel/acpi/realmode/wakeup.h
@@ -21,6 +21,9 @@ struct wakeup_header {
u32 pmode_efer_low; /* Protected mode EFER */
u32 pmode_efer_high;
u64 pmode_gdt;
+ u32 pmode_misc_en_low; /* Protected mode MISC_ENABLE */
+ u32 pmode_misc_en_high;
+ u32 pmode_behavior; /* Wakeup routine behavior flags */
u32 realmode_flags;
u32 real_magic;
u16 trampoline_segment; /* segment with trampoline code, 64-bit only */
@@ -39,4 +42,7 @@ extern struct wakeup_header wakeup_heade
#define WAKEUP_HEADER_SIGNATURE 0x51ee1111
#define WAKEUP_END_SIGNATURE 0x65a22c82
+/* Wakeup behavior bits */
+#define WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE 0
+
#endif /* ARCH_X86_KERNEL_ACPI_RM_WAKEUP_H */
--- a/arch/x86/kernel/acpi/sleep.c
+++ b/arch/x86/kernel/acpi/sleep.c
@@ -77,6 +77,12 @@ int acpi_suspend_lowlevel(void)
header->pmode_cr0 = read_cr0();
header->pmode_cr4 = read_cr4_safe();
+ header->pmode_behavior = 0;
+ if (!rdmsr_safe(MSR_IA32_MISC_ENABLE,
+ &header->pmode_misc_en_low,
+ &header->pmode_misc_en_high))
+ header->pmode_behavior |=
+ (1 << WAKEUP_BEHAVIOR_RESTORE_MISC_ENABLE);
header->realmode_flags = acpi_realmode_flags;
header->real_magic = 0x12345678;
next prev parent reply other threads:[~2011-07-08 5:15 UTC|newest]
Thread overview: 117+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-08 0:17 [000/107] 2.6.39.3 review Greg KH
2011-07-08 0:15 ` [001/107] netfilter: ipset: Use proper timeout value to jiffies conversion Greg KH
2011-07-08 0:15 ` [002/107] net: fix ETHTOOL_SFEATURES compatibility with old ethtool_ops.set_flags Greg KH
2011-07-08 0:15 ` [003/107] netfilter: ipset: remove unused variable from type_pf_tdel() Greg KH
2011-07-08 0:15 ` [004/107] netfilter: ipset: fix ip_set_flush return code Greg KH
2011-07-08 0:15 ` [005/107] bug.h: Add WARN_RATELIMIT Greg KH
2011-07-08 0:15 ` [006/107] net: filter: Use WARN_RATELIMIT Greg KH
2011-07-08 0:15 ` [007/107] bug.h: Fix build with CONFIG_PRINTK disabled Greg KH
2011-07-08 0:15 ` [008/107] bug.h: Move ratelimit warn interfaces to ratelimit.h Greg KH
2011-07-08 0:15 ` [009/107] IPVS: bug in ip_vs_ftp, same list heaad used in all netns Greg KH
2011-07-08 0:15 ` [010/107] inetpeer: fix race in unused_list manipulations Greg KH
2011-07-08 0:15 ` [011/107] bridge: provide a cow_metrics method for fake_ops Greg KH
2011-07-08 0:15 ` [012/107] af_packet: prevent information leak Greg KH
2011-07-08 0:15 ` [013/107] inet_diag: fix inet_diag_bc_audit() Greg KH
2011-07-08 0:15 ` [014/107] net/ipv4: Check for mistakenly passed in non-IPv4 address Greg KH
2011-07-08 0:15 ` [015/107] ipv6/udp: Use the correct variable to determine non-blocking condition Greg KH
2011-07-08 0:15 ` [016/107] udp/recvmsg: Clear MSG_TRUNC flag when starting over for a new packet Greg KH
2011-07-08 0:15 ` [017/107] ksm: fix NULL pointer dereference in scan_get_next_rmap_item() Greg KH
2011-07-08 0:15 ` [018/107] drivers/tty/serial/pch_uart.c: dont oops if dmi_get_system_info returns NULL Greg KH
2011-07-08 0:15 ` [019/107] migrate: dont account swapcache as shmem Greg KH
2011-07-08 0:15 ` [020/107] hwmon: (ibmaem) Initialize sysfs attributes Greg KH
2011-07-08 0:15 ` [021/107] hwmon: (s3c) " Greg KH
2011-07-08 0:15 ` [022/107] hwmon: (ibmpex) " Greg KH
2011-07-08 0:15 ` [023/107] Revert "drm/i915: Enable GMBUS for post-gen2 chipsets" Greg KH
2011-07-08 0:15 ` [024/107] drm/radeon/kms/atom: fix duallink on some early DCE3.2 cards Greg KH
2011-07-08 0:15 ` [025/107] drm/radeon/kms: Fix chremap setup on RV770 CE Greg KH
2011-07-08 0:15 ` [026/107] drm/i915: Fix gen6 (SNB) missed BLT ring interrupts Greg KH
2011-07-08 6:13 ` Keith Packard
2011-07-08 14:45 ` Greg KH
2011-07-08 0:15 ` [027/107] drm: populate irq_by_busid-member for pci Greg KH
2011-07-08 0:16 ` [028/107] xen: support CONFIG_MAXSMP Greg KH
2011-07-08 0:16 ` [029/107] xen: partially revert "xen: set max_pfn_mapped to the last pfn mapped" Greg KH
2011-07-08 0:16 ` [030/107] xen/pci: Use the INT_SRC_OVR IRQ (instead of GSI) to preset the ACPI SCI IRQ Greg KH
2011-07-08 0:16 ` [031/107] xen/mmu: Fix for linker errors when CONFIG_SMP is not defined Greg KH
2011-07-08 0:16 ` [032/107] xen/pci: Move check for acpi_sci_override_gsi to xen_setup_acpi_sci Greg KH
2011-07-08 0:16 ` [033/107] clocksource: Make watchdog robust vs. interruption Greg KH
2011-07-08 0:16 ` [034/107] ARM: SAMSUNG: serial: Fix on handling of one clock source for UART Greg KH
2011-07-08 0:16 ` [035/107] TTY: ldisc, do not close until there are readers Greg KH
2011-07-08 0:16 ` [036/107] Connector: Set the CN_NETLINK_USERS correctly Greg KH
2011-07-08 0:16 ` [037/107] Connector: Correctly set the error code in case of success when dispatching receive callbacks Greg KH
2011-07-08 0:16 ` [038/107] xhci: Reject double add of active endpoints Greg KH
2011-07-08 0:16 ` [039/107] xhci: Add reset on resume quirk for asrock p67 host Greg KH
2011-07-08 0:16 ` [040/107] xhci: Always set urb->status to zero for isoc endpoints Greg KH
2011-07-08 0:16 ` [041/107] USB: Free bandwidth when usb_disable_device is called Greg KH
2011-07-08 0:16 ` [042/107] USB: Add new FT232H chip to drivers/usb/serial/ftdi_sio.c Greg KH
2011-07-08 0:16 ` [043/107] mm/memory-failure.c: fix page isolated count mismatch Greg KH
2011-07-08 0:16 ` [044/107] PM: Free memory bitmaps if opening /dev/snapshot fails Greg KH
2011-07-08 0:16 ` [045/107] ath5k: fix memory leak when fewer than N_PD_CURVES are in use Greg KH
2011-07-08 0:16 ` [046/107] ath5k: Disable fast channel switching by default Greg KH
2011-07-08 0:16 ` [047/107] pxa168_eth: fix race in transmit path Greg KH
2011-07-08 6:20 ` Sachin Sanap
2011-07-08 14:43 ` Greg KH
2011-07-08 0:16 ` [048/107] ath9k: Fix suspend/resume when no interface is UP Greg KH
2011-07-08 0:16 ` Greg KH [this message]
2011-07-08 0:16 ` [050/107] oprofile, x86: Fix race in nmi handler while starting counters Greg KH
2011-07-08 0:16 ` [051/107] mmc: tmio: fix regression in TMIO_MMC_WRPROTECT_DISABLE handling Greg KH
2011-07-08 0:16 ` [052/107] mmc: Add PCI fixup quirks for Ricoh 1180:e823 reader Greg KH
2011-07-08 0:16 ` [053/107] mm: fix negative commitlimit when gigantic hugepages are allocated Greg KH
2011-07-08 0:16 ` [054/107] block: add REQ_SECURE to REQ_COMMON_MASK Greg KH
2011-07-08 0:16 ` [055/107] NFS41: do not update isize if inode needs layoutcommit Greg KH
2011-07-08 0:16 ` [056/107] mm, hotplug: fix error handling in mem_online_node() Greg KH
2011-07-08 0:16 ` [057/107] ALSA: HDA: Remove quirk for an HP device Greg KH
2011-07-08 0:16 ` [058/107] ALSA: HDA: Add a new Conexant codec ID (506c) Greg KH
2011-07-08 0:16 ` [059/107] [media] rc: fix ghost keypresses with certain hw Greg KH
2011-07-08 0:16 ` [060/107] [media] lirc_zilog: fix spinning rx thread Greg KH
2011-07-08 0:16 ` [061/107] [media] keymaps: fix table for pinnacle pctv hd devices Greg KH
2011-07-08 0:16 ` [062/107] [media] uvcvideo: Remove buffers from the queues when freeing Greg KH
2011-07-08 0:16 ` [063/107] [media] ite-cir: 8709 needs to use pnp resource 2 Greg KH
2011-07-08 0:16 ` [064/107] watchdog: mtx1-wdt: request gpio before using it Greg KH
2011-07-08 0:16 ` [065/107] nfsd: v4 support requires CRYPTO Greg KH
2011-07-08 0:16 ` [066/107] nfsd: fix dependency of nfsd on auth_rpcgss Greg KH
2011-07-08 0:16 ` [067/107] nfsd: link returns nfserr_delay when breaking lease Greg KH
2011-07-08 0:16 ` [068/107] nfsd4: fix break_lease flags on nfsd open Greg KH
2011-07-08 0:16 ` [069/107] NFSv4.1: allow nfs_fhget to succeed with mounted on fileid Greg KH
2011-07-08 0:16 ` [070/107] NFSv4.1: allow zero fh array in filelayout decode layout Greg KH
2011-07-08 0:16 ` [071/107] NFSv4: Fix a readdir regression Greg KH
2011-07-08 0:16 ` [072/107] Input: properly assign return value of clamp() macro Greg KH
2011-07-08 0:16 ` [073/107] debugobjects: Fix boot crash when kmemleak and debugobjects enabled Greg KH
2011-07-08 0:16 ` [074/107] cfq-iosched: fix locking around ioc->ioc_data assignment Greg KH
2011-07-08 0:16 ` [075/107] cfq-iosched: fix a rcu warning Greg KH
2011-07-08 0:16 ` [076/107] cfq-iosched: make code consistent Greg KH
2011-07-08 0:16 ` [077/107] block: use the passed in @bdev when claiming if partno is zero Greg KH
2011-07-08 0:16 ` [078/107] PCI / PM: Block races between runtime PM and system sleep Greg KH
2011-07-08 0:16 ` [079/107] PM: Rename dev_pm_info.in_suspend to is_prepared Greg KH
2011-07-08 0:16 ` [080/107] PM: Fix async resume following suspend failure Greg KH
2011-07-08 0:16 ` [081/107] PM / Hibernate: Fix free_unnecessary_pages() Greg KH
2011-07-08 0:16 ` [082/107] KEYS: Fix error handling in construct_key_and_link() Greg KH
2011-07-08 0:16 ` [083/107] i2c-taos-evm: Fix log messages Greg KH
2011-07-08 0:16 ` [084/107] i2c/pca954x: Initialize the mux to disconnected state Greg KH
2011-07-08 0:16 ` [085/107] hfsplus: add missing call to bio_put() Greg KH
2011-07-08 0:16 ` [086/107] md: avoid endless recovery loop when waiting for fail device to complete Greg KH
2011-07-08 0:16 ` [087/107] SUNRPC: Ensure the RPC client only quits on fatal signals Greg KH
2011-07-08 0:17 ` [088/107] ASoC: pxa-ssp: Correct check for stream presence Greg KH
2011-07-08 0:17 ` [089/107] drivers/base/platform.c: dont mark platform_device_register_resndata() as __init_or_module Greg KH
2011-07-08 6:47 ` Uwe Kleine-König
2011-07-08 14:43 ` Greg KH
2011-07-08 0:17 ` [090/107] fs: fix lock initialization Greg KH
2011-07-08 0:17 ` [091/107] FS-Cache: Add a helper to bulk uncache pages on an inode Greg KH
2011-07-08 0:17 ` [092/107] 6pack,mkiss: fix lock inconsistency Greg KH
2011-07-08 0:17 ` [093/107] iwlagn: fix change_interface for P2P types Greg KH
2011-07-08 0:17 ` [094/107] drivers/misc/lkdtm.c: fix race when crashpoint is hit multiple times before checking count Greg KH
2011-07-08 0:17 ` [095/107] taskstats: dont allow duplicate entries in listener mode Greg KH
2011-07-08 0:17 ` [096/107] Fix CPU spinlock lockups on secondary CPU bringup Greg KH
2011-07-08 0:17 ` [097/107] NLM: Dont hang forever on NLM unlock requests Greg KH
2011-07-08 0:17 ` [098/107] USB: dont let errors prevent system sleep Greg KH
2011-07-08 0:17 ` [099/107] USB: dont let the hub driver " Greg KH
2011-07-08 0:17 ` [100/107] USB: fix regression occurring during device removal Greg KH
2011-07-08 0:17 ` [101/107] ipv4: fix multicast losses Greg KH
2011-07-08 0:17 ` [102/107] netfilter: Fix ip_route_me_harder triggering ip_rt_bug Greg KH
2011-07-08 0:17 ` [103/107] vlan: fix typo in vlan_dev_hard_start_xmit() Greg KH
2011-07-08 0:17 ` [104/107] xfrm: Fix off by one in the replay advance functions Greg KH
2011-07-08 0:17 ` [105/107] Revert "KVM: Save/restore state of assigned PCI device" Greg KH
2011-07-08 0:17 ` [106/107] KVM: Fix register corruption in pvclock_scale_delta Greg KH
2011-07-08 0:17 ` [107/107] IPVS netns exit causes crash in conntrack Greg KH
2011-07-08 2:06 ` [000/107] 2.6.39.3 review Stefan Lippers-Hollmann
2011-07-08 2:49 ` Greg KH
2011-07-08 2:53 ` Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110708001657.465581186@clark.kroah.org \
--to=gregkh@suse.de \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=hpa@zytor.com \
--cc=kees.cook@canonical.com \
--cc=linux-kernel@vger.kernel.org \
--cc=rjw@sisk.pl \
--cc=stable-review@kernel.org \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®