1. 19 7月, 2014 6 次提交
    • D
      efi: Introduce EFI_PARAVIRT flag · 9f27bc54
      Daniel Kiper 提交于
      Introduce EFI_PARAVIRT flag. If it is set then kernel runs
      on EFI platform but it has not direct control on EFI stuff
      like EFI runtime, tables, structures, etc. If not this means
      that Linux Kernel has direct access to EFI infrastructure
      and everything runs as usual.
      
      This functionality is used in Xen dom0 because hypervisor
      has full control on EFI stuff and all calls from dom0 to
      EFI must be requested via special hypercall which in turn
      executes relevant EFI code in behalf of dom0.
      Signed-off-by: NDaniel Kiper <daniel.kiper@oracle.com>
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      9f27bc54
    • D
      efi: Use early_mem*() instead of early_io*() · abc93f8e
      Daniel Kiper 提交于
      Use early_mem*() instead of early_io*() because all mapped EFI regions
      are memory (usually RAM but they could also be ROM, EPROM, EEPROM, flash,
      etc.) not I/O regions. Additionally, I/O family calls do not work correctly
      under Xen in our case. early_ioremap() skips the PFN to MFN conversion
      when building the PTE. Using it for memory will attempt to map the wrong
      machine frame. However, all artificial EFI structures created under Xen
      live in dom0 memory and should be mapped/unmapped using early_mem*() family
      calls which map domain memory.
      Signed-off-by: NDaniel Kiper <daniel.kiper@oracle.com>
      Cc: Leif Lindholm <leif.lindholm@linaro.org>
      Cc: Mark Salter <msalter@redhat.com>
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      abc93f8e
    • M
      x86/reboot: Add EFI reboot quirk for ACPI Hardware Reduced flag · 44be28e9
      Matt Fleming 提交于
      It appears that the BayTrail-T class of hardware requires EFI in order
      to powerdown and reboot and no other reliable method exists.
      
      This quirk is generally applicable to all hardware that has the ACPI
      Hardware Reduced bit set, since usually ACPI would be the preferred
      method.
      
      Cc: Len Brown <len.brown@intel.com>
      Cc: Mark Salter <msalter@redhat.com>
      Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      44be28e9
    • M
      efi/reboot: Allow powering off machines using EFI · 0c5ed61a
      Matt Fleming 提交于
      Not only can EfiResetSystem() be used to reboot, it can also be used to
      power down machines.
      
      By and large, this functionality doesn't work very well across the range
      of EFI machines in the wild, so it should definitely only be used as a
      last resort. In an ideal world, this wouldn't be needed at all.
      
      Unfortunately, we're starting to see machines where EFI is the *only*
      reliable way to power down, and nothing else, not PCI, not ACPI, works.
      
      efi_poweroff_required() should be implemented on a per-architecture
      basis, since exactly when we should be using EFI runtime services is a
      platform-specific decision. There's no analogue for reboot because each
      architecture handles reboot very differently - the x86 code in
      particular is pretty complex.
      
      Patches to enable this for specific classes of hardware will be
      submitted separately.
      Tested-by: NMark Salter <msalter@redhat.com>
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      0c5ed61a
    • M
      efi/reboot: Add generic wrapper around EfiResetSystem() · 8562c99c
      Matt Fleming 提交于
      Implement efi_reboot(), which is really just a wrapper around the
      EfiResetSystem() EFI runtime service, but it does at least allow us to
      funnel all callers through a single location.
      
      It also simplifies the callsites since users no longer need to check to
      see whether EFI_RUNTIME_SERVICES are enabled.
      
      Cc: Tony Luck <tony.luck@intel.com>
      Tested-by: NMark Salter <msalter@redhat.com>
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      8562c99c
    • A
      efi: efistub: Convert into static library · f4f75ad5
      Ard Biesheuvel 提交于
      This patch changes both x86 and arm64 efistub implementations
      from #including shared .c files under drivers/firmware/efi to
      building shared code as a static library.
      
      The x86 code uses a stub built into the boot executable which
      uncompresses the kernel at boot time. In this case, the library is
      linked into the decompressor.
      
      In the arm64 case, the stub is part of the kernel proper so the library
      is linked into the kernel proper as well.
      Signed-off-by: NArd Biesheuvel <ard.biesheuvel@linaro.org>
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      f4f75ad5
  2. 08 7月, 2014 3 次提交
    • A
      efi: efistub: Refactor stub components · bd669475
      Ard Biesheuvel 提交于
      In order to move from the #include "../../../xxxxx.c" anti-pattern used
      by both the x86 and arm64 versions of the stub to a static library
      linked into either the kernel proper (arm64) or a separate boot
      executable (x86), there is some prepatory work required.
      
      This patch does the following:
      - move forward declarations of functions shared between the arch
        specific and the generic parts of the stub to include/linux/efi.h
      - move forward declarations of functions shared between various .c files
        of the generic stub code to a new local header file called "efistub.h"
      - add #includes to all .c files which were formerly relying on the
        #includor to include the correct header files
      - remove all static modifiers from functions which will need to be
        externally visible once we move to a static library
      Signed-off-by: NArd Biesheuvel <ard.biesheuvel@linaro.org>
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      bd669475
    • A
      efi/x86: Move UEFI Runtime Services wrappers to generic code · 022ee6c5
      Ard Biesheuvel 提交于
      In order for other archs (such as arm64) to be able to reuse the virtual
      mode function call wrappers, move them to drivers/firmware/efi/runtime-wrappers.c.
      Signed-off-by: NArd Biesheuvel <ard.biesheuvel@linaro.org>
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      022ee6c5
    • A
      efi/arm64: efistub: remove local copy of linux_banner · f49182ec
      Ard Biesheuvel 提交于
      The shared efistub code for ARM and arm64 contains a local copy of
      linux_banner, allowing it to be referenced from separate executables
      such as the ARM decompressor. However, this introduces a dependency on
      generated header files, causing unnecessary rebuilds of the stub itself
      and, in case of arm64, vmlinux which contains it.
      
      On arm64, the copy is not actually needed since we can reference the
      original symbol directly, and as it turns out, there may be better ways
      to deal with this for ARM as well, so let's remove it from the shared
      code. If it still needs to be reintroduced for ARM later, it should live
      under arch/arm anyway and not in shared code.
      Signed-off-by: NArd Biesheuvel <ard.biesheuvel@linaro.org>
      Acked-by: NWill Deacon <will.deacon@arm.com>
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      f49182ec
  3. 01 5月, 2014 4 次提交
  4. 17 4月, 2014 7 次提交
  5. 15 4月, 2014 2 次提交
  6. 11 4月, 2014 1 次提交
    • M
      efi: Pass correct file handle to efi_file_{read,close} · 47514c99
      Matt Fleming 提交于
      We're currently passing the file handle for the root file system to
      efi_file_read() and efi_file_close(), instead of the file handle for the
      file we wish to read/close.
      
      While this has worked up until now, it seems that it has only been by
      pure luck. Olivier explains,
      
       "The issue is the UEFI Fat driver might return the same function for
        'fh->read()' and 'h->read()'. While in our case it does not work with
        a different implementation of EFI_SIMPLE_FILE_SYSTEM_PROTOCOL. In our
        case, we return a different pointer when reading a directory and
        reading a file."
      
      Fixing this actually clears up the two functions because we can drop one
      of the arguments, and instead only pass a file 'handle' argument.
      Reported-by: NOlivier Martin <olivier.martin@arm.com>
      Reviewed-by: NOlivier Martin <olivier.martin@arm.com>
      Reviewed-by: NMark Rutland <mark.rutland@arm.com>
      Cc: Leif Lindholm <leif.lindholm@linaro.org>
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      47514c99
  7. 27 3月, 2014 1 次提交
  8. 05 3月, 2014 3 次提交
  9. 21 12月, 2013 3 次提交
  10. 20 12月, 2013 1 次提交
  11. 29 11月, 2013 2 次提交
    • M
      efi-pstore: Make efi-pstore return a unique id · fdeadb43
      Madper Xie 提交于
      Pstore fs expects that backends provide a unique id which could avoid
      pstore making entries as duplication or denominating entries the same
      name. So I combine the timestamp, part and count into id.
      Signed-off-by: NMadper Xie <cxie@redhat.com>
      Cc: Seiji Aguchi <seiji.aguchi@hds.com>
      Cc: stable@vger.kernel.org
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      fdeadb43
    • S
      efivars, efi-pstore: Hold off deletion of sysfs entry until the scan is completed · e0d59733
      Seiji Aguchi 提交于
      Currently, when mounting pstore file system, a read callback of
      efi_pstore driver runs mutiple times as below.
      
      - In the first read callback, scan efivar_sysfs_list from head and pass
        a kmsg buffer of a entry to an upper pstore layer.
      - In the second read callback, rescan efivar_sysfs_list from the entry
        and pass another kmsg buffer to it.
      - Repeat the scan and pass until the end of efivar_sysfs_list.
      
      In this process, an entry is read across the multiple read function
      calls. To avoid race between the read and erasion, the whole process
      above is protected by a spinlock, holding in open() and releasing in
      close().
      
      At the same time, kmemdup() is called to pass the buffer to pstore
      filesystem during it. And then, it causes a following lockdep warning.
      
      To make the dynamic memory allocation runnable without taking spinlock,
      holding off a deletion of sysfs entry if it happens while scanning it
      via efi_pstore, and deleting it after the scan is completed.
      
      To implement it, this patch introduces two flags, scanning and deleting,
      to efivar_entry.
      
      On the code basis, it seems that all the scanning and deleting logic is
      not needed because __efivars->lock are not dropped when reading from the
      EFI variable store.
      
      But, the scanning and deleting logic is still needed because an
      efi-pstore and a pstore filesystem works as follows.
      
      In case an entry(A) is found, the pointer is saved to psi->data.  And
      efi_pstore_read() passes the entry(A) to a pstore filesystem by
      releasing  __efivars->lock.
      
      And then, the pstore filesystem calls efi_pstore_read() again and the
      same entry(A), which is saved to psi->data, is used for resuming to scan
      a sysfs-list.
      
      So, to protect the entry(A), the logic is needed.
      
      [    1.143710] ------------[ cut here ]------------
      [    1.144058] WARNING: CPU: 1 PID: 1 at kernel/lockdep.c:2740 lockdep_trace_alloc+0x104/0x110()
      [    1.144058] DEBUG_LOCKS_WARN_ON(irqs_disabled_flags(flags))
      [    1.144058] Modules linked in:
      [    1.144058] CPU: 1 PID: 1 Comm: systemd Not tainted 3.11.0-rc5 #2
      [    1.144058]  0000000000000009 ffff8800797e9ae0 ffffffff816614a5 ffff8800797e9b28
      [    1.144058]  ffff8800797e9b18 ffffffff8105510d 0000000000000080 0000000000000046
      [    1.144058]  00000000000000d0 00000000000003af ffffffff81ccd0c0 ffff8800797e9b78
      [    1.144058] Call Trace:
      [    1.144058]  [<ffffffff816614a5>] dump_stack+0x54/0x74
      [    1.144058]  [<ffffffff8105510d>] warn_slowpath_common+0x7d/0xa0
      [    1.144058]  [<ffffffff8105517c>] warn_slowpath_fmt+0x4c/0x50
      [    1.144058]  [<ffffffff8131290f>] ? vsscanf+0x57f/0x7b0
      [    1.144058]  [<ffffffff810bbd74>] lockdep_trace_alloc+0x104/0x110
      [    1.144058]  [<ffffffff81192da0>] __kmalloc_track_caller+0x50/0x280
      [    1.144058]  [<ffffffff815147bb>] ? efi_pstore_read_func.part.1+0x12b/0x170
      [    1.144058]  [<ffffffff8115b260>] kmemdup+0x20/0x50
      [    1.144058]  [<ffffffff815147bb>] efi_pstore_read_func.part.1+0x12b/0x170
      [    1.144058]  [<ffffffff81514800>] ? efi_pstore_read_func.part.1+0x170/0x170
      [    1.144058]  [<ffffffff815148b4>] efi_pstore_read_func+0xb4/0xe0
      [    1.144058]  [<ffffffff81512b7b>] __efivar_entry_iter+0xfb/0x120
      [    1.144058]  [<ffffffff8151428f>] efi_pstore_read+0x3f/0x50
      [    1.144058]  [<ffffffff8128d7ba>] pstore_get_records+0x9a/0x150
      [    1.158207]  [<ffffffff812af25c>] ? selinux_d_instantiate+0x1c/0x20
      [    1.158207]  [<ffffffff8128ce30>] ? parse_options+0x80/0x80
      [    1.158207]  [<ffffffff8128ced5>] pstore_fill_super+0xa5/0xc0
      [    1.158207]  [<ffffffff811ae7d2>] mount_single+0xa2/0xd0
      [    1.158207]  [<ffffffff8128ccf8>] pstore_mount+0x18/0x20
      [    1.158207]  [<ffffffff811ae8b9>] mount_fs+0x39/0x1b0
      [    1.158207]  [<ffffffff81160550>] ? __alloc_percpu+0x10/0x20
      [    1.158207]  [<ffffffff811c9493>] vfs_kern_mount+0x63/0xf0
      [    1.158207]  [<ffffffff811cbb0e>] do_mount+0x23e/0xa20
      [    1.158207]  [<ffffffff8115b51b>] ? strndup_user+0x4b/0xf0
      [    1.158207]  [<ffffffff811cc373>] SyS_mount+0x83/0xc0
      [    1.158207]  [<ffffffff81673cc2>] system_call_fastpath+0x16/0x1b
      [    1.158207] ---[ end trace 61981bc62de9f6f4 ]---
      Signed-off-by: NSeiji Aguchi <seiji.aguchi@hds.com>
      Tested-by: NMadper Xie <cxie@redhat.com>
      Cc: stable@kernel.org
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      e0d59733
  12. 01 11月, 2013 1 次提交
  13. 05 10月, 2013 1 次提交
  14. 25 9月, 2013 5 次提交