6d39f752e53ef2cf7d41264883206eaae1a62294
[deliverable/binutils-gdb.git] / gdb / config / vax / tm-vax.h
1 /* Definitions to make GDB run on a vax under 4.2bsd.
2 Copyright 1986, 1987, 1989, 1991, 1993 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20
21 #define TARGET_BYTE_ORDER LITTLE_ENDIAN
22
23 /* Offset from address of function to start of its code.
24 Zero on most machines. */
25
26 #define FUNCTION_START_OFFSET 2
27
28 /* Advance PC across any function entry prologue instructions
29 to reach some "real" code. */
30
31 #define SKIP_PROLOGUE(pc) \
32 { register int op = (unsigned char) read_memory_integer (pc, 1); \
33 if (op == 0x11) pc += 2; /* skip brb */ \
34 if (op == 0x31) pc += 3; /* skip brw */ \
35 if (op == 0xC2 && \
36 ((unsigned char) read_memory_integer (pc+2, 1)) == 0x5E) \
37 pc += 3; /* skip subl2 */ \
38 if (op == 0x9E && \
39 ((unsigned char) read_memory_integer (pc+1, 1)) == 0xAE && \
40 ((unsigned char) read_memory_integer(pc+3, 1)) == 0x5E) \
41 pc += 4; /* skip movab */ \
42 if (op == 0x9E && \
43 ((unsigned char) read_memory_integer (pc+1, 1)) == 0xCE && \
44 ((unsigned char) read_memory_integer(pc+4, 1)) == 0x5E) \
45 pc += 5; /* skip movab */ \
46 if (op == 0x9E && \
47 ((unsigned char) read_memory_integer (pc+1, 1)) == 0xEE && \
48 ((unsigned char) read_memory_integer(pc+6, 1)) == 0x5E) \
49 pc += 7; /* skip movab */ \
50 }
51
52 /* Immediately after a function call, return the saved pc.
53 Can't always go through the frames for this because on some machines
54 the new frame is not set up until the new function executes
55 some instructions. */
56
57 #define SAVED_PC_AFTER_CALL(frame) FRAME_SAVED_PC(frame)
58
59 #define TARGET_UPAGES 14
60 #define TARGET_NBPG 512
61 #define STACK_END_ADDR (0x80000000 - (TARGET_UPAGES * TARGET_NBPG))
62
63 /* On the VAX, sigtramp is in the u area. Can't check the exact
64 addresses because for cross-debugging we don't have VAX include
65 files around. This should be close enough. */
66 #define SIGTRAMP_START STACK_END_ADDR
67 #define SIGTRAMP_END 0x80000000
68
69 /* Stack grows downward. */
70
71 #define INNER_THAN <
72
73 /* Sequence of bytes for breakpoint instruction. */
74
75 #define BREAKPOINT {3}
76
77 /* Amount PC must be decremented by after a breakpoint.
78 This is often the number of bytes in BREAKPOINT
79 but not always. */
80
81 #define DECR_PC_AFTER_BREAK 0
82
83 /* Nonzero if instruction at PC is a return instruction. */
84
85 #define ABOUT_TO_RETURN(pc) (read_memory_integer (pc, 1) == 04)
86
87 /* Return 1 if P points to an invalid floating point value.
88 LEN is the length in bytes -- not relevant on the Vax. */
89
90 #define INVALID_FLOAT(p, len) ((*(short *) p & 0xff80) == 0x8000)
91
92 /* Say how long (ordinary) registers are. */
93
94 #define REGISTER_TYPE long
95
96 /* Number of machine registers */
97
98 #define NUM_REGS 17
99
100 /* Initializer for an array of names of registers.
101 There should be NUM_REGS strings in this initializer. */
102
103 #define REGISTER_NAMES {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "ap", "fp", "sp", "pc", "ps"}
104
105 /* Register numbers of various important registers.
106 Note that some of these values are "real" register numbers,
107 and correspond to the general registers of the machine,
108 and some are "phony" register numbers which are too large
109 to be actual register numbers as far as the user is concerned
110 but do serve to get the desired values when passed to read_register. */
111
112 #define AP_REGNUM 12
113 #define FP_REGNUM 13 /* Contains address of executing stack frame */
114 #define SP_REGNUM 14 /* Contains address of top of stack */
115 #define PC_REGNUM 15 /* Contains program counter */
116 #define PS_REGNUM 16 /* Contains processor status */
117
118 /* Total amount of space needed to store our copies of the machine's
119 register state, the array `registers'. */
120 #define REGISTER_BYTES (17*4)
121
122 /* Index within `registers' of the first byte of the space for
123 register N. */
124
125 #define REGISTER_BYTE(N) ((N) * 4)
126
127 /* Number of bytes of storage in the actual machine representation
128 for register N. On the vax, all regs are 4 bytes. */
129
130 #define REGISTER_RAW_SIZE(N) 4
131
132 /* Number of bytes of storage in the program's representation
133 for register N. On the vax, all regs are 4 bytes. */
134
135 #define REGISTER_VIRTUAL_SIZE(N) 4
136
137 /* Largest value REGISTER_RAW_SIZE can have. */
138
139 #define MAX_REGISTER_RAW_SIZE 4
140
141 /* Largest value REGISTER_VIRTUAL_SIZE can have. */
142
143 #define MAX_REGISTER_VIRTUAL_SIZE 4
144
145 /* Return the GDB type object for the "standard" data type
146 of data in register N. */
147
148 #define REGISTER_VIRTUAL_TYPE(N) builtin_type_int
149
150 /* Store the address of the place in which to copy the structure the
151 subroutine will return. This is called from call_function. */
152
153 #define STORE_STRUCT_RETURN(ADDR, SP) \
154 { write_register (1, (ADDR)); }
155
156 /* Extract from an array REGBUF containing the (raw) register state
157 a function return value of type TYPE, and copy that, in virtual format,
158 into VALBUF. */
159
160 #define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
161 memcpy (VALBUF, REGBUF, TYPE_LENGTH (TYPE))
162
163 /* Write into appropriate registers a function return value
164 of type TYPE, given in virtual format. */
165
166 #define STORE_RETURN_VALUE(TYPE,VALBUF) \
167 write_register_bytes (0, VALBUF, TYPE_LENGTH (TYPE))
168
169 /* Extract from an array REGBUF containing the (raw) register state
170 the address in which a function should return its structure value,
171 as a CORE_ADDR (or an expression that can be used as one). */
172
173 #define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) (*(int *)(REGBUF))
174
175 \f
176 /* Describe the pointer in each stack frame to the previous stack frame
177 (its caller). */
178
179 /* FRAME_CHAIN takes a frame's nominal address
180 and produces the frame's chain-pointer. */
181
182 /* In the case of the Vax, the frame's nominal address is the FP value,
183 and 12 bytes later comes the saved previous FP value as a 4-byte word. */
184
185 #define FRAME_CHAIN(thisframe) \
186 (!inside_entry_file ((thisframe)->pc) ? \
187 read_memory_integer ((thisframe)->frame + 12, 4) :\
188 0)
189
190 /* Define other aspects of the stack frame. */
191
192 /* A macro that tells us whether the function invocation represented
193 by FI does not have a frame on the stack associated with it. If it
194 does not, FRAMELESS is set to 1, else 0. */
195 /* On the vax, all functions have frames. */
196 #define FRAMELESS_FUNCTION_INVOCATION(FI, FRAMELESS) {(FRAMELESS) = 0;}
197
198 /* Saved Pc. Get it from sigcontext if within sigtramp. */
199
200 /* Offset to saved PC in sigcontext, from <sys/signal.h>. */
201 #define SIGCONTEXT_PC_OFFSET 12
202
203 #define FRAME_SAVED_PC(FRAME) \
204 (((FRAME)->signal_handler_caller \
205 ? sigtramp_saved_pc (FRAME) \
206 : read_memory_integer ((FRAME)->frame + 16, 4)) \
207 )
208
209 /* Cannot find the AP register value directly from the FP value. Must
210 find it saved in the frame called by this one, or in the AP
211 register for the innermost frame. However, there is no way to tell
212 the difference between the innermost frame and a frame for which we
213 just don't know the frame that it called (e.g. "info frame
214 0x7ffec789"). For the sake of argument suppose that the stack is
215 somewhat trashed (which is one reason that "info frame" exists).
216 So return 0 (indicating we don't know the address of
217 the arglist) if we don't know what frame this frame calls. */
218 #define FRAME_ARGS_ADDRESS_CORRECT(fi) \
219 (((fi)->next \
220 ? read_memory_integer ((fi)->next->frame + 8, 4) \
221 : /* read_register (AP_REGNUM) */ 0))
222
223 /* In most of GDB, getting the args address is too important to
224 just say "I don't know". This is sometimes wrong for functions
225 that aren't on top of the stack, but c'est la vie. */
226 #define FRAME_ARGS_ADDRESS(fi) \
227 (((fi)->next \
228 ? read_memory_integer ((fi)->next->frame + 8, 4) \
229 : read_register (AP_REGNUM) /* 0 */))
230
231 #define FRAME_LOCALS_ADDRESS(fi) ((fi)->frame)
232
233 /* Return number of args passed to a frame.
234 Can return -1, meaning no way to tell. */
235
236 #define FRAME_NUM_ARGS(numargs, fi) \
237 { numargs = (0xff & read_memory_integer (FRAME_ARGS_ADDRESS (fi), 1)); }
238
239 /* Return number of bytes at start of arglist that are not really args. */
240
241 #define FRAME_ARGS_SKIP 4
242
243 /* Put here the code to store, into a struct frame_saved_regs,
244 the addresses of the saved registers of frame described by FRAME_INFO.
245 This includes special registers such as pc and fp saved in special
246 ways in the stack frame. sp is even more special:
247 the address we return for it IS the sp for the next frame. */
248
249 #define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) \
250 { register int regnum; \
251 register int regmask = read_memory_integer ((frame_info)->frame+4, 4) >> 16; \
252 register CORE_ADDR next_addr; \
253 memset (&frame_saved_regs, '\0', sizeof frame_saved_regs); \
254 next_addr = (frame_info)->frame + 16; \
255 /* Regmask's low bit is for register 0, \
256 which is the first one that would be pushed. */ \
257 for (regnum = 0; regnum < 12; regnum++, regmask >>= 1) \
258 (frame_saved_regs).regs[regnum] = (regmask & 1) ? (next_addr += 4) : 0; \
259 (frame_saved_regs).regs[SP_REGNUM] = next_addr + 4; \
260 if (read_memory_integer ((frame_info)->frame + 4, 4) & 0x20000000) \
261 (frame_saved_regs).regs[SP_REGNUM] += 4 + 4 * read_memory_integer (next_addr + 4, 4); \
262 (frame_saved_regs).regs[PC_REGNUM] = (frame_info)->frame + 16; \
263 (frame_saved_regs).regs[FP_REGNUM] = (frame_info)->frame + 12; \
264 (frame_saved_regs).regs[AP_REGNUM] = (frame_info)->frame + 8; \
265 (frame_saved_regs).regs[PS_REGNUM] = (frame_info)->frame + 4; \
266 }
267 \f
268 /* Things needed for making the inferior call functions. */
269
270 /* Push an empty stack frame, to record the current PC, etc. */
271
272 #define PUSH_DUMMY_FRAME \
273 { register CORE_ADDR sp = read_register (SP_REGNUM);\
274 register int regnum; \
275 sp = push_word (sp, 0); /* arglist */ \
276 for (regnum = 11; regnum >= 0; regnum--) \
277 sp = push_word (sp, read_register (regnum)); \
278 sp = push_word (sp, read_register (PC_REGNUM)); \
279 sp = push_word (sp, read_register (FP_REGNUM)); \
280 sp = push_word (sp, read_register (AP_REGNUM)); \
281 sp = push_word (sp, (read_register (PS_REGNUM) & 0xffef) \
282 + 0x2fff0000); \
283 sp = push_word (sp, 0); \
284 write_register (SP_REGNUM, sp); \
285 write_register (FP_REGNUM, sp); \
286 write_register (AP_REGNUM, sp + 17 * sizeof (int)); }
287
288 /* Discard from the stack the innermost frame, restoring all registers. */
289
290 #define POP_FRAME \
291 { register CORE_ADDR fp = read_register (FP_REGNUM); \
292 register int regnum; \
293 register int regmask = read_memory_integer (fp + 4, 4); \
294 write_register (PS_REGNUM, \
295 (regmask & 0xffff) \
296 | (read_register (PS_REGNUM) & 0xffff0000)); \
297 write_register (PC_REGNUM, read_memory_integer (fp + 16, 4)); \
298 write_register (FP_REGNUM, read_memory_integer (fp + 12, 4)); \
299 write_register (AP_REGNUM, read_memory_integer (fp + 8, 4)); \
300 fp += 16; \
301 for (regnum = 0; regnum < 12; regnum++) \
302 if (regmask & (0x10000 << regnum)) \
303 write_register (regnum, read_memory_integer (fp += 4, 4)); \
304 fp = fp + 4 + ((regmask >> 30) & 3); \
305 if (regmask & 0x20000000) \
306 { regnum = read_memory_integer (fp, 4); \
307 fp += (regnum + 1) * 4; } \
308 write_register (SP_REGNUM, fp); \
309 flush_cached_frames (); \
310 set_current_frame (create_new_frame (read_register (FP_REGNUM),\
311 read_pc ())); }
312
313 /* This sequence of words is the instructions
314 calls #69, @#32323232
315 bpt
316 Note this is 8 bytes. */
317
318 #define CALL_DUMMY {0x329f69fb, 0x03323232}
319
320 #define CALL_DUMMY_START_OFFSET 0 /* Start execution at beginning of dummy */
321
322 /* Insert the specified number of args and function address
323 into a call sequence of the above form stored at DUMMYNAME. */
324
325 #define FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p) \
326 { *((char *) dummyname + 1) = nargs; \
327 *(int *)((char *) dummyname + 3) = fun; }
328
329 /* If vax pcc says CHAR or SHORT, it provides the correct address. */
330
331 #define BELIEVE_PCC_PROMOTION 1
This page took 0.043887 seconds and 3 git commands to generate.