summaryrefslogtreecommitdiffstats
path: root/include/asm-ia64/kdbsupport.h
blob: beb846f798426547da4d485305bb8dfd8130a71e (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
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
#ifndef _ASM_IA64_KDBSUPPORT_H
#define _ASM_IA64_KDBSUPPORT_H

/*
 * Kernel Debugger Breakpoint Handler
 *
 * Copyright 1999, Silicon Graphics, Inc.
 *
 * Written March 1999 by Scott Lurndal at Silicon Graphics, Inc.
 */

#include <asm/ptrace.h>

	/*
	 * This file provides definitions for functions that
	 * are dependent upon the product into which  kdb is
	 * linked. 
	 *
	 * This version is for linux.
	 */
typedef void (*handler_t)(struct pt_regs *);
typedef unsigned long k_machreg_t;

unsigned long show_cur_stack_frame(struct pt_regs *, int, unsigned long *) ;

extern char*         kbd_getstr(char *, size_t, char *);
extern int           kdbinstalltrap(int, handler_t, handler_t*);
extern int           kdbinstalldbreg(kdb_bp_t *);
extern void          kdbremovedbreg(kdb_bp_t *);
extern void          kdb_initbptab(void);
extern int	     kdbgetregcontents(const char *, struct pt_regs *, unsigned long *);
extern int	     kdbsetregcontents(const char *, struct pt_regs *, unsigned long);
extern int	     kdbdumpregs(struct pt_regs *, const char *, const char *);

typedef int kdbintstate_t;
	
extern void	     kdb_disableint(kdbintstate_t *);
extern void	     kdb_restoreint(kdbintstate_t *);

extern k_machreg_t   kdb_getpc(struct pt_regs *);
extern int	     kdb_setpc(struct pt_regs *, k_machreg_t);

extern int	     kdb_putword(unsigned long, unsigned long);
extern int	     kdb_getcurrentframe(struct pt_regs *);

/*
 * kdb_db_trap is a processor dependent routine invoked
 * from kdb() via the #db trap handler.   It handles breakpoints involving
 * the processor debug registers and handles single step traps
 * using the processor trace flag.
 */

#define KDB_DB_BPT	0	/* Straight breakpoint */
#define KDB_DB_SS	1	/* Single Step trap */
#define KDB_DB_SSB	2	/* Single Step, caller should continue */

extern int 	     kdb_db_trap(struct pt_regs *, int);

extern int	     kdb_allocdbreg(kdb_bp_t *);
extern void          kdb_freedbreg(kdb_bp_t *);
extern void	     kdb_initdbregs(void);

extern void          kdb_setsinglestep(struct pt_regs *);

	/*
	 *  Support for ia32 architecture debug registers.
	 */
#define KDB_DBREGS	4	
extern k_machreg_t dbregs[];

#define DR6_BT  0x00008000
#define DR6_BS	0x00004000
#define DR6_BD  0x00002000

#define DR6_B3  0x00000008
#define DR6_B2	0x00000004
#define DR6_B1  0x00000002
#define DR6_B0	0x00000001

#define DR7_RW_VAL(dr, drnum) \
       (((dr) >> (16 + (4 * (drnum)))) & 0x3)

#define DR7_RW_SET(dr, drnum, rw)                              \
       do {                                                    \
               (dr) &= ~(0x3 << (16 + (4 * (drnum))));         \
               (dr) |= (((rw) & 0x3) << (16 + (4 * (drnum)))); \
       } while (0)

#define DR7_RW0(dr)       DR7_RW_VAL(dr, 0)
#define DR7_RW0SET(dr,rw)  DR7_RW_SET(dr, 0, rw)
#define DR7_RW1(dr)       DR7_RW_VAL(dr, 1)
#define DR7_RW1SET(dr,rw)  DR7_RW_SET(dr, 1, rw)
#define DR7_RW2(dr)       DR7_RW_VAL(dr, 2)
#define DR7_RW2SET(dr,rw)  DR7_RW_SET(dr, 2, rw)
#define DR7_RW3(dr)       DR7_RW_VAL(dr, 3)
#define DR7_RW3SET(dr,rw)  DR7_RW_SET(dr, 3, rw)


#define DR7_LEN_VAL(dr, drnum) \
       (((dr) >> (18 + (4 * (drnum)))) & 0x3)

#define DR7_LEN_SET(dr, drnum, rw)                             \
       do {                                                    \
               (dr) &= ~(0x3 << (18 + (4 * (drnum))));         \
               (dr) |= (((rw) & 0x3) << (18 + (4 * (drnum)))); \
       } while (0)

#define DR7_LEN0(dr)        DR7_LEN_VAL(dr, 0)
#define DR7_LEN0SET(dr,len)  DR7_LEN_SET(dr, 0, len)
#define DR7_LEN1(dr)        DR7_LEN_VAL(dr, 1)
#define DR7_LEN1SET(dr,len)  DR7_LEN_SET(dr, 1, len)
#define DR7_LEN2(dr)        DR7_LEN_VAL(dr, 2)
#define DR7_LEN2SET(dr,len)  DR7_LEN_SET(dr, 2, len)
#define DR7_LEN3(dr)        DR7_LEN_VAL(dr, 3)
#define DR7_LEN3SET(dr,len)  DR7_LEN_SET(dr, 3, len)

#define DR7_G0(dr)    (((dr)>>1)&0x1)
#define DR7_G0SET(dr) ((dr) |= 0x2)
#define DR7_G0CLR(dr) ((dr) &= ~0x2)
#define DR7_G1(dr)    (((dr)>>3)&0x1)
#define DR7_G1SET(dr) ((dr) |= 0x8)
#define DR7_G1CLR(dr) ((dr) &= ~0x8)
#define DR7_G2(dr)    (((dr)>>5)&0x1)
#define DR7_G2SET(dr) ((dr) |= 0x20)
#define DR7_G2CLR(dr) ((dr) &= ~0x20)
#define DR7_G3(dr)    (((dr)>>7)&0x1)
#define DR7_G3SET(dr) ((dr) |= 0x80)
#define DR7_G3CLR(dr) ((dr) &= ~0x80)

#define DR7_L0(dr)    (((dr))&0x1)
#define DR7_L0SET(dr) ((dr) |= 0x1)
#define DR7_L0CLR(dr) ((dr) &= ~0x1)
#define DR7_L1(dr)    (((dr)>>2)&0x1)
#define DR7_L1SET(dr) ((dr) |= 0x4)
#define DR7_L1CLR(dr) ((dr) &= ~0x4)
#define DR7_L2(dr)    (((dr)>>4)&0x1)
#define DR7_L2SET(dr) ((dr) |= 0x10)
#define DR7_L2CLR(dr) ((dr) &= ~0x10)
#define DR7_L3(dr)    (((dr)>>6)&0x1)
#define DR7_L3SET(dr) ((dr) |= 0x40)
#define DR7_L3CLR(dr) ((dr) &= ~0x40)

#define DR7_GD		0x00002000		/* General Detect Enable */
#define DR7_GE		0x00000200		/* Global exact */
#define DR7_LE		0x00000100		/* Local exact */

extern k_machreg_t kdb_getdr6(void);
extern void kdb_putdr6(k_machreg_t);

extern k_machreg_t kdb_getdr7(void);
extern void kdb_putdr7(k_machreg_t);

extern k_machreg_t kdb_getdr(int);
extern void kdb_putdr(int, k_machreg_t);

extern k_machreg_t kdb_getcr(int);

extern void kdb_bp_install(void);
extern void kdb_bp_remove(void);

/*
 * Support for setjmp/longjmp
 */
#define JB_BX   0
#define JB_SI   1
#define JB_DI   2
#define JB_BP   3
#define JB_SP   4
#define JB_PC   5

typedef struct __kdb_jmp_buf {
	unsigned long   regs[6];
} kdb_jmp_buf;

extern int kdb_setjmp(kdb_jmp_buf *);
extern void kdb_longjmp(kdb_jmp_buf *, int);

extern kdb_jmp_buf  kdbjmpbuf;

#define getprsregs(regs)	((struct switch_stack *)regs -1)

#define BITMASK(bp,value)  (value << bp)

/* bkpt support using break inst instead of IBP reg */

/*
 * Define certain specific instructions
 */
#define BREAK_INSTR             (0x00000080100L << 11)
#define INST_SLOT0_MASK         (0x1ffffffffffL << 5)

#if 0
#define MAX_BREAKPOINTS         40
#define PSR_SS                  40
#endif

/**
 * IA-64 instruction format structures
 */
typedef union bundle {
        struct {
                long    low8;
                long    high8;
        } lform;
        struct {
                int     low_low4;
                int     low_high4;
                long    high8;
        } iform;
} bundle_t;

#define BKPTMODE_DATAR	3
#define BKPTMODE_IO   	2
#define BKPTMODE_DATAW	1
#define BKPTMODE_INST	0

/* Some of the fault registers needed by kdb but not passed with
 * regs or switch stack.
 */
typedef struct fault_regs {
	unsigned long	isr ;
	unsigned long	ifa ;
	unsigned long	iim ;
	unsigned long	itir ;
} fault_regs_t ;

/*
 * State of kdb
 */

typedef struct kdb_state {
        int     cmd_given ;
        int     reason_for_entry ;
        int     bkpt_handling_state ;
	int	kdb_action ;
} kdb_state_t ;

#define BKPTSTATE_NOT_HANDLED 	0
#define BKPTSTATE_HANDLED 	1

#define CMDGIVEN_UNKNOWN	0	
#define CMDGIVEN_SSTEP		1	
#define CMDGIVEN_GO		2	

#define ENTRYREASON_GO	 	0
#define ENTRYREASON_SSTEP	1

#define ACTION_UNKNOWN		0
#define ACTION_NOBPINSTALL	1
#define ACTION_NOPROMPT		2

#endif /* _ASM_IA64_KDBSUPPORT_H */