xref: /rk3399_ARM-atf/lib/stack_protector/stack_protector.c (revision 72e8f2456af54b75a0a1d92aadfce0b4bcde6ba1)
151faada7SDouglas Raillard /*
2*4c700c15SGovindraj Raja  * Copyright (c) 2017, Arm Limited and Contributors. All rights reserved.
351faada7SDouglas Raillard  *
482cb2c1aSdp-arm  * SPDX-License-Identifier: BSD-3-Clause
551faada7SDouglas Raillard  */
609d40e0eSAntonio Nino Diaz 
751faada7SDouglas Raillard #include <stdint.h>
851faada7SDouglas Raillard 
909d40e0eSAntonio Nino Diaz #include <common/debug.h>
1009d40e0eSAntonio Nino Diaz #include <plat/common/platform.h>
1109d40e0eSAntonio 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  */
__stack_chk_fail(void)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