This patch fixes calculations for the top of the interrupt and main stacks. Due to power of two alignment requirements for certain MPUs, the guard size must be taken into account due to the guard being counted against the initial stack size. Signed-off-by: Andy Gross <andy.gross@linaro.org>
61 lines
1.1 KiB
C
61 lines
1.1 KiB
C
/*
|
|
* Copyright (c) 2013-2014 Wind River Systems, Inc.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
* @brief Stack helpers for Cortex-M CPUs
|
|
*
|
|
* Stack helper functions.
|
|
*/
|
|
|
|
#ifndef _ARM_CORTEXM_STACK__H_
|
|
#define _ARM_CORTEXM_STACK__H_
|
|
|
|
#include <kernel_structs.h>
|
|
#include <asm_inline.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifdef _ASMLANGUAGE
|
|
|
|
/* nothing */
|
|
|
|
#else
|
|
|
|
extern K_THREAD_STACK_DEFINE(_interrupt_stack, CONFIG_ISR_STACK_SIZE);
|
|
|
|
/**
|
|
*
|
|
* @brief Setup interrupt stack
|
|
*
|
|
* On Cortex-M, the interrupt stack is registered in the MSP (main stack
|
|
* pointer) register, and switched to automatically when taking an exception.
|
|
*
|
|
* @return N/A
|
|
*/
|
|
static ALWAYS_INLINE void _InterruptStackSetup(void)
|
|
{
|
|
#ifdef CONFIG_MPU_REQUIRES_POWER_OF_TWO_ALIGNMENT
|
|
u32_t msp = (u32_t)(K_THREAD_STACK_BUFFER(_interrupt_stack) +
|
|
CONFIG_ISR_STACK_SIZE - MPU_GUARD_ALIGN_AND_SIZE);
|
|
#else
|
|
u32_t msp = (u32_t)(K_THREAD_STACK_BUFFER(_interrupt_stack) +
|
|
CONFIG_ISR_STACK_SIZE);
|
|
#endif
|
|
|
|
_MspSet(msp);
|
|
}
|
|
|
|
#endif /* _ASMLANGUAGE */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _ARM_CORTEXM_STACK__H_ */
|