blob: e3791180243c4ce0d09c46beaf8516f12b9f840c [file] [log] [blame]
<!--
Documentation/_templates/layout.html
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership. The
ASF licenses this file to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance with the
License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
-->
<!DOCTYPE html>
<html class="writer-html5" lang="en">
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Stack Overflow Check &mdash; NuttX latest documentation</title>
<link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../_static/css/theme.css" />
<link rel="stylesheet" type="text/css" href="../_static/copybutton.css" />
<link rel="stylesheet" type="text/css" href="../_static/sphinx_collapse.css" />
<link rel="stylesheet" type="text/css" href="../_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css" />
<link rel="stylesheet" type="text/css" href="../_static/custom.css" />
<link rel="shortcut icon" href="../_static/favicon.ico"/>
<script src="../_static/jquery.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<script src="../_static/clipboard.min.js"></script>
<script src="../_static/copybutton.js"></script>
<script src="../_static/design-tabs.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Run time stack statistics" href="stackrecord.html" />
<link rel="prev" title="Coresight - HW Assisted Tracing on ARM" href="coresight.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html" class="icon icon-home"> NuttX
</a>
<!-- this version selector is quite ugly, should be probably replaced by something
more modern -->
<div class="version-selector">
<select onchange="javascript:location.href = this.value;">
<option value="../../latest" selected="selected">latest</option>
<option value="../../10.0.0" >10.0.0</option>
<option value="../../10.0.1" >10.0.1</option>
<option value="../../10.1.0" >10.1.0</option>
<option value="../../10.2.0" >10.2.0</option>
<option value="../../10.3.0" >10.3.0</option>
<option value="../../11.0.0" >11.0.0</option>
<option value="../../12.0.0" >12.0.0</option>
<option value="../../12.1.0" >12.1.0</option>
<option value="../../12.2.0" >12.2.0</option>
<option value="../../12.2.1" >12.2.1</option>
<option value="../../12.3.0" >12.3.0</option>
<option value="../../12.4.0" >12.4.0</option>
<option value="../../12.5.0" >12.5.0</option>
<option value="../../12.5.1" >12.5.1</option>
<option value="../../12.6.0" >12.6.0</option>
<option value="../../12.7.0" >12.7.0</option>
<option value="../../12.8.0" >12.8.0</option>
<option value="../../12.9.0" >12.9.0</option>
<option value="../../12.10.0" >12.10.0</option>
<option value="../../12.11.0" >12.11.0</option>
</select>
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../index.html">Home</a></li>
<li class="toctree-l1"><a class="reference internal" href="../introduction/index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../quickstart/index.html">Getting Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../contributing/index.html">Contributing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../introduction/inviolables.html">The Inviolable Principles of NuttX</a></li>
<li class="toctree-l1"><a class="reference internal" href="../platforms/index.html">Supported Platforms</a></li>
<li class="toctree-l1"><a class="reference internal" href="../components/index.html">OS Components</a></li>
<li class="toctree-l1"><a class="reference internal" href="../applications/index.html">Applications</a></li>
<li class="toctree-l1"><a class="reference internal" href="../implementation/index.html">Implementation Details</a></li>
<li class="toctree-l1"><a class="reference internal" href="../reference/index.html">API Reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../faq/index.html">FAQ</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="index.html">Debugging</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="gdbwithpython.html">GDB with Python</a></li>
<li class="toctree-l2"><a class="reference internal" href="qemugdb.html">How to debug NuttX using QEMU and GDB</a></li>
<li class="toctree-l2"><a class="reference internal" href="gdbserver.html">gdbserver</a></li>
<li class="toctree-l2"><a class="reference internal" href="debugging_elf_loadable_modules.html">Debugging ELF Loadable Modules</a></li>
<li class="toctree-l2"><a class="reference internal" href="tasktrace.html">Task Trace</a></li>
<li class="toctree-l2"><a class="reference internal" href="kasan.html">The Kernel Address Sanitizer (KASAN)</a></li>
<li class="toctree-l2"><a class="reference internal" href="coredump.html">Core Dump</a></li>
<li class="toctree-l2"><a class="reference internal" href="coresight.html">Coresight - HW Assisted Tracing on ARM</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Stack Overflow Check</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#overview">Overview</a></li>
<li class="toctree-l3"><a class="reference internal" href="#support">Support</a></li>
<li class="toctree-l3"><a class="reference internal" href="#stack-overflow-software-check-during-function-call">Stack Overflow Software Check During Function Call</a></li>
<li class="toctree-l3"><a class="reference internal" href="#stack-overflow-software-check-during-context-switching">Stack Overflow Software Check During Context Switching</a></li>
<li class="toctree-l3"><a class="reference internal" href="#stack-overflow-hardware-check">Stack Overflow Hardware Check</a></li>
<li class="toctree-l3"><a class="reference internal" href="#stack-canary-check">Stack Canary Check</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="stackrecord.html">Run time stack statistics</a></li>
<li class="toctree-l2"><a class="reference internal" href="disabling_stackdumpdebug.html">Disabling the Stack Dump During Debugging</a></li>
<li class="toctree-l2"><a class="reference internal" href="debuggingflash_nuttxonarm.html">Debugging / flashing NuttX on ARM with hardware debugger (JTAG/SWD)</a></li>
<li class="toctree-l2"><a class="reference internal" href="cortexmhardfaults.html">Analyzing Cortex-M Hardfaults</a></li>
<li class="toctree-l2"><a class="reference internal" href="mte.html">ATM64 MTE extension</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../guides/index.html">Guides</a></li>
<li class="toctree-l1"><a class="reference internal" href="../standards/index.html">Standards</a></li>
<li class="toctree-l1"><a class="reference internal" href="../glossary.html">Glossary</a></li>
<li class="toctree-l1"><a class="reference internal" href="../logos/index.html">NuttX Logos</a></li>
<li class="toctree-l1"><a class="reference internal" href="../_tags/tagsindex.html">Tags</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">NuttX</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="index.html">Debugging</a></li>
<li class="breadcrumb-item active">Stack Overflow Check</li>
<li class="wy-breadcrumbs-aside">
<a href="https://github.com/apache/nuttx/blob/master/Documentation/debugging/stackcheck.rst" class="fa fa-github"> Edit on GitHub</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="stack-overflow-check">
<h1>Stack Overflow Check<a class="headerlink" href="#stack-overflow-check" title="Permalink to this heading"></a></h1>
<section id="overview">
<h2>Overview<a class="headerlink" href="#overview" title="Permalink to this heading"></a></h2>
<dl class="simple">
<dt>Currently NuttX supports three types of stack overflow detection:</dt><dd><ol class="arabic simple">
<li><p>Stack Overflow Software Check During Function Call</p></li>
<li><p>Stack Overflow Software Check During Context Switching</p></li>
<li><p>Stack Overflow Hardware Check</p></li>
<li><p>Stack Canary Check</p></li>
</ol>
</dd>
<dt>The software stack detection during function call includes two implementation ideas:</dt><dd><ol class="arabic simple">
<li><p>Implemented by coloring the stack memory</p></li>
<li><p>Implemented by comparing the sp and sl registers</p></li>
</ol>
</dd>
<dt>The software stack detection during context switching includes two implementation ideas:</dt><dd><ol class="arabic simple">
<li><p>Implemented by coloring the stack memory</p></li>
<li><p>Implemented by checking the bottom memory of the stack and the sp register</p></li>
</ol>
</dd>
</dl>
</section>
<section id="support">
<h2>Support<a class="headerlink" href="#support" title="Permalink to this heading"></a></h2>
<p>Software and hardware stack overflow detection implementation,
currently only implemented on ARM Cortex-M (32-bit) series chips
Stack Canary Check is available on all platforms</p>
</section>
<section id="stack-overflow-software-check-during-function-call">
<h2>Stack Overflow Software Check During Function Call<a class="headerlink" href="#stack-overflow-software-check-during-function-call" title="Permalink to this heading"></a></h2>
<ol class="arabic">
<li><dl>
<dt>Memory Coloring Implementation Principle</dt><dd><ol class="arabic simple">
<li><p>Before using the stack, Thread will refresh the stack area to 0xdeadbeef</p></li>
<li><p>When Thread is running, it will overwrite 0xdeadbeef</p></li>
<li><p>up_check_tcbstack() detects 0xdeadbeef to get the stack peak value</p></li>
</ol>
<dl class="simple">
<dt>Usage:</dt><dd><p>Enable CONFIG_STACK_COLORATION</p>
</dd>
</dl>
</dd>
</dl>
</li>
<li><dl>
<dt>Compare sp and sl</dt><dd><p>When compiling the program, keep r10 and use r10 as stackbase::
‘’’
ARCHOPTIMIZATION += -finstrument-functions -ffixed-r10</p>
<p>Each function will automatically add the following when entering and exiting:
__cyg_profile_func_enter
__cyg_profile_func_exit</p>
<dl class="simple">
<dt>Usage:</dt><dd><p>Enable CONFIG_ARMV8M_STACKCHECK or CONFIG_ARMV7M_STACKCHECK</p>
</dd>
</dl>
</dd>
</dl>
</li>
</ol>
</section>
<section id="stack-overflow-software-check-during-context-switching">
<h2>Stack Overflow Software Check During Context Switching<a class="headerlink" href="#stack-overflow-software-check-during-context-switching" title="Permalink to this heading"></a></h2>
<ol class="arabic simple">
<li><p>Determine by detecting the number of bytes specified at the bottom of the stack.</p></li>
<li><p>Check if the sp register is out of bounds.</p></li>
</ol>
<dl class="simple">
<dt>Usage:</dt><dd><p>Set the detection length by STACKCHECK_MARGIN</p>
</dd>
</dl>
</section>
<section id="stack-overflow-hardware-check">
<h2>Stack Overflow Hardware Check<a class="headerlink" href="#stack-overflow-hardware-check" title="Permalink to this heading"></a></h2>
<ol class="arabic simple">
<li><p>Set MSPLIM PSPLIM when context switching</p></li>
<li><p>Each time sp is operated, the hardware automatically compares sp and PSPLIM. If sp is lower than PSPLIM, crash</p></li>
</ol>
<dl class="simple">
<dt>Usage:</dt><dd><p>Enable CONFIG_ARMV8M_STACKCHECK_HARDWARE</p>
</dd>
</dl>
</section>
<section id="stack-canary-check">
<h2>Stack Canary Check<a class="headerlink" href="#stack-canary-check" title="Permalink to this heading"></a></h2>
<ol class="arabic simple">
<li><p>Add a canary value to the stack</p></li>
<li><p>When the thread is running, the canary value is overwritten</p></li>
<li><p>When the thread is running, the canary value is compared with the original value</p></li>
<li><p>If the value is different, it means that the stack is overflowed</p></li>
</ol>
<dl class="simple">
<dt>Usage:</dt><dd><p>Enable CONFIG_STACK_CANARIES</p>
</dd>
</dl>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="coresight.html" class="btn btn-neutral float-left" title="Coresight - HW Assisted Tracing on ARM" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="stackrecord.html" class="btn btn-neutral float-right" title="Run time stack statistics" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2023, The Apache Software Foundation.</p>
</div>
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>