public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@linux-foundation.org>
To: "Frédéric Riss" <frederic.riss@gmail.com>,
	"Matt Domsch" <Matt_Domsch@dell.com>
Cc: Adrian Bunk <bunk@stusta.de>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Eric Van Hensbergen <ericvh@gmail.com>,
	Trond Myklebust <trond.myklebust@fys.uio.no>,
	Neil Brown <neilb@suse.de>,
	Stephen Hemminger <shemminger@linux-foundation.org>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Andi Kleen <ak@suse.de>, Jeff Garzik <jeff@garzik.org>,
	"Eric W. Biederman" <ebiederm@xmission.com>,
	Francois Romieu <romieu@fr.zoreil.com>
Subject: Re: 2.6.20-rc7: known regressions
Date: Sat, 3 Feb 2007 01:24:26 -0800	[thread overview]
Message-ID: <20070203012426.120ec586.akpm@linux-foundation.org> (raw)
In-Reply-To: <1170494391.31373.25.camel@funkylaptop>

On Sat, 03 Feb 2007 10:19:51 +0100 Frédéric Riss <frederic.riss@gmail.com> wrote:

> Le vendredi 02 février 2007 à 17:55 -0800, Andrew Morton a écrit :
> > - I have efi-x86-pass-firmware-call-parameters-on-the-stack.patch, but
> >   I'm not sure it's right and unless something really rapid happens, we'll
> >   ship with that bug unfixed.
> 
> Things I can say:
>  - Works for me :-)
>  - When you look at the code, it's obvious that switching to -mregparm=3
> changed the way we call into EFI runtime services. If you consider that
> that old code was correct, then the patch is needed to keep the good
> calling convention.
>  - It touches only arch/i386/kernel/efi.c which is compiled only with
> CONFIG_EFI && X86
>  - It changes code that is called only when booted in EFI mode.
> 
> Last 2 points mean the user base is pretty limited, which can be taken
> both as an argument to push it for the release or not to. I'd obviously
> prefer that someone knowledgeable about EFI looks at it and ACKs before
> it goes in.
> 

OK, well here it is again for everyone's reviwing pleasure:


From: Frederic Riss <frederic.riss@gmail.com>

When calling into the EFI firmware, the parameters need to be passed on
the stack. The recent change to use -mregparm=3 breaks x86 EFI support.
This patch is needed to allow the new Intel-based Macs to suspend to ram
(efi.get_time is called during the suspend phase).

Signed-off-by: Frederic Riss <frederic.riss@gmail.com>
Cc: Bjorn Helgaas <bjorn.helgaas@hp.com>
Cc: <artiom.myaskouvskey@intel.com>
Cc: Matt Domsch <Matt_Domsch@dell.com>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 arch/i386/kernel/efi.c |   89 +++++++++++++++++++++++++++++++--------
 1 files changed, 73 insertions(+), 16 deletions(-)

