xref: /rk3399_ARM-atf/lib/stack_protector/stack_protector.c (revision 82cb2c1ad9897473743f08437d0a3995bed561b9)
151faada7SDouglas Raillard /*
251faada7SDouglas Raillard  * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
351faada7SDouglas Raillard  *
4*82cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
551faada7SDouglas Raillard  */
651faada7SDouglas Raillard #include <debug.h>
751faada7SDouglas Raillard #include <platform.h>
851faada7SDouglas Raillard #include <stdint.h>
951faada7SDouglas Raillard 
1051faada7SDouglas Raillard /*
1151faada7SDouglas Raillard  * Canary value used by the compiler runtime checks to detect stack corruption.
1251faada7SDouglas Raillard  *
1351faada7SDouglas Raillard  * Force the canary to be in .data to allow predictable memory layout relatively
1451faada7SDouglas Raillard  * to the stacks.
1551faada7SDouglas Raillard  */
1651faada7SDouglas Raillard u_register_t  __attribute__((section(".data.stack_protector_canary")))
1751faada7SDouglas Raillard 	__stack_chk_guard = (u_register_t) 3288484550995823360ULL;
1851faada7SDouglas Raillard 
1951faada7SDouglas Raillard /*
2051faada7SDouglas Raillard  * Function called when the stack's canary check fails, which means the stack
2151faada7SDouglas Raillard  * was corrupted. It must not return.
2251faada7SDouglas Raillard  */
2351faada7SDouglas Raillard void __dead2 __stack_chk_fail(void)
2451faada7SDouglas Raillard {
2551faada7SDouglas Raillard #if DEBUG
2651faada7SDouglas Raillard 	ERROR("Stack corruption detected\n");
2751faada7SDouglas Raillard #endif
2851faada7SDouglas Raillard 	panic();
2951faada7SDouglas Raillard }
3051faada7SDouglas Raillard 
31