LCOV - code coverage report
Current view: top level - drivers/firmware/efi - capsule.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 2 85 2.4 %
Date: 2022-03-28 15:32:58 Functions: 1 6 16.7 %
Branches: 0 36 0.0 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0
       2                 :            : /*
       3                 :            :  * EFI capsule support.
       4                 :            :  *
       5                 :            :  * Copyright 2013 Intel Corporation; author Matt Fleming
       6                 :            :  */
       7                 :            : 
       8                 :            : #define pr_fmt(fmt) "efi: " fmt
       9                 :            : 
      10                 :            : #include <linux/slab.h>
      11                 :            : #include <linux/mutex.h>
      12                 :            : #include <linux/highmem.h>
      13                 :            : #include <linux/efi.h>
      14                 :            : #include <linux/vmalloc.h>
      15                 :            : #include <asm/io.h>
      16                 :            : 
      17                 :            : typedef struct {
      18                 :            :         u64 length;
      19                 :            :         u64 data;
      20                 :            : } efi_capsule_block_desc_t;
      21                 :            : 
      22                 :            : static bool capsule_pending;
      23                 :            : static bool stop_capsules;
      24                 :            : static int efi_reset_type = -1;
      25                 :            : 
      26                 :            : /*
      27                 :            :  * capsule_mutex serialises access to both capsule_pending and
      28                 :            :  * efi_reset_type and stop_capsules.
      29                 :            :  */
      30                 :            : static DEFINE_MUTEX(capsule_mutex);
      31                 :            : 
      32                 :            : /**
      33                 :            :  * efi_capsule_pending - has a capsule been passed to the firmware?
      34                 :            :  * @reset_type: store the type of EFI reset if capsule is pending
      35                 :            :  *
      36                 :            :  * To ensure that the registered capsule is processed correctly by the
      37                 :            :  * firmware we need to perform a specific type of reset. If a capsule is
      38                 :            :  * pending return the reset type in @reset_type.
      39                 :            :  *
      40                 :            :  * This function will race with callers of efi_capsule_update(), for
      41                 :            :  * example, calling this function while somebody else is in
      42                 :            :  * efi_capsule_update() but hasn't reached efi_capsue_update_locked()
      43                 :            :  * will miss the updates to capsule_pending and efi_reset_type after
      44                 :            :  * efi_capsule_update_locked() completes.
      45                 :            :  *
      46                 :            :  * A non-racy use is from platform reboot code because we use
      47                 :            :  * system_state to ensure no capsules can be sent to the firmware once
      48                 :            :  * we're at SYSTEM_RESTART. See efi_capsule_update_locked().
      49                 :            :  */
      50                 :          0 : bool efi_capsule_pending(int *reset_type)
      51                 :            : {
      52         [ #  # ]:          0 :         if (!capsule_pending)
      53                 :            :                 return false;
      54                 :            : 
      55         [ #  # ]:          0 :         if (reset_type)
      56                 :          0 :                 *reset_type = efi_reset_type;
      57                 :            : 
      58                 :            :         return true;
      59                 :            : }
      60                 :            : 
      61                 :            : /*
      62                 :            :  * Whitelist of EFI capsule flags that we support.
      63                 :            :  *
      64                 :            :  * We do not handle EFI_CAPSULE_INITIATE_RESET because that would
      65                 :            :  * require us to prepare the kernel for reboot. Refuse to load any
      66                 :            :  * capsules with that flag and any other flags that we do not know how
      67                 :            :  * to handle.
      68                 :            :  */
      69                 :            : #define EFI_CAPSULE_SUPPORTED_FLAG_MASK                 \
      70                 :            :         (EFI_CAPSULE_PERSIST_ACROSS_RESET | EFI_CAPSULE_POPULATE_SYSTEM_TABLE)
      71                 :            : 
      72                 :            : /**
      73                 :            :  * efi_capsule_supported - does the firmware support the capsule?
      74                 :            :  * @guid: vendor guid of capsule
      75                 :            :  * @flags: capsule flags
      76                 :            :  * @size: size of capsule data
      77                 :            :  * @reset: the reset type required for this capsule
      78                 :            :  *
      79                 :            :  * Check whether a capsule with @flags is supported by the firmware
      80                 :            :  * and that @size doesn't exceed the maximum size for a capsule.
      81                 :            :  *
      82                 :            :  * No attempt is made to check @reset against the reset type required
      83                 :            :  * by any pending capsules because of the races involved.
      84                 :            :  */
      85                 :          0 : int efi_capsule_supported(efi_guid_t guid, u32 flags, size_t size, int *reset)
      86                 :            : {
      87                 :          0 :         efi_capsule_header_t capsule;
      88                 :          0 :         efi_capsule_header_t *cap_list[] = { &capsule };
      89                 :          0 :         efi_status_t status;
      90                 :          0 :         u64 max_size;
      91                 :            : 
      92         [ #  # ]:          0 :         if (flags & ~EFI_CAPSULE_SUPPORTED_FLAG_MASK)
      93                 :            :                 return -EINVAL;
      94                 :            : 
      95                 :          0 :         capsule.headersize = capsule.imagesize = sizeof(capsule);
      96                 :          0 :         memcpy(&capsule.guid, &guid, sizeof(efi_guid_t));
      97                 :          0 :         capsule.flags = flags;
      98                 :            : 
      99                 :          0 :         status = efi.query_capsule_caps(cap_list, 1, &max_size, reset);
     100         [ #  # ]:          0 :         if (status != EFI_SUCCESS)
     101                 :          0 :                 return efi_status_to_err(status);
     102                 :            : 
     103         [ #  # ]:          0 :         if (size > max_size)
     104                 :          0 :                 return -ENOSPC;
     105                 :            : 
     106                 :            :         return 0;
     107                 :            : }
     108                 :            : EXPORT_SYMBOL_GPL(efi_capsule_supported);
     109                 :            : 
     110                 :            : /*
     111                 :            :  * Every scatter gather list (block descriptor) page must end with a
     112                 :            :  * continuation pointer. The last continuation pointer of the last
     113                 :            :  * page must be zero to mark the end of the chain.
     114                 :            :  */
     115                 :            : #define SGLIST_PER_PAGE ((PAGE_SIZE / sizeof(efi_capsule_block_desc_t)) - 1)
     116                 :            : 
     117                 :            : /*
     118                 :            :  * How many scatter gather list (block descriptor) pages do we need
     119                 :            :  * to map @count pages?
     120                 :            :  */
     121                 :          0 : static inline unsigned int sg_pages_num(unsigned int count)
     122                 :            : {
     123                 :          0 :         return DIV_ROUND_UP(count, SGLIST_PER_PAGE);
     124                 :            : }
     125                 :            : 
     126                 :            : /**
     127                 :            :  * efi_capsule_update_locked - pass a single capsule to the firmware
     128                 :            :  * @capsule: capsule to send to the firmware
     129                 :            :  * @sg_pages: array of scatter gather (block descriptor) pages
     130                 :            :  * @reset: the reset type required for @capsule
     131                 :            :  *
     132                 :            :  * Since this function must be called under capsule_mutex check
     133                 :            :  * whether efi_reset_type will conflict with @reset, and atomically
     134                 :            :  * set it and capsule_pending if a capsule was successfully sent to
     135                 :            :  * the firmware.
     136                 :            :  *
     137                 :            :  * We also check to see if the system is about to restart, and if so,
     138                 :            :  * abort. This avoids races between efi_capsule_update() and
     139                 :            :  * efi_capsule_pending().
     140                 :            :  */
     141                 :            : static int
     142                 :          0 : efi_capsule_update_locked(efi_capsule_header_t *capsule,
     143                 :            :                           struct page **sg_pages, int reset)
     144                 :            : {
     145                 :          0 :         efi_physical_addr_t sglist_phys;
     146                 :          0 :         efi_status_t status;
     147                 :            : 
     148                 :          0 :         lockdep_assert_held(&capsule_mutex);
     149                 :            : 
     150                 :            :         /*
     151                 :            :          * If someone has already registered a capsule that requires a
     152                 :            :          * different reset type, we're out of luck and must abort.
     153                 :            :          */
     154   [ #  #  #  # ]:          0 :         if (efi_reset_type >= 0 && efi_reset_type != reset) {
     155                 :          0 :                 pr_err("Conflicting capsule reset type %d (%d).\n",
     156                 :            :                        reset, efi_reset_type);
     157                 :          0 :                 return -EINVAL;
     158                 :            :         }
     159                 :            : 
     160                 :            :         /*
     161                 :            :          * If the system is getting ready to restart it may have
     162                 :            :          * called efi_capsule_pending() to make decisions (such as
     163                 :            :          * whether to force an EFI reboot), and we're racing against
     164                 :            :          * that call. Abort in that case.
     165                 :            :          */
     166         [ #  # ]:          0 :         if (unlikely(stop_capsules)) {
     167                 :          0 :                 pr_warn("Capsule update raced with reboot, aborting.\n");
     168                 :          0 :                 return -EINVAL;
     169                 :            :         }
     170                 :            : 
     171                 :          0 :         sglist_phys = page_to_phys(sg_pages[0]);
     172                 :            : 
     173                 :          0 :         status = efi.update_capsule(&capsule, 1, sglist_phys);
     174         [ #  # ]:          0 :         if (status == EFI_SUCCESS) {
     175                 :          0 :                 capsule_pending = true;
     176                 :          0 :                 efi_reset_type = reset;
     177                 :            :         }
     178                 :            : 
     179                 :          0 :         return efi_status_to_err(status);
     180                 :            : }
     181                 :            : 
     182                 :            : /**
     183                 :            :  * efi_capsule_update - send a capsule to the firmware
     184                 :            :  * @capsule: capsule to send to firmware
     185                 :            :  * @pages: an array of capsule data pages
     186                 :            :  *
     187                 :            :  * Build a scatter gather list with EFI capsule block descriptors to
     188                 :            :  * map the capsule described by @capsule with its data in @pages and
     189                 :            :  * send it to the firmware via the UpdateCapsule() runtime service.
     190                 :            :  *
     191                 :            :  * @capsule must be a virtual mapping of the complete capsule update in the
     192                 :            :  * kernel address space, as the capsule can be consumed immediately.
     193                 :            :  * A capsule_header_t that describes the entire contents of the capsule
     194                 :            :  * must be at the start of the first data page.
     195                 :            :  *
     196                 :            :  * Even though this function will validate that the firmware supports
     197                 :            :  * the capsule guid, users will likely want to check that
     198                 :            :  * efi_capsule_supported() returns true before calling this function
     199                 :            :  * because it makes it easier to print helpful error messages.
     200                 :            :  *
     201                 :            :  * If the capsule is successfully submitted to the firmware, any
     202                 :            :  * subsequent calls to efi_capsule_pending() will return true. @pages
     203                 :            :  * must not be released or modified if this function returns
     204                 :            :  * successfully.
     205                 :            :  *
     206                 :            :  * Callers must be prepared for this function to fail, which can
     207                 :            :  * happen if we raced with system reboot or if there is already a
     208                 :            :  * pending capsule that has a reset type that conflicts with the one
     209                 :            :  * required by @capsule. Do NOT use efi_capsule_pending() to detect
     210                 :            :  * this conflict since that would be racy. Instead, submit the capsule
     211                 :            :  * to efi_capsule_update() and check the return value.
     212                 :            :  *
     213                 :            :  * Return 0 on success, a converted EFI status code on failure.
     214                 :            :  */
     215                 :          0 : int efi_capsule_update(efi_capsule_header_t *capsule, phys_addr_t *pages)
     216                 :            : {
     217                 :          0 :         u32 imagesize = capsule->imagesize;
     218                 :          0 :         efi_guid_t guid = capsule->guid;
     219                 :          0 :         unsigned int count, sg_count;
     220                 :          0 :         u32 flags = capsule->flags;
     221                 :          0 :         struct page **sg_pages;
     222                 :          0 :         int rv, reset_type;
     223                 :          0 :         int i, j;
     224                 :            : 
     225                 :          0 :         rv = efi_capsule_supported(guid, flags, imagesize, &reset_type);
     226         [ #  # ]:          0 :         if (rv)
     227                 :            :                 return rv;
     228                 :            : 
     229                 :          0 :         count = DIV_ROUND_UP(imagesize, PAGE_SIZE);
     230                 :          0 :         sg_count = sg_pages_num(count);
     231                 :            : 
     232                 :          0 :         sg_pages = kcalloc(sg_count, sizeof(*sg_pages), GFP_KERNEL);
     233         [ #  # ]:          0 :         if (!sg_pages)
     234                 :            :                 return -ENOMEM;
     235                 :            : 
     236         [ #  # ]:          0 :         for (i = 0; i < sg_count; i++) {
     237                 :          0 :                 sg_pages[i] = alloc_page(GFP_KERNEL);
     238         [ #  # ]:          0 :                 if (!sg_pages[i]) {
     239                 :          0 :                         rv = -ENOMEM;
     240                 :          0 :                         goto out;
     241                 :            :                 }
     242                 :            :         }
     243                 :            : 
     244         [ #  # ]:          0 :         for (i = 0; i < sg_count; i++) {
     245                 :          0 :                 efi_capsule_block_desc_t *sglist;
     246                 :            : 
     247                 :          0 :                 sglist = kmap(sg_pages[i]);
     248                 :            : 
     249         [ #  # ]:          0 :                 for (j = 0; j < SGLIST_PER_PAGE && count > 0; j++) {
     250                 :          0 :                         u64 sz = min_t(u64, imagesize,
     251                 :            :                                        PAGE_SIZE - (u64)*pages % PAGE_SIZE);
     252                 :            : 
     253                 :          0 :                         sglist[j].length = sz;
     254                 :          0 :                         sglist[j].data = *pages++;
     255                 :            : 
     256                 :          0 :                         imagesize -= sz;
     257                 :          0 :                         count--;
     258                 :            :                 }
     259                 :            : 
     260                 :            :                 /* Continuation pointer */
     261                 :          0 :                 sglist[j].length = 0;
     262                 :            : 
     263         [ #  # ]:          0 :                 if (i + 1 == sg_count)
     264                 :          0 :                         sglist[j].data = 0;
     265                 :            :                 else
     266                 :          0 :                         sglist[j].data = page_to_phys(sg_pages[i + 1]);
     267                 :            : 
     268                 :          0 :                 kunmap(sg_pages[i]);
     269                 :            :         }
     270                 :            : 
     271                 :          0 :         mutex_lock(&capsule_mutex);
     272                 :          0 :         rv = efi_capsule_update_locked(capsule, sg_pages, reset_type);
     273                 :          0 :         mutex_unlock(&capsule_mutex);
     274                 :            : 
     275                 :          0 : out:
     276         [ #  # ]:          0 :         for (i = 0; rv && i < sg_count; i++) {
     277         [ #  # ]:          0 :                 if (sg_pages[i])
     278                 :          0 :                         __free_page(sg_pages[i]);
     279                 :            :         }
     280                 :            : 
     281                 :          0 :         kfree(sg_pages);
     282                 :          0 :         return rv;
     283                 :            : }
     284                 :            : EXPORT_SYMBOL_GPL(efi_capsule_update);
     285                 :            : 
     286                 :          0 : static int capsule_reboot_notify(struct notifier_block *nb, unsigned long event, void *cmd)
     287                 :            : {
     288                 :          0 :         mutex_lock(&capsule_mutex);
     289                 :          0 :         stop_capsules = true;
     290                 :          0 :         mutex_unlock(&capsule_mutex);
     291                 :            : 
     292                 :          0 :         return NOTIFY_DONE;
     293                 :            : }
     294                 :            : 
     295                 :            : static struct notifier_block capsule_reboot_nb = {
     296                 :            :         .notifier_call = capsule_reboot_notify,
     297                 :            : };
     298                 :            : 
     299                 :         28 : static int __init capsule_reboot_register(void)
     300                 :            : {
     301                 :         28 :         return register_reboot_notifier(&capsule_reboot_nb);
     302                 :            : }
     303                 :            : core_initcall(capsule_reboot_register);

Generated by: LCOV version 1.14