2007-03-28 11:31:55 -05:00
|
|
|
/***************************************************************************
|
|
|
|
* Copyright (C) 2005 by Dominic Rath *
|
|
|
|
* Dominic.Rath@gmx.de *
|
|
|
|
* *
|
2009-07-17 14:54:25 -05:00
|
|
|
* Copyright (C) 2007,2008 Øyvind Harboe *
|
2008-07-25 01:54:17 -05:00
|
|
|
* oyvind.harboe@zylin.com *
|
|
|
|
* *
|
2007-03-28 11:31:55 -05:00
|
|
|
* 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 2 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 *
|
2016-05-16 15:41:00 -05:00
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
|
2007-03-28 11:31:55 -05:00
|
|
|
***************************************************************************/
|
2012-02-05 06:03:04 -06:00
|
|
|
|
2007-03-28 11:31:55 -05:00
|
|
|
#ifndef XSCALE_H
|
|
|
|
#define XSCALE_H
|
|
|
|
|
2009-12-13 14:52:23 -06:00
|
|
|
#include "arm.h"
|
|
|
|
#include "armv4_5_mmu.h"
|
|
|
|
#include "trace.h"
|
2007-03-28 11:31:55 -05:00
|
|
|
|
|
|
|
#define XSCALE_COMMON_MAGIC 0x58534341
|
|
|
|
|
2009-10-12 04:39:01 -05:00
|
|
|
/* These four JTAG instructions are architecturally defined.
|
|
|
|
* Lengths are core-specific; originally 5 bits, later 7.
|
|
|
|
*/
|
|
|
|
#define XSCALE_DBGRX 0x02
|
|
|
|
#define XSCALE_DBGTX 0x10
|
|
|
|
#define XSCALE_LDIC 0x07
|
|
|
|
#define XSCALE_SELDCSR 0x09
|
2007-03-28 11:31:55 -05:00
|
|
|
|
2009-11-29 05:53:06 -06:00
|
|
|
/* Possible CPU types */
|
|
|
|
#define XSCALE_IXP4XX_PXA2XX 0x0
|
|
|
|
#define XSCALE_PXA3XX 0x4
|
|
|
|
|
2012-02-05 06:03:04 -06:00
|
|
|
enum xscale_debug_reason {
|
2007-03-28 11:31:55 -05:00
|
|
|
XSCALE_DBG_REASON_GENERIC,
|
|
|
|
XSCALE_DBG_REASON_RESET,
|
|
|
|
XSCALE_DBG_REASON_TB_FULL,
|
|
|
|
};
|
|
|
|
|
2012-02-05 06:03:04 -06:00
|
|
|
enum xscale_trace_entry_type {
|
2007-08-17 03:58:40 -05:00
|
|
|
XSCALE_TRACE_MESSAGE = 0x0,
|
|
|
|
XSCALE_TRACE_ADDRESS = 0x1,
|
2007-06-28 05:32:58 -05:00
|
|
|
};
|
|
|
|
|
2012-02-05 06:03:04 -06:00
|
|
|
struct xscale_trace_entry {
|
2009-06-18 02:04:08 -05:00
|
|
|
uint8_t data;
|
2007-06-28 05:32:58 -05:00
|
|
|
enum xscale_trace_entry_type type;
|
2009-11-13 11:10:47 -06:00
|
|
|
};
|
2007-06-28 05:32:58 -05:00
|
|
|
|
2012-02-05 06:03:04 -06:00
|
|
|
struct xscale_trace_data {
|
2009-11-13 11:10:47 -06:00
|
|
|
struct xscale_trace_entry *entries;
|
2007-06-28 05:32:58 -05:00
|
|
|
int depth;
|
2009-06-18 02:09:35 -05:00
|
|
|
uint32_t chkpt0;
|
|
|
|
uint32_t chkpt1;
|
|
|
|
uint32_t last_instruction;
|
2010-04-13 12:34:52 -05:00
|
|
|
unsigned int num_checkpoints;
|
2009-11-13 10:45:32 -06:00
|
|
|
struct xscale_trace_data *next;
|
|
|
|
};
|
2007-06-28 05:32:58 -05:00
|
|
|
|
2012-02-05 06:03:04 -06:00
|
|
|
enum trace_mode {
|
|
|
|
XSCALE_TRACE_DISABLED,
|
|
|
|
XSCALE_TRACE_FILL,
|
|
|
|
XSCALE_TRACE_WRAP
|
2010-12-02 13:08:28 -06:00
|
|
|
};
|
|
|
|
|
2012-02-05 06:03:04 -06:00
|
|
|
struct xscale_trace {
|
2009-11-13 11:46:21 -06:00
|
|
|
struct image *image; /* source for target opcodes */
|
2009-11-13 10:45:32 -06:00
|
|
|
struct xscale_trace_data *data; /* linked list of collected trace data */
|
2010-12-02 13:08:28 -06:00
|
|
|
int buffer_fill; /* maximum number of trace runs to read */
|
2012-02-05 06:03:04 -06:00
|
|
|
int fill_counter; /* running count during trace collection */
|
|
|
|
enum trace_mode mode;
|
2009-12-04 22:14:46 -06:00
|
|
|
enum arm_state core_state; /* current core state (ARM, Thumb) */
|
2009-11-13 11:11:22 -06:00
|
|
|
};
|
2007-06-28 05:32:58 -05:00
|
|
|
|
2012-02-05 06:03:04 -06:00
|
|
|
struct xscale_common {
|
2009-11-06 00:04:25 -06:00
|
|
|
/* armv4/5 common stuff */
|
2012-01-19 04:06:37 -06:00
|
|
|
struct arm arm;
|
2009-11-06 00:04:25 -06:00
|
|
|
|
2007-03-28 11:31:55 -05:00
|
|
|
int common_magic;
|
2009-06-23 17:49:23 -05:00
|
|
|
|
2007-03-28 11:31:55 -05:00
|
|
|
/* XScale registers (CP15, DBG) */
|
2009-11-13 10:44:08 -06:00
|
|
|
struct reg_cache *reg_cache;
|
2007-03-28 11:31:55 -05:00
|
|
|
|
|
|
|
/* current state of the debug handler */
|
2009-06-18 02:09:35 -05:00
|
|
|
uint32_t handler_address;
|
2009-06-23 17:49:23 -05:00
|
|
|
|
2007-03-28 11:31:55 -05:00
|
|
|
/* target-endian buffers with exception vectors */
|
2009-06-18 02:09:35 -05:00
|
|
|
uint32_t low_vectors[8];
|
|
|
|
uint32_t high_vectors[8];
|
2009-06-23 17:49:23 -05:00
|
|
|
|
2007-03-28 11:31:55 -05:00
|
|
|
/* static low vectors */
|
2009-06-18 02:04:08 -05:00
|
|
|
uint8_t static_low_vectors_set; /* bit field with static vectors set by the user */
|
|
|
|
uint8_t static_high_vectors_set; /* bit field with static vectors set by the user */
|
2009-06-18 02:09:35 -05:00
|
|
|
uint32_t static_low_vectors[8];
|
|
|
|
uint32_t static_high_vectors[8];
|
2007-03-28 11:31:55 -05:00
|
|
|
|
2009-06-23 17:49:23 -05:00
|
|
|
/* DCache cleaning */
|
2009-06-18 02:09:35 -05:00
|
|
|
uint32_t cache_clean_address;
|
2009-06-23 17:49:23 -05:00
|
|
|
|
2007-03-28 11:31:55 -05:00
|
|
|
/* whether hold_rst and ext_dbg_break should be set */
|
|
|
|
int hold_rst;
|
|
|
|
int external_debug_break;
|
2009-06-23 17:49:23 -05:00
|
|
|
|
2007-03-28 11:31:55 -05:00
|
|
|
/* breakpoint / watchpoint handling */
|
|
|
|
int dbr_available;
|
|
|
|
int dbr0_used;
|
|
|
|
int dbr1_used;
|
|
|
|
int ibcr_available;
|
|
|
|
int ibcr0_used;
|
|
|
|
int ibcr1_used;
|
2009-06-18 02:09:35 -05:00
|
|
|
uint32_t arm_bkpt;
|
2009-06-18 02:07:59 -05:00
|
|
|
uint16_t thumb_bkpt;
|
2009-06-23 17:49:23 -05:00
|
|
|
|
2009-06-18 02:04:08 -05:00
|
|
|
uint8_t vector_catch;
|
2007-06-28 05:32:58 -05:00
|
|
|
|
2009-11-13 11:11:22 -06:00
|
|
|
struct xscale_trace trace;
|
2009-06-23 17:49:23 -05:00
|
|
|
|
2007-03-28 11:31:55 -05:00
|
|
|
int arch_debug_reason;
|
2009-06-23 17:49:23 -05:00
|
|
|
|
2007-03-28 11:31:55 -05:00
|
|
|
/* MMU/Caches */
|
2009-11-13 10:41:27 -06:00
|
|
|
struct armv4_5_mmu_common armv4_5_mmu;
|
2009-06-18 02:09:35 -05:00
|
|
|
uint32_t cp15_control_reg;
|
2009-06-23 17:49:23 -05:00
|
|
|
|
2008-02-24 15:54:09 -06:00
|
|
|
int fast_memory_access;
|
2009-11-29 05:53:06 -06:00
|
|
|
|
|
|
|
/* CPU variant */
|
|
|
|
int xscale_variant;
|
2009-11-13 10:45:37 -06:00
|
|
|
};
|
2007-03-28 11:31:55 -05:00
|
|
|
|
2009-11-13 10:45:37 -06:00
|
|
|
static inline struct xscale_common *
|
2009-11-13 12:11:13 -06:00
|
|
|
target_to_xscale(struct target *target)
|
2009-11-05 23:59:39 -06:00
|
|
|
{
|
2012-02-05 06:03:04 -06:00
|
|
|
return container_of(target->arch_info, struct xscale_common, arm);
|
2009-11-05 23:59:39 -06:00
|
|
|
}
|
|
|
|
|
2012-02-05 06:03:04 -06:00
|
|
|
struct xscale_reg {
|
2007-03-28 11:31:55 -05:00
|
|
|
int dbg_handler_number;
|
2009-11-13 12:11:13 -06:00
|
|
|
struct target *target;
|
2009-11-13 10:45:40 -06:00
|
|
|
};
|
2007-03-28 11:31:55 -05:00
|
|
|
|
2012-02-05 06:03:04 -06:00
|
|
|
enum {
|
2007-03-28 11:31:55 -05:00
|
|
|
XSCALE_MAINID, /* 0 */
|
|
|
|
XSCALE_CACHETYPE,
|
|
|
|
XSCALE_CTRL,
|
|
|
|
XSCALE_AUXCTRL,
|
|
|
|
XSCALE_TTB,
|
|
|
|
XSCALE_DAC,
|
|
|
|
XSCALE_FSR,
|
|
|
|
XSCALE_FAR,
|
|
|
|
XSCALE_PID,
|
|
|
|
XSCALE_CPACCESS,
|
|
|
|
XSCALE_IBCR0, /* 10 */
|
|
|
|
XSCALE_IBCR1,
|
|
|
|
XSCALE_DBR0,
|
|
|
|
XSCALE_DBR1,
|
|
|
|
XSCALE_DBCON,
|
|
|
|
XSCALE_TBREG,
|
|
|
|
XSCALE_CHKPT0,
|
|
|
|
XSCALE_CHKPT1,
|
|
|
|
XSCALE_DCSR,
|
|
|
|
XSCALE_TX,
|
|
|
|
XSCALE_RX, /* 20 */
|
|
|
|
XSCALE_TXRXCTRL,
|
|
|
|
};
|
|
|
|
|
2010-06-22 11:53:17 -05:00
|
|
|
#define ERROR_XSCALE_NO_TRACE_DATA (-700)
|
2007-06-28 05:32:58 -05:00
|
|
|
|
2013-06-23 16:17:55 -05:00
|
|
|
/* DCSR bit and field definitions */
|
|
|
|
#define DCSR_TR (1 << 16)
|
|
|
|
#define DCSR_TU (1 << 17)
|
|
|
|
#define DCSR_TS (1 << 18)
|
|
|
|
#define DCSR_TA (1 << 19)
|
|
|
|
#define DCSR_TD (1 << 20)
|
|
|
|
#define DCSR_TI (1 << 22)
|
|
|
|
#define DCSR_TF (1 << 23)
|
|
|
|
#define DCSR_TRAP_MASK \
|
|
|
|
(DCSR_TF | DCSR_TI | DCSR_TD | DCSR_TA | DCSR_TS | DCSR_TU | DCSR_TR)
|
|
|
|
|
2007-03-28 11:31:55 -05:00
|
|
|
#endif /* XSCALE_H */
|