Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1384102 > unrolled thread

[PATCHv2 1/5] efi/runtime-wrappers: add {__,}efi_call_virt templates

Started byMark Rutland <mark.rutland@arm.com>
First post2016-04-21 13:40 +0200
Last post2016-04-21 16:30 +0200
Articles 4 — 2 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  [PATCHv2 1/5] efi/runtime-wrappers: add {__,}efi_call_virt templates Mark Rutland <mark.rutland@arm.com> - 2016-04-21 13:40 +0200
    Re: [PATCHv2 1/5] efi/runtime-wrappers: add {__,}efi_call_virt  templates Leif Lindholm <leif.lindholm@linaro.org> - 2016-04-21 13:50 +0200
      Re: [PATCHv2 1/5] efi/runtime-wrappers: add {__,}efi_call_virt  templates Mark Rutland <mark.rutland@arm.com> - 2016-04-21 15:00 +0200
        Re: [PATCHv2 1/5] efi/runtime-wrappers: add {__,}efi_call_virt  templates Mark Rutland <mark.rutland@arm.com> - 2016-04-21 16:30 +0200

#1384102 — [PATCHv2 1/5] efi/runtime-wrappers: add {__,}efi_call_virt templates

FromMark Rutland <mark.rutland@arm.com>
Date2016-04-21 13:40 +0200
Subject[PATCHv2 1/5] efi/runtime-wrappers: add {__,}efi_call_virt templates
Message-ID<rql7I-8rt-5@gated-at.bofh.it>
Currently each architecture must implement two macros, efi_call_virt and
__efi_call_virt, which only differ by the presence or absence of a
return type. Otherwise, the logic surrounding the call is identical.

As each architecture must define the entire body of each, we can't place
any generic manipulation (e.g. irq flag validation) in the middle.

This patch adds template implementations of these macros. With these,
arch code can implement three template macros, avoiding reptition for
the void/non-void return cases:

* arch_efi_call_virt_setup

  Sets up the environment for the call (e.g. switching page tables,
  allowing kernel-mode use of floating point, if required).

* arch_efi_call_virt

  Performs the call. The last expression in the macro must be the call
  itself, allowing the logic to be shared by the void and non-void
  cases.

* arch_efi_call_virt_teardown

  Restores the usual kernel environment once the call has returned.

While the savings from repition are minimal, we additionally gain the
ability to add common code around the call with the call enviroment set
up. This can be used to detect common firmware issues (e.g. bad irq mask
management).

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Cc: Matt Fleming <matt@codeblueprint.co.uk>
Cc: linux-efi@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
---
 drivers/firmware/efi/runtime-wrappers.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/drivers/firmware/efi/runtime-wrappers.c b/drivers/firmware/efi/runtime-wrappers.c
index de69530..1b9fa54 100644
--- a/drivers/firmware/efi/runtime-wrappers.c
+++ b/drivers/firmware/efi/runtime-wrappers.c
@@ -20,6 +20,27 @@
 #include <linux/spinlock.h>
 #include <asm/efi.h>
 
