- struct target *target;
- int retval;
-
- for (target = all_targets; target; target = target->next) {
- struct target_type *type = target->type;
-
- target_reset_examined(target);
- if (target->type->examine == NULL)
- {
- target->type->examine = default_examine;
- }
-
- if ((retval = target->type->init_target(cmd_ctx, target)) != ERROR_OK)
- {
- LOG_ERROR("target '%s' init failed", target_name(target));
- return retval;
- }
-
- /**
- * @todo MCR/MRC are ARM-specific; don't require them in
- * all targets, or for ARMs without coprocessors.
- */
- if (target->type->mcr == NULL)
- {
- target->type->mcr = default_mcr;
- } else
- {
- const struct command_registration mcr_cmd = {
- .name = "mcr",
- .mode = COMMAND_EXEC,
- .jim_handler = &jim_mcrmrc,
- .help = "write coprocessor",
- .usage = "<cpnum> <op1> <op2> <CRn> <CRm> <value>",
- };
- register_command(cmd_ctx, NULL, &mcr_cmd);
- }
-
- if (target->type->mrc == NULL)
- {
- target->type->mrc = default_mrc;
- } else
- {
- const struct command_registration mrc_cmd = {
- .name = "mrc",
- .jim_handler = &jim_mcrmrc,
- .help = "read coprocessor",
- .usage = "<cpnum> <op1> <op2> <CRn> <CRm>",
- };
- register_command(cmd_ctx, NULL, &mrc_cmd);
- }
-
-
- /**
- * @todo get rid of those *memory_imp() methods, now that all
- * callers are using target_*_memory() accessors ... and make
- * sure the "physical" paths handle the same issues.
- */
-
- /* a non-invasive way(in terms of patches) to add some code that
- * runs before the type->write/read_memory implementation
- */
- target->type->write_memory_imp = target->type->write_memory;
- target->type->write_memory = target_write_memory_imp;
- target->type->read_memory_imp = target->type->read_memory;
- target->type->read_memory = target_read_memory_imp;
- target->type->soft_reset_halt_imp = target->type->soft_reset_halt;
- target->type->soft_reset_halt = target_soft_reset_halt_imp;
- target->type->run_algorithm_imp = target->type->run_algorithm;
- target->type->run_algorithm = target_run_algorithm_imp;
-
- /* Sanity-check MMU support ... stub in what we must, to help
- * implement it in stages, but warn if we need to do so.
- */
- if (type->mmu) {
- if (type->write_phys_memory == NULL) {
- LOG_ERROR("type '%s' is missing %s",
- type->name,
- "write_phys_memory");
- type->write_phys_memory = err_write_phys_memory;
- }
- if (type->read_phys_memory == NULL) {
- LOG_ERROR("type '%s' is missing %s",
- type->name,
- "read_phys_memory");
- type->read_phys_memory = err_read_phys_memory;
- }
- if (type->virt2phys == NULL) {
- LOG_ERROR("type '%s' is missing %s",
- type->name,
- "virt2phys");
- type->virt2phys = identity_virt2phys;
- }
-
- /* Make sure no-MMU targets all behave the same: make no
- * distinction between physical and virtual addresses, and
- * ensure that virt2phys() is always an identity mapping.
- */
- } else {
- if (type->write_phys_memory
- || type->read_phys_memory
- || type->virt2phys)
- LOG_WARNING("type '%s' has broken MMU hooks",
- type->name);
-
- type->mmu = no_mmu;
- type->write_phys_memory = type->write_memory;
- type->read_phys_memory = type->read_memory;
- type->virt2phys = identity_virt2phys;
- }
- }