blob: 3c3abd1aaab2ca0c3f47e0448ecf3c1afd481ab3 [file] [log] [blame]
Kumar Galad12d8af2016-10-05 12:01:54 -05001/*
2 * Copyright (c) 2012-2014 Wind River Systems, Inc.
3 *
David B. Kinderac74d8b2017-01-18 17:01:01 -08004 * SPDX-License-Identifier: Apache-2.0
Kumar Galad12d8af2016-10-05 12:01:54 -05005 */
6
7/**
8 * @file
9 * @brief Compiler stack protection (kernel part)
10 *
11 * This module provides functions to support compiler stack protection
12 * using canaries. This feature is enabled with configuration
13 * CONFIG_STACK_CANARIES=y.
14 *
15 * When this feature is enabled, the compiler generated code refers to
16 * function __stack_chk_fail and global variable __stack_chk_guard.
17 */
18
19#include <toolchain.h> /* compiler specific configurations */
20
Benjamin Walshf6ca7de2016-11-08 10:36:50 -050021#include <kernel_structs.h>
Kumar Galad12d8af2016-10-05 12:01:54 -050022#include <toolchain.h>
Anas Nashif397d29d2017-06-17 11:30:47 -040023#include <linker/sections.h>
Andrew Boiecdb94d62017-04-18 15:22:05 -070024#include <kernel.h>
Andrew Boie01100ea2019-02-21 15:02:22 -080025#include <app_memory/app_memdomain.h>
Kumar Galad12d8af2016-10-05 12:01:54 -050026
27/**
28 *
29 * @brief Stack canary error handler
30 *
31 * This function is invoked when a stack canary error is detected.
32 *
33 * @return Does not return
34 */
Kumar Galabc181592019-10-03 18:32:35 -050035void _StackCheckHandler(void)
Kumar Galad12d8af2016-10-05 12:01:54 -050036{
37 /* Stack canary error is a software fatal condition; treat it as such.
38 */
Andrew Boie71ce8ce2019-07-11 14:18:28 -070039 z_except_reason(K_ERR_STACK_CHK_FAIL);
Enjia Mai53ca7092021-01-15 17:09:58 +080040 CODE_UNREACHABLE; /* LCOV_EXCL_LINE */
Kumar Galad12d8af2016-10-05 12:01:54 -050041}
42
43/* Global variable */
44
45/*
46 * Symbol referenced by GCC compiler generated code for canary value.
Patrik Flykt4344e272019-03-08 14:19:05 -070047 * The canary value gets initialized in z_cstart().
Kumar Galad12d8af2016-10-05 12:01:54 -050048 */
Andrew Boie4ce652e2019-02-22 16:08:44 -080049#ifdef CONFIG_USERSPACE
Andrew Boie01100ea2019-02-21 15:02:22 -080050K_APP_DMEM(z_libc_partition) uintptr_t __stack_chk_guard;
51#else
52__noinit uintptr_t __stack_chk_guard;
53#endif
Kumar Galad12d8af2016-10-05 12:01:54 -050054
55/**
56 *
57 * @brief Referenced by GCC compiler generated code
58 *
59 * This routine is invoked when a stack canary error is detected, indicating
60 * a buffer overflow or stack corruption problem.
61 */
62FUNC_ALIAS(_StackCheckHandler, __stack_chk_fail, void);