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 Raillardvoid __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