adi_v5: enforce check on AP number value
The AP number value is restricted in 8 bits unsigned by ADI-v5 specification. Nevertheless, an "invalid" value is used by target cortex-m to force an automatic detection of the AP. Replace magic numbers by using new macros for AP max number and for the value of AP invalid. Check the value passed through -ap-num flag during configuration. Change-Id: Ic19a367db0ab11c0ebd070750eca0647d25279a5 Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: http://openocd.zylin.com/4668 Tested-by: jenkins Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>
This commit is contained in:
parent
2a3b709aa5
commit
11019a824d
|
@ -793,7 +793,7 @@ int dap_find_ap(struct adiv5_dap *dap, enum ap_type type_to_find, struct adiv5_a
|
||||||
int ap_num;
|
int ap_num;
|
||||||
|
|
||||||
/* Maximum AP number is 255 since the SELECT register is 8 bits */
|
/* Maximum AP number is 255 since the SELECT register is 8 bits */
|
||||||
for (ap_num = 0; ap_num <= 255; ap_num++) {
|
for (ap_num = 0; ap_num <= DP_APSEL_MAX; ap_num++) {
|
||||||
|
|
||||||
/* read the IDR register of the Access Port */
|
/* read the IDR register of the Access Port */
|
||||||
uint32_t id_val = 0;
|
uint32_t id_val = 0;
|
||||||
|
@ -1429,7 +1429,7 @@ int adiv5_jim_configure(struct target *target, Jim_GetOptInfo *goi)
|
||||||
pc = (struct adiv5_private_config *)target->private_config;
|
pc = (struct adiv5_private_config *)target->private_config;
|
||||||
if (pc == NULL) {
|
if (pc == NULL) {
|
||||||
pc = calloc(1, sizeof(struct adiv5_private_config));
|
pc = calloc(1, sizeof(struct adiv5_private_config));
|
||||||
pc->ap_num = -1;
|
pc->ap_num = DP_APSEL_INVALID;
|
||||||
target->private_config = pc;
|
target->private_config = pc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1498,6 +1498,10 @@ int adiv5_jim_configure(struct target *target, Jim_GetOptInfo *goi)
|
||||||
e = Jim_GetOpt_Wide(goi, &ap_num);
|
e = Jim_GetOpt_Wide(goi, &ap_num);
|
||||||
if (e != JIM_OK)
|
if (e != JIM_OK)
|
||||||
return e;
|
return e;
|
||||||
|
if (ap_num < 0 || ap_num > DP_APSEL_MAX) {
|
||||||
|
Jim_SetResultString(goi->interp, "Invalid AP number!", -1);
|
||||||
|
return JIM_ERR;
|
||||||
|
}
|
||||||
pc->ap_num = ap_num;
|
pc->ap_num = ap_num;
|
||||||
} else {
|
} else {
|
||||||
if (goi->argc != 0) {
|
if (goi->argc != 0) {
|
||||||
|
@ -1507,7 +1511,7 @@ int adiv5_jim_configure(struct target *target, Jim_GetOptInfo *goi)
|
||||||
return JIM_ERR;
|
return JIM_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pc->ap_num < 0) {
|
if (pc->ap_num == DP_APSEL_INVALID) {
|
||||||
Jim_SetResultString(goi->interp, "AP number not configured", -1);
|
Jim_SetResultString(goi->interp, "AP number not configured", -1);
|
||||||
return JIM_ERR;
|
return JIM_ERR;
|
||||||
}
|
}
|
||||||
|
@ -1543,7 +1547,7 @@ COMMAND_HANDLER(handle_dap_info_command)
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
|
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
|
||||||
if (apsel >= 256)
|
if (apsel > DP_APSEL_MAX)
|
||||||
return ERROR_COMMAND_SYNTAX_ERROR;
|
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1566,7 +1570,7 @@ COMMAND_HANDLER(dap_baseaddr_command)
|
||||||
case 1:
|
case 1:
|
||||||
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
|
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
|
||||||
/* AP address is in bits 31:24 of DP_SELECT */
|
/* AP address is in bits 31:24 of DP_SELECT */
|
||||||
if (apsel >= 256)
|
if (apsel > DP_APSEL_MAX)
|
||||||
return ERROR_COMMAND_SYNTAX_ERROR;
|
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1625,7 +1629,7 @@ COMMAND_HANDLER(dap_apsel_command)
|
||||||
case 1:
|
case 1:
|
||||||
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
|
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
|
||||||
/* AP address is in bits 31:24 of DP_SELECT */
|
/* AP address is in bits 31:24 of DP_SELECT */
|
||||||
if (apsel >= 256)
|
if (apsel > DP_APSEL_MAX)
|
||||||
return ERROR_COMMAND_SYNTAX_ERROR;
|
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1691,7 +1695,7 @@ COMMAND_HANDLER(dap_apid_command)
|
||||||
case 1:
|
case 1:
|
||||||
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
|
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
|
||||||
/* AP address is in bits 31:24 of DP_SELECT */
|
/* AP address is in bits 31:24 of DP_SELECT */
|
||||||
if (apsel >= 256)
|
if (apsel > DP_APSEL_MAX)
|
||||||
return ERROR_COMMAND_SYNTAX_ERROR;
|
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1722,7 +1726,7 @@ COMMAND_HANDLER(dap_apreg_command)
|
||||||
|
|
||||||
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
|
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
|
||||||
/* AP address is in bits 31:24 of DP_SELECT */
|
/* AP address is in bits 31:24 of DP_SELECT */
|
||||||
if (apsel >= 256)
|
if (apsel > DP_APSEL_MAX)
|
||||||
return ERROR_COMMAND_SYNTAX_ERROR;
|
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||||
ap = dap_ap(dap, apsel);
|
ap = dap_ap(dap, apsel);
|
||||||
|
|
||||||
|
|
|
@ -136,6 +136,9 @@
|
||||||
#define DP_SELECT_DPBANK 0x0000000F
|
#define DP_SELECT_DPBANK 0x0000000F
|
||||||
#define DP_SELECT_INVALID 0x00FFFF00 /* Reserved bits one */
|
#define DP_SELECT_INVALID 0x00FFFF00 /* Reserved bits one */
|
||||||
|
|
||||||
|
#define DP_APSEL_MAX (255)
|
||||||
|
#define DP_APSEL_INVALID (-1)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This represents an ARM Debug Interface (v5) Access Port (AP).
|
* This represents an ARM Debug Interface (v5) Access Port (AP).
|
||||||
* Most common is a MEM-AP, for memory access.
|
* Most common is a MEM-AP, for memory access.
|
||||||
|
|
|
@ -431,6 +431,10 @@ static int cti_configure(Jim_GetOptInfo *goi, struct arm_cti_object *cti)
|
||||||
e = Jim_GetOpt_Wide(goi, &w);
|
e = Jim_GetOpt_Wide(goi, &w);
|
||||||
if (e != JIM_OK)
|
if (e != JIM_OK)
|
||||||
return e;
|
return e;
|
||||||
|
if (w < 0 || w > DP_APSEL_MAX) {
|
||||||
|
Jim_SetResultString(goi->interp, "-ap-num is invalid", -1);
|
||||||
|
return JIM_ERR;
|
||||||
|
}
|
||||||
cti->ap_num = (uint32_t)w;
|
cti->ap_num = (uint32_t)w;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@ static void dap_instance_init(struct adiv5_dap *dap)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
/* Set up with safe defaults */
|
/* Set up with safe defaults */
|
||||||
for (i = 0; i <= 255; i++) {
|
for (i = 0; i <= DP_APSEL_MAX; i++) {
|
||||||
dap->ap[i].dap = dap;
|
dap->ap[i].dap = dap;
|
||||||
dap->ap[i].ap_num = i;
|
dap->ap[i].ap_num = i;
|
||||||
/* memaccess_tck max is 255 */
|
/* memaccess_tck max is 255 */
|
||||||
|
@ -319,7 +319,7 @@ COMMAND_HANDLER(handle_dap_info_command)
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
|
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
|
||||||
if (apsel >= 256)
|
if (apsel > DP_APSEL_MAX)
|
||||||
return ERROR_COMMAND_SYNTAX_ERROR;
|
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -1986,7 +1986,7 @@ int cortex_m_examine(struct target *target)
|
||||||
/* stlink shares the examine handler but does not support
|
/* stlink shares the examine handler but does not support
|
||||||
* all its calls */
|
* all its calls */
|
||||||
if (!armv7m->stlink) {
|
if (!armv7m->stlink) {
|
||||||
if (cortex_m->apsel < 0) {
|
if (cortex_m->apsel == DP_APSEL_INVALID) {
|
||||||
/* Search for the MEM-AP */
|
/* Search for the MEM-AP */
|
||||||
retval = dap_find_ap(swjdp, AP_TYPE_AHB_AP, &armv7m->debug_ap);
|
retval = dap_find_ap(swjdp, AP_TYPE_AHB_AP, &armv7m->debug_ap);
|
||||||
if (retval != ERROR_OK) {
|
if (retval != ERROR_OK) {
|
||||||
|
|
Loading…
Reference in New Issue