All of lore.kernel.org
 help / color / mirror / Atom feed
From: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
To: Pavel Machek <pavel@suse.cz>
Cc: "Pallipadi, Venkatesh" <venkatesh.pallipadi@intel.com>,
	akpm@osdl.org, "Brown, Len" <len.brown@intel.com>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH] S3 suspend/resume with noexec
Date: Wed, 6 Oct 2004 17:20:18 -0700	[thread overview]
Message-ID: <20041006172018.A10426@unix-os.sc.intel.com> (raw)
In-Reply-To: <20041006223203.GE2630@elf.ucw.cz>; from pavel@suse.cz on Thu, Oct 07, 2004 at 12:32:03AM +0200


How about this patch?

I verified that x86-64 already does right things to restore MSR_EFER during 
resume. So this issue is there only with i386.

Thanks,
Venki

This patch is required for S3 suspend-resume on noexec capable systems.
On these systems, we need to save and restore MSR_EFER during S3 suspend-resume.

Signed-off-by:: "Venkatesh Pallipadi" <venkatesh.pallipadi@intel.com>

--- linux-2.6.9-rc2/include/asm-i386/page.h.org	2004-09-03 21:13:03.275683336 -0700
+++ linux-2.6.9-rc2/include/asm-i386/page.h	2004-09-03 21:13:35.694754888 -0700
@@ -39,9 +39,9 @@
 /*
  * These are used to make use of C type-checking..
  */
+extern int nx_enabled;
 #ifdef CONFIG_X86_PAE
 extern unsigned long long __supported_pte_mask;
-extern int nx_enabled;
 typedef struct { unsigned long pte_low, pte_high; } pte_t;
 typedef struct { unsigned long long pmd; } pmd_t;
 typedef struct { unsigned long long pgd; } pgd_t;
