xref: /optee_os/lib/libutils/ext/memzero_explicit.c (revision 7c8b181a013779b0f30d40580e4b00be63d1e91e)
1*7c8b181aSJerome Forissier // SPDX-License-Identifier: BSD-2-Clause
2*7c8b181aSJerome Forissier /*
3*7c8b181aSJerome Forissier  * Copyright (C) 2019 Linaro Limited
4*7c8b181aSJerome Forissier  */
5*7c8b181aSJerome Forissier 
6*7c8b181aSJerome Forissier #include <string.h>
7*7c8b181aSJerome Forissier #include <string_ext.h>
8*7c8b181aSJerome Forissier 
9*7c8b181aSJerome Forissier /*
10*7c8b181aSJerome Forissier  * This method prevents dead store elimination, which could happen in case
11*7c8b181aSJerome Forissier  * link-time optimization (LTO) is used.
12*7c8b181aSJerome Forissier  * See "Dead Store Elimination (Still) Considered Harmful" [1] section 3.3.3.
13*7c8b181aSJerome Forissier  *
14*7c8b181aSJerome Forissier  * [1]
15*7c8b181aSJerome Forissier  * http://www.usenix.org/system/files/conference/usenixsecurity17/sec17-yang.pdf
16*7c8b181aSJerome Forissier  */
17*7c8b181aSJerome Forissier static volatile void * (*memset_func)(void *, int, size_t) =
18*7c8b181aSJerome Forissier 	(volatile void * (*)(void *, int, size_t))&memset;
19*7c8b181aSJerome Forissier 
memzero_explicit(void * s,size_t count)20*7c8b181aSJerome Forissier void memzero_explicit(void *s, size_t count)
21*7c8b181aSJerome Forissier {
22*7c8b181aSJerome Forissier 	memset_func(s, 0, count);
23*7c8b181aSJerome Forissier }
24