Most of functions in src/bfin/bfin.c had two versions: part_foo and
chain_foo. The chain_foo did the same operations on all parts on the
chain. But we needed the assumption that all parts on the chain were
Blackfin processors/cores. Sometimes this assumption was not true so
we had some hacks to put those non-Blackfin parts in the bypass mode
and asked chain_foo to ignore those bypassed parts.
Recently I think it will be better and cleaner to just drop all
chain_* functions. The performance impact is little. The patch is
attached and committed.
Regards,
Jie
* include/urjtag/bfin.h (chain_scan_select): Remove declaration.
(DECLARE_CHAIN_DBGCTL_SET_BIT): Remove.
(DECLARE_CHAIN_DBGCTL_CLEAR_BIT): Remove.
(DECLARE_DBGCTL_BIT_OP): Don't use the above two.
(chain_dbgstat_get): Remove declaration.
(chain_emupc_get): Likewise.
(chain_dbgstat_clear_ovfs): Likewise.
(chain_check_emuready): Likewise.
(chain_wait_in_reset): Likewise.
(chain_wait_reset): Likewise.
(chain_register_get): Likewise.
(chain_register_set): Likewise.
(chain_register_set_same): Likewise.
(chain_emuir_set_same): Likewise.
(chain_emuir_set_same_2): Likewise.
(chain_emulation_enable): Likewise.
(chain_emulation_disable): Likewise.
(chain_emulation_trigger): Likewise.
(chain_emulation_return): Likewise.
(chain_emupc_reset): Likewise.
(bfin_core_reset): Add a new parameter.
(software_reset): Likewise.
(part_emupc_reset): Declare.
* src/cmd/cmd_bfin.c (cmd_bfin_run): Pass chain->active_part as
the second argument to software_reset and bfin_core_reset.
* src/bfin/bfin.c (part_is_bypassed): Remove.
(part_bypass): Remove.
(chain_scan_select_array): Remove.
(chain_scan_select): Remove.
(part_scan_select): Don't call part_is_bypassed.
(CHAIN_DBGCTL_CLEAR_OR_SET_BIT): Remove.
(CHAIN_DBGCTL_SET_BIT): Remove.
(CHAIN_DBGCTL_CLEAR_BIT): Remove.
(DBGCTL_BIT_OP): Don't use the above two.
(chain_dbgstat_get): Remove.
(chain_emupc_get): Remove.
(chain_dbgstat_clear_ovfs): Remove.
(chain_check_emuready): Remove.
(chain_wait_in_reset): Remove.
(chain_wait_reset): Remove.
(chain_emuir_set_same): Remove.
(part_emuir_set): Don't call part_is_bypassed.
(chain_emuir_set_same_2): Remove.
(part_emuir_set_2): Don't call part_is_bypassed.
(chain_register_get): Remove.
(chain_register_set_1): Remove.
(chain_register_set): Remove.
(chain_register_set_same): Remove.
(chain_emulation_enable): Remove.
(chain_emulation_disable): Remove.
(chain_emulation_trigger): Remove.
(chain_emulation_return): Remove.
(bfin_core_reset): Replace chain functions with part functions.
(software_reset): Pass new argument to bfin_core_reset.
(chain_emupc_reset): Remove.
(part_emupc_reset): New.
Index: include/urjtag/bfin.h
===================================================================
--- include/urjtag/bfin.h (revision 2006)
+++ include/urjtag/bfin.h (working copy)
@@ -192,7 +192,6 @@ void part_bypass (urj_chain_t *, int);
urj_tap_register_t *register_init_value (urj_tap_register_t *, uint64_t);
int part_scan_select (urj_chain_t *, int, int);
-int chain_scan_select (urj_chain_t *, int);
#define DECLARE_PART_DBGCTL_SET_BIT(name) \
void part_dbgctl_bit_set_##name (urj_chain_t *chain, int n);
@@ -203,18 +202,10 @@ int chain_scan_select (urj_chain_t *, in
#define DECLARE_PART_DBGCTL_IS(name) \
int part_dbgctl_is_##name (urj_chain_t *chain, int n);
-#define DECLARE_CHAIN_DBGCTL_SET_BIT(name) \
- void chain_dbgctl_bit_set_##name (urj_chain_t *chain);
-
-#define DECLARE_CHAIN_DBGCTL_CLEAR_BIT(name) \
- void chain_dbgctl_bit_clear_##name (urj_chain_t *chain);
-
#define DECLARE_DBGCTL_BIT_OP(name) \
DECLARE_PART_DBGCTL_SET_BIT(name) \
DECLARE_PART_DBGCTL_CLEAR_BIT(name) \
- DECLARE_PART_DBGCTL_IS(name) \
- DECLARE_CHAIN_DBGCTL_SET_BIT(name) \
- DECLARE_CHAIN_DBGCTL_CLEAR_BIT(name)
+ DECLARE_PART_DBGCTL_IS(name)
/* These functions check cached DBGSTAT. So before calling them,
chain_dbgstat_get or part_dbgstat_get has to be called to update cached
@@ -254,16 +245,10 @@ DECLARE_PART_DBGSTAT_BIT_IS (emudif)
DECLARE_PART_DBGSTAT_BIT_IS (emudof)
uint16_t part_dbgstat_emucause (urj_chain_t *, int);
-void chain_dbgstat_get (urj_chain_t *);
void part_dbgstat_get (urj_chain_t *, int);
-void chain_emupc_get (urj_chain_t *, int);
uint32_t part_emupc_get (urj_chain_t *, int, int);
-void chain_dbgstat_clear_ovfs (urj_chain_t *);
void part_dbgstat_clear_ovfs (urj_chain_t *, int);
-void chain_check_emuready (urj_chain_t *);
-void chain_wait_in_reset (urj_chain_t *);
void part_wait_in_reset (urj_chain_t *, int);
-void chain_wait_reset (urj_chain_t *);
void part_wait_reset (urj_chain_t *, int);
void part_check_emuready (urj_chain_t *, int);
void part_emudat_set (urj_chain_t *, int, uint32_t, int);
@@ -272,32 +257,23 @@ void part_emudat_defer_get (urj_chain_t
uint32_t part_emudat_get_done (urj_chain_t *, int, int);
uint64_t emudat_value (urj_tap_register_t *);
void emudat_init_value (urj_tap_register_t *, uint32_t);
-void chain_register_get (urj_chain_t *, enum core_regnum, uint32_t *);
uint32_t part_register_get (urj_chain_t *, int, enum core_regnum);
-void chain_register_set (urj_chain_t *, enum core_regnum, uint32_t *);
-void chain_register_set_same (urj_chain_t *, enum core_regnum, uint32_t);
void part_register_set (urj_chain_t *, int, enum core_regnum, uint32_t);
-void chain_emuir_set_same (urj_chain_t *, uint64_t, int);
void part_emuir_set (urj_chain_t *, int, uint64_t, int);
-void chain_emuir_set_same_2 (urj_chain_t *, uint64_t, uint64_t, int);
void part_emuir_set_2 (urj_chain_t *, int, uint64_t, uint64_t, int);
uint32_t part_get_r0 (urj_chain_t *, int);
uint32_t part_get_p0 (urj_chain_t *, int);
void part_set_r0 (urj_chain_t *, int, uint32_t);
void part_set_p0 (urj_chain_t *, int, uint32_t);
-void chain_emulation_enable (urj_chain_t *);
void part_emulation_enable (urj_chain_t *, int);
-void chain_emulation_disable (urj_chain_t *);
void part_emulation_disable (urj_chain_t *, int);
-void chain_emulation_trigger (urj_chain_t *);
void part_emulation_trigger (urj_chain_t *, int);
-void chain_emulation_return (urj_chain_t *);
void part_emulation_return (urj_chain_t *, int);
void part_execute_instructions (urj_chain_t *, int n, struct bfin_insn *);
void chain_system_reset (urj_chain_t *);
-void bfin_core_reset (urj_chain_t *);
-void software_reset (urj_chain_t *);
-void chain_emupc_reset (urj_chain_t *, uint32_t *);
+void bfin_core_reset (urj_chain_t *, int);
+void software_reset (urj_chain_t *, int);
+void part_emupc_reset (urj_chain_t *, int, uint32_t);
uint32_t part_mmr_read_clobber_r0 (urj_chain_t *, int, int32_t, int);
void part_mmr_write_clobber_r0 (urj_chain_t *, int, int32_t, uint32_t, int);
uint32_t part_mmr_read (urj_chain_t *, int, uint32_t, int);
Index: src/cmd/cmd_bfin.c
===================================================================
--- src/cmd/cmd_bfin.c (revision 2006)
+++ src/cmd/cmd_bfin.c (working copy)
@@ -474,9 +474,9 @@ cmd_bfin_run (urj_chain_t *chain, char *
_("%s: reseting processor ... "), "bfin");
fflush (stdout);
if (reset_what == 0x3)
- software_reset (chain);
+ software_reset (chain, chain->active_part);
else if (reset_what & 0x1)
- bfin_core_reset (chain);
+ bfin_core_reset (chain, chain->active_part);
else if (reset_what & 0x2)
chain_system_reset (chain);
urj_log (URJ_LOG_LEVEL_NORMAL, _("OK\n"));
Index: src/bfin/bfin.c
===================================================================
--- src/bfin/bfin.c (revision 2006)
+++ src/bfin/bfin.c (working copy)
@@ -69,31 +69,6 @@ part_is_bfin (urj_chain_t *chain, int n)
return is_bfin_part (chain->parts->parts[n]);
}
-static int
-part_is_bypassed (urj_chain_t *chain, int n)
-{
- urj_part_t *part;
-
- part = chain->parts->parts[n];
-
- if (part_is_bfin (chain, n))
- return BFIN_PART_BYPASS (part);
-
- /* Other parts are all bypassed. */
- else
- return 1;
-}
-
-void
-part_bypass (urj_chain_t *chain, int n)
-{
- urj_part_t *part;
-
- part = chain->parts->parts[n];
- if (is_bfin_part (part))
- BFIN_PART_BYPASS (part) = 1;
-}
-
urj_tap_register_t *
register_init_value (urj_tap_register_t *tr, uint64_t value)
{
@@ -135,52 +110,6 @@ bfin_set_scan (urj_part_t *part, int sca
static void emuir_init_value (urj_tap_register_t *r, uint64_t insn);
-#if 0
-static int
-chain_scan_select_array (urj_chain_t *chain, int *scan)
-{
- int i;
- int changed;
-
- changed = 0;
-
- for (i = 0; i < chain->parts->len; i++)
- {
- urj_part_t *part = chain->parts->parts[i];
-
- if (part_is_bypassed (chain, i))
- changed += bfin_set_scan (part, BYPASS);
- else
- changed += bfin_set_scan (part, scan[i]);
- }
-
- if (changed)
- urj_tap_chain_shift_instructions_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
-
- return 0;
-}
-#endif
-
-int
-chain_scan_select (urj_chain_t *chain, int scan)
-{
- int i;
- int changed;
-
- changed = 0;
-
- for (i = 0; i < chain->parts->len; i++)
- if (part_is_bypassed (chain, i))
- changed += bfin_set_scan (chain->parts->parts[i], BYPASS);
- else
- changed += bfin_set_scan (chain->parts->parts[i], scan);
-
- if (changed)
- urj_tap_chain_shift_instructions_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
-
- return 0;
-}
-
int
part_scan_select (urj_chain_t *chain, int n, int scan)
{
@@ -203,9 +132,6 @@ part_scan_select (urj_chain_t *chain, in
for (i = 0; i < chain->parts->len; i++)
{
- if (part_is_bypassed (chain, i))
- continue;
-
if (i != n)
{
part = chain->parts->parts[i];
@@ -248,21 +174,6 @@ bfin_dbgstat_value (urj_part_t *part)
BFIN_PART_DBGCTL (part) = dbgctl; \
}
-#define CHAIN_DBGCTL_CLEAR_OR_SET_BIT(name) \
- static void \
- chain_dbgctl_bit_clear_or_set_##name (urj_chain_t *chain, int set) \
- { \
- int i; \
- \
- for (i = 0; i < chain->parts->len; i++) \
- { \
- if (part_is_bypassed (chain, i)) \
- continue; \
- \
- part_dbgctl_bit_clear_or_set_##name (chain, i, set); \
- } \
- }
-
#define PART_DBGCTL_SET_BIT(name) \
void \
part_dbgctl_bit_set_##name (urj_chain_t *chain, int n) \
@@ -289,29 +200,11 @@ bfin_dbgstat_value (urj_part_t *part)
part_dbgctl_bit_clear_or_set_##name (chain, n, 0); \
}
-#define CHAIN_DBGCTL_SET_BIT(name) \
- void \
- chain_dbgctl_bit_set_##name (urj_chain_t *chain) \
- { \
- chain_dbgctl_bit_clear_or_set_##name (chain, 1); \
- }
-
-#define CHAIN_DBGCTL_CLEAR_BIT(name) \
- void \
- chain_dbgctl_bit_clear_##name (urj_chain_t *chain) \
- { \
- chain_dbgctl_bit_clear_or_set_##name (chain, 0); \
- }
-
#define DBGCTL_BIT_OP(name) \
PART_DBGCTL_CLEAR_OR_SET_BIT(name) \
PART_DBGCTL_SET_BIT(name) \
PART_DBGCTL_CLEAR_BIT(name) \
- PART_DBGCTL_IS(name) \
- CHAIN_DBGCTL_CLEAR_OR_SET_BIT(name) \
- CHAIN_DBGCTL_SET_BIT(name) \
- CHAIN_DBGCTL_CLEAR_BIT(name)
-
+ PART_DBGCTL_IS(name)
/* These functions check cached DBGSTAT. So before calling them,
dbgstat_get or core_dbgstat_get has to be called to update cached
@@ -407,34 +300,6 @@ part_dbgstat_emucause (urj_chain_t *chai
}
void
-chain_dbgstat_get (urj_chain_t *chain)
-{
- urj_part_t *part;
- int i;
-
- chain_scan_select (chain, DBGSTAT_SCAN);
-
- for (i = 0; i < chain->parts->len; i++)
- {
- part = chain->parts->parts[i];
-
- if (part_is_bypassed (chain, i))
- continue;
- }
-
- urj_tap_chain_shift_data_registers_mode (chain, 1, 1, URJ_CHAIN_EXITMODE_UPDATE);
-
- for (i = 0; i < chain->parts->len; i++)
- {
- if (part_is_bypassed (chain, i))
- continue;
-
- part = chain->parts->parts[i];
- BFIN_PART_DBGSTAT (part) = bfin_dbgstat_value (part);
- }
-}
-
-void
part_dbgstat_get (urj_chain_t *chain, int n)
{
urj_part_t *part;
@@ -450,30 +315,6 @@ part_dbgstat_get (urj_chain_t *chain, in
BFIN_PART_DBGSTAT (part) = bfin_dbgstat_value (part);
}
-void
-chain_emupc_get (urj_chain_t *chain, int save)
-{
- urj_part_t *part;
- urj_tap_register_t *r;
- int i;
-
- chain_scan_select (chain, EMUPC_SCAN);
-
- urj_tap_chain_shift_data_registers_mode (chain, 1, 1, URJ_CHAIN_EXITMODE_UPDATE);
- for (i = 0; i < chain->parts->len; i++)
- {
- part = chain->parts->parts[i];
-
- if (part_is_bypassed (chain, i))
- continue;
-
- r = part->active_instruction->data_register->out;
- BFIN_PART_EMUPC (part) = urj_tap_register_get_value (r);
- if (save)
- BFIN_PART_EMUPC_ORIG (part) = BFIN_PART_EMUPC (part);
- }
-}
-
uint32_t
part_emupc_get (urj_chain_t *chain, int n, int save)
{
@@ -496,32 +337,6 @@ part_emupc_get (urj_chain_t *chain, int
}
void
-chain_dbgstat_clear_ovfs (urj_chain_t *chain)
-{
- int i;
-
- chain_scan_select (chain, DBGSTAT_SCAN);
-
- for (i = 0; i < chain->parts->len; i++)
- {
- if (part_is_bypassed (chain, i))
- continue;
- part_dbgstat_bit_set_emudiovf (chain, i);
- part_dbgstat_bit_set_emudoovf (chain, i);
- }
-
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
-
- for (i = 0; i < chain->parts->len; i++)
- {
- if (part_is_bypassed (chain, i))
- continue;
- part_dbgstat_bit_clear_emudiovf (chain, i);
- part_dbgstat_bit_clear_emudoovf (chain, i);
- }
-}
-
-void
part_dbgstat_clear_ovfs (urj_chain_t *chain, int n)
{
part_scan_select (chain, n, DBGSTAT_SCAN);
@@ -536,29 +351,6 @@ part_dbgstat_clear_ovfs (urj_chain_t *ch
}
void
-chain_check_emuready (urj_chain_t *chain)
-{
- int emuready;
- int i;
-
- chain_dbgstat_get (chain);
- emuready = 1;
- for (i = 0; i < chain->parts->len; i++)
- {
- if (part_is_bypassed (chain, i))
- continue;
-
- if (!(part_dbgstat_is_emuready (chain, i)))
- {
- emuready = 0;
- break;
- }
- }
-
- assert (emuready);
-}
-
-void
part_check_emuready (urj_chain_t *chain, int n)
{
int emuready;
@@ -573,40 +365,6 @@ part_check_emuready (urj_chain_t *chain,
}
void
-chain_wait_in_reset (urj_chain_t *chain)
-{
- int in_reset;
- int i;
- int waited = 0;
-
- try_again:
-
- chain_dbgstat_get (chain);
- in_reset = 1;
- for (i = 0; i < chain->parts->len; i++)
- {
- if (part_is_bypassed (chain, i))
- continue;
-
- if (!(part_dbgstat_is_in_reset (chain, i)))
- {
- in_reset = 0;
- break;
- }
- }
-
- if (waited)
- assert (in_reset);
-
- if (!in_reset)
- {
- nanosleep (&bfin_emu_wait_ts, NULL);
- waited = 1;
- goto try_again;
- }
-}
-
-void
part_wait_in_reset (urj_chain_t *chain, int n)
{
int in_reset;
@@ -632,40 +390,6 @@ part_wait_in_reset (urj_chain_t *chain,
}
void
-chain_wait_reset (urj_chain_t *chain)
-{
- int in_reset;
- int i;
- int waited = 0;
-
- try_again:
-
- chain_dbgstat_get (chain);
- in_reset = 0;
- for (i = 0; i < chain->parts->len; i++)
- {
- if (part_is_bypassed (chain, i))
- continue;
-
- if (part_dbgstat_is_in_reset (chain, i))
- {
- in_reset = 1;
- break;
- }
- }
-
- if (waited)
- assert (!in_reset);
-
- if (in_reset)
- {
- nanosleep (&bfin_emu_wait_ts, NULL);
- waited = 1;
- goto try_again;
- }
-}
-
-void
part_wait_reset (urj_chain_t *chain, int n)
{
int in_reset;
@@ -737,52 +461,6 @@ emuir_init_value (urj_tap_register_t *r,
}
void
-chain_emuir_set_same (urj_chain_t *chain, uint64_t insn, int exit)
-{
- int emuir_scan;
- urj_part_t *part;
- urj_tap_register_t *r;
- int i;
-
- assert (exit == URJ_CHAIN_EXITMODE_UPDATE || exit == URJ_CHAIN_EXITMODE_IDLE);
-
- if ((insn & 0xffffffff00000000ULL) == 0)
- {
- emuir_scan = EMUIR_SCAN;
-
- chain_scan_select (chain, DBGCTL_SCAN);
- chain_dbgctl_bit_set_emuirsz_32 (chain);
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
- }
- else
- {
- emuir_scan = EMUIR64_SCAN;
-
- chain_scan_select (chain, DBGCTL_SCAN);
- chain_dbgctl_bit_set_emuirsz_64 (chain);
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
- }
-
- chain_scan_select (chain, emuir_scan);
-
- for (i = 0; i < chain->parts->len; i++)
- {
- if (part_is_bypassed (chain, i))
- continue;
-
- part = chain->parts->parts[i];
- r = part->active_instruction->data_register->in;
- emuir_init_value (r, insn);
- BFIN_PART_EMUIR_A (part) = insn;
- }
-
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, exit);
-
- if (exit == URJ_CHAIN_EXITMODE_IDLE && bfin_check_emuready)
- chain_check_emuready (chain);
-}
-
-void
part_emuir_set (urj_chain_t *chain, int n, uint64_t insn, int exit)
{
int emuir_scan;
@@ -817,7 +495,7 @@ part_emuir_set (urj_chain_t *chain, int
for (i = 0; i < chain->parts->len; i++)
{
- if (part_is_bypassed (chain, i))
+ if (!part_is_bfin (chain, i))
continue;
if (i == n && BFIN_PART_EMUIR_A (chain->parts->parts[i]) != insn)
@@ -838,10 +516,7 @@ part_emuir_set (urj_chain_t *chain, int
for (i = 0; i < chain->parts->len; i++)
{
- if (part_is_bypassed (chain, i))
- continue;
-
- if (changed[i])
+ if (part_is_bfin (chain, i) && changed[i])
scan_changed += bfin_set_scan (chain->parts->parts[i], emuir_scan);
else
scan_changed += bfin_set_scan (chain->parts->parts[i], BYPASS);
@@ -852,7 +527,7 @@ part_emuir_set (urj_chain_t *chain, int
for (i = 0; i < chain->parts->len; i++)
{
- if (part_is_bypassed (chain, i))
+ if (!part_is_bfin (chain, i))
continue;
if (changed[i])
@@ -872,65 +547,6 @@ part_emuir_set (urj_chain_t *chain, int
}
void
-chain_emuir_set_same_2 (urj_chain_t *chain, uint64_t insn1, uint64_t insn2, int exit)
-{
- urj_part_t *part;
- urj_tap_register_t *r;
- int emuir_scan;
- int i;
-
- assert (exit == URJ_CHAIN_EXITMODE_UPDATE || exit == URJ_CHAIN_EXITMODE_IDLE);
-
- if ((insn1 & 0xffffffff00000000ULL) == 0
- && (insn2 & 0xffffffff00000000ULL) == 0)
- {
- emuir_scan = EMUIR_SCAN;
-
- chain_scan_select (chain, DBGCTL_SCAN);
- chain_dbgctl_bit_set_emuirsz_32 (chain);
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
- }
- else
- {
- emuir_scan = EMUIR64_SCAN;
-
- chain_scan_select (chain, DBGCTL_SCAN);
- chain_dbgctl_bit_set_emuirsz_64 (chain);
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
- }
-
- chain_scan_select (chain, emuir_scan);
-
- for (i = 0; i < chain->parts->len; i++)
- {
- if (part_is_bypassed (chain, i))
- continue;
-
- part = chain->parts->parts[i];
- r = part->active_instruction->data_register->in;
- emuir_init_value (r, insn2);
- BFIN_PART_EMUIR_B (part) = insn2;
- }
-
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
-
- for (i = 0; i < chain->parts->len; i++)
- {
- if (part_is_bypassed (chain, i))
- continue;
-
- part = chain->parts->parts[i];
- r = part->active_instruction->data_register->in;
- emuir_init_value (r, insn1);
- BFIN_PART_EMUIR_A (part) = insn1;
- }
-
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, exit);
- if (exit == URJ_CHAIN_EXITMODE_IDLE && bfin_check_emuready)
- chain_check_emuready (chain);
-}
-
-void
part_emuir_set_2 (urj_chain_t *chain, int n, uint64_t insn1, uint64_t insn2, int exit)
{
int emuir_scan;
@@ -966,7 +582,7 @@ part_emuir_set_2 (urj_chain_t *chain, in
for (i = 0; i < chain->parts->len; i++)
{
- if (part_is_bypassed (chain, i))
+ if (!part_is_bfin (chain, i))
continue;
if (i == n
@@ -991,10 +607,7 @@ part_emuir_set_2 (urj_chain_t *chain, in
for (i = 0; i < chain->parts->len; i++)
{
- if (part_is_bypassed (chain, i))
- continue;
-
- if (changed[i])
+ if (part_is_bfin (chain, i) && changed[i])
scan_changed += bfin_set_scan (chain->parts->parts[i], emuir_scan);
else
scan_changed += bfin_set_scan (chain->parts->parts[i], BYPASS);
@@ -1005,7 +618,7 @@ part_emuir_set_2 (urj_chain_t *chain, in
for (i = 0; i < chain->parts->len; i++)
{
- if (part_is_bypassed (chain, i))
+ if (!part_is_bfin (chain, i))
continue;
if (changed[i] && i == n)
@@ -1017,7 +630,7 @@ part_emuir_set_2 (urj_chain_t *chain, in
emuir_init_value (r, insn1);
}
- else if (changed[i] && i != chain->active_part)
+ else if (changed[i])
{
part = chain->parts->parts[i];
r = part->active_instruction->data_register->in;
@@ -1191,59 +804,9 @@ part_emudat_set (urj_chain_t *chain, int
}
/* Forward declarations */
-void chain_register_set (urj_chain_t *chain, enum core_regnum reg, uint32_t *value);
void part_register_set (urj_chain_t *chain, int n, enum core_regnum reg,
uint32_t value);
-void
-chain_register_get (urj_chain_t *chain, enum core_regnum reg, uint32_t *value)
-{
- urj_part_t *part;
- urj_tap_register_t *r;
- int i;
- uint32_t *r0 = NULL;
-
- if (DREG_P (reg) || PREG_P (reg))
- chain_emuir_set_same (chain, gen_move (REG_EMUDAT, reg), URJ_CHAIN_EXITMODE_IDLE);
- else
- {
- r0 = (uint32_t *)malloc (chain->parts->len * sizeof (uint32_t));
- if (!r0)
- abort ();
-
- chain_register_get (chain, REG_R0, r0);
-
- chain_scan_select (chain, DBGCTL_SCAN);
- chain_dbgctl_bit_set_emuirlpsz_2 (chain);
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
-
- chain_emuir_set_same_2 (chain, gen_move (REG_R0, reg),
- gen_move (REG_EMUDAT, REG_R0), URJ_CHAIN_EXITMODE_IDLE);
-
- chain_scan_select (chain, DBGCTL_SCAN);
- chain_dbgctl_bit_clear_emuirlpsz_2 (chain);
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
- }
-
- chain_scan_select (chain, EMUDAT_SCAN);
- urj_tap_chain_shift_data_registers_mode (chain, 1, 1, URJ_CHAIN_EXITMODE_UPDATE);
- for (i = 0; i < chain->parts->len; i++)
- {
- if (part_is_bypassed (chain, i))
- continue;
-
- part = chain->parts->parts[i];
- r = part->active_instruction->data_register->out;
- value[i] = emudat_value (r);
- }
-
- if (!DREG_P (reg) && !PREG_P (reg))
- {
- chain_register_set (chain, REG_R0, r0);
- free (r0);
- }
-}
-
uint32_t
part_register_get (urj_chain_t *chain, int n, enum core_regnum reg)
{
@@ -1280,67 +843,6 @@ part_register_get (urj_chain_t *chain, i
return emudat_value (r);
}
-static void
-chain_register_set_1 (urj_chain_t *chain, enum core_regnum reg, uint32_t *value, bool array)
-{
- urj_part_t *part;
- urj_tap_register_t *r;
- int i;
- uint32_t *r0 = NULL;
-
- if (!DREG_P (reg) && !PREG_P (reg))
- {
- r0 = (uint32_t *)malloc (chain->parts->len * sizeof (uint32_t));
- if (!r0)
- abort ();
-
- chain_register_get (chain, REG_R0, r0);
- }
-
- chain_scan_select (chain, EMUDAT_SCAN);
- for (i = 0; i < chain->parts->len; i++)
- {
- if (part_is_bypassed (chain, i))
- continue;
-
- part = chain->parts->parts[i];
- r = part->active_instruction->data_register->in;
- emudat_init_value (r, array ? value[i] : *value);
- }
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
-
- if (DREG_P (reg) || PREG_P (reg))
- chain_emuir_set_same (chain, gen_move (reg, REG_EMUDAT), URJ_CHAIN_EXITMODE_IDLE);
- else
- {
- chain_scan_select (chain, DBGCTL_SCAN);
- chain_dbgctl_bit_set_emuirlpsz_2 (chain);
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
-
- chain_emuir_set_same_2 (chain, gen_move (REG_R0, REG_EMUDAT),
- gen_move (reg, REG_R0), URJ_CHAIN_EXITMODE_IDLE);
-
- chain_scan_select (chain, DBGCTL_SCAN);
- chain_dbgctl_bit_clear_emuirlpsz_2 (chain);
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
-
- chain_register_set (chain, REG_R0, r0);
- free (r0);
- }
-}
-
-void
-chain_register_set (urj_chain_t *chain, enum core_regnum reg, uint32_t *value)
-{
- chain_register_set_1 (chain, reg, value, true);
-}
-
-void
-chain_register_set_same (urj_chain_t *chain, enum core_regnum reg, uint32_t value)
-{
- chain_register_set_1 (chain, reg, &value, false);
-}
-
void
part_register_set (urj_chain_t *chain, int n, enum core_regnum reg, uint32_t value)
{
@@ -1404,22 +906,6 @@ part_set_p0 (urj_chain_t *chain, int n,
}
void
-chain_emulation_enable (urj_chain_t *chain)
-{
- chain_scan_select (chain, DBGCTL_SCAN);
-
- chain_dbgctl_bit_set_empwr (chain);
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
-
- chain_dbgctl_bit_set_emfen (chain);
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
-
- chain_dbgctl_bit_set_emuirsz_32 (chain);
- chain_dbgctl_bit_set_emudatsz_40 (chain);
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
-}
-
-void
part_emulation_enable (urj_chain_t *chain, int n)
{
part_scan_select (chain, n, DBGCTL_SCAN);
@@ -1436,14 +922,6 @@ part_emulation_enable (urj_chain_t *chai
}
void
-chain_emulation_disable (urj_chain_t *chain)
-{
- chain_scan_select (chain, DBGCTL_SCAN);
- chain_dbgctl_bit_clear_empwr (chain);
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
-}
-
-void
part_emulation_disable (urj_chain_t *chain, int n)
{
part_scan_select (chain, n, DBGCTL_SCAN);
@@ -1451,25 +929,6 @@ part_emulation_disable (urj_chain_t *cha
urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
}
-
-void
-chain_emulation_trigger (urj_chain_t *chain)
-{
- chain_emuir_set_same (chain, INSN_NOP, URJ_CHAIN_EXITMODE_UPDATE);
-
- chain_scan_select (chain, DBGCTL_SCAN);
- chain_dbgctl_bit_set_wakeup (chain);
- chain_dbgctl_bit_set_emeen (chain);
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_IDLE);
-
- /* I don't know why, but the following code works. */
- /* Enter the emulation mode */
- urj_tap_chain_defer_clock (chain, 1, 0, 1);
- /* Bring the TAP state to Update-DR */
- urj_tap_chain_defer_clock (chain, 0, 0, 1);
- urj_tap_chain_defer_clock (chain, 1, 0, 2);
-}
-
void
part_emulation_trigger (urj_chain_t *chain, int n)
{
@@ -1489,17 +948,6 @@ part_emulation_trigger (urj_chain_t *cha
}
void
-chain_emulation_return (urj_chain_t *chain)
-{
- chain_emuir_set_same (chain, INSN_RTE, URJ_CHAIN_EXITMODE_UPDATE);
-
- chain_scan_select (chain, DBGCTL_SCAN);
- chain_dbgctl_bit_clear_emeen (chain);
- chain_dbgctl_bit_clear_wakeup (chain);
- urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_IDLE);
-}
-
-void
part_emulation_return (urj_chain_t *chain, int n)
{
part_emuir_set (chain, n, INSN_RTE, URJ_CHAIN_EXITMODE_UPDATE);
@@ -1570,62 +1018,54 @@ chain_system_reset (urj_chain_t *chain)
}
void
-bfin_core_reset (urj_chain_t *chain)
+bfin_core_reset (urj_chain_t *chain, int n)
{
- chain_emulation_disable (chain);
+ part_emulation_disable (chain, n);
- part_emuir_set (chain, chain->main_part, INSN_NOP, URJ_CHAIN_EXITMODE_UPDATE);
+ part_emuir_set (chain, n, INSN_NOP, URJ_CHAIN_EXITMODE_UPDATE);
- chain_scan_select (chain, DBGCTL_SCAN);
- chain_dbgctl_bit_set_sram_init (chain);
- part_dbgctl_bit_set_sysrst (chain, chain->main_part);
+ part_scan_select (chain, n, DBGCTL_SCAN);
+ part_dbgctl_bit_set_sram_init (chain, n);
+ part_dbgctl_bit_set_sysrst (chain, n);
urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
- chain_wait_in_reset (chain);
+ part_wait_in_reset (chain, n);
- chain_scan_select (chain, DBGCTL_SCAN);
- part_dbgctl_bit_clear_sysrst (chain, chain->main_part);
+ part_scan_select (chain, n, DBGCTL_SCAN);
+ part_dbgctl_bit_clear_sysrst (chain, n);
urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
- chain_wait_reset (chain);
+ part_wait_reset (chain, n);
- chain_emulation_enable (chain);
- chain_emulation_trigger (chain);
+ part_emulation_enable (chain, n);
+ part_emulation_trigger (chain, n);
- chain_scan_select (chain, DBGCTL_SCAN);
- chain_dbgctl_bit_clear_sram_init (chain);
+ part_scan_select (chain, n, DBGCTL_SCAN);
+ part_dbgctl_bit_clear_sram_init (chain, n);
urj_tap_chain_shift_data_registers_mode (chain, 0, 1, URJ_CHAIN_EXITMODE_UPDATE);
}
void
-software_reset (urj_chain_t *chain)
+software_reset (urj_chain_t *chain, int n)
{
chain_system_reset (chain);
- bfin_core_reset (chain);
+ bfin_core_reset (chain, n);
}
void
-chain_emupc_reset (urj_chain_t *chain, uint32_t *new_pc)
+part_emupc_reset (urj_chain_t *chain, int n, uint32_t new_pc)
{
- uint32_t p0[chain->parts->len];
- int i;
+ urj_part_t *part = chain->parts->parts[n];
+ uint32_t p0;
- chain_register_get (chain, REG_P0, p0);
+ p0 = part_register_get (chain, n, REG_P0);
- for (i = 0; i < chain->parts->len; i++)
- {
- urj_part_t *part = chain->parts->parts[i];
-
- if (part_is_bypassed (chain, i))
- continue;
-
- BFIN_PART_EMUPC (part) = new_pc[i];
- }
+ BFIN_PART_EMUPC (part) = new_pc;
- chain_register_set (chain, REG_P0, new_pc);
- chain_emuir_set_same (chain, gen_jump_reg (REG_P0), URJ_CHAIN_EXITMODE_IDLE);
+ part_register_set (chain, n, REG_P0, new_pc);
+ part_emuir_set (chain, n, gen_jump_reg (REG_P0), URJ_CHAIN_EXITMODE_IDLE);
- chain_register_set (chain, REG_P0, p0);
+ part_register_set (chain, n, REG_P0, p0);
}
uint32_t
------------------------------------------------------------------------------
The demand for IT networking professionals continues to grow, and the
demand for specialized networking skills is growing even more rapidly.
Take a complimentary Learning@Ciosco Self-Assessment and learn
about Cisco certifications, training, and career opportunities.
http://p.sf.net/sfu/cisco-dev2dev
_______________________________________________
UrJTAG-development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/urjtag-development