Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/firmware/efi/libstub/intrinsics.c
26483 views
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
76