diff -puN arch/i386/kernel/efi.c~efi-x86-pass-firmware-call-parameters-on-the-stack arch/i386/kernel/efi.c
--- a/arch/i386/kernel/efi.c~efi-x86-pass-firmware-call-parameters-on-the-stack
+++ a/arch/i386/kernel/efi.c
@@ -473,6 +473,70 @@ static inline void __init check_range_fo
 }
 
 /*
+ * Wrap all the virtual calls in a way that forces the parameters on the stack.
+ */
+
+#define efi_call_virt(f, args...) \
+     ((efi_##f##_t __attribute__((regparm(0)))*)efi.systab->runtime->f)(args)
+
+static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
+{
+	return efi_call_virt(get_time, tm, tc);
+}
+
+static efi_status_t virt_efi_set_time (efi_time_t *tm)
+{
+	return efi_call_virt(set_time, tm);
+}
+
+static efi_status_t virt_efi_get_wakeup_time (efi_bool_t *enabled,
+					      efi_bool_t *pending,
+					      efi_time_t *tm)
+{
+	return efi_call_virt(get_wakeup_time, enabled, pending, tm);
+}
+
+static efi_status_t virt_efi_set_wakeup_time (efi_bool_t enabled,
+					      efi_time_t *tm)
+{
+	return efi_call_virt(set_wakeup_time, enabled, tm);
+}
+
+static efi_status_t virt_efi_get_variable (efi_char16_t *name,
+					   efi_guid_t *vendor, u32 *attr,
+					   unsigned long *data_size, void *data)
+{
+	return efi_call_virt(get_variable, name, vendor, attr, data_size, data);
+}
+
+static efi_status_t virt_efi_get_next_variable (unsigned long *name_size,
+						efi_char16_t *name,
+						efi_guid_t *vendor)
+{
+	return efi_call_virt(get_next_variable, name_size, name, vendor);
+}
+
+static efi_status_t virt_efi_set_variable (efi_char16_t *name,
+					   efi_guid_t *vendor,
+					   unsigned long attr,
+					   unsigned long data_size, void *data)
+{
+	return efi_call_virt(set_variable, name, vendor, attr, data_size, data);
+}
+
+static efi_status_t virt_efi_get_next_high_mono_count (u32 *count)
+{
+	return efi_call_virt(get_next_high_mono_count, count);
+}
+
+static void virt_efi_reset_system (int reset_type, efi_status_t status,
+				   unsigned long data_size,
+				   efi_char16_t *data)
+{
+	efi_call_virt(reset_system, reset_type, status, data_size, data);
+}
+
+/*
  * This function will switch the EFI runtime services to virtual mode.
  * Essentially, look through the EFI memmap and map every region that
  * has the runtime attribute bit set in its memory descriptor and update
@@ -525,22 +589,15 @@ void __init efi_enter_virtual_mode(void)
 	 * pointers in the runtime service table to the new virtual addresses.
 	 */
 
-	efi.get_time = (efi_get_time_t *) efi.systab->runtime->get_time;
-	efi.set_time = (efi_set_time_t *) efi.systab->runtime->set_time;
-	efi.get_wakeup_time = (efi_get_wakeup_time_t *)
-					efi.systab->runtime->get_wakeup_time;
-	efi.set_wakeup_time = (efi_set_wakeup_time_t *)
-					efi.systab->runtime->set_wakeup_time;
-	efi.get_variable = (efi_get_variable_t *)
-					efi.systab->runtime->get_variable;
-	efi.get_next_variable = (efi_get_next_variable_t *)
-					efi.systab->runtime->get_next_variable;
-	efi.set_variable = (efi_set_variable_t *)
-					efi.systab->runtime->set_variable;
-	efi.get_next_high_mono_count = (efi_get_next_high_mono_count_t *)
-					efi.systab->runtime->get_next_high_mono_count;
-	efi.reset_system = (efi_reset_system_t *)
-					efi.systab->runtime->reset_system;
+	efi.get_time = virt_efi_get_time;
+	efi.set_time = virt_efi_set_time;
+	efi.get_wakeup_time = virt_efi_get_wakeup_time;
+	efi.set_wakeup_time = virt_efi_set_wakeup_time;
+	efi.get_variable = virt_efi_get_variable;
+	efi.get_next_variable = virt_efi_get_next_variable;
+	efi.set_variable = virt_efi_set_variable;
+	efi.get_next_high_mono_count = virt_efi_get_next_high_mono_count;
+	efi.reset_system = virt_efi_reset_system;
 }
 
 void __init
_


  reply	other threads:[~2007-02-03  9:28 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-01-31  4:28 Linux 2.6.20-rc7 Linus Torvalds
     [not found] ` <45C05150.6000802@agmk.net>
2007-01-31 16:04   ` Linus Torvalds
2007-01-31 23:13     ` Andrew Morton
     [not found]     ` <200702010037.48472.pluto@agmk.net>
2007-02-01  0:14       ` Andrew Morton
2007-02-01  0:19       ` Linus Torvalds
2007-02-01  0:26         ` Andrew Morton
2007-02-01  0:39           ` Linus Torvalds
2007-02-01  0:44         ` Nick Piggin
2007-02-01  0:54           ` Linus Torvalds
2007-02-01  6:48     ` Pekka Enberg
2007-01-31 17:11 ` [PATCH] x86_64: Fix preprocessor condition Josef 'Jeff' Sipek
2007-01-31 17:16   ` Andi Kleen
2007-01-31 17:40     ` Josef Sipek
2007-01-31 18:15 ` Linux 2.6.20-rc7 Sunil Naidu
2007-02-01  2:16 ` S.Çağlar Onur
2007-02-01  2:36   ` Linus Torvalds
2007-02-01  3:01     ` S.Çağlar Onur
2007-02-01  3:31       ` Linus Torvalds
2007-02-01  5:44         ` H. Peter Anvin
2007-02-01  6:00           ` Linus Torvalds
2007-02-01  6:10             ` H. Peter Anvin
2007-02-01  6:38               ` Alexander E. Patrakov
2007-02-01  6:53                 ` H. Peter Anvin
2007-02-02 20:52         ` S.Çağlar Onur
2007-02-01 21:06           ` H. Peter Anvin
2007-02-02  5:49 ` 2.6.20-rc7: known regressions Adrian Bunk
2007-02-03  1:55   ` Andrew Morton
2007-02-03  2:03     ` Jeff Garzik
2007-02-03  2:15       ` Andrew Morton
2007-02-03  9:19     ` Frédéric Riss
2007-02-03  9:24       ` Andrew Morton [this message]
2007-02-03  9:33         ` Andi Kleen
2007-02-03  9:49           ` Frédéric Riss
2007-02-03  9:58             ` Andi Kleen
2007-02-03 10:47               ` Frédéric Riss
2007-02-03 10:51                 ` Andi Kleen
2007-02-03 10:57                   ` Frédéric Riss
2007-02-03 11:08                     ` Frédéric RISS
2007-02-04 13:13                   ` Frédéric Riss
2007-02-04 14:37                     ` Andi Kleen
2007-02-04 17:34                     ` Linus Torvalds
2007-02-04 18:18                       ` Frédéric Riss
2007-02-04 18:29                         ` Linus Torvalds
2007-02-05  8:26                       ` Andi Kleen
2007-02-05  9:35                         ` Eric W. Biederman
2007-02-03  0:44 ` 2.6.20-rc7: known regressions (v2) (part 1) Adrian Bunk
2007-02-03  6:06   ` Auke Kok
2007-02-03  7:41     ` Eric W. Biederman
2007-02-03 18:06       ` Adam Kropelin
2007-02-03 20:43         ` Auke Kok
2007-02-03 21:00           ` Adam Kropelin
2007-02-03 21:26             ` Auke Kok
2007-02-03 22:24               ` Eric W. Biederman
2007-02-03 21:12           ` Eric W. Biederman
2007-02-03 23:20             ` Adam Kropelin
2007-02-04  1:14               ` Eric W. Biederman
2007-02-04  4:44                 ` Adam Kropelin
2007-02-04  5:12                   ` Eric W. Biederman
2007-02-03  0:47 ` 2.6.20-rc7: known regressions (v2) (part 2) Adrian Bunk
     [not found] <19868466.241170405430418.JavaMail.root@lxnaydesign.net>
2007-02-02  8:45 ` 2.6.20-rc7: known regressions Fabio Erculiani
2007-02-02 13:58   ` Adrian Bunk

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=20070203012426.120ec586.akpm@linux-foundation.org \
    --to=akpm@linux-foundation.org \
    --cc=Matt_Domsch@dell.com \
    --cc=ak@suse.de \
    --cc=benh@kernel.crashing.org \
    --cc=bunk@stusta.de \
    --cc=ebiederm@xmission.com \
    --cc=ericvh@gmail.com \
    --cc=frederic.riss@gmail.com \
    --cc=jeff@garzik.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=neilb@suse.de \
    --cc=romieu@fr.zoreil.com \
    --cc=shemminger@linux-foundation.org \
    --cc=torvalds@linux-foundation.org \
    --cc=trond.myklebust@fys.uio.no \
    /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