1. 27 6月, 2016 1 次提交
    • A
      efi: Convert efi_call_virt() to efi_call_virt_pointer() · 80e75596
      Alex Thorlton 提交于
      This commit makes a few slight modifications to the efi_call_virt() macro
      to get it to work with function pointers that are stored in locations
      other than efi.systab->runtime, and renames the macro to
      efi_call_virt_pointer().  The majority of the changes here are to pull
      these macros up into header files so that they can be accessed from
      outside of drivers/firmware/efi/runtime-wrappers.c.
      
      The most significant change not directly related to the code move is to
      add an extra "p" argument into the appropriate efi_call macros, and use
      that new argument in place of the, formerly hard-coded,
      efi.systab->runtime pointer.
      
      The last piece of the puzzle was to add an efi_call_virt() macro back into
      drivers/firmware/efi/runtime-wrappers.c to wrap around the new
      efi_call_virt_pointer() macro - this was mainly to keep the code from
      looking too cluttered by adding a bunch of extra references to
      efi.systab->runtime everywhere.
      
      Note that I also broke up the code in the efi_call_virt_pointer() macro a
      bit in the process of moving it.
      Signed-off-by: NAlex Thorlton <athorlton@sgi.com>
      Signed-off-by: NMatt Fleming <matt@codeblueprint.co.uk>
      Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
      Cc: Catalin Marinas <catalin.marinas@arm.com>
      Cc: Dimitri Sivanich <sivanich@sgi.com>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Roy Franz <roy.franz@linaro.org>
      Cc: Russ Anderson <rja@sgi.com>
      Cc: Russell King <linux@armlinux.org.uk>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Will Deacon <will.deacon@arm.com>
      Cc: linux-arm-kernel@lists.infradead.org
      Cc: linux-efi@vger.kernel.org
      Link: http://lkml.kernel.org/r/1466839230-12781-5-git-send-email-matt@codeblueprint.co.ukSigned-off-by: NIngo Molnar <mingo@kernel.org>
      80e75596
  2. 28 4月, 2016 4 次提交
    • M
      efi/runtime-wrappers: Remove ARCH_EFI_IRQ_FLAGS_MASK #ifdef · 0cf0223c
      Mark Rutland 提交于
      Now that arm, arm64, and x86 all provide ARCH_EFI_IRQ_FLAGS_MASK, we can
      get rid of the trivial and now unused implementation of
      efi_call_virt_check_flags().
      Signed-off-by: NMark Rutland <mark.rutland@arm.com>
      Signed-off-by: NMatt Fleming <matt@codeblueprint.co.uk>
      Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
      Cc: Borislav Petkov <bp@alien8.de>
      Cc: Catalin Marinas <catalin.marinas@arm.com>
      Cc: Leif Lindholm <leif.lindholm@linaro.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Russell King <linux@arm.linux.org.uk>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Will Deacon <will.deacon@arm.com>
      Cc: linux-efi@vger.kernel.org
      Link: http://lkml.kernel.org/r/1461614832-17633-41-git-send-email-matt@codeblueprint.co.ukSigned-off-by: NIngo Molnar <mingo@kernel.org>
      0cf0223c
    • M
      efi/runtime-wrappers: Detect firmware IRQ flag corruption · 1d04ba17
      Mark Rutland 提交于
      The UEFI spec allows runtime services to be called with interrupts
      masked or unmasked, and if a runtime service function needs to mask
      interrupts, it must restore the mask to its original state before
      returning (i.e. from the PoV of the OS, this does not change across a
      call). Firmware should never unmask exceptions, as these may then be
      taken by the OS unexpectedly.
      
      Unfortunately, some firmware has been seen to unmask IRQs (and
      potentially other maskable exceptions) across runtime services calls,
      leaving IRQ flags corrupted after returning from a runtime services
      function call. This may be detected by the IRQ tracing code, but often
      goes unnoticed, leaving a potentially disastrous bug hidden.
      
      This patch detects when the IRQ flags are corrupted by an EFI runtime
      services call, logging the call and specific corruption to the console.
      While restoring the expected value of the flags is insufficient to avoid
      problems, we do so to avoid redundant warnings from elsewhere (e.g. IRQ
      tracing).
      
      The set of bits in flags which we want to check is architecture-specific
      (e.g. we want to check FIQ on arm64, but not the zero flag on x86), so
      each arch must provide ARCH_EFI_IRQ_FLAGS_MASK to describe those. In the
      absence of this mask, the check is a no-op, and we redundantly save the
      flags twice, but that will be short-lived as subsequent patches
      will implement this and remove the scaffolding.
      Signed-off-by: NMark Rutland <mark.rutland@arm.com>
      Signed-off-by: NMatt Fleming <matt@codeblueprint.co.uk>
      Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
      Cc: Borislav Petkov <bp@alien8.de>
      Cc: Catalin Marinas <catalin.marinas@arm.com>
      Cc: Leif Lindholm <leif.lindholm@linaro.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Robin Murphy <robin.murphy@arm.com>
      Cc: Russell King <linux@arm.linux.org.uk>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Will Deacon <will.deacon@arm.com>
      Cc: linux-efi@vger.kernel.org
      Link: http://lkml.kernel.org/r/1461614832-17633-37-git-send-email-matt@codeblueprint.co.ukSigned-off-by: NIngo Molnar <mingo@kernel.org>
      1d04ba17
    • M
      efi/runtime-wrappers: Remove redundant #ifdefs · d9c6e1d0
      Mark Rutland 提交于
      Now that all users of the EFI runtime wrappers (arm,arm64,x86) have been
      migrated to the new setup/teardown macros, we don't need to support
      overridden {__,}efi_call_virt() implementations.
      
      This patch removes the unnecessary #ifdefs.
      Signed-off-by: NMark Rutland <mark.rutland@arm.com>
      Signed-off-by: NMatt Fleming <matt@codeblueprint.co.uk>
      Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
      Cc: Borislav Petkov <bp@alien8.de>
      Cc: Catalin Marinas <catalin.marinas@arm.com>
      Cc: Leif Lindholm <leif.lindholm@linaro.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Russell King <linux@arm.linux.org.uk>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Will Deacon <will.deacon@arm.com>
      Cc: linux-efi@vger.kernel.org
      Link: http://lkml.kernel.org/r/1461614832-17633-36-git-send-email-matt@codeblueprint.co.ukSigned-off-by: NIngo Molnar <mingo@kernel.org>
      d9c6e1d0
    • M
      efi/runtime-wrappers: Add {__,}efi_call_virt() templates · f51c35f2
      Mark Rutland 提交于
      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 environment set
      up. This can be used to detect common firmware issues (e.g. bad irq mask
      management).
      Signed-off-by: NMark Rutland <mark.rutland@arm.com>
      Signed-off-by: NMatt Fleming <matt@codeblueprint.co.uk>
      Reviewed-by: NArd Biesheuvel <ard.biesheuvel@linaro.org>
      Cc: Borislav Petkov <bp@alien8.de>
      Cc: Catalin Marinas <catalin.marinas@arm.com>
      Cc: Leif Lindholm <leif.lindholm@linaro.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Russell King <linux@arm.linux.org.uk>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Will Deacon <will.deacon@arm.com>
      Cc: linux-efi@vger.kernel.org
      Link: http://lkml.kernel.org/r/1461614832-17633-32-git-send-email-matt@codeblueprint.co.ukSigned-off-by: NIngo Molnar <mingo@kernel.org>
      f51c35f2
  3. 22 2月, 2016 1 次提交
    • A
      efi/runtime-wrappers: Run UEFI Runtime Services with interrupts enabled · fe324494
      Ard Biesheuvel 提交于
      The UEFI spec allows Runtime Services to be invoked with interrupts
      enabled. The only reason we were disabling interrupts was to prevent
      recursive calls into the services on the same CPU, which will lead to
      deadlock. However, the only context where such invocations may occur
      legally is from efi-pstore via efivars, and that code has been updated
      to call a non-blocking alternative when invoked from a non-interruptible
      context.
      
      So instead, update the ordinary, blocking UEFI Runtime Services wrappers
      to execute with interrupts enabled. This aims to prevent excessive interrupt
      latencies on uniprocessor platforms with slow variable stores.
      
      Note that other OSes such as Windows call UEFI Runtime Services with
      interrupts enabled as well.
      Signed-off-by: NArd Biesheuvel <ard.biesheuvel@linaro.org>
      Signed-off-by: NMatt Fleming <matt@codeblueprint.co.uk>
      Cc: Andy Lutomirski <luto@amacapital.net>
      Cc: Linus Torvalds <torvalds@linux-foundation.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Sai Praneeth Prakhya <sai.praneeth.prakhya@intel.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: linux-efi@vger.kernel.org
      Link: http://lkml.kernel.org/r/1455712566-16727-3-git-send-email-matt@codeblueprint.co.ukSigned-off-by: NIngo Molnar <mingo@kernel.org>
      fe324494
  4. 03 2月, 2016 3 次提交
  5. 04 10月, 2014 3 次提交
    • M
      efi: Delete the in_nmi() conditional runtime locking · 60b4dc77
      Matt Fleming 提交于
      commit 5dc3826d9f08 ("efi: Implement mandatory locking for UEFI Runtime
      Services") implemented some conditional locking when accessing variable
      runtime services that Ingo described as "pretty disgusting".
      
      The intention with the !efi_in_nmi() checks was to avoid live-locks when
      trying to write pstore crash data into an EFI variable. Such lockless
      accesses are allowed according to the UEFI specification when we're in a
      "non-recoverable" state, but whether or not things are implemented
      correctly in actual firmware implementations remains an unanswered
      question, and so it would seem sensible to avoid doing any kind of
      unsynchronized variable accesses.
      
      Furthermore, the efi_in_nmi() tests are inadequate because they don't
      account for the case where we call EFI variable services from panic or
      oops callbacks and aren't executing in NMI context. In other words,
      live-locking is still possible.
      
      Let's just remove the conditional locking altogether. Now we've got the
      ->set_variable_nonblocking() EFI variable operation we can abort if the
      runtime lock is already held. Aborting is by far the safest option.
      
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Ingo Molnar <mingo@kernel.org>
      Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
      Cc: Matthew Garrett <mjg59@srcf.ucam.org>
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      60b4dc77
    • M
      efi: Provide a non-blocking SetVariable() operation · 6d80dba1
      Matt Fleming 提交于
      There are some circumstances that call for trying to write an EFI
      variable in a non-blocking way. One such scenario is when writing pstore
      data in efi_pstore_write() via the pstore_dump() kdump callback.
      
      Now that we have an EFI runtime spinlock we need a way of aborting if
      there is contention instead of spinning, since when writing pstore data
      from the kdump callback, the runtime lock may already be held by the CPU
      that's running the callback if we crashed in the middle of an EFI
      variable operation.
      
      The situation is sufficiently special that a new EFI variable operation
      is warranted.
      
      Introduce ->set_variable_nonblocking() for this use case. It is an
      optional EFI backend operation, and need only be implemented by those
      backends that usually acquire locks to serialize access to EFI
      variables, as is the case for virt_efi_set_variable() where we now grab
      the EFI runtime spinlock.
      
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Ingo Molnar <mingo@kernel.org>
      Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
      Cc: Matthew Garrett <mjg59@srcf.ucam.org>
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      6d80dba1
    • A
      efi: Implement mandatory locking for UEFI Runtime Services · 161485e8
      Ard Biesheuvel 提交于
      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
      serialized. Use a spinlock to serialize all Runtime Services with respect
      to all others, even if this is more than strictly needed.
      
      We've managed to get away without requiring a runtime services lock
      until now because most of the interactions with EFI involve EFI
      variables, and those operations are already serialised with
      __efivars->lock.
      
      Some of the assumptions underlying the decision whether locks are
      needed or not (e.g., SetVariable() against ResetSystem()) may not
      apply universally to all [new] architectures that implement UEFI.
      Rather than try to reason our way out of this, let's just implement at
      least what the spec requires in terms of locking.
      Signed-off-by: NArd Biesheuvel <ard.biesheuvel@linaro.org>
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      161485e8
  6. 08 7月, 2014 1 次提交