summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/x86/memcpy.c8
-rw-r--r--src/arch/x86/memmove.c8
-rw-r--r--src/arch/x86/memset.c7
-rw-r--r--src/include/asan.h2
-rw-r--r--src/lib/asan.c2
5 files changed, 26 insertions, 1 deletions
diff --git a/src/arch/x86/memcpy.c b/src/arch/x86/memcpy.c
index 2f23219de5..1cfdf89175 100644
--- a/src/arch/x86/memcpy.c
+++ b/src/arch/x86/memcpy.c
@@ -1,11 +1,19 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <string.h>
+#include <stdbool.h>
+#include <asan.h>
void *memcpy(void *dest, const void *src, size_t n)
{
unsigned long d0, d1, d2;
+#if (ENV_ROMSTAGE && CONFIG(ASAN_IN_ROMSTAGE)) || \
+ (ENV_RAMSTAGE && CONFIG(ASAN_IN_RAMSTAGE))
+ check_memory_region((unsigned long)src, n, false, _RET_IP_);
+ check_memory_region((unsigned long)dest, n, true, _RET_IP_);
+#endif
+
asm volatile(
#ifdef __x86_64__
"rep ; movsd\n\t"
diff --git a/src/arch/x86/memmove.c b/src/arch/x86/memmove.c
index cdd1e8dc70..3ec50b26ae 100644
--- a/src/arch/x86/memmove.c
+++ b/src/arch/x86/memmove.c
@@ -4,12 +4,20 @@
*/
#include <string.h>
+#include <stdbool.h>
+#include <asan.h>
void *memmove(void *dest, const void *src, size_t n)
{
int d0, d1, d2, d3, d4, d5;
char *ret = dest;
+#if (ENV_ROMSTAGE && CONFIG(ASAN_IN_ROMSTAGE)) || \
+ (ENV_RAMSTAGE && CONFIG(ASAN_IN_RAMSTAGE))
+ check_memory_region((unsigned long)src, n, false, _RET_IP_);
+ check_memory_region((unsigned long)dest, n, true, _RET_IP_);
+#endif
+
__asm__ __volatile__(
/* Handle more 16bytes in loop */
"cmp $0x10, %0\n\t"
diff --git a/src/arch/x86/memset.c b/src/arch/x86/memset.c
index 17963426c0..fc09a9bd52 100644
--- a/src/arch/x86/memset.c
+++ b/src/arch/x86/memset.c
@@ -4,6 +4,8 @@
#include <string.h>
#include <stdint.h>
+#include <stdbool.h>
+#include <asan.h>
typedef uint32_t op_t;
@@ -12,6 +14,11 @@ void *memset(void *dstpp, int c, size_t len)
int d0;
unsigned long int dstp = (unsigned long int) dstpp;
+#if (ENV_ROMSTAGE && CONFIG(ASAN_IN_ROMSTAGE)) || \
+ (ENV_RAMSTAGE && CONFIG(ASAN_IN_RAMSTAGE))
+ check_memory_region((unsigned long)dstpp, len, true, _RET_IP_);
+#endif
+
/* This explicit register allocation improves code very much indeed. */
register op_t x asm("ax");
diff --git a/src/include/asan.h b/src/include/asan.h
index 8816eafbf4..1fe798d97f 100644
--- a/src/include/asan.h
+++ b/src/include/asan.h
@@ -57,6 +57,8 @@ void asan_unpoison_shadow(const void *address, size_t size);
void asan_report(unsigned long addr, size_t size, bool is_write,
unsigned long ip);
void asan_init(void);
+void check_memory_region(unsigned long addr, size_t size, bool write,
+ unsigned long ret_ip);
uintptr_t __asan_shadow_offset(uintptr_t addr);
void __asan_register_globals(struct asan_global *globals, size_t size);
diff --git a/src/lib/asan.c b/src/lib/asan.c
index 11dbf7c657..6de0de1409 100644
--- a/src/lib/asan.c
+++ b/src/lib/asan.c
@@ -260,7 +260,7 @@ static __always_inline void check_memory_region_inline(unsigned long addr,
asan_report(addr, size, write, ret_ip);
}
-static void check_memory_region(unsigned long addr, size_t size, bool write,
+void check_memory_region(unsigned long addr, size_t size, bool write,
unsigned long ret_ip)
{
check_memory_region_inline(addr, size, write, ret_ip);