1 // SPDX-License-Identifier: GPL-2.0 2 3 #include <linux/efi.h> 4 #include <asm/efi.h> 5 #include <asm/string.h> 6 7 #include "efistub.h" 8 9 #ifdef CONFIG_KASAN 10 #undef memcpy 11 #undef memmove 12 #undef memset 13 void *__memcpy(void *__dest, const void *__src, size_t __n) __alias(memcpy); 14 void *__memmove(void *__dest, const void *__src, size_t count) __alias(memmove); 15 void *__memset(void *s, int c, size_t count) __alias(memset); 16 #endif 17 18 static void *efistub_memmove(u8 *dst, const u8 *src, size_t len) 19 { 20 if (src > dst || dst >= (src + len)) 21 for (size_t i = 0; i < len; i++) 22 dst[i] = src[i]; 23 else 24 for (ssize_t i = len - 1; i >= 0; i--) 25 dst[i] = src[i]; 26 27 return dst; 28 } 29 30 static void *efistub_memset(void *dst, int c, size_t len) 31 { 32 for (u8 *d = dst; len--; d++) 33 *d = c; 34 35 return dst; 36 } 37 38 void *memcpy(void *dst, const void *src, size_t len) 39 { 40 if (efi_table_attr(efi_system_table, boottime) == NULL) 41 return efistub_memmove(dst, src, len); 42 43 efi_bs_call(copy_mem, dst, src, len); 44 return dst; 45 } 46 47 extern void *memmove(void *dst, const void *src, size_t len) __alias(memcpy); 48 49 void *memset(void *dst, int c, size_t len) 50 { 51 if (efi_table_attr(efi_system_table, boottime) == NULL) 52 return efistub_memset(dst, c, len); 53 54 efi_bs_call(set_mem, dst, len, c & U8_MAX); 55 return dst; 56 } 57 58 /** 59 * memcmp - Compare two areas of memory 60 * @cs: One area of memory 61 * @ct: Another area of memory 62 * @count: The size of the area. 63 */ 64 #undef memcmp 65 int memcmp(const void *cs, const void *ct, size_t count) 66 { 67 const unsigned char *su1, *su2; 68 int res = 0; 69 70 for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--) 71 if ((res = *su1 - *su2) != 0) 72 break; 73 return res; 74 } 75