]> Git Repo - binutils.git/blob - gdb/config/z8k/tm-z8k.h
* valops.c (call_function_by_hand, push_word), defs.h (push_word),
[binutils.git] / gdb / config / z8k / tm-z8k.h
1 /* Parameters for execution on a z8000 series machine.
2    Copyright 1992, 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 #define IEEE_FLOAT 1
21
22 #define TARGET_SHORT_BIT 16
23 #define TARGET_INT_BIT 16
24 #define TARGET_LONG_BIT 32
25 #define TARGET_PTR_BIT (BIG ? 32: 16)
26
27 /* Define the bit, byte, and word ordering of the machine.  */
28 #define TARGET_BYTE_ORDER BIG_ENDIAN
29
30 /* Offset from address of function to start of its code.
31    Zero on most machines.  */
32
33 #define FUNCTION_START_OFFSET 0
34
35 /* Advance PC across any function entry prologue instructions
36    to reach some "real" code.  */
37
38 #define SKIP_PROLOGUE(ip)   {(ip) = z8k_skip_prologue(ip);}
39 extern CORE_ADDR mz8k_skip_prologue PARAMS ((CORE_ADDR ip));
40
41
42 /* Immediately after a function call, return the saved pc.
43    Can't always go through the frames for this because on some machines
44    the new frame is not set up until the new function executes
45    some instructions.  */
46
47 #define SAVED_PC_AFTER_CALL(frame) saved_pc_after_call(frame)
48
49 /* Stack grows downward.  */
50
51 #define INNER_THAN <
52
53 /* Sequence of bytes for breakpoint instruction. */
54
55 #define BREAKPOINT {0x36,0x00}
56
57 /* If your kernel resets the pc after the trap happens you may need to
58    define this before including this file.  */
59
60 #define DECR_PC_AFTER_BREAK 0
61
62 /* Nonzero if instruction at PC is a return instruction.  */
63 /* Allow any of the return instructions, including a trapv and a return
64    from interupt.  */
65
66 #define ABOUT_TO_RETURN(pc) about_to_return(pc)
67
68 /* Return 1 if P points to an invalid floating point value.  */
69
70 #define INVALID_FLOAT(p, len) 0   /* Just a first guess; not checked */
71
72 /* Say how long (ordinary) registers are.  This is a piece of bogosity
73    used in push_word and a few other places; REGISTER_RAW_SIZE is the
74    real way to know how big a register is.  */
75
76 #define REGISTER_SIZE 4
77
78 #define NUM_REGS        23   /* 16 registers + 1 ccr + 1 pc + 3 debug
79                                 regs + fake fp + fake sp*/
80 #define REGISTER_BYTES  (NUM_REGS *4)
81
82 /* Index within `registers' of the first byte of the space for
83    register N.  */
84
85 #define REGISTER_BYTE(N)  ((N)*4)
86
87 /* Number of bytes of storage in the actual machine representation
88    for register N.  On the z8k, all but the pc are 2 bytes, but we
89    keep them all as 4 bytes and trim them on I/O */
90
91
92 #define REGISTER_RAW_SIZE(N) (((N) < 16)? 2:4)
93
94 /* Number of bytes of storage in the program's representation
95    for register N.  */
96
97 #define REGISTER_VIRTUAL_SIZE(N) REGISTER_RAW_SIZE(N) 
98
99 /* Largest value REGISTER_RAW_SIZE can have.  */
100
101 #define MAX_REGISTER_RAW_SIZE 4
102
103 /* Largest value REGISTER_VIRTUAL_SIZE can have.  */
104
105 #define MAX_REGISTER_VIRTUAL_SIZE 4
106
107 /* Return the GDB type object for the "standard" data type
108    of data in register N.  */
109
110 #define REGISTER_VIRTUAL_TYPE(N) \
111  (REGISTER_VIRTUAL_SIZE(N) == 2? builtin_type_unsigned_int : builtin_type_long)
112
113 /*#define INIT_FRAME_PC(x,y) init_frame_pc(x,y)*/
114 /* Initializer for an array of names of registers.
115    Entries beyond the first NUM_REGS are ignored.  */
116
117 #define REGISTER_NAMES  \
118  {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \
119   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", \
120   "ccr", "pc", "cycles","insts","time","fp","sp"}
121
122 /* Register numbers of various important registers.
123    Note that some of these values are "real" register numbers,
124    and correspond to the general registers of the machine,
125    and some are "phony" register numbers which are too large
126    to be actual register numbers as far as the user is concerned
127    but do serve to get the desired values when passed to read_register.  */
128
129 #define CCR_REGNUM      16      /* Contains processor status */
130 #define PC_REGNUM       17      /* Contains program counter */
131 #define CYCLES_REGNUM   18
132 #define INSTS_REGNUM    19
133 #define TIME_REGNUM     20
134 #define FP_REGNUM       21      /* Contains fp, whatever memory model */
135 #define SP_REGNUM       22      /* Conatins sp, whatever memory model */
136
137
138
139 #define PTR_SIZE (BIG ? 4: 2)
140 #define PTR_MASK (BIG ? 0xff00ffff : 0x0000ffff)
141
142 /* Store the address of the place in which to copy the structure the
143    subroutine will return.  This is called from call_function. */
144
145 #define STORE_STRUCT_RETURN(ADDR, SP) abort();
146
147 /* Extract from an array REGBUF containing the (raw) register state
148    a function return value of type TYPE, and copy that, in virtual format,
149    into VALBUF.  This is assuming that floating point values are returned
150    as doubles in d0/d1.  */
151
152
153 #define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
154   memcpy(VALBUF, REGBUF + REGISTER_BYTE(2), TYPE_LENGTH(TYPE));
155
156 /* Write into appropriate registers a function return value
157    of type TYPE, given in virtual format. */
158
159 #define STORE_RETURN_VALUE(TYPE,VALBUF) abort();
160
161 /* Extract from an array REGBUF containing the (raw) register state
162    the address in which a function should return its structure value,
163    as a CORE_ADDR (or an expression that can be used as one).  */
164
165 #define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) (*(CORE_ADDR *)(REGBUF))
166 \f
167 /* Describe the pointer in each stack frame to the previous stack frame
168    (its caller).  */
169
170 /* FRAME_CHAIN takes a frame's nominal address and produces the frame's
171    chain-pointer.
172    In the case of the Z8000, the frame's nominal address
173    is the address of a ptr sized byte word containing the calling
174    frame's address.  */
175
176 #define FRAME_CHAIN(thisframe) frame_chain(thisframe);
177
178
179
180 /* Define other aspects of the stack frame.  */
181
182 /* A macro that tells us whether the function invocation represented
183    by FI does not have a frame on the stack associated with it.  If it
184    does not, FRAMELESS is set to 1, else 0.  */
185 #define FRAMELESS_FUNCTION_INVOCATION(FI, FRAMELESS) \
186   (FRAMELESS) = frameless_look_for_prologue(FI)
187
188 #define FRAME_SAVED_PC(FRAME) frame_saved_pc(FRAME)
189
190 #define FRAME_ARGS_ADDRESS(fi) ((fi)->frame)
191
192 #define FRAME_LOCALS_ADDRESS(fi) ((fi)->frame)
193
194 /* Set VAL to the number of args passed to frame described by FI.
195    Can set VAL to -1, meaning no way to tell.  */
196
197 /* We can't tell how many args there are
198    now that the C compiler delays popping them.  */
199 #if !defined (FRAME_NUM_ARGS)
200 #define FRAME_NUM_ARGS(val,fi) (val = -1)
201 #endif
202
203 /* Return number of bytes at start of arglist that are not really args.  */
204
205 #define FRAME_ARGS_SKIP 8
206
207
208 \f
209 /* Things needed for making the inferior call functions.
210    It seems like every m68k based machine has almost identical definitions
211    in the individual machine's configuration files.  Most other cpu types
212    (mips, i386, etc) have routines in their *-tdep.c files to handle this
213    for most configurations.  The m68k family should be able to do this as
214    well.  These macros can still be overridden when necessary.  */
215
216 /* The CALL_DUMMY macro is the sequence of instructions, as disassembled
217    by gdb itself:
218
219         fmovemx fp0-fp7,sp@-                    0xf227 0xe0ff
220         moveml d0-a5,sp@-                       0x48e7 0xfffc
221         clrw sp@-                               0x4267
222         movew ccr,sp@-                          0x42e7
223
224         /..* The arguments are pushed at this point by GDB;
225         no code is needed in the dummy for this.
226         The CALL_DUMMY_START_OFFSET gives the position of 
227         the following jsr instruction.  *../
228
229         jsr @#0x32323232                        0x4eb9 0x3232 0x3232
230         addal #0x69696969,sp                    0xdffc 0x6969 0x6969
231         trap #<your BPT_VECTOR number here>     0x4e4?
232         nop                                     0x4e71
233
234    Note this is CALL_DUMMY_LENGTH bytes (28 for the above example).
235    We actually start executing at the jsr, since the pushing of the
236    registers is done by PUSH_DUMMY_FRAME.  If this were real code,
237    the arguments for the function called by the jsr would be pushed
238    between the moveml and the jsr, and we could allow it to execute through.
239    But the arguments have to be pushed by GDB after the PUSH_DUMMY_FRAME is
240    done, and we cannot allow the moveml to push the registers again lest
241    they be taken for the arguments.  */
242
243
244 #define CALL_DUMMY { 0 }
245 #define CALL_DUMMY_LENGTH 24            /* Size of CALL_DUMMY */
246 #define CALL_DUMMY_START_OFFSET 8       /* Offset to jsr instruction*/
247
248
249 /* Insert the specified number of args and function address
250    into a call sequence of the above form stored at DUMMYNAME.
251    We use the BFD routines to store a big-endian value of known size.  */
252
253 #define FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p)     \
254 { bfd_putb32 (fun,     (char *) dummyname + CALL_DUMMY_START_OFFSET + 2);  \
255   bfd_putb32 (nargs*4, (char *) dummyname + CALL_DUMMY_START_OFFSET + 8); }
256
257 /* Push an empty stack frame, to record the current PC, etc.  */
258
259 #define PUSH_DUMMY_FRAME        { z8k_push_dummy_frame (); }
260
261 extern void z8k_push_dummy_frame PARAMS ((void));
262
263 extern void z8k_pop_frame PARAMS ((void));
264
265 /* Discard from the stack the innermost frame, restoring all registers.  */
266
267 #define POP_FRAME               { z8k_pop_frame (); }
268
269 /* Offset from SP to first arg on stack at first instruction of a function */
270
271 #define SP_ARG0 (1 * 4)
272
273 #define ADDR_BITS_REMOVE(x) addr_bits_remove(x)
274 int sim_z8001_mode;
275 #define BIG (sim_z8001_mode)
276
277 #define read_memory_short(x)  (read_memory_integer(x,2) & 0xffff)
278
279 #define NO_STD_REGS
280
281 #define PRINT_REGISTER_HOOK(regno) print_register_hook(regno)
282
283
284 #define INIT_EXTRA_SYMTAB_INFO \
285   z8k_set_pointer_size(objfile->obfd->arch_info->bits_per_address);
This page took 0.040602 seconds and 4 git commands to generate.