This is an automated email from Gerrit. Matthias Blaicher ([email protected]) just uploaded a new patch set to Gerrit, which you can find at http://openocd.zylin.com/961
-- gerrit commit 75c6afbee75ed9d43738116f35435be2d4635e0a Author: Matthias Blaicher <[email protected]> Date: Mon Nov 5 09:44:22 2012 +0100 rtos: Add FPU detection to ChibiOS/RT The stacking of ChibiOS depends on the usage of an FPU. If the FPU is enabled the FPU registers are also saved on context switch. This patch adds automatic detection of FPU for armv7m targets. Note: With this patch, openocd will only output an error message warning that the FPU is enabled. For further FPU support, the correct stacking information also needs to be added. Change-Id: I0984cbd9180f247ba2fa610e74a6413cc54239ea Signed-off-by: Matthias Blaicher <[email protected]> diff --git a/src/rtos/ChibiOS.c b/src/rtos/ChibiOS.c index be5fe84..70203de 100644 --- a/src/rtos/ChibiOS.c +++ b/src/rtos/ChibiOS.c @@ -29,6 +29,7 @@ #include <jtag/jtag.h> #include "target/target.h" #include "target/target_type.h" +#include "target/armv7m.h" #include "rtos.h" #include "helper/log.h" #include "helper/types.h" @@ -94,12 +95,12 @@ struct ChibiOS_params ChibiOS_params_list[] = { { "cortex_m3", /* target_name */ 0, - &rtos_chibios_arm_v7m_stacking, /* stacking_info */ + NULL, /* stacking_info */ }, { "stm32_stlink", /* target_name */ 0, - &rtos_chibios_arm_v7m_stacking, /* stacking_info */ + NULL, /* stacking_info */ } }; #define CHIBIOS_NUM_PARAMS ((int)(sizeof(ChibiOS_params_list)/sizeof(struct ChibiOS_params))) @@ -219,8 +220,46 @@ static int ChibiOS_update_stacking(struct rtos *rtos) * available than the current execution. In which case * ChibiOS_get_thread_reg_list is called. */ + int retval; + + if (!rtos->rtos_specific_params) + return -1; + + struct ChibiOS_params *param; + param = (struct ChibiOS_params *) rtos->rtos_specific_params; + + /* Check for armv7m with *enabled* FPU, i.e. a Cortex M4 */ + struct armv7m_common *armv7m_target = target_to_armv7m(rtos->target); + if (is_armv7m(armv7m_target)) { + if (armv7m_target->fp_feature == FPv4_SP) { + /* Found ARM v7m target wich does included a FPU */ + const uint32_t cpacr_addr = 0xE000ED88; + const uint32_t cpacr; + + retval = target_read_buffer(rtos->target, cpacr_addr, sizeof(cpacr), + (uint8_t *)&cpacr); + if (retval != ERROR_OK) { + LOG_ERROR("Could not read CPACR register to check FPU state"); + return -1; + } + + /* Check if CP10 and CP11 are set to full access. + * In ChibiOS this is done in ResetHandler() in crt0.c */ + if (cpacr & 0x00F00000) { + LOG_DEBUG("The target FPU is enabled"); + + /* FIXME: Need to figure out how to specify the FPU registers */ + LOG_ERROR("ChibiOS ARM v7m targets with enabled FPU " + " are NOT supported"); + return -1; + } + } + + /* Found ARM v7m target with no or disabled FPU */ + param->stacking_info = &rtos_chibios_arm_v7m_stacking; + return 0; + } - /* TODO: Add actual detection, currently it will not work with FPU enabled.*/ return -1; } -- ------------------------------------------------------------------------------ LogMeIn Central: Instant, anywhere, Remote PC access and management. Stay in control, update software, and manage PCs from one command center Diagnose problems and improve visibility into emerging IT issues Automate, monitor and manage. Do more in less time with Central http://p.sf.net/sfu/logmein12331_d2d _______________________________________________ OpenOCD-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openocd-devel
