LCOV - code coverage report
Current view: top level - drivers/firmware/efi - runtime-wrappers.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 164 0.0 %
Date: 2022-03-28 13:20:08 Functions: 0 18 0.0 %
Branches: 0 120 0.0 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0-only
       2                 :            : /*
       3                 :            :  * runtime-wrappers.c - Runtime Services function call wrappers
       4                 :            :  *
       5                 :            :  * Implementation summary:
       6                 :            :  * -----------------------
       7                 :            :  * 1. When user/kernel thread requests to execute efi_runtime_service(),
       8                 :            :  * enqueue work to efi_rts_wq.
       9                 :            :  * 2. Caller thread waits for completion until the work is finished
      10                 :            :  * because it's dependent on the return status and execution of
      11                 :            :  * efi_runtime_service().
      12                 :            :  * For instance, get_variable() and get_next_variable().
      13                 :            :  *
      14                 :            :  * Copyright (C) 2014 Linaro Ltd. <ard.biesheuvel@linaro.org>
      15                 :            :  *
      16                 :            :  * Split off from arch/x86/platform/efi/efi.c
      17                 :            :  *
      18                 :            :  * Copyright (C) 1999 VA Linux Systems
      19                 :            :  * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
      20                 :            :  * Copyright (C) 1999-2002 Hewlett-Packard Co.
      21                 :            :  * Copyright (C) 2005-2008 Intel Co.
      22                 :            :  * Copyright (C) 2013 SuSE Labs
      23                 :            :  */
      24                 :            : 
      25                 :            : #define pr_fmt(fmt)     "efi: " fmt
      26                 :            : 
      27                 :            : #include <linux/bug.h>
      28                 :            : #include <linux/efi.h>
      29                 :            : #include <linux/irqflags.h>
      30                 :            : #include <linux/mutex.h>
      31                 :            : #include <linux/semaphore.h>
      32                 :            : #include <linux/stringify.h>
      33                 :            : #include <linux/workqueue.h>
      34                 :            : #include <linux/completion.h>
      35                 :            : 
      36                 :            : #include <asm/efi.h>
      37                 :            : 
      38                 :            : /*
      39                 :            :  * Wrap around the new efi_call_virt_generic() macros so that the
      40                 :            :  * code doesn't get too cluttered:
      41                 :            :  */
      42                 :            : #define efi_call_virt(f, args...)   \
      43                 :            :         efi_call_virt_pointer(efi.systab->runtime, f, args)
      44                 :            : #define __efi_call_virt(f, args...) \
      45                 :            :         __efi_call_virt_pointer(efi.systab->runtime, f, args)
      46                 :            : 
      47                 :            : struct efi_runtime_work efi_rts_work;
      48                 :            : 
      49                 :            : /*
      50                 :            :  * efi_queue_work:      Queue efi_runtime_service() and wait until it's done
      51                 :            :  * @rts:                efi_runtime_service() function identifier
      52                 :            :  * @rts_arg<1-5>: efi_runtime_service() function arguments
      53                 :            :  *
      54                 :            :  * Accesses to efi_runtime_services() are serialized by a binary
      55                 :            :  * semaphore (efi_runtime_lock) and caller waits until the work is
      56                 :            :  * finished, hence _only_ one work is queued at a time and the caller
      57                 :            :  * thread waits for completion.
      58                 :            :  */
      59                 :            : #define efi_queue_work(_rts, _arg1, _arg2, _arg3, _arg4, _arg5)         \
      60                 :            : ({                                                                      \
      61                 :            :         efi_rts_work.status = EFI_ABORTED;                              \
      62                 :            :                                                                         \
      63                 :            :         if (!efi_enabled(EFI_RUNTIME_SERVICES)) {                       \
      64                 :            :                 pr_warn_once("EFI Runtime Services are disabled!\n"); \
      65                 :            :                 goto exit;                                              \
      66                 :            :         }                                                               \
      67                 :            :                                                                         \
      68                 :            :         init_completion(&efi_rts_work.efi_rts_comp);                        \
      69                 :            :         INIT_WORK(&efi_rts_work.work, efi_call_rts);                        \
      70                 :            :         efi_rts_work.arg1 = _arg1;                                      \
      71                 :            :         efi_rts_work.arg2 = _arg2;                                      \
      72                 :            :         efi_rts_work.arg3 = _arg3;                                      \
      73                 :            :         efi_rts_work.arg4 = _arg4;                                      \
      74                 :            :         efi_rts_work.arg5 = _arg5;                                      \
      75                 :            :         efi_rts_work.efi_rts_id = _rts;                                 \
      76                 :            :                                                                         \
      77                 :            :         /*                                                              \
      78                 :            :          * queue_work() returns 0 if work was already on queue,         \
      79                 :            :          * _ideally_ this should never happen.                          \
      80                 :            :          */                                                             \
      81                 :            :         if (queue_work(efi_rts_wq, &efi_rts_work.work))                     \
      82                 :            :                 wait_for_completion(&efi_rts_work.efi_rts_comp);    \
      83                 :            :         else                                                            \
      84                 :            :                 pr_err("Failed to queue work to efi_rts_wq.\n");      \
      85                 :            :                                                                         \
      86                 :            : exit:                                                                   \
      87                 :            :         efi_rts_work.efi_rts_id = EFI_NONE;                             \
      88                 :            :         efi_rts_work.status;                                            \
      89                 :            : })
      90                 :            : 
      91                 :            : #ifndef arch_efi_save_flags
      92                 :            : #define arch_efi_save_flags(state_flags)        local_save_flags(state_flags)
      93                 :            : #define arch_efi_restore_flags(state_flags)     local_irq_restore(state_flags)
      94                 :            : #endif
      95                 :            : 
      96                 :          0 : unsigned long efi_call_virt_save_flags(void)
      97                 :            : {
      98                 :          0 :         unsigned long flags;
      99                 :            : 
     100                 :          0 :         arch_efi_save_flags(flags);
     101                 :          0 :         return flags;
     102                 :            : }
     103                 :            : 
     104                 :          0 : void efi_call_virt_check_flags(unsigned long flags, const char *call)
     105                 :            : {
     106                 :          0 :         unsigned long cur_flags, mismatch;
     107                 :            : 
     108                 :          0 :         cur_flags = efi_call_virt_save_flags();
     109                 :            : 
     110                 :          0 :         mismatch = flags ^ cur_flags;
     111   [ #  #  #  # ]:          0 :         if (!WARN_ON_ONCE(mismatch & ARCH_EFI_IRQ_FLAGS_MASK))
     112                 :            :                 return;
     113                 :            : 
     114                 :          0 :         add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_NOW_UNRELIABLE);
     115         [ #  # ]:          0 :         pr_err_ratelimited(FW_BUG "IRQ flags corrupted (0x%08lx=>0x%08lx) by EFI %s\n",
     116                 :            :                            flags, cur_flags, call);
     117                 :          0 :         arch_efi_restore_flags(flags);
     118                 :            : }
     119                 :            : 
     120                 :            : /*
     121                 :            :  * According to section 7.1 of the UEFI spec, Runtime Services are not fully
     122                 :            :  * reentrant, and there are particular combinations of calls that need to be
     123                 :            :  * serialized. (source: UEFI Specification v2.4A)
     124                 :            :  *
     125                 :            :  * Table 31. Rules for Reentry Into Runtime Services
     126                 :            :  * +------------------------------------+-------------------------------+
     127                 :            :  * | If previous call is busy in        | Forbidden to call             |
     128                 :            :  * +------------------------------------+-------------------------------+
     129                 :            :  * | Any                                | SetVirtualAddressMap()        |
     130                 :            :  * +------------------------------------+-------------------------------+
     131                 :            :  * | ConvertPointer()                   | ConvertPointer()              |
     132                 :            :  * +------------------------------------+-------------------------------+
     133                 :            :  * | SetVariable()                      | ResetSystem()                 |
     134                 :            :  * | UpdateCapsule()                    |                               |
     135                 :            :  * | SetTime()                          |                               |
     136                 :            :  * | SetWakeupTime()                    |                               |
     137                 :            :  * | GetNextHighMonotonicCount()        |                               |
     138                 :            :  * +------------------------------------+-------------------------------+
     139                 :            :  * | GetVariable()                      | GetVariable()                 |
     140                 :            :  * | GetNextVariableName()              | GetNextVariableName()         |
     141                 :            :  * | SetVariable()                      | SetVariable()                 |
     142                 :            :  * | QueryVariableInfo()                | QueryVariableInfo()           |
     143                 :            :  * | UpdateCapsule()                    | UpdateCapsule()               |
     144                 :            :  * | QueryCapsuleCapabilities()         | QueryCapsuleCapabilities()    |
     145                 :            :  * | GetNextHighMonotonicCount()        | GetNextHighMonotonicCount()   |
     146                 :            :  * +------------------------------------+-------------------------------+
     147                 :            :  * | GetTime()                          | GetTime()                     |
     148                 :            :  * | SetTime()                          | SetTime()                     |
     149                 :            :  * | GetWakeupTime()                    | GetWakeupTime()               |
     150                 :            :  * | SetWakeupTime()                    | SetWakeupTime()               |
     151                 :            :  * +------------------------------------+-------------------------------+
     152                 :            :  *
     153                 :            :  * Due to the fact that the EFI pstore may write to the variable store in
     154                 :            :  * interrupt context, we need to use a lock for at least the groups that
     155                 :            :  * contain SetVariable() and QueryVariableInfo(). That leaves little else, as
     156                 :            :  * none of the remaining functions are actually ever called at runtime.
     157                 :            :  * So let's just use a single lock to serialize all Runtime Services calls.
     158                 :            :  */
     159                 :            : static DEFINE_SEMAPHORE(efi_runtime_lock);
     160                 :            : 
     161                 :            : /*
     162                 :            :  * Expose the EFI runtime lock to the UV platform
     163                 :            :  */
     164                 :            : #ifdef CONFIG_X86_UV
     165                 :            : extern struct semaphore __efi_uv_runtime_lock __alias(efi_runtime_lock);
     166                 :            : #endif
     167                 :            : 
     168                 :            : /*
     169                 :            :  * Calls the appropriate efi_runtime_service() with the appropriate
     170                 :            :  * arguments.
     171                 :            :  *
     172                 :            :  * Semantics followed by efi_call_rts() to understand efi_runtime_work:
     173                 :            :  * 1. If argument was a pointer, recast it from void pointer to original
     174                 :            :  * pointer type.
     175                 :            :  * 2. If argument was a value, recast it from void pointer to original
     176                 :            :  * pointer type and dereference it.
     177                 :            :  */
     178                 :          0 : static void efi_call_rts(struct work_struct *work)
     179                 :            : {
     180                 :          0 :         void *arg1, *arg2, *arg3, *arg4, *arg5;
     181                 :          0 :         efi_status_t status = EFI_NOT_FOUND;
     182                 :            : 
     183                 :          0 :         arg1 = efi_rts_work.arg1;
     184                 :          0 :         arg2 = efi_rts_work.arg2;
     185                 :          0 :         arg3 = efi_rts_work.arg3;
     186                 :          0 :         arg4 = efi_rts_work.arg4;
     187                 :          0 :         arg5 = efi_rts_work.arg5;
     188                 :            : 
     189   [ #  #  #  #  :          0 :         switch (efi_rts_work.efi_rts_id) {
          #  #  #  #  #  
                #  #  # ]
     190                 :          0 :         case EFI_GET_TIME:
     191                 :          0 :                 status = efi_call_virt(get_time, (efi_time_t *)arg1,
     192                 :            :                                        (efi_time_cap_t *)arg2);
     193                 :          0 :                 break;
     194                 :          0 :         case EFI_SET_TIME:
     195                 :          0 :                 status = efi_call_virt(set_time, (efi_time_t *)arg1);
     196                 :          0 :                 break;
     197                 :          0 :         case EFI_GET_WAKEUP_TIME:
     198                 :          0 :                 status = efi_call_virt(get_wakeup_time, (efi_bool_t *)arg1,
     199                 :            :                                        (efi_bool_t *)arg2, (efi_time_t *)arg3);
     200                 :          0 :                 break;
     201                 :          0 :         case EFI_SET_WAKEUP_TIME:
     202                 :          0 :                 status = efi_call_virt(set_wakeup_time, *(efi_bool_t *)arg1,
     203                 :            :                                        (efi_time_t *)arg2);
     204                 :          0 :                 break;
     205                 :          0 :         case EFI_GET_VARIABLE:
     206                 :          0 :                 status = efi_call_virt(get_variable, (efi_char16_t *)arg1,
     207                 :            :                                        (efi_guid_t *)arg2, (u32 *)arg3,
     208                 :            :                                        (unsigned long *)arg4, (void *)arg5);
     209                 :          0 :                 break;
     210                 :          0 :         case EFI_GET_NEXT_VARIABLE:
     211                 :          0 :                 status = efi_call_virt(get_next_variable, (unsigned long *)arg1,
     212                 :            :                                        (efi_char16_t *)arg2,
     213                 :            :                                        (efi_guid_t *)arg3);
     214                 :          0 :                 break;
     215                 :          0 :         case EFI_SET_VARIABLE:
     216                 :          0 :                 status = efi_call_virt(set_variable, (efi_char16_t *)arg1,
     217                 :            :                                        (efi_guid_t *)arg2, *(u32 *)arg3,
     218                 :            :                                        *(unsigned long *)arg4, (void *)arg5);
     219                 :          0 :                 break;
     220                 :          0 :         case EFI_QUERY_VARIABLE_INFO:
     221                 :          0 :                 status = efi_call_virt(query_variable_info, *(u32 *)arg1,
     222                 :            :                                        (u64 *)arg2, (u64 *)arg3, (u64 *)arg4);
     223                 :          0 :                 break;
     224                 :          0 :         case EFI_GET_NEXT_HIGH_MONO_COUNT:
     225                 :          0 :                 status = efi_call_virt(get_next_high_mono_count, (u32 *)arg1);
     226                 :          0 :                 break;
     227                 :          0 :         case EFI_UPDATE_CAPSULE:
     228                 :          0 :                 status = efi_call_virt(update_capsule,
     229                 :            :                                        (efi_capsule_header_t **)arg1,
     230                 :            :                                        *(unsigned long *)arg2,
     231                 :            :                                        *(unsigned long *)arg3);
     232                 :          0 :                 break;
     233                 :          0 :         case EFI_QUERY_CAPSULE_CAPS:
     234                 :          0 :                 status = efi_call_virt(query_capsule_caps,
     235                 :            :                                        (efi_capsule_header_t **)arg1,
     236                 :            :                                        *(unsigned long *)arg2, (u64 *)arg3,
     237                 :            :                                        (int *)arg4);
     238                 :          0 :                 break;
     239                 :          0 :         default:
     240                 :            :                 /*
     241                 :            :                  * Ideally, we should never reach here because a caller of this
     242                 :            :                  * function should have put the right efi_runtime_service()
     243                 :            :                  * function identifier into efi_rts_work->efi_rts_id
     244                 :            :                  */
     245                 :          0 :                 pr_err("Requested executing invalid EFI Runtime Service.\n");
     246                 :            :         }
     247                 :          0 :         efi_rts_work.status = status;
     248                 :          0 :         complete(&efi_rts_work.efi_rts_comp);
     249                 :          0 : }
     250                 :            : 
     251                 :          0 : static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
     252                 :            : {
     253                 :          0 :         efi_status_t status;
     254                 :            : 
     255         [ #  # ]:          0 :         if (down_interruptible(&efi_runtime_lock))
     256                 :            :                 return EFI_ABORTED;
     257   [ #  #  #  #  :          0 :         status = efi_queue_work(EFI_GET_TIME, tm, tc, NULL, NULL, NULL);
                   #  # ]
     258                 :          0 :         up(&efi_runtime_lock);
     259                 :          0 :         return status;
     260                 :            : }
     261                 :            : 
     262                 :          0 : static efi_status_t virt_efi_set_time(efi_time_t *tm)
     263                 :            : {
     264                 :          0 :         efi_status_t status;
     265                 :            : 
     266         [ #  # ]:          0 :         if (down_interruptible(&efi_runtime_lock))
     267                 :            :                 return EFI_ABORTED;
     268   [ #  #  #  #  :          0 :         status = efi_queue_work(EFI_SET_TIME, tm, NULL, NULL, NULL, NULL);
                   #  # ]
     269                 :          0 :         up(&efi_runtime_lock);
     270                 :          0 :         return status;
     271                 :            : }
     272                 :            : 
     273                 :          0 : static efi_status_t virt_efi_get_wakeup_time(efi_bool_t *enabled,
     274                 :            :                                              efi_bool_t *pending,
     275                 :            :                                              efi_time_t *tm)
     276                 :            : {
     277                 :          0 :         efi_status_t status;
     278                 :            : 
     279         [ #  # ]:          0 :         if (down_interruptible(&efi_runtime_lock))
     280                 :            :                 return EFI_ABORTED;
     281   [ #  #  #  #  :          0 :         status = efi_queue_work(EFI_GET_WAKEUP_TIME, enabled, pending, tm, NULL,
                   #  # ]
     282                 :            :                                 NULL);
     283                 :          0 :         up(&efi_runtime_lock);
     284                 :          0 :         return status;
     285                 :            : }
     286                 :            : 
     287                 :          0 : static efi_status_t virt_efi_set_wakeup_time(efi_bool_t enabled, efi_time_t *tm)
     288                 :            : {
     289                 :          0 :         efi_status_t status;
     290                 :            : 
     291         [ #  # ]:          0 :         if (down_interruptible(&efi_runtime_lock))
     292                 :            :                 return EFI_ABORTED;
     293   [ #  #  #  #  :          0 :         status = efi_queue_work(EFI_SET_WAKEUP_TIME, &enabled, tm, NULL, NULL,
                   #  # ]
     294                 :            :                                 NULL);
     295                 :          0 :         up(&efi_runtime_lock);
     296                 :          0 :         return status;
     297                 :            : }
     298                 :            : 
     299                 :          0 : static efi_status_t virt_efi_get_variable(efi_char16_t *name,
     300                 :            :                                           efi_guid_t *vendor,
     301                 :            :                                           u32 *attr,
     302                 :            :                                           unsigned long *data_size,
     303                 :            :                                           void *data)
     304                 :            : {
     305                 :          0 :         efi_status_t status;
     306                 :            : 
     307         [ #  # ]:          0 :         if (down_interruptible(&efi_runtime_lock))
     308                 :            :                 return EFI_ABORTED;
     309   [ #  #  #  #  :          0 :         status = efi_queue_work(EFI_GET_VARIABLE, name, vendor, attr, data_size,
                   #  # ]
     310                 :            :                                 data);
     311                 :          0 :         up(&efi_runtime_lock);
     312                 :          0 :         return status;
     313                 :            : }
     314                 :            : 
     315                 :          0 : static efi_status_t virt_efi_get_next_variable(unsigned long *name_size,
     316                 :            :                                                efi_char16_t *name,
     317                 :            :                                                efi_guid_t *vendor)
     318                 :            : {
     319                 :          0 :         efi_status_t status;
     320                 :            : 
     321         [ #  # ]:          0 :         if (down_interruptible(&efi_runtime_lock))
     322                 :            :                 return EFI_ABORTED;
     323   [ #  #  #  #  :          0 :         status = efi_queue_work(EFI_GET_NEXT_VARIABLE, name_size, name, vendor,
                   #  # ]
     324                 :            :                                 NULL, NULL);
     325                 :          0 :         up(&efi_runtime_lock);
     326                 :          0 :         return status;
     327                 :            : }
     328                 :            : 
     329                 :          0 : static efi_status_t virt_efi_set_variable(efi_char16_t *name,
     330                 :            :                                           efi_guid_t *vendor,
     331                 :            :                                           u32 attr,
     332                 :            :                                           unsigned long data_size,
     333                 :            :                                           void *data)
     334                 :            : {
     335                 :          0 :         efi_status_t status;
     336                 :            : 
     337         [ #  # ]:          0 :         if (down_interruptible(&efi_runtime_lock))
     338                 :            :                 return EFI_ABORTED;
     339   [ #  #  #  #  :          0 :         status = efi_queue_work(EFI_SET_VARIABLE, name, vendor, &attr, &data_size,
                   #  # ]
     340                 :            :                                 data);
     341                 :          0 :         up(&efi_runtime_lock);
     342                 :          0 :         return status;
     343                 :            : }
     344                 :            : 
     345                 :            : static efi_status_t
     346                 :          0 : virt_efi_set_variable_nonblocking(efi_char16_t *name, efi_guid_t *vendor,
     347                 :            :                                   u32 attr, unsigned long data_size,
     348                 :            :                                   void *data)
     349                 :            : {
     350                 :          0 :         efi_status_t status;
     351                 :            : 
     352         [ #  # ]:          0 :         if (down_trylock(&efi_runtime_lock))
     353                 :            :                 return EFI_NOT_READY;
     354                 :            : 
     355                 :          0 :         status = efi_call_virt(set_variable, name, vendor, attr, data_size,
     356                 :            :                                data);
     357                 :          0 :         up(&efi_runtime_lock);
     358                 :          0 :         return status;
     359                 :            : }
     360                 :            : 
     361                 :            : 
     362                 :          0 : static efi_status_t virt_efi_query_variable_info(u32 attr,
     363                 :            :                                                  u64 *storage_space,
     364                 :            :                                                  u64 *remaining_space,
     365                 :            :                                                  u64 *max_variable_size)
     366                 :            : {
     367                 :          0 :         efi_status_t status;
     368                 :            : 
     369         [ #  # ]:          0 :         if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
     370                 :            :                 return EFI_UNSUPPORTED;
     371                 :            : 
     372         [ #  # ]:          0 :         if (down_interruptible(&efi_runtime_lock))
     373                 :            :                 return EFI_ABORTED;
     374   [ #  #  #  #  :          0 :         status = efi_queue_work(EFI_QUERY_VARIABLE_INFO, &attr, storage_space,
                   #  # ]
     375                 :            :                                 remaining_space, max_variable_size, NULL);
     376                 :          0 :         up(&efi_runtime_lock);
     377                 :          0 :         return status;
     378                 :            : }
     379                 :            : 
     380                 :            : static efi_status_t
     381                 :          0 : virt_efi_query_variable_info_nonblocking(u32 attr,
     382                 :            :                                          u64 *storage_space,
     383                 :            :                                          u64 *remaining_space,
     384                 :            :                                          u64 *max_variable_size)
     385                 :            : {
     386                 :          0 :         efi_status_t status;
     387                 :            : 
     388         [ #  # ]:          0 :         if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
     389                 :            :                 return EFI_UNSUPPORTED;
     390                 :            : 
     391         [ #  # ]:          0 :         if (down_trylock(&efi_runtime_lock))
     392                 :            :                 return EFI_NOT_READY;
     393                 :            : 
     394                 :          0 :         status = efi_call_virt(query_variable_info, attr, storage_space,
     395                 :            :                                remaining_space, max_variable_size);
     396                 :          0 :         up(&efi_runtime_lock);
     397                 :          0 :         return status;
     398                 :            : }
     399                 :            : 
     400                 :          0 : static efi_status_t virt_efi_get_next_high_mono_count(u32 *count)
     401                 :            : {
     402                 :          0 :         efi_status_t status;
     403                 :            : 
     404         [ #  # ]:          0 :         if (down_interruptible(&efi_runtime_lock))
     405                 :            :                 return EFI_ABORTED;
     406   [ #  #  #  #  :          0 :         status = efi_queue_work(EFI_GET_NEXT_HIGH_MONO_COUNT, count, NULL, NULL,
                   #  # ]
     407                 :            :                                 NULL, NULL);
     408                 :          0 :         up(&efi_runtime_lock);
     409                 :          0 :         return status;
     410                 :            : }
     411                 :            : 
     412                 :          0 : static void virt_efi_reset_system(int reset_type,
     413                 :            :                                   efi_status_t status,
     414                 :            :                                   unsigned long data_size,
     415                 :            :                                   efi_char16_t *data)
     416                 :            : {
     417         [ #  # ]:          0 :         if (down_interruptible(&efi_runtime_lock)) {
     418                 :          0 :                 pr_warn("failed to invoke the reset_system() runtime service:\n"
     419                 :            :                         "could not get exclusive access to the firmware\n");
     420                 :          0 :                 return;
     421                 :            :         }
     422                 :          0 :         efi_rts_work.efi_rts_id = EFI_RESET_SYSTEM;
     423                 :          0 :         __efi_call_virt(reset_system, reset_type, status, data_size, data);
     424                 :          0 :         up(&efi_runtime_lock);
     425                 :            : }
     426                 :            : 
     427                 :          0 : static efi_status_t virt_efi_update_capsule(efi_capsule_header_t **capsules,
     428                 :            :                                             unsigned long count,
     429                 :            :                                             unsigned long sg_list)
     430                 :            : {
     431                 :          0 :         efi_status_t status;
     432                 :            : 
     433         [ #  # ]:          0 :         if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
     434                 :            :                 return EFI_UNSUPPORTED;
     435                 :            : 
     436         [ #  # ]:          0 :         if (down_interruptible(&efi_runtime_lock))
     437                 :            :                 return EFI_ABORTED;
     438   [ #  #  #  #  :          0 :         status = efi_queue_work(EFI_UPDATE_CAPSULE, capsules, &count, &sg_list,
                   #  # ]
     439                 :            :                                 NULL, NULL);
     440                 :          0 :         up(&efi_runtime_lock);
     441                 :          0 :         return status;
     442                 :            : }
     443                 :            : 
     444                 :          0 : static efi_status_t virt_efi_query_capsule_caps(efi_capsule_header_t **capsules,
     445                 :            :                                                 unsigned long count,
     446                 :            :                                                 u64 *max_size,
     447                 :            :                                                 int *reset_type)
     448                 :            : {
     449                 :          0 :         efi_status_t status;
     450                 :            : 
     451         [ #  # ]:          0 :         if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
     452                 :            :                 return EFI_UNSUPPORTED;
     453                 :            : 
     454         [ #  # ]:          0 :         if (down_interruptible(&efi_runtime_lock))
     455                 :            :                 return EFI_ABORTED;
     456   [ #  #  #  #  :          0 :         status = efi_queue_work(EFI_QUERY_CAPSULE_CAPS, capsules, &count,
                   #  # ]
     457                 :            :                                 max_size, reset_type, NULL);
     458                 :          0 :         up(&efi_runtime_lock);
     459                 :          0 :         return status;
     460                 :            : }
     461                 :            : 
     462                 :          0 : void efi_native_runtime_setup(void)
     463                 :            : {
     464                 :          0 :         efi.get_time = virt_efi_get_time;
     465                 :          0 :         efi.set_time = virt_efi_set_time;
     466                 :          0 :         efi.get_wakeup_time = virt_efi_get_wakeup_time;
     467                 :          0 :         efi.set_wakeup_time = virt_efi_set_wakeup_time;
     468                 :          0 :         efi.get_variable = virt_efi_get_variable;
     469                 :          0 :         efi.get_next_variable = virt_efi_get_next_variable;
     470                 :          0 :         efi.set_variable = virt_efi_set_variable;
     471                 :          0 :         efi.set_variable_nonblocking = virt_efi_set_variable_nonblocking;
     472                 :          0 :         efi.get_next_high_mono_count = virt_efi_get_next_high_mono_count;
     473                 :          0 :         efi.reset_system = virt_efi_reset_system;
     474                 :          0 :         efi.query_variable_info = virt_efi_query_variable_info;
     475                 :          0 :         efi.query_variable_info_nonblocking = virt_efi_query_variable_info_nonblocking;
     476                 :          0 :         efi.update_capsule = virt_efi_update_capsule;
     477                 :          0 :         efi.query_capsule_caps = virt_efi_query_capsule_caps;
     478                 :          0 : }

Generated by: LCOV version 1.14