diff options
Diffstat (limited to 'os')
| -rw-r--r-- | os/ports/RVCT/ARMCMx/chcore_v6m.h | 9 | ||||
| -rw-r--r-- | os/ports/RVCT/ARMCMx/chcore_v7m.h | 11 | 
2 files changed, 19 insertions, 1 deletions
diff --git a/os/ports/RVCT/ARMCMx/chcore_v6m.h b/os/ports/RVCT/ARMCMx/chcore_v6m.h index 970fc3b8d..9c5e35b33 100644 --- a/os/ports/RVCT/ARMCMx/chcore_v6m.h +++ b/os/ports/RVCT/ARMCMx/chcore_v6m.h @@ -208,7 +208,16 @@ struct intctx {   * @param[in] ntp       the thread to be switched in
   * @param[in] otp       the thread to be switched out
   */
 +#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__)
  #define port_switch(ntp, otp) _port_switch(ntp, otp)
 +#else
 +#define port_switch(ntp, otp) {                                             \
 +  struct intctx *r13 = (struct intctx *)__current_sp();                     \
 +  if ((void *)(r13 - 1) < (void *)(otp + 1))                                \
 +    chDbgPanic("stack overflow");                                           \
 +  _port_switch(ntp, otp);                                                   \
 +}
 +#endif
  #ifdef __cplusplus
  extern "C" {
 diff --git a/os/ports/RVCT/ARMCMx/chcore_v7m.h b/os/ports/RVCT/ARMCMx/chcore_v7m.h index 45f9843e3..3a4cbe381 100644 --- a/os/ports/RVCT/ARMCMx/chcore_v7m.h +++ b/os/ports/RVCT/ARMCMx/chcore_v7m.h @@ -234,7 +234,16 @@ struct intctx {   * @param[in] ntp       the thread to be switched in
   * @param[in] otp       the thread to be switched out
   */
 -#define port_switch(ntp, otp)  _port_switch(ntp, otp)
 +#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__)
 +#define port_switch(ntp, otp) _port_switch(ntp, otp)
 +#else
 +#define port_switch(ntp, otp) {                                             \
 +  struct intctx *r13 = (struct intctx *)__current_sp();                     \
 +  if ((void *)(r13 - 1) < (void *)(otp + 1))                                \
 +    chDbgPanic("stack overflow");                                           \
 +  _port_switch(ntp, otp);                                                   \
 +}
 +#endif
  #ifdef __cplusplus
  extern "C" {
  | 
