From 8494bd1ced5bed6f1960abda0e4c01df9dc56fd0 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Fri, 10 Jun 2022 15:29:39 +0200 Subject: [PATCH] boot: Use memcpy/memset provided by firmware These are significantly faster and safe us from rolling our own optimized versions. --- src/boot/efi/efi-string.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/boot/efi/efi-string.c b/src/boot/efi/efi-string.c index f5b671c7be..b8c576b8f0 100644 --- a/src/boot/efi/efi-string.c +++ b/src/boot/efi/efi-string.c @@ -263,6 +263,16 @@ void *efi_memcpy(void * restrict dest, const void * restrict src, size_t n) { if (!dest || !src || n == 0) return dest; +#ifdef SD_BOOT + /* The firmware-provided memcpy is likely optimized, so use that. The function is guaranteed to be + * available by the UEFI spec. We still make it depend on the boot services pointer being set just in + * case the compiler emits a call before it is available. */ + if (_likely_(BS)) { + BS->CopyMem(dest, (void *) src, n); + return dest; + } +#endif + uint8_t *d = dest; const uint8_t *s = src; @@ -280,6 +290,14 @@ void *efi_memset(void *p, int c, size_t n) { if (!p || n == 0) return p; +#ifdef SD_BOOT + /* See comment in efi_memcpy. Note that the signature has c and n swapped! */ + if (_likely_(BS)) { + BS->SetMem(p, n, c); + return p; + } +#endif + uint8_t *q = p; while (n > 0) { *q = c;