#include "armv7a.h"
#include "arm_disassembler.h"
-#include "target.h"
#include "register.h"
-#include "log.h"
#include "binarybuffer.h"
#include "command.h"
#include <string.h>
#include <unistd.h>
-struct bitfield_desc armv7a_psr_bitfield_desc[] =
-{
- {"M[4:0]", 5},
- {"T", 1},
- {"F", 1},
- {"I", 1},
- {"A", 1},
- {"E", 1},
- {"IT[7:2]", 6},
- {"GE[3:0]", 4},
- {"reserved(DNM)", 4},
- {"J", 1},
- {"IT[0:1]", 2},
- {"Q", 1},
- {"V", 1},
- {"C", 1},
- {"Z", 1},
- {"N", 1},
-};
char* armv7a_core_reg_list[] =
{
}
};
+/* 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};
-reg_t armv7a_gdb_dummy_fp_reg =
+struct reg armv7a_gdb_dummy_fp_reg =
{
- "GDB dummy floating-point register", armv7a_gdb_dummy_fp_value,
- 0, 1, 96, NULL, 0, NULL, 0
+ .name = "GDB dummy floating-point register",
+ .value = armv7a_gdb_dummy_fp_value,
+ .dirty = 0,
+ .valid = 1,
+ .size = 96,
+ .arch_info = NULL,
};
-void armv7a_show_fault_registers(target_t *target)
+void armv7a_show_fault_registers(struct target *target)
{
uint32_t dfsr, ifsr, dfar, ifar;
struct armv7a_common *armv7a = target_to_armv7a(target);
}
-int armv7a_arch_state(struct target_s *target)
+int armv7a_arch_state(struct target *target)
{
static const char *state[] =
{
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)
{
- target_t *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)
{
- target_t *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)
{
- target_t *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)
{
- target_t *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)
{
- target_t *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)
+int armv7a_register_commands(struct command_context *cmd_ctx)
{
- target_t *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++) {
- arm_instruction_t 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;
-}
-
-int armv7a_register_commands(struct command_context_s *cmd_ctx)
-{
- command_t *arm_adi_v5_dap_cmd;
- command_t *armv7a_cmd;
+ struct command *arm_adi_v5_dap_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;
}