aboutsummaryrefslogtreecommitdiff
path: root/src/target/xscale.h
blob: fd4bddf21375207e7e3e2c80057df958295a2c84 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
/***************************************************************************
 *   Copyright (C) 2005 by Dominic Rath                                    *
 *   Dominic.Rath@gmx.de                                                   *
 *                                                                         *
 *   Copyright (C) 2007,2008 Øyvind Harboe                                 *
 *   oyvind.harboe@zylin.com                                               *
 *                                                                         *
 *   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     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
#ifndef XSCALE_H
#define XSCALE_H

#include "armv4_5.h"
#include "armv4_5_mmu.h"
#include "trace.h"

#define	XSCALE_COMMON_MAGIC 0x58534341

typedef struct xscale_jtag_s
{
	/* position in JTAG scan chain */
	jtag_tap_t *tap;

	/* IR length and instructions */	
	int ir_length;
	u32 dbgrx;
	u32 dbgtx;
	u32 ldic;
	u32 dcsr;
} xscale_jtag_t;

enum xscale_debug_reason
{
	XSCALE_DBG_REASON_GENERIC,
	XSCALE_DBG_REASON_RESET,
	XSCALE_DBG_REASON_TB_FULL,
};

enum xscale_trace_entry_type
{
	XSCALE_TRACE_MESSAGE = 0x0,
	XSCALE_TRACE_ADDRESS = 0x1,
};

typedef struct xscale_trace_entry_s
{
	uint8_t data;
	enum xscale_trace_entry_type type;
} xscale_trace_entry_t;

typedef struct xscale_trace_data_s
{
	xscale_trace_entry_t *entries;
	int depth;
	u32 chkpt0;
	u32 chkpt1;
	u32 last_instruction;
	struct xscale_trace_data_s *next;
} xscale_trace_data_t;

typedef struct xscale_trace_s
{
	trace_status_t capture_status;	/* current state of capture run */
	struct image_s *image;					/* source for target opcodes */
	xscale_trace_data_t *data;		/* linked list of collected trace data */
	int buffer_enabled;				/* whether trace buffer is enabled */
	int buffer_fill;				/* maximum number of trace runs to read (-1 for wrap-around) */
	int pc_ok;
	u32 current_pc;
	armv4_5_state_t core_state;		/* current core state (ARM, Thumb, Jazelle) */
} xscale_trace_t;

typedef struct xscale_common_s
{
	int common_magic;
	
	/* XScale registers (CP15, DBG) */
	reg_cache_t *reg_cache;

	/* pxa250, pxa255, pxa27x, ixp42x, ... */
	char *variant;

	xscale_jtag_t jtag_info;
	
	/* current state of the debug handler */
	int handler_installed;
	int handler_running;
	u32 handler_address;
	
	/* target-endian buffers with exception vectors */
	u32 low_vectors[8];
	u32 high_vectors[8];
	
	/* static low vectors */
	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 */
	u32 static_low_vectors[8];
	u32 static_high_vectors[8];

	/* DCache cleaning */	
	u32 cache_clean_address;
	
	/* whether hold_rst and ext_dbg_break should be set */
	int hold_rst;
	int external_debug_break;
	
	/* breakpoint / watchpoint handling */
	int dbr_available;
	int dbr0_used;
	int dbr1_used;
	int ibcr_available;
	int ibcr0_used;
	int	ibcr1_used;
	u32 arm_bkpt;
	uint16_t thumb_bkpt;
	
	uint8_t vector_catch;

	xscale_trace_t trace;
	
	int arch_debug_reason;
	
	/* armv4/5 common stuff */
	armv4_5_common_t armv4_5_common;
	
	/* MMU/Caches */
	armv4_5_mmu_common_t armv4_5_mmu;
	u32 cp15_control_reg;
	
	/* possible future enhancements that go beyond XScale common stuff */
	void *arch_info;
	
	int fast_memory_access;
} xscale_common_t;

typedef struct xscale_reg_s
{
	int dbg_handler_number;
	target_t *target;
} xscale_reg_t;

enum
{
	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,
};

#define ERROR_XSCALE_NO_TRACE_DATA	(-1500)

#endif /* XSCALE_H */