xref: /rk3399_ARM-atf/plat/arm/board/juno/juno_stack_protector.c (revision 174551d5984a7d54bb11ddb30603805180ea3696)
1e6d2aea1Sdp-arm /*
2e6d2aea1Sdp-arm  * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
3e6d2aea1Sdp-arm  *
482cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
5e6d2aea1Sdp-arm  */
6e6d2aea1Sdp-arm 
7e6d2aea1Sdp-arm #include <arch_helpers.h>
809d40e0eSAntonio Nino Diaz #include <common/debug.h>
909d40e0eSAntonio Nino Diaz #include <lib/utils.h>
10*cb5f0faaSAndre Przywara #include <plat/common/plat_trng.h>
11234bc7f8SAntonio Nino Diaz #include <platform_def.h>
1209d40e0eSAntonio Nino Diaz 
plat_get_stack_protector_canary(void)13e6d2aea1Sdp-arm u_register_t plat_get_stack_protector_canary(void)
14e6d2aea1Sdp-arm {
15543f0d8bSAndre Przywara 	uint64_t entropy;
16e6d2aea1Sdp-arm 
17*cb5f0faaSAndre Przywara 	if (!plat_get_entropy(&entropy)) {
18e6d2aea1Sdp-arm 		ERROR("Not enough entropy to initialize canary value\n");
19e6d2aea1Sdp-arm 		panic();
20e6d2aea1Sdp-arm 	}
21e6d2aea1Sdp-arm 
22543f0d8bSAndre Przywara 	if (sizeof(entropy) == sizeof(u_register_t)) {
23543f0d8bSAndre Przywara 		return entropy;
24543f0d8bSAndre Przywara 	}
25543f0d8bSAndre Przywara 
26543f0d8bSAndre Przywara 	return (entropy & 0xffffffffULL) ^ (entropy >> 32);
27e6d2aea1Sdp-arm }
28