forked from thesofproject/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
arm64: efi: Force the use of SetVirtualAddressMap() on Altra machines
Ampere Altra machines are reported to misbehave when the SetTime() EFI runtime service is called after ExitBootServices() but before calling SetVirtualAddressMap(). Given that the latter is horrid, pointless and explicitly documented as optional by the EFI spec, we no longer invoke it at boot if the configured size of the VA space guarantees that the EFI runtime memory regions can remain mapped 1:1 like they are at boot time. On Ampere Altra machines, this results in SetTime() calls issued by the rtc-efi driver triggering synchronous exceptions during boot. We can now recover from those without bringing down the system entirely, due to commit 23715a2 ("arm64: efi: Recover from synchronous exceptions occurring in firmware"). However, it would be better to avoid the issue entirely, given that the firmware appears to remain in a funny state after this. So attempt to identify these machines based on the 'family' field in the type #1 SMBIOS record, and call SetVirtualAddressMap() unconditionally in that case. Tested-by: Alexandru Elisei <alexandru.elisei@gmail.com> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
- Loading branch information
1 parent
23715a2
commit 550b33c
Showing
5 changed files
with
94 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
// Copyright 2022 Google LLC | ||
// Author: Ard Biesheuvel <ardb@google.com> | ||
|
||
#include <linux/efi.h> | ||
|
||
#include "efistub.h" | ||
|
||
typedef struct efi_smbios_protocol efi_smbios_protocol_t; | ||
|
||
struct efi_smbios_protocol { | ||
efi_status_t (__efiapi *add)(efi_smbios_protocol_t *, efi_handle_t, | ||
u16 *, struct efi_smbios_record *); | ||
efi_status_t (__efiapi *update_string)(efi_smbios_protocol_t *, u16 *, | ||
unsigned long *, u8 *); | ||
efi_status_t (__efiapi *remove)(efi_smbios_protocol_t *, u16); | ||
efi_status_t (__efiapi *get_next)(efi_smbios_protocol_t *, u16 *, u8 *, | ||
struct efi_smbios_record **, | ||
efi_handle_t *); | ||
|
||
u8 major_version; | ||
u8 minor_version; | ||
}; | ||
|
||
const u8 *__efi_get_smbios_string(u8 type, int offset, int recsize) | ||
{ | ||
struct efi_smbios_record *record; | ||
efi_smbios_protocol_t *smbios; | ||
efi_status_t status; | ||
u16 handle = 0xfffe; | ||
const u8 *strtable; | ||
|
||
status = efi_bs_call(locate_protocol, &EFI_SMBIOS_PROTOCOL_GUID, NULL, | ||
(void **)&smbios) ?: | ||
efi_call_proto(smbios, get_next, &handle, &type, &record, NULL); | ||
if (status != EFI_SUCCESS) | ||
return NULL; | ||
|
||
strtable = (u8 *)record + recsize; | ||
for (int i = 1; i < ((u8 *)record)[offset]; i++) { | ||
int len = strlen(strtable); | ||
|
||
if (!len) | ||
return NULL; | ||
strtable += len + 1; | ||
} | ||
return strtable; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters