Added 'vector_catch' command to control trapped vectors on Cortex-M.

This commit is contained in:
Gareth McMullin 2012-06-25 21:19:09 +12:00
parent b0d41d155a
commit 0e768664ac
2 changed files with 52 additions and 1 deletions

View File

@ -5,6 +5,7 @@ VPATH += $(PLATFORM_DIR)
BUILDDATE := `date +"%Y%m%d"`
CFLAGS += -Wall -Wextra -Wno-pointer-sign -Wno-char-subscripts\
-Wno-sign-compare \
-O2 -std=gnu99 -g3 -DBUILDDATE=\"$(BUILDDATE)\"\
-I. -Iinclude -I$(PLATFORM_DIR) \
-DVERSION_SUFFIX=\"`../scripts/setlocalversion`\" -MD

View File

@ -29,14 +29,24 @@
* There are way too many magic numbers used here.
*/
#include <stdio.h>
#include <string.h>
#include "general.h"
#include "jtagtap.h"
#include "jtag_scan.h"
#include "adiv5.h"
#include "target.h"
#include "command.h"
#include "gdb_packet.h"
static char cortexm_driver_str[] = "ARM Cortex-M3";
static char cortexm_driver_str[] = "ARM Cortex-M";
static bool cortexm_vector_catch(target *t, int argc, char *argv[]);
const struct command_s cortexm_cmd_list[] = {
{"vector_catch", (cmd_handler)cortexm_vector_catch, "Catch exception vectors"},
{NULL, NULL, NULL}
};
/* target options recognised by the Cortex-M target */
#define TOPT_FLAVOUR_V6M (1<<0) /* if not set, target is assumed to be v7m */
@ -313,6 +323,8 @@ cortexm_probe(struct target_s *target)
target->fault_unwind = cortexm_fault_unwind;
target->regs_size = sizeof(regnum_cortex_m); /* XXX: detect FP extension */
target_add_commands(target, cortexm_cmd_list, cortexm_driver_str);
/* Probe for FP extension */
ADIv5_AP_t *ap = adiv5_target_ap(target);
uint32_t cpacr = adiv5_ap_mem_read(ap, CORTEXM_CPACR);
@ -737,3 +749,41 @@ cortexm_check_hw_wp(struct target_s *target, uint32_t *addr)
return 1;
}
static bool cortexm_vector_catch(target *t, int argc, char *argv[])
{
ADIv5_AP_t *ap = adiv5_target_ap(t);
const char *vectors[] = {"reset", NULL, NULL, NULL, "mm", "nocp",
"chk", "stat", "bus", "int", "hard"};
uint32_t demcr = adiv5_ap_mem_read(ap, CORTEXM_DEMCR);
uint32_t tmp = 0;
unsigned i, j;
if ((argc < 3) || ((argv[1][0] != 'e') && (argv[1][0] != 'd'))) {
gdb_out("usage: monitor vector_catch (enable|disable) "
"(hard|int|bus|stat|chk|nocp|mm|reset)\n");
} else {
for (j = 0; j < argc; j++)
for (i = 0; i < sizeof(vectors) / sizeof(char*); i++) {
if (vectors[i] && !strcmp(vectors[i], argv[j]))
tmp |= 1 << i;
}
if (argv[1][0] == 'e')
demcr |= tmp;
else
demcr &= ~tmp;
adiv5_ap_mem_write(ap, CORTEXM_DEMCR, demcr);
}
gdb_out("Catching vectors: ");
for (i = 0; i < sizeof(vectors) / sizeof(char*); i++) {
if (!vectors[i])
continue;
if (demcr & (1 << i))
gdb_outf("%s ", vectors[i]);
}
gdb_out("\n");
return true;
}