blob: 9fb6521351a863ed5cc1703eef5b2a5d14ebfe67 [file] [log] [blame]
/* Target dependent code for ARC processor family, for GDB, the GNU debugger.
Copyright 2008, 2009 Free Software Foundation, Inc.
Contributed by ARC International (www.arc.com)
Authors:
Richard Stuckey <richard.stuckey@arc.com>
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
/******************************************************************************/
/* */
/* Outline: */
/* This header file defines operations for manipulating the ARC processor */
/* core registers and auxiliary registers. */
/* */
/******************************************************************************/
#ifndef ARC_REGISTERS_H
#define ARC_REGISTERS_H
/* gdb header files */
#include "defs.h"
#include "gdbarch.h"
/* ARC header files */
#include "arc-support.h"
#include "arc-tdep.h"
#include "arc-architecture.h"
#define REGISTER_DEFINITION_FILE "arc-registers.xml"
/* ARC aux registers with known (well-defined) numbers. */
#define ARC_HW_LP_START_REGNUM (ARC_RegisterNumber) 0x2
#define ARC_HW_LP_END_REGNUM (ARC_RegisterNumber) 0x3
#define ARC_HW_IDENTITY_REGNUM (ARC_RegisterNumber) 0x4
#define ARC_HW_DEBUG_REGNUM (ARC_RegisterNumber) 0x5
#define ARC_HW_PC_REGNUM (ARC_RegisterNumber) 0x6
#define ARC_HW_STATUS32_REGNUM (ARC_RegisterNumber) 0xA
/* Specific ARCangel aux registers for caches. */
#define ARC_HW_IC_IVIC_REGNUM (ARC_RegisterNumber) 0x10 /* Invalidate ICache. */
#define ARC_HW_IC_CTRL_REGNUM (ARC_RegisterNumber) 0x11 /* Disable ICache. */
#define ARC_HW_DC_IVDC_REGNUM (ARC_RegisterNumber) 0x47 /* Invalidate DCache. */
#define ARC_HW_DC_CTRL_REGNUM (ARC_RegisterNumber) 0x48 /* Disable DCache. */
/* BCRs. */
#define ARC_HW_MEMSUBSYS_REGNUM (ARC_RegisterNumber) 0x67
#define ARC_HW_AP_BUILD_REGNUM (ARC_RegisterNumber) 0x76
/* Auxiliary registers for actionpoint 0 (there are up to 8 sets of these). */
#define ARC_HW_AMV0_REGNUM (ARC_RegisterNumber) 0x220
#define ARC_HW_AMM0_REGNUM (ARC_RegisterNumber) 0x221
#define ARC_HW_AC0_REGNUM (ARC_RegisterNumber) 0x222
/* Bit masks for use with the cache-related auxiliary registers. */
#define IC_IVIC_IV 0x00000001
#define DC_IVDC_IV 0x00000001
#define IC_CTRL_DC 0x00000001
#define DC_CTRL_DC 0x00000001
#define DC_CTRL_IM 0x00000040
/* Bit masks for use with the auxiliary DEBUG, IDENTITY, STATUS32 and AP_BUILD registers. */
#define DEBUG_SH 0x40000000
#define DEBUG_BH 0x20000000
#define DEBUG_USER 0x10000000
#define DEBUG_ACTIONPOINT_HALT 0x00000004
#define DEBUG_ACTIONPOINT_STATUS 0x000007F8
#define DEBUG_ACTIONPOINT_STATUS_SHIFT 3
#define DEBUG_FORCE_HALT 0x00000002
#define DEBUG_INSTRUCTION_STEP 0x00000800
#define DEBUG_SINGLE_STEP 0x00000001
#define DEBUG_LOAD_PENDING 0x80000000
#define IDENTITY_ARCVER 0x000000FF
#define STATUS32_USER 0x00000080
#define STATUS32_L 0x00000100
#define STATUS32_HALT 0x00000001
#define AP_BUILD_VERSION 0x000000FF
#define AP_BUILD_TYPE 0x00000F00
#define AP_BUILD_TYPE_SHIFT 8
typedef enum register_access
{
READ_ONLY,
READ_WRITE,
WRITE_ONLY
} RegisterAccess;
struct core_register_definition
{
int gdb_regno;
ARC_Word mask;
RegisterAccess access;
Boolean exists;
};
/* The type 'struct aux_register_definition' is incomplete: it is private to this
module. */
typedef struct aux_register_definition ARC_AuxRegisterDefinition;
typedef struct core_register_definition ARC_CoreRegisterDefinition;
/* This type is essentially private: no access to any of its fields should
be performed outside of this module. */
typedef struct _register_info
{
ARC_ProcessorVersion processor;
ARC_AuxRegisterDefinition *aux_registers;
unsigned int aux_register_count;
int first_aux_gdb_regno;
unsigned int max_name_length;
int PC_number;
ARC_CoreRegisterDefinition core_registers[ARC_MAX_CORE_REGS];
unsigned int core_register_count;
} ARC_RegisterInfo;
typedef void (*ARC_AuxRegisterFunction)(ARC_AuxRegisterDefinition *def, void *data);
extern Boolean arc_pending_register_architecture_change_event;
/* Initialization functions. */
void arc_initialize_aux_reg_info (ARC_RegisterInfo *info);
void arc_read_default_aux_registers (struct gdbarch *gdbarch);
/* PC-related functions. */
void arc_aux_pc_guard (struct gdbarch *gdbarch, Boolean on);
void arc_aux_check_pc_defined (struct gdbarch *gdbarch);
int arc_aux_pc_number (struct gdbarch *gdbarch);
/* Output functions. */
void arc_print_aux_register (ARC_AuxRegisterDefinition *def,
ARC_RegisterContents contents);
/* Search functions. */
ARC_AuxRegisterDefinition* arc_find_aux_register_by_name (const char *name);
ARC_AuxRegisterDefinition* arc_find_aux_register_by_gdb_number (int gdb_regno);
ARC_AuxRegisterDefinition* arc_find_aux_register_by_hw_number (ARC_RegisterNumber hw_regno);
ARC_RegisterNumber arc_aux_find_register_number (const char *name,
ARC_RegisterNumber defaultNumber);
ARC_RegisterNumber arc_core_register_number (int gdb_regno);
int arc_core_register_gdb_number (ARC_RegisterNumber hw_regno);
const char* arc_aux_register_name_of (ARC_RegisterNumber hw_regno);
Boolean arc_is_core_register (int gdb_regno);
/* Accessor functions. */
int arc_aux_gdb_register_number (ARC_AuxRegisterDefinition *def);
ARC_RegisterNumber arc_aux_hw_register_number (ARC_AuxRegisterDefinition *def);
RegisterAccess arc_aux_register_access (ARC_AuxRegisterDefinition *def);
Boolean arc_aux_is_unused (ARC_AuxRegisterDefinition *def);
Boolean arc_aux_is_BCR (ARC_AuxRegisterDefinition *def);
const char* arc_aux_register_name (ARC_AuxRegisterDefinition *def);
RegisterAccess arc_core_register_access (ARC_RegisterNumber regno);
/* Iterator/summary functions. */
void arc_all_aux_registers (ARC_AuxRegisterFunction function, void *data);
unsigned int arc_aux_register_max_name_length (void);
unsigned int arc_aux_register_count (struct gdbarch *gdbarch);
unsigned int arc_core_register_count (struct gdbarch *gdbarch);
Boolean arc_aux_regs_defined (struct gdbarch *gdbarch);
ARC_ProcessorVersion arc_aux_architecture (struct gdbarch *gdbarch);
/* Register contents conversion functions. */
ARC_RegisterContents arc_write_value (ARC_AuxRegisterDefinition *def, ARC_RegisterContents value);
void arc_convert_aux_contents_for_write (int gdb_regno, void *buffer);
#endif /* ARC_REGISTERS_H */
/******************************************************************************/