Address some FIXME comments by getting rid of globals, moving
per-core parameters in the existing per-core data structure.
This will matter most whenever there are multiple ARM11 cores,
e.g. ARM11 MPcore chips, but in general is just cleanup.
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
-/* FIXME none of these flags should be global to all ARM11 cores!
- * Most of them shouldn't exist at all, once the code works...
- */
-static bool arm11_config_memwrite_burst = true;
-static bool arm11_config_memwrite_error_fatal = true;
-static uint32_t arm11_vcr = 0;
-static bool arm11_config_step_irq_enable = false;
-static bool arm11_config_hardware_step = false;
-
static int arm11_step(struct target *target, int current,
uint32_t address, int handle_breakpoints);
static int arm11_step(struct target *target, int current,
uint32_t address, int handle_breakpoints);
- if (arm11_vcr)
- arm11_sc7_set_vcr(arm11, arm11_vcr);
+ if (arm11->vcr)
+ arm11_sc7_set_vcr(arm11, arm11->vcr);
}
/* activate all watchpoints and breakpoints */
}
/* activate all watchpoints and breakpoints */
brp[1].write = 1;
brp[1].address = ARM11_SC7_BCR0;
brp[1].write = 1;
brp[1].address = ARM11_SC7_BCR0;
- if (arm11_config_hardware_step)
+ if (arm11->hardware_step)
{
/* Hardware single stepping ("instruction address
* mismatch") is used if enabled. It's not quite
{
/* Hardware single stepping ("instruction address
* mismatch") is used if enabled. It's not quite
- if (arm11_config_step_irq_enable)
+ if (arm11->step_irq_enable)
/* this disable should be redundant ... */
arm11->dscr &= ~DSCR_INT_DIS;
else
/* this disable should be redundant ... */
arm11->dscr &= ~DSCR_INT_DIS;
else
struct arm11_common *arm11 = target_to_arm11(target);
/* optionally catch reset vector */
struct arm11_common *arm11 = target_to_arm11(target);
/* optionally catch reset vector */
- if (target->reset_halt && !(arm11_vcr & 1))
- arm11_sc7_set_vcr(arm11, arm11_vcr | 1);
+ if (target->reset_halt && !(arm11->vcr & 1))
+ arm11_sc7_set_vcr(arm11, arm11->vcr | 1);
/* Issue some kind of warm reset. */
if (target_has_event_action(target, TARGET_EVENT_RESET_ASSERT)) {
/* Issue some kind of warm reset. */
if (target_has_event_action(target, TARGET_EVENT_RESET_ASSERT)) {
}
/* maybe restore vector catch config */
}
/* maybe restore vector catch config */
- if (target->reset_halt && !(arm11_vcr & 1))
- arm11_sc7_set_vcr(arm11, arm11_vcr);
+ if (target->reset_halt && !(arm11->vcr & 1))
+ arm11_sc7_set_vcr(arm11, arm11->vcr);
* now exercise both burst and non-burst code paths with the
* default settings, increasing code coverage.
*/
* now exercise both burst and non-burst code paths with the
* default settings, increasing code coverage.
*/
- bool burst = arm11_config_memwrite_burst && (count > 1);
+ bool burst = arm11->memwrite_burst && (count > 1);
if (burst)
LOG_ERROR("use 'arm11 memwrite burst disable' to disable fast burst mode");
if (burst)
LOG_ERROR("use 'arm11 memwrite burst disable' to disable fast burst mode");
- if (arm11_config_memwrite_error_fatal)
+ if (arm11->memwrite_error_fatal)
arm11->jtag_info.cur_scan_chain = ~0; /* invalid/unknown */
arm11->jtag_info.intest_instr = ARM11_INTEST;
arm11->jtag_info.cur_scan_chain = ~0; /* invalid/unknown */
arm11->jtag_info.intest_instr = ARM11_INTEST;
+ arm11->memwrite_burst = true;
+ arm11->memwrite_error_fatal = true;
+
break;
case 0x7B76:
arm11->arm.core_type = ARM_MODE_MON;
break;
case 0x7B76:
arm11->arm.core_type = ARM_MODE_MON;
+ /* NOTE: could default arm11->hardware_step to true */
type = "ARM1176";
break;
default:
type = "ARM1176";
break;
default:
-/* FIXME all these BOOL_WRAPPER things should be modifying
- * per-instance state, not shared state; ditto the vector
- * catch register support. Scan chains with multiple cores
- * should be able to say "work with this core like this,
- * that core like that". Example, ARM11 MPCore ...
- */
-
#define ARM11_BOOL_WRAPPER(name, print_name) \
#define ARM11_BOOL_WRAPPER(name, print_name) \
- COMMAND_HANDLER(arm11_handle_bool_##name) \
- { \
- return CALL_COMMAND_HANDLER(handle_command_parse_bool, \
- &arm11_config_##name, print_name); \
- }
+ COMMAND_HANDLER(arm11_handle_bool_##name) \
+ { \
+ struct target *target = get_current_target(CMD_CTX); \
+ struct arm11_common *arm11 = target_to_arm11(target); \
+ \
+ return CALL_COMMAND_HANDLER(handle_command_parse_bool, \
+ &arm11->name, print_name); \
+ }
ARM11_BOOL_WRAPPER(memwrite_burst, "memory write burst mode")
ARM11_BOOL_WRAPPER(memwrite_error_fatal, "fatal error mode for memory writes")
ARM11_BOOL_WRAPPER(step_irq_enable, "IRQs while stepping")
ARM11_BOOL_WRAPPER(hardware_step, "hardware single step")
ARM11_BOOL_WRAPPER(memwrite_burst, "memory write burst mode")
ARM11_BOOL_WRAPPER(memwrite_error_fatal, "fatal error mode for memory writes")
ARM11_BOOL_WRAPPER(step_irq_enable, "IRQs while stepping")
ARM11_BOOL_WRAPPER(hardware_step, "hardware single step")
+/* REVISIT handle the VCR bits like other ARMs: use symbols for
+ * input and output values.
+ */
+
COMMAND_HANDLER(arm11_handle_vcr)
{
COMMAND_HANDLER(arm11_handle_vcr)
{
+ struct target *target = get_current_target(CMD_CTX);
+ struct arm11_common *arm11 = target_to_arm11(target);
+
switch (CMD_ARGC) {
case 0:
break;
case 1:
switch (CMD_ARGC) {
case 0:
break;
case 1:
- COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], arm11_vcr);
+ COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], arm11->vcr);
break;
default:
return ERROR_COMMAND_SYNTAX_ERROR;
}
break;
default:
return ERROR_COMMAND_SYNTAX_ERROR;
}
- LOG_INFO("VCR 0x%08" PRIx32 "", arm11_vcr);
+ LOG_INFO("VCR 0x%08" PRIx32 "", arm11->vcr);
},
COMMAND_REGISTRATION_DONE
};
},
COMMAND_REGISTRATION_DONE
};
static const struct command_registration arm11_command_handlers[] = {
{
.chain = arm_command_handlers,
static const struct command_registration arm11_command_handlers[] = {
{
.chain = arm_command_handlers,
bool simulate_reset_on_next_halt; /**< Perform cleanups of the ARM state on next halt */
bool simulate_reset_on_next_halt; /**< Perform cleanups of the ARM state on next halt */
+ /* Per-core configurable options.
+ * NOTE that several of these boolean options should not exist
+ * once the relevant code is known to work correctly.
+ */
+ bool memwrite_burst;
+ bool memwrite_error_fatal;
+ bool step_irq_enable;
+ bool hardware_step;
+
+ /** Configured Vector Catch Register settings. */
+ uint32_t vcr;
+
struct arm_jtag jtag_info;
};
struct arm_jtag jtag_info;
};
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)