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