xref: /arm-trusted-firmware/plat/rpi/common/rpi3_stack_protector.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2017-2019, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <stdint.h>
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #include <lib/utils.h>
10*91f16700Schasinglulu #include <lib/utils_def.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu #include <drivers/rpi3/rng/rpi3_rng.h>
13*91f16700Schasinglulu 
14*91f16700Schasinglulu /* Get 128 bits of entropy and fuse the values together to form the canary. */
15*91f16700Schasinglulu #define TRNG_NBYTES	16U
16*91f16700Schasinglulu 
17*91f16700Schasinglulu u_register_t plat_get_stack_protector_canary(void)
18*91f16700Schasinglulu {
19*91f16700Schasinglulu 	size_t i;
20*91f16700Schasinglulu 	u_register_t buf[TRNG_NBYTES / sizeof(u_register_t)];
21*91f16700Schasinglulu 	u_register_t ret = 0U;
22*91f16700Schasinglulu 
23*91f16700Schasinglulu 	rpi3_rng_read(buf, sizeof(buf));
24*91f16700Schasinglulu 
25*91f16700Schasinglulu 	for (i = 0U; i < ARRAY_SIZE(buf); i++)
26*91f16700Schasinglulu 		ret ^= buf[i];
27*91f16700Schasinglulu 
28*91f16700Schasinglulu 	return ret;
29*91f16700Schasinglulu }
30