#include "armv7a.h"
#include "arm_disassembler.h"
-#include "target.h"
#include "register.h"
#include "binarybuffer.h"
#include "command.h"
}
};
-/* FIXME this dummy is IDENTICAL to the armv4_5, arm11, and armv7m
- * ones... except for naming/scoping
- */
-uint8_t armv7a_gdb_dummy_fp_value[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-
-struct reg armv7a_gdb_dummy_fp_reg =
-{
- .name = "GDB dummy floating-point register",
- .value = armv7a_gdb_dummy_fp_value,
- .dirty = 0,
- .valid = 1,
- .size = 96,
- .arch_info = NULL,
- .arch_type = 0,
-};
-
void armv7a_show_fault_registers(struct target *target)
{
uint32_t dfsr, ifsr, dfar, ifar;
struct armv7a_common *armv7a = target_to_armv7a(target);
struct armv4_5_common_s *armv4_5 = &armv7a->armv4_5_common;
- if (armv4_5->common_magic != ARMV4_5_COMMON_MAGIC)
+ if (armv7a->common_magic != ARMV7_COMMON_MAGIC)
{
- LOG_ERROR("BUG: called for a non-ARMv4/5 target");
- exit(-1);
+ LOG_ERROR("BUG: called for a non-ARMv7A target");
+ return ERROR_INVALID_ARGUMENTS;
}
LOG_USER("target halted in %s state due to %s, current mode: %s\n"
COMMAND_HANDLER(handle_dap_baseaddr_command)
{
- struct target *target = get_current_target(cmd_ctx);
+ struct target *target = get_current_target(CMD_CTX);
struct armv7a_common *armv7a = target_to_armv7a(target);
struct swjdp_common *swjdp = &armv7a->swjdp_info;
COMMAND_HANDLER(handle_dap_memaccess_command)
{
- struct target *target = get_current_target(cmd_ctx);
+ struct target *target = get_current_target(CMD_CTX);
struct armv7a_common *armv7a = target_to_armv7a(target);
struct swjdp_common *swjdp = &armv7a->swjdp_info;
COMMAND_HANDLER(handle_dap_apsel_command)
{
- struct target *target = get_current_target(cmd_ctx);
+ struct target *target = get_current_target(CMD_CTX);
struct armv7a_common *armv7a = target_to_armv7a(target);
struct swjdp_common *swjdp = &armv7a->swjdp_info;
COMMAND_HANDLER(handle_dap_apid_command)
{
- struct target *target = get_current_target(cmd_ctx);
+ struct target *target = get_current_target(CMD_CTX);
struct armv7a_common *armv7a = target_to_armv7a(target);
struct swjdp_common *swjdp = &armv7a->swjdp_info;
COMMAND_HANDLER(handle_dap_info_command)
{
- struct target *target = get_current_target(cmd_ctx);
+ struct target *target = get_current_target(CMD_CTX);
struct armv7a_common *armv7a = target_to_armv7a(target);
struct swjdp_common *swjdp = &armv7a->swjdp_info;
uint32_t apsel;
- switch (argc) {
+ switch (CMD_ARGC) {
case 0:
apsel = swjdp->apsel;
break;
case 1:
- COMMAND_PARSE_NUMBER(u32, args[0], apsel);
+ COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], apsel);
break;
default:
return ERROR_COMMAND_SYNTAX_ERROR;
}
- return dap_info_command(cmd_ctx, swjdp, apsel);
-}
-
-COMMAND_HANDLER(handle_armv7a_disassemble_command)
-{
- struct target *target = get_current_target(cmd_ctx);
- struct armv4_5_common_s *armv4_5 = target_to_armv4_5(target);
- int thumb = 0;
- int count = 1;
- uint32_t address;
- int i;
-
- if (armv4_5->common_magic != ARMV4_5_COMMON_MAGIC) {
- command_print(cmd_ctx, "current target isn't an ARM target");
- return ERROR_OK;
- }
-
- /* REVISIT: eventually support ThumbEE disassembly too;
- * some opcodes work differently.
- */
-
- switch (argc) {
- case 3:
- if (strcmp(args[2], "thumb") != 0)
- goto usage;
- thumb = 1;
- /* FALL THROUGH */
- case 2:
- COMMAND_PARSE_NUMBER(int, args[1], count);
- /* FALL THROUGH */
- case 1:
- COMMAND_PARSE_NUMBER(u32, args[0], address);
- if (address & 0x01) {
- if (!thumb) {
- command_print(cmd_ctx, "Disassemble as Thumb");
- thumb = 1;
- }
- address &= ~1;
- }
- break;
- default:
-usage:
- command_print(cmd_ctx,
- "usage: armv7a disassemble <address> [<count> ['thumb']]");
- return ERROR_OK;
- }
-
- for (i = 0; i < count; i++) {
- struct arm_instruction cur_instruction;
- int retval;
-
- if (thumb) {
- retval = thumb2_opcode(target, address, &cur_instruction);
- if (retval != ERROR_OK)
- return retval;
-
- address += cur_instruction.instruction_size;
- } else {
- uint32_t opcode;
-
- retval = target_read_u32(target, address, &opcode);
- if (retval != ERROR_OK)
- return retval;
-
- retval = arm_evaluate_opcode(opcode, address,
- &cur_instruction);
- if (retval != ERROR_OK)
- return retval;
-
- address += 4;
- }
- command_print(cmd_ctx, "%s", cur_instruction.text);
- }
-
- return ERROR_OK;
+ return dap_info_command(CMD_CTX, swjdp, apsel);
}
int armv7a_register_commands(struct command_context *cmd_ctx)
{
struct command *arm_adi_v5_dap_cmd;
- struct command *armv7a_cmd;
arm_adi_v5_dap_cmd = register_command(cmd_ctx, NULL, "dap",
NULL, COMMAND_ANY,
"set/get number of extra tck for mem-ap memory "
"bus access [0-255]");
- armv7a_cmd = register_command(cmd_ctx, NULL, "armv7a",
- NULL, COMMAND_ANY,
- "ARMv7-A specific commands");
-
- register_command(cmd_ctx, armv7a_cmd, "disassemble",
- handle_armv7a_disassemble_command, COMMAND_EXEC,
- "disassemble instructions <address> [<count> ['thumb']]");
-
return ERROR_OK;
}