Skip to content

Commit

Permalink
efi/x86: Remove support for EFI time and counter services in mixed mode
Browse files Browse the repository at this point in the history
Mixed mode calls at runtime are rather tricky with vmap'ed stacks,
as we can no longer assume that data passed in by the callers of the
EFI runtime wrapper routines is contiguous in physical memory.

We need to fix this, but before we do, let's drop the implementations
of routines that we know are never used on x86, i.e., the RTC related
ones. Given that UEFI rev2.8 permits any runtime service to return
EFI_UNSUPPORTED at runtime, let's return that instead.

As get_next_high_mono_count() is never used at all, even on other
architectures, let's make that return EFI_UNSUPPORTED too.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: linux-efi@vger.kernel.org
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20200221084849.26878-3-ardb@kernel.org
  • Loading branch information
Ard Biesheuvel authored and Ingo Molnar committed Feb 26, 2020
1 parent 63056e8 commit f80c9f6
Showing 1 changed file with 5 additions and 76 deletions.
81 changes: 5 additions & 76 deletions arch/x86/platform/efi/efi_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -568,85 +568,25 @@ efi_thunk_set_virtual_address_map(unsigned long memory_map_size,

static efi_status_t efi_thunk_get_time(efi_time_t *tm, efi_time_cap_t *tc)
{
efi_status_t status;
u32 phys_tm, phys_tc;
unsigned long flags;

spin_lock(&rtc_lock);
spin_lock_irqsave(&efi_runtime_lock, flags);

phys_tm = virt_to_phys_or_null(tm);
phys_tc = virt_to_phys_or_null(tc);

status = efi_thunk(get_time, phys_tm, phys_tc);

spin_unlock_irqrestore(&efi_runtime_lock, flags);
spin_unlock(&rtc_lock);

return status;
return EFI_UNSUPPORTED;
}

static efi_status_t efi_thunk_set_time(efi_time_t *tm)
{
efi_status_t status;
u32 phys_tm;
unsigned long flags;

spin_lock(&rtc_lock);
spin_lock_irqsave(&efi_runtime_lock, flags);

phys_tm = virt_to_phys_or_null(tm);

status = efi_thunk(set_time, phys_tm);

spin_unlock_irqrestore(&efi_runtime_lock, flags);
spin_unlock(&rtc_lock);

return status;
return EFI_UNSUPPORTED;
}

static efi_status_t
efi_thunk_get_wakeup_time(efi_bool_t *enabled, efi_bool_t *pending,
efi_time_t *tm)
{
efi_status_t status;
u32 phys_enabled, phys_pending, phys_tm;
unsigned long flags;

spin_lock(&rtc_lock);
spin_lock_irqsave(&efi_runtime_lock, flags);

phys_enabled = virt_to_phys_or_null(enabled);
phys_pending = virt_to_phys_or_null(pending);
phys_tm = virt_to_phys_or_null(tm);

status = efi_thunk(get_wakeup_time, phys_enabled,
phys_pending, phys_tm);

spin_unlock_irqrestore(&efi_runtime_lock, flags);
spin_unlock(&rtc_lock);

return status;
return EFI_UNSUPPORTED;
}

static efi_status_t
efi_thunk_set_wakeup_time(efi_bool_t enabled, efi_time_t *tm)
{
efi_status_t status;
u32 phys_tm;
unsigned long flags;

spin_lock(&rtc_lock);
spin_lock_irqsave(&efi_runtime_lock, flags);

phys_tm = virt_to_phys_or_null(tm);

status = efi_thunk(set_wakeup_time, enabled, phys_tm);

spin_unlock_irqrestore(&efi_runtime_lock, flags);
spin_unlock(&rtc_lock);

return status;
return EFI_UNSUPPORTED;
}

static unsigned long efi_name_size(efi_char16_t *name)
Expand Down Expand Up @@ -770,18 +710,7 @@ efi_thunk_get_next_variable(unsigned long *name_size,
static efi_status_t
efi_thunk_get_next_high_mono_count(u32 *count)
{
efi_status_t status;
u32 phys_count;
unsigned long flags;

spin_lock_irqsave(&efi_runtime_lock, flags);

phys_count = virt_to_phys_or_null(count);
status = efi_thunk(get_next_high_mono_count, phys_count);

spin_unlock_irqrestore(&efi_runtime_lock, flags);

return status;
return EFI_UNSUPPORTED;
}

static void
Expand Down

0 comments on commit f80c9f6

Please sign in to comment.