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