+
+#ifndef efi_call_virt
+#define efi_call_virt(f, args...)					\
+({									\
+	efi_status_t __s;						\
+	arch_efi_call_virt_setup();					\
+	__s = arch_efi_call_virt(f, args);				\
+	arch_efi_call_virt_teardown();					\
+	__s;								\
+})
+#endif
+
+#ifndef __efi_call_virt
+#define __efi_call_virt(f, args...)					\
+({									\
+	arch_efi_call_virt_setup();					\
+	arch_efi_call_virt(f, args);					\
+	arch_efi_call_virt_teardown();					\
+})
+#endif
+
 /*
  * According to section 7.1 of the UEFI spec, Runtime Services are not fully
  * reentrant, and there are particular combinations of calls that need to be
-- 
1.9.1

[toc] | [next] | [standalone]


#1384121 — Re: [PATCHv2 1/5] efi/runtime-wrappers: add {__,}efi_call_virt templates

FromLeif Lindholm <leif.lindholm@linaro.org>
Date2016-04-21 13:50 +0200
SubjectRe: [PATCHv2 1/5] efi/runtime-wrappers: add {__,}efi_call_virt templates
Message-ID<rqlho-8vU-23@gated-at.bofh.it>
In reply to#1384102
On Thu, Apr 21, 2016 at 12:35:25PM +0100, Mark Rutland wrote:
> Currently each architecture must implement two macros, efi_call_virt and
> __efi_call_virt, which only differ by the presence or absence of a
> return type. Otherwise, the logic surrounding the call is identical.
> 
> As each architecture must define the entire body of each, we can't place
> any generic manipulation (e.g. irq flag validation) in the middle.
> 
> This patch adds template implementations of these macros. With these,
> arch code can implement three template macros, avoiding reptition for
> the void/non-void return cases:
> 
> * arch_efi_call_virt_setup
> 
>   Sets up the environment for the call (e.g. switching page tables,
>   allowing kernel-mode use of floating point, if required).
> 
> * arch_efi_call_virt
> 
>   Performs the call. The last expression in the macro must be the call
>   itself, allowing the logic to be shared by the void and non-void
>   cases.
> 
> * arch_efi_call_virt_teardown
> 
>   Restores the usual kernel environment once the call has returned.
> 
> While the savings from repition are minimal, we additionally gain the
> ability to add common code around the call with the call enviroment set
> up. This can be used to detect common firmware issues (e.g. bad irq mask
> management).
> 
> Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> Cc: Matt Fleming <matt@codeblueprint.co.uk>
> Cc: linux-efi@vger.kernel.org
> Cc: linux-kernel@vger.kernel.org
> ---
>  drivers/firmware/efi/runtime-wrappers.c | 21 +++++++++++++++++++++
>  1 file changed, 21 insertions(+)
> 
> diff --git a/drivers/firmware/efi/runtime-wrappers.c b/drivers/firmware/efi/runtime-wrappers.c
> index de69530..1b9fa54 100644
> --- a/drivers/firmware/efi/runtime-wrappers.c
> +++ b/drivers/firmware/efi/runtime-wrappers.c
> @@ -20,6 +20,27 @@
>  #include <linux/spinlock.h>
>  #include <asm/efi.h>
>  
> +
> +#ifndef efi_call_virt

So ... not a strong complaint, but I would prefer if these weren't
ifdefd. I presume this is because ia64?
Could that be given a dummy pass-through version instead? If not,
could a comment be added that this is to retain compatibility with
ia64 (so that if that architecture was to mysteriously disappear from
the tree, someone might remember to deconditionalise it)?

> +#define efi_call_virt(f, args...)					\
> +({									\
> +	efi_status_t __s;						\
> +	arch_efi_call_virt_setup();					\
> +	__s = arch_efi_call_virt(f, args);				\
> +	arch_efi_call_virt_teardown();					\
> +	__s;								\
> +})
> +#endif
> +
> +#ifndef __efi_call_virt
> +#define __efi_call_virt(f, args...)					\
> +({									\
> +	arch_efi_call_virt_setup();					\
> +	arch_efi_call_virt(f, args);					\
> +	arch_efi_call_virt_teardown();					\
> +})
> +#endif
> +
>  /*
>   * According to section 7.1 of the UEFI spec, Runtime Services are not fully
>   * reentrant, and there are particular combinations of calls that need to be
> -- 
> 1.9.1
> 

[toc] | [prev] | [next] | [standalone]


#1384172 — Re: [PATCHv2 1/5] efi/runtime-wrappers: add {__,}efi_call_virt templates

FromMark Rutland <mark.rutland@arm.com>
Date2016-04-21 15:00 +0200
SubjectRe: [PATCHv2 1/5] efi/runtime-wrappers: add {__,}efi_call_virt templates
Message-ID<rqmn9-Rq-9@gated-at.bofh.it>
In reply to#1384121
On Thu, Apr 21, 2016 at 12:42:56PM +0100, Leif Lindholm wrote:
> On Thu, Apr 21, 2016 at 12:35:25PM +0100, Mark Rutland wrote:
> > Currently each architecture must implement two macros, efi_call_virt and
> > __efi_call_virt, which only differ by the presence or absence of a
> > return type. Otherwise, the logic surrounding the call is identical.
> > 
> > As each architecture must define the entire body of each, we can't place
> > any generic manipulation (e.g. irq flag validation) in the middle.
> > 
> > This patch adds template implementations of these macros. With these,
> > arch code can implement three template macros, avoiding reptition for
> > the void/non-void return cases:
> > 
> > * arch_efi_call_virt_setup
> > 
> >   Sets up the environment for the call (e.g. switching page tables,
> >   allowing kernel-mode use of floating point, if required).
> > 
> > * arch_efi_call_virt
> > 
> >   Performs the call. The last expression in the macro must be the call
> >   itself, allowing the logic to be shared by the void and non-void
> >   cases.
> > 
> > * arch_efi_call_virt_teardown
> > 
> >   Restores the usual kernel environment once the call has returned.
> > 
> > While the savings from repition are minimal, we additionally gain the
> > ability to add common code around the call with the call enviroment set
> > up. This can be used to detect common firmware issues (e.g. bad irq mask
> > management).
> > 
> > Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> > Cc: Matt Fleming <matt@codeblueprint.co.uk>
> > Cc: linux-efi@vger.kernel.org
> > Cc: linux-kernel@vger.kernel.org
> > ---
> >  drivers/firmware/efi/runtime-wrappers.c | 21 +++++++++++++++++++++
> >  1 file changed, 21 insertions(+)
> > 
> > diff --git a/drivers/firmware/efi/runtime-wrappers.c b/drivers/firmware/efi/runtime-wrappers.c
> > index de69530..1b9fa54 100644
> > --- a/drivers/firmware/efi/runtime-wrappers.c
> > +++ b/drivers/firmware/efi/runtime-wrappers.c
> > @@ -20,6 +20,27 @@
> >  #include <linux/spinlock.h>
> >  #include <asm/efi.h>
> >  
> > +
> > +#ifndef efi_call_virt
> 
> So ... not a strong complaint, but I would prefer if these weren't
> ifdefd. I presume this is because ia64?

Yup, and to allow the gradual migration of arm/arm64/x86 without a new
CONFIG_WANT_GENERIC_EFI_CALL_VIRT or something to that effect.

> Could that be given a dummy pass-through version instead?

I'm not exactly sure what you mean by that. Could you elaborate?

> If not, could a comment be added that this is to retain compatibility
> with ia64 (so that if that architecture was to mysteriously disappear
> from the tree, someone might remember to deconditionalise it)?

Sure. I can also add a note to the commit message regarding the
temporary need while arm/arm64/x86 are moved over.

Thanks,
Mark.

> > +#define efi_call_virt(f, args...)					\
> > +({									\
> > +	efi_status_t __s;						\
> > +	arch_efi_call_virt_setup();					\
> > +	__s = arch_efi_call_virt(f, args);				\
> > +	arch_efi_call_virt_teardown();					\
> > +	__s;								\
> > +})
> > +#endif
> > +
> > +#ifndef __efi_call_virt
> > +#define __efi_call_virt(f, args...)					\
> > +({									\
> > +	arch_efi_call_virt_setup();					\
> > +	arch_efi_call_virt(f, args);					\
> > +	arch_efi_call_virt_teardown();					\
> > +})
> > +#endif
> > +
> >  /*
> >   * According to section 7.1 of the UEFI spec, Runtime Services are not fully
> >   * reentrant, and there are particular combinations of calls that need to be
> > -- 
> > 1.9.1
> > 
> 

[toc] | [prev] | [next] | [standalone]


#1384286 — Re: [PATCHv2 1/5] efi/runtime-wrappers: add {__,}efi_call_virt templates

FromMark Rutland <mark.rutland@arm.com>
Date2016-04-21 16:30 +0200
SubjectRe: [PATCHv2 1/5] efi/runtime-wrappers: add {__,}efi_call_virt templates
Message-ID<rqnMe-24H-13@gated-at.bofh.it>
In reply to#1384172
On Thu, Apr 21, 2016 at 01:55:07PM +0100, Mark Rutland wrote:
> On Thu, Apr 21, 2016 at 12:42:56PM +0100, Leif Lindholm wrote:
> > On Thu, Apr 21, 2016 at 12:35:25PM +0100, Mark Rutland wrote:
> > > Currently each architecture must implement two macros, efi_call_virt and
> > > __efi_call_virt, which only differ by the presence or absence of a
> > > return type. Otherwise, the logic surrounding the call is identical.
> > > 
> > > As each architecture must define the entire body of each, we can't place
> > > any generic manipulation (e.g. irq flag validation) in the middle.
> > > 
> > > This patch adds template implementations of these macros. With these,
> > > arch code can implement three template macros, avoiding reptition for
> > > the void/non-void return cases:
> > > 
> > > * arch_efi_call_virt_setup
> > > 
> > >   Sets up the environment for the call (e.g. switching page tables,
> > >   allowing kernel-mode use of floating point, if required).
> > > 
> > > * arch_efi_call_virt
> > > 
> > >   Performs the call. The last expression in the macro must be the call
> > >   itself, allowing the logic to be shared by the void and non-void
> > >   cases.
> > > 
> > > * arch_efi_call_virt_teardown
> > > 
> > >   Restores the usual kernel environment once the call has returned.
> > > 
> > > While the savings from repition are minimal, we additionally gain the
> > > ability to add common code around the call with the call enviroment set
> > > up. This can be used to detect common firmware issues (e.g. bad irq mask
> > > management).
> > > 
> > > Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> > > Cc: Matt Fleming <matt@codeblueprint.co.uk>
> > > Cc: linux-efi@vger.kernel.org
> > > Cc: linux-kernel@vger.kernel.org
> > > ---
> > >  drivers/firmware/efi/runtime-wrappers.c | 21 +++++++++++++++++++++
> > >  1 file changed, 21 insertions(+)
> > > 
> > > diff --git a/drivers/firmware/efi/runtime-wrappers.c b/drivers/firmware/efi/runtime-wrappers.c
> > > index de69530..1b9fa54 100644
> > > --- a/drivers/firmware/efi/runtime-wrappers.c
> > > +++ b/drivers/firmware/efi/runtime-wrappers.c
> > > @@ -20,6 +20,27 @@
> > >  #include <linux/spinlock.h>
> > >  #include <asm/efi.h>
> > >  
> > > +
> > > +#ifndef efi_call_virt
> > 
> > So ... not a strong complaint, but I would prefer if these weren't
> > ifdefd. I presume this is because ia64?
> 
> Yup, and to allow the gradual migration of arm/arm64/x86 without a new
> CONFIG_WANT_GENERIC_EFI_CALL_VIRT or something to that effect.

Actually, ia64 never uses this code, so I can add a final patch to
remove the ifdefs after the existing arch code is moved over.

I'll do that...

Mark.

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web