1. 31 1月, 2013 2 次提交
    • M
      efivarfs: Use sizeof() instead of magic number · 94a193fb
      Matt Fleming 提交于
      Instead of adding a magic 4 to the variable size, use sizeof() to make
      it explicitly clear what the quantity represents (the variable's
      attributes).
      
      CC: Jeremy Kerr <jeremy.kerr@canonical.com>
      Cc: Chun-Yi Lee <joeyli.kernel@gmail.com>
      Cc: Andy Whitcroft <apw@canonical.com>
      Reported-by: NLingzhu Xiang <lxiang@redhat.com>
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      94a193fb
    • M
      efi: Make 'efi_enabled' a function to query EFI facilities · 83e68189
      Matt Fleming 提交于
      Originally 'efi_enabled' indicated whether a kernel was booted from
      EFI firmware. Over time its semantics have changed, and it now
      indicates whether or not we are booted on an EFI machine with
      bit-native firmware, e.g. 64-bit kernel with 64-bit firmware.
      
      The immediate motivation for this patch is the bug report at,
      
          https://bugs.launchpad.net/ubuntu-cdimage/+bug/1040557
      
      which details how running a platform driver on an EFI machine that is
      designed to run under BIOS can cause the machine to become
      bricked. Also, the following report,
      
          https://bugzilla.kernel.org/show_bug.cgi?id=47121
      
      details how running said driver can also cause Machine Check
      Exceptions. Drivers need a new means of detecting whether they're
      running on an EFI machine, as sadly the expression,
      
          if (!efi_enabled)
      
      hasn't been a sufficient condition for quite some time.
      
      Users actually want to query 'efi_enabled' for different reasons -
      what they really want access to is the list of available EFI
      facilities.
      
      For instance, the x86 reboot code needs to know whether it can invoke
      the ResetSystem() function provided by the EFI runtime services, while
      the ACPI OSL code wants to know whether the EFI config tables were
      mapped successfully. There are also checks in some of the platform
      driver code to simply see if they're running on an EFI machine (which
      would make it a bad idea to do BIOS-y things).
      
      This patch is a prereq for the samsung-laptop fix patch.
      
      Cc: David Airlie <airlied@linux.ie>
      Cc: Corentin Chary <corentincj@iksaif.net>
      Cc: Matthew Garrett <mjg59@srcf.ucam.org>
      Cc: Dave Jiang <dave.jiang@intel.com>
      Cc: Olof Johansson <olof@lixom.net>
      Cc: Peter Jones <pjones@redhat.com>
      Cc: Colin Ian King <colin.king@canonical.com>
      Cc: Steve Langasek <steve.langasek@canonical.com>
      Cc: Tony Luck <tony.luck@intel.com>
      Cc: Konrad Rzeszutek Wilk <konrad@kernel.org>
      Cc: Rafael J. Wysocki <rjw@sisk.pl>
      Cc: <stable@vger.kernel.org>
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      Signed-off-by: NH. Peter Anvin <hpa@linux.intel.com>
      83e68189
  2. 18 1月, 2013 3 次提交
    • M
      efivarfs: Delete dentry from dcache in efivarfs_file_write() · 791eb564
      Matt Fleming 提交于
      Unlike the unlink path that is called from the VFS layer, we need to
      call d_delete() ourselves when a variable is deleted in
      efivarfs_file_write().
      
      Failure to do so means we can access a stale struct efivar_entry when
      reading/writing the file, which can result in the following oops,
      
        [   59.978216] general protection fault: 0000 [#1] SMP
        [   60.038660] CPU 9
        [   60.040501] Pid: 1001, comm: cat Not tainted 3.7.0-2.fc19.x86_64 #1 IBM System x3550 M3 -[7944I21]-/69Y4438
        [   60.050840] RIP: 0010:[<ffffffff810d5d1e>]  [<ffffffff810d5d1e>] __lock_acquire+0x5e/0x1bb0
        [   60.059198] RSP: 0018:ffff880270595ce8  EFLAGS: 00010046
        [   60.064500] RAX: 0000000000000046 RBX: 0000000000000002 RCX: 0000000000000000
        [   60.071617] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 6b6b6b6b6b6b6b83
        [   60.078735] RBP: ffff880270595dd8 R08: 0000000000000002 R09: 0000000000000000
        [   60.085852] R10: 6b6b6b6b6b6b6b83 R11: 0000000000000000 R12: 0000000000000000
        [   60.092971] R13: ffff88027170cd20 R14: 0000000000000000 R15: 0000000000000000
        [   60.100091] FS:  00007fc0c8ff3740(0000) GS:ffff880277000000(0000) knlGS:0000000000000000
        [   60.108164] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
        [   60.113899] CR2: 0000000001520000 CR3: 000000026d594000 CR4: 00000000000007e0
        [   60.121016] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
        [   60.128135] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
        [   60.135254] Process cat (pid: 1001, threadinfo ffff880270594000, task ffff88027170cd20)
        [   60.143239] Stack:
        [   60.145251]  ffff880270595cf8 ffffffff81021da3 ffff880270595d08 ffffffff81021e19
        [   60.152714]  ffff880270595d38 ffffffff810acdb5 ffff880200000168 0000000000000086
        [   60.160175]  ffff88027170d5e8 ffffffff810d25ed ffff880270595d58 ffffffff810ace7f
        [   60.167638] Call Trace:
        [   60.170088]  [<ffffffff81021da3>] ? native_sched_clock+0x13/0x80
        [   60.176085]  [<ffffffff81021e19>] ? sched_clock+0x9/0x10
        [   60.181389]  [<ffffffff810acdb5>] ? sched_clock_cpu+0xc5/0x120
        [   60.187211]  [<ffffffff810d25ed>] ? trace_hardirqs_off+0xd/0x10
        [   60.193121]  [<ffffffff810ace7f>] ? local_clock+0x6f/0x80
        [   60.198513]  [<ffffffff810d2f6f>] ? lock_release_holdtime.part.26+0xf/0x180
        [   60.205465]  [<ffffffff810d7b57>] ? lock_release_non_nested+0x2e7/0x320
        [   60.212073]  [<ffffffff815638bb>] ? efivarfs_file_write+0x5b/0x280
        [   60.218242]  [<ffffffff810d7f41>] lock_acquire+0xa1/0x1f0
        [   60.223633]  [<ffffffff81563971>] ? efivarfs_file_write+0x111/0x280
        [   60.229892]  [<ffffffff8118b47c>] ? might_fault+0x5c/0xb0
        [   60.235287]  [<ffffffff816f1bf6>] _raw_spin_lock+0x46/0x80
        [   60.240762]  [<ffffffff81563971>] ? efivarfs_file_write+0x111/0x280
        [   60.247018]  [<ffffffff81563971>] efivarfs_file_write+0x111/0x280
        [   60.253103]  [<ffffffff811d307f>] vfs_write+0xaf/0x190
        [   60.258233]  [<ffffffff811d33d5>] sys_write+0x55/0xa0
        [   60.263278]  [<ffffffff816fbd19>] system_call_fastpath+0x16/0x1b
        [   60.269271] Code: 41 0f 45 d8 4c 89 75 f0 4c 89 7d f8 85 c0 0f 84 09 01 00 00 8b 05 a3 f9 ff 00 49 89 fa 41 89 f6 41 89 d3 85 c0 0f 84 12 01 00 00 <49> 8b 02 ba 01 00 00 00 48 3d a0 07 14 82 0f 44 da 41 83 fe 01
        [   60.289431] RIP  [<ffffffff810d5d1e>] __lock_acquire+0x5e/0x1bb0
        [   60.295444]  RSP <ffff880270595ce8>
        [   60.298928] ---[ end trace 1bbfd41a2cf6a0d8 ]---
      
      Cc: Josh Boyer <jwboyer@redhat.com>
      Acked-by: NJeremy Kerr <jeremy.kerr@canonical.com>
      Cc: Lee, Chun-Yi <jlee@suse.com>
      Cc: Andy Whitcroft <apw@canonical.com>
      Reported-by: NLingzhu Xiang <lxiang@redhat.com>
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      791eb564
    • M
      efivarfs: Never return ENOENT from firmware · 1fa7e695
      Matt Fleming 提交于
      Files are created in efivarfs_create() before a corresponding variable
      is created in the firmware. This leads to users being able to
      read/write to the file without the variable existing in the
      firmware. Reading a non-existent variable currently returns -ENOENT,
      which is confusing because the file obviously *does* exist.
      
      Convert EFI_NOT_FOUND into -EIO which is the closest thing to "error
      while interacting with firmware", and should hopefully indicate to the
      caller that the variable is in some uninitialised state.
      
      Cc: Josh Boyer <jwboyer@redhat.com>
      Acked-by: NJeremy Kerr <jeremy.kerr@canonical.com>
      Cc: Lee, Chun-Yi <jlee@suse.com>
      Cc: Andy Whitcroft <apw@canonical.com>
      Reported-by: NLingzhu Xiang <lxiang@redhat.com>
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      1fa7e695
    • L
      efivarfs: Drop link count of the right inode · de5fe955
      Lingzhu Xiang 提交于
      efivarfs_unlink() should drop the file's link count, not the directory's.
      Signed-off-by: NLingzhu Xiang <lxiang@redhat.com>
      Cc: Jeremy Kerr <jeremy.kerr@canonical.com>
      Tested-by: NLee, Chun-Yi <jlee@suse.com>
      Signed-off-by: NMatt Fleming <matt.fleming@intel.com>
      de5fe955
  3. 18 12月, 2012 1 次提交
  4. 27 11月, 2012 7 次提交
    • S
      efi_pstore: Add a format check for an existing variable name at erasing time · f94ec0c0
      Seiji Aguchi 提交于
      [Issue]
      
      a format of variable name has been updated to type, id, count and ctime
      to support holding multiple logs.
      
      Format of current variable name
        dump-type0-1-2-12345678
      
        type:0
        id:1
        count:2
        ctime:12345678
      
      On the other hand, if an old variable name before being updated
      remains, users can't erase it via /dev/pstore.
      
      Format of old variable name
        dump-type0-1-12345678
      
        type:0
        id:1
        ctime:12345678
      
      [Solution]
      
      This patch add a format check for the old variable name in a erase callback to make it erasable.
      Signed-off-by: NSeiji Aguchi <seiji.aguchi@hds.com>
      Acked-by: NMike Waychison <mikew@google.com>
      Signed-off-by: NTony Luck <tony.luck@intel.com>
      f94ec0c0
    • S
      efi_pstore: Add a format check for an existing variable name at reading time · 0f7de85a
      Seiji Aguchi 提交于
      [Issue]
      
      a format of variable name has been updated to type, id, count and ctime
      to support holding multiple logs.
      
      Format of current variable name
        dump-type0-1-2-12345678
      
        type:0
        id:1
        count:2
        ctime:12345678
      
      On the other hand, if an old variable name before being updated
      remains, users can't read it via /dev/pstore.
      
      Format of old variable name
        dump-type0-1-12345678
      
        type:0
        id:1
        ctime:12345678
      
      [Solution]
      
      This patch add a format check for the old variable name in a read callback
      to make it readable.
      Signed-off-by: NSeiji Aguchi <seiji.aguchi@hds.com>
      Acked-by: NMike Waychison <mikew@google.com>
      Signed-off-by: NTony Luck <tony.luck@intel.com>
      0f7de85a
    • S
      efi_pstore: Add a sequence counter to a variable name · 755d4fe4
      Seiji Aguchi 提交于
      [Issue]
      
      Currently, a variable name, which identifies each entry, consists of type, id and ctime.
      But if multiple events happens in a short time, a second/third event may fail to log because
      efi_pstore can't distinguish each event with current variable name.
      
      [Solution]
      
      A reasonable way to identify all events precisely is introducing a sequence counter to
      the variable name.
      
      The sequence counter has already supported in a pstore layer with "oopscount".
      So, this patch adds it to a variable name.
      Also, it is passed to read/erase callbacks of platform drivers in accordance with
      the modification of the variable name.
      
        <before applying this patch>
       a variable name of first event: dump-type0-1-12345678
       a variable name of second event: dump-type0-1-12345678
      
        type:0
        id:1
        ctime:12345678
      
       If multiple events happen in a short time, efi_pstore can't distinguish them because
       variable names are same among them.
      
        <after applying this patch>
      
       it can be distinguishable by adding a sequence counter as follows.
      
       a variable name of first event: dump-type0-1-1-12345678
       a variable name of Second event: dump-type0-1-2-12345678
      
        type:0
        id:1
        sequence counter: 1(first event), 2(second event)
        ctime:12345678
      
      In case of a write callback executed in pstore_console_write(), "0" is added to
      an argument of the write callback because it just logs all kernel messages and
      doesn't need to care about multiple events.
      Signed-off-by: NSeiji Aguchi <seiji.aguchi@hds.com>
      Acked-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Acked-by: NMike Waychison <mikew@google.com>
      Signed-off-by: NTony Luck <tony.luck@intel.com>
      755d4fe4
    • S
      efi_pstore: Add ctime to argument of erase callback · a9efd39c
      Seiji Aguchi 提交于
      [Issue]
      
      Currently, a variable name, which is used to identify each log entry, consists of type,
      id and ctime. But an erase callback does not use ctime.
      
      If efi_pstore supported just one log, type and id were enough.
      However, in case of supporting multiple logs, it doesn't work because
      it can't distinguish each entry without ctime at erasing time.
      
       <Example>
      
       As you can see below, efi_pstore can't differentiate first event from second one without ctime.
      
       a variable name of first event: dump-type0-1-12345678
       a variable name of second event: dump-type0-1-23456789
      
        type:0
        id:1
        ctime:12345678, 23456789
      
      [Solution]
      
      This patch adds ctime to an argument of an erase callback.
      
      It works across reboots because ctime of pstore means the date that the record was originally stored.
      To do this, efi_pstore saves the ctime to variable name at writing time and passes it to pstore
      at reading time.
      Signed-off-by: NSeiji Aguchi <seiji.aguchi@hds.com>
      Acked-by: NMike Waychison <mikew@google.com>
      Signed-off-by: NTony Luck <tony.luck@intel.com>
      a9efd39c
    • S
      efi_pstore: Remove a logic erasing entries from a write callback to hold multiple logs · 96480d9c
      Seiji Aguchi 提交于
      [Issue]
      
      Currently, efi_pstore driver simply overwrites existing panic messages in NVRAM.
      So, in the following scenario, we will lose 1st panic messages.
      
      1. kernel panics.
      2. efi_pstore is kicked and writes panic messages to NVRAM.
      3. system reboots.
      4. kernel panics again before a user checks the 1st panic messages in NVRAM.
      
      [Solution]
      
      A reasonable solution to fix the issue is just holding multiple logs without erasing
      existing entries.
      This patch removes a logic erasing existing entries in a write callback
      because the logic is not needed in the write callback to support holding multiple logs.
      Signed-off-by: NSeiji Aguchi <seiji.aguchi@hds.com>
      Acked-by: NMike Waychison <mikew@google.com>
      Signed-off-by: NTony Luck <tony.luck@intel.com>
      96480d9c
    • S
      efi_pstore: Add a logic erasing entries to an erase callback · dd230fec
      Seiji Aguchi 提交于
      [Issue]
      
      Currently, efi_pstore driver simply overwrites existing panic messages in NVRAM.
      So, in the following scenario, we will lose 1st panic messages.
      
       1. kernel panics.
       2. efi_pstore is kicked and writes panic messages to NVRAM.
       3. system reboots.
       4. kernel panics again before a user checks the 1st panic messages in NVRAM.
      
      [Solution]
      
      A reasonable solution to fix the issue is just holding multiple logs without erasing
      existing entries.
      
      This patch freshly adds a logic erasing existing entries, which shared with a write callback,
      to an erase callback.
      To support holding multiple logs, the write callback doesn't need to erase any entries and
      it will be removed in a subsequent patch.
      Signed-off-by: NSeiji Aguchi <seiji.aguchi@hds.com>
      Acked-by: NMike Waychison <mikew@google.com>
      Signed-off-by: NTony Luck <tony.luck@intel.com>
      dd230fec
    • S
      efi_pstore: Check remaining space with QueryVariableInfo() before writing data · d80a361d
      Seiji Aguchi 提交于
      [Issue]
      
      As discussed in a thread below, Running out of space in EFI isn't a well-tested scenario.
      And we wouldn't expect all firmware to handle it gracefully.
      http://marc.info/?l=linux-kernel&m=134305325801789&w=2
      
      On the other hand, current efi_pstore doesn't check a remaining space of storage at writing time.
      Therefore, efi_pstore may not work if it tries to write a large amount of data.
      
      [Patch Description]
      
      To avoid handling the situation above, this patch checks if there is a space enough to log with
      QueryVariableInfo() before writing data.
      Signed-off-by: NSeiji Aguchi <seiji.aguchi@hds.com>
      Acked-by: NMike Waychison <mikew@google.com>
      Signed-off-by: NTony Luck <tony.luck@intel.com>
      d80a361d
  5. 16 11月, 2012 1 次提交
  6. 13 11月, 2012 1 次提交
  7. 30 10月, 2012 16 次提交
  8. 11 9月, 2012 1 次提交
  9. 04 5月, 2012 1 次提交
  10. 01 5月, 2012 1 次提交
    • M
      efi: Validate UEFI boot variables · fec6c20b
      Matthew Garrett 提交于
      A common flaw in UEFI systems is a refusal to POST triggered by a malformed
      boot variable. Once in this state, machines may only be restored by
      reflashing their firmware with an external hardware device. While this is
      obviously a firmware bug, the serious nature of the outcome suggests that
      operating systems should filter their variable writes in order to prevent
      a malicious user from rendering the machine unusable.
      Signed-off-by: NMatthew Garrett <mjg@redhat.com>
      Cc: stable@vger.kernel.org
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      fec6c20b
  11. 29 11月, 2011 1 次提交
  12. 18 11月, 2011 2 次提交
    • K
      pstore: pass reason to backend write callback · 3d6d8d20
      Kees Cook 提交于
      This allows a backend to filter on the dmesg reason as well as the pstore
      reason. When ramoops is switched to pstore, this is needed since it has
      no interest in storing non-crash dmesg details.
      
      Drop pstore_write() as it has no users, and handling the "reason" here
      has no obviously correct value.
      Signed-off-by: NKees Cook <keescook@chromium.org>
      Signed-off-by: NTony Luck <tony.luck@intel.com>
      3d6d8d20
    • K
      pstore: pass allocated memory region back to caller · f6f82851
      Kees Cook 提交于
      The buf_lock cannot be held while populating the inodes, so make the backend
      pass forward an allocated and filled buffer instead. This solves the following
      backtrace. The effect is that "buf" is only ever used to notify the backends
      that something was written to it, and shouldn't be used in the read path.
      
      To replace the buf_lock during the read path, isolate the open/read/close
      loop with a separate mutex to maintain serialized access to the backend.
      
      Note that is is up to the pstore backend to cope if the (*write)() path is
      called in the middle of the read path.
      
      [   59.691019] BUG: sleeping function called from invalid context at .../mm/slub.c:847
      [   59.691019] in_atomic(): 0, irqs_disabled(): 1, pid: 1819, name: mount
      [   59.691019] Pid: 1819, comm: mount Not tainted 3.0.8 #1
      [   59.691019] Call Trace:
      [   59.691019]  [<810252d5>] __might_sleep+0xc3/0xca
      [   59.691019]  [<810a26e6>] kmem_cache_alloc+0x32/0xf3
      [   59.691019]  [<810b53ac>] ? __d_lookup_rcu+0x6f/0xf4
      [   59.691019]  [<810b68b1>] alloc_inode+0x2a/0x64
      [   59.691019]  [<810b6903>] new_inode+0x18/0x43
      [   59.691019]  [<81142447>] pstore_get_inode.isra.1+0x11/0x98
      [   59.691019]  [<81142623>] pstore_mkfile+0xae/0x26f
      [   59.691019]  [<810a2a66>] ? kmem_cache_free+0x19/0xb1
      [   59.691019]  [<8116c821>] ? ida_get_new_above+0x140/0x158
      [   59.691019]  [<811708ea>] ? __init_rwsem+0x1e/0x2c
      [   59.691019]  [<810b67e8>] ? inode_init_always+0x111/0x1b0
      [   59.691019]  [<8102127e>] ? should_resched+0xd/0x27
      [   59.691019]  [<8137977f>] ? _cond_resched+0xd/0x21
      [   59.691019]  [<81142abf>] pstore_get_records+0x52/0xa7
      [   59.691019]  [<8114254b>] pstore_fill_super+0x7d/0x91
      [   59.691019]  [<810a7ff5>] mount_single+0x46/0x82
      [   59.691019]  [<8114231a>] pstore_mount+0x15/0x17
      [   59.691019]  [<811424ce>] ? pstore_get_inode.isra.1+0x98/0x98
      [   59.691019]  [<810a8199>] mount_fs+0x5a/0x12d
      [   59.691019]  [<810b9174>] ? alloc_vfsmnt+0xa4/0x14a
      [   59.691019]  [<810b9474>] vfs_kern_mount+0x4f/0x7d
      [   59.691019]  [<810b9d7e>] do_kern_mount+0x34/0xb2
      [   59.691019]  [<810bb15f>] do_mount+0x5fc/0x64a
      [   59.691019]  [<810912fb>] ? strndup_user+0x2e/0x3f
      [   59.691019]  [<810bb3cb>] sys_mount+0x66/0x99
      [   59.691019]  [<8137b537>] sysenter_do_call+0x12/0x26
      Signed-off-by: NKees Cook <keescook@chromium.org>
      Signed-off-by: NTony Luck <tony.luck@intel.com>
      f6f82851
  13. 13 10月, 2011 1 次提交
  14. 17 8月, 2011 1 次提交
    • D
      pstore: change mutex locking to spin_locks · abd4d558
      Don Zickus 提交于
      pstore was using mutex locking to protect read/write access to the
      backend plug-ins.  This causes problems when pstore is executed in
      an NMI context through panic() -> kmsg_dump().
      
      This patch changes the mutex to a spin_lock_irqsave then also checks to
      see if we are in an NMI context.  If we are in an NMI and can't get the
      lock, just print a message stating that and blow by the locking.
      
      All this is probably a hack around the bigger locking problem but it
      solves my current situation of trying to sleep in an NMI context.
      
      Tested by loading the lkdtm module and executing a HARDLOCKUP which
      will cause the machine to panic inside the nmi handler.
      Signed-off-by: NDon Zickus <dzickus@redhat.com>
      Acked-by: NMatthew Garrett <mjg@redhat.com>
      Signed-off-by: NTony Luck <tony.luck@intel.com>
      abd4d558
  15. 03 8月, 2011 1 次提交