@@ -49,7 +49,6 @@ typedef struct { unsigned long long pgpr
 #define pte_val(x)	((x).pte_low | ((unsigned long long)(x).pte_high << 32))
 #define HPAGE_SHIFT	21
 #else
-#define nx_enabled 0
 typedef struct { unsigned long pte_low; } pte_t;
 typedef struct { unsigned long pmd; } pmd_t;
 typedef struct { unsigned long pgd; } pgd_t;
--- linux-2.6.9-rc2/arch/i386/kernel/acpi/wakeup.S.org	2004-09-01 21:02:14.639883944 -0700
+++ linux-2.6.9-rc2/arch/i386/kernel/acpi/wakeup.S	2004-09-03 21:00:45.113900984 -0700
@@ -59,6 +59,14 @@ wakeup_code:
 	movl	$swapper_pg_dir-__PAGE_OFFSET, %eax
 	movl	%eax, %cr3
 
+	testl	$1, real_efer_save_restore - wakeup_code
+	jz	4f
+	# restore efer setting
+	movl	real_save_efer_edx - wakeup_code, %edx
+	movl	real_save_efer_eax - wakeup_code, %eax
+	mov     $0xc0000080, %ecx
+	wrmsr
+4:
 	# make sure %cr4 is set correctly (features, etc)
 	movl	real_save_cr4 - wakeup_code, %eax
 	movl	%eax, %cr4
@@ -89,6 +97,9 @@ real_save_cr4:	.long 0
 real_magic:	.long 0
 video_mode:	.long 0
 video_flags:	.long 0
+real_efer_save_restore:	.long 0
+real_save_efer_edx: 	.long 0
+real_save_efer_eax: 	.long 0
 
 bogus_real_magic:
 	movw	$0x0e00 + 'B', %fs:(0x12)
@@ -223,6 +234,20 @@ ENTRY(acpi_copy_wakeup_routine)
 	sldt	saved_ldt
 	str	saved_tss
 
+	movl	nx_enabled, %edx
+	movl	%edx, real_efer_save_restore - wakeup_start (%eax)
+	testl	$1, real_efer_save_restore - wakeup_start (%eax)
+	jz	2f
+	# save efer setting
+	pushl	%eax
+	movl	%eax, %ebx
+	mov     $0xc0000080, %ecx
+	rdmsr
+	movl	%edx, real_save_efer_edx - wakeup_start (%ebx)
+	movl	%eax, real_save_efer_eax - wakeup_start (%ebx)
+	popl	%eax
+2:
+
 	movl    %cr3, %edx
 	movl    %edx, real_save_cr3 - wakeup_start (%eax)
 	movl    %cr4, %edx
--- linux-2.6.9-rc2/arch/i386/mm/init.c.org	2004-09-03 21:13:50.803458016 -0700
+++ linux-2.6.9-rc2/arch/i386/mm/init.c	2004-09-03 21:14:19.401110512 -0700
@@ -436,8 +436,8 @@ static int __init noexec_setup(char *str
 
 __setup("noexec=", noexec_setup);
 
-#ifdef CONFIG_X86_PAE
 int nx_enabled = 0;
+#ifdef CONFIG_X86_PAE
 
 static void __init set_nx(void)
 {
--- linux-2.6.9-rc2//include/asm-i386/suspend.h.org	2004-09-01 19:20:01.842210904 -0700
+++ linux-2.6.9-rc2//include/asm-i386/suspend.h	2004-09-02 19:12:54.317408064 -0700
@@ -18,6 +18,7 @@ arch_prepare_suspend(void)
 struct saved_context {
   	u16 es, fs, gs, ss;
 	unsigned long cr0, cr2, cr3, cr4;
+	unsigned long efer_lo, efer_hi;
 	u16 gdt_pad;
 	u16 gdt_limit;
 	unsigned long gdt_base;
--- linux-2.6.9-rc2//arch/i386/power/cpu.c.org	2004-09-01 19:05:41.997927104 -0700
+++ linux-2.6.9-rc2//arch/i386/power/cpu.c	2004-09-03 18:58:07.934362280 -0700
@@ -62,6 +62,8 @@ void __save_processor_state(struct saved
 	asm volatile ("movl %%cr0, %0" : "=r" (ctxt->cr0));
 	asm volatile ("movl %%cr2, %0" : "=r" (ctxt->cr2));
 	asm volatile ("movl %%cr3, %0" : "=r" (ctxt->cr3));
+	if (nx_enabled)
+		rdmsr(MSR_EFER, ctxt->efer_lo, ctxt->efer_hi);
 	asm volatile ("movl %%cr4, %0" : "=r" (ctxt->cr4));
 }
 
@@ -113,6 +115,8 @@ void __restore_processor_state(struct sa
 	 * control registers
 	 */
 	asm volatile ("movl %0, %%cr4" :: "r" (ctxt->cr4));
+	if (nx_enabled)
+		wrmsr(MSR_EFER, ctxt->efer_lo, ctxt->efer_hi);
 	asm volatile ("movl %0, %%cr3" :: "r" (ctxt->cr3));
 	asm volatile ("movl %0, %%cr2" :: "r" (ctxt->cr2));
 	asm volatile ("movl %0, %%cr0" :: "r" (ctxt->cr0));

  reply	other threads:[~2004-10-07  0:21 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-10-06 18:28 [PATCH] S3 suspend/resume with noexec Pallipadi, Venkatesh
2004-10-06 22:32 ` Pavel Machek
2004-10-07  0:20   ` Venkatesh Pallipadi [this message]
2004-10-07  8:03     ` Pavel Machek
     [not found] <20041005172757.A31514@unix-os.sc.intel.com>
2004-10-06  8:52 ` Pavel Machek

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=20041006172018.A10426@unix-os.sc.intel.com \
    --to=venkatesh.pallipadi@intel.com \
    --cc=akpm@osdl.org \
    --cc=len.brown@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pavel@suse.cz \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.