mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
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;
 



  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®