Fix dm->current_hartid corruption on hartsellen discovery (#754)
* target/riscv Fix dm->current_hartid corruption on hartsellen discovery Change-Id: Iec969df2675b608365eda2c3a83a4185752430f2 Signed-off-by: Charles Papon <charles.papon.90@gmail.com> * target/riscv Ensure HART_INDEX_DIRTY does not have side effects Change-Id: Ie89c94d97cd4f15c1be0327fddff75beea6ae027 Signed-off-by: Charles Papon <charles.papon.90@gmail.com> Signed-off-by: Charles Papon <charles.papon.90@gmail.com>
This commit is contained in:
parent
cdadb2040b
commit
70980e7f57
|
@ -130,6 +130,7 @@ typedef enum {
|
||||||
} yes_no_maybe_t;
|
} yes_no_maybe_t;
|
||||||
|
|
||||||
#define HART_INDEX_MULTIPLE -1
|
#define HART_INDEX_MULTIPLE -1
|
||||||
|
#define HART_INDEX_UNKNOWN -2
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
|
@ -284,6 +285,8 @@ dm013_info_t *get_dm(struct target *target)
|
||||||
|
|
||||||
static uint32_t set_dmcontrol_hartsel(uint32_t initial, int hart_index)
|
static uint32_t set_dmcontrol_hartsel(uint32_t initial, int hart_index)
|
||||||
{
|
{
|
||||||
|
assert(hart_index != HART_INDEX_UNKNOWN);
|
||||||
|
|
||||||
if (hart_index >= 0) {
|
if (hart_index >= 0) {
|
||||||
initial = set_field(initial, DM_DMCONTROL_HASEL, DM_DMCONTROL_HASEL_SINGLE);
|
initial = set_field(initial, DM_DMCONTROL_HASEL, DM_DMCONTROL_HASEL_SINGLE);
|
||||||
uint32_t index_lo = hart_index & ((1 << DM_DMCONTROL_HARTSELLO_LENGTH) - 1);
|
uint32_t index_lo = hart_index & ((1 << DM_DMCONTROL_HARTSELLO_LENGTH) - 1);
|
||||||
|
@ -1599,9 +1602,14 @@ static int examine(struct target *target)
|
||||||
dmi_write(target, DM_DMCONTROL, DM_DMCONTROL_HARTSELLO |
|
dmi_write(target, DM_DMCONTROL, DM_DMCONTROL_HARTSELLO |
|
||||||
DM_DMCONTROL_HARTSELHI | DM_DMCONTROL_DMACTIVE |
|
DM_DMCONTROL_HARTSELHI | DM_DMCONTROL_DMACTIVE |
|
||||||
DM_DMCONTROL_HASEL);
|
DM_DMCONTROL_HASEL);
|
||||||
|
dm->current_hartid = HART_INDEX_UNKNOWN;
|
||||||
uint32_t dmcontrol;
|
uint32_t dmcontrol;
|
||||||
if (dmi_read(target, &dmcontrol, DM_DMCONTROL) != ERROR_OK)
|
if (dmi_read(target, &dmcontrol, DM_DMCONTROL) != ERROR_OK)
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
|
/* Ensure the HART_INDEX_UNKNOWN is flushed out */
|
||||||
|
if (dm013_select_hart(target, 0) != ERROR_OK)
|
||||||
|
return ERROR_FAIL;
|
||||||
|
|
||||||
|
|
||||||
if (!get_field(dmcontrol, DM_DMCONTROL_DMACTIVE)) {
|
if (!get_field(dmcontrol, DM_DMCONTROL_DMACTIVE)) {
|
||||||
LOG_ERROR("Debug Module did not become active. dmcontrol=0x%x",
|
LOG_ERROR("Debug Module did not become active. dmcontrol=0x%x",
|
||||||
|
@ -4139,7 +4147,7 @@ static int dm013_select_hart(struct target *target, int hart_index)
|
||||||
dmcontrol = set_dmcontrol_hartsel(dmcontrol, hart_index);
|
dmcontrol = set_dmcontrol_hartsel(dmcontrol, hart_index);
|
||||||
if (dmi_write(target, DM_DMCONTROL, dmcontrol) != ERROR_OK) {
|
if (dmi_write(target, DM_DMCONTROL, dmcontrol) != ERROR_OK) {
|
||||||
/* Who knows what the state is? */
|
/* Who knows what the state is? */
|
||||||
dm->current_hartid = -2;
|
dm->current_hartid = HART_INDEX_UNKNOWN;
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
dm->current_hartid = hart_index;
|
dm->current_hartid = hart_index;
|
||||||
|
|
Loading…
Reference in New Issue