]> Git Repo - binutils.git/blame - gdb/config/d10v/tm-d10v.h
Define ULONGEST
[binutils.git] / gdb / config / d10v / tm-d10v.h
CommitLineData
ab0268b7
MH
1/* Target-specific definition for the Mitsubishi D10V
2 Copyright (C) 1996 Free Software Foundation, Inc.
3
4This file is part of GDB.
5
6This program is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program; if not, write to the Free Software
18Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20/* Contributed by Martin Hunt, [email protected] */
21
ab0268b7
MH
22#define GDB_TARGET_IS_D10V
23
ab0268b7
MH
24/* Define the bit, byte, and word ordering of the machine. */
25
26#define TARGET_BYTE_ORDER BIG_ENDIAN
27
ab0268b7
MH
28/* Offset from address of function to start of its code.
29 Zero on most machines. */
30
31#define FUNCTION_START_OFFSET 0
32
61e5b759
MH
33/* these are the addresses the D10V-EVA board maps data */
34/* and instruction memory to. */
35
36#define DMEM_START 0x2000000
37#define IMEM_START 0x1000000
38#define STACK_START 0x2007ffe
39
40#ifdef __STDC__ /* Forward decls for prototypes */
41struct frame_info;
42struct frame_saved_regs;
43struct type;
44struct value;
45#endif
46
ab0268b7
MH
47/* Advance PC across any function entry prologue instructions
48 to reach some "real" code. */
49
50extern CORE_ADDR d10v_skip_prologue ();
51#define SKIP_PROLOGUE(ip) \
52 {(ip) = d10v_skip_prologue(ip);}
53
ab0268b7
MH
54
55/* Stack grows downward. */
ab0268b7
MH
56#define INNER_THAN <
57
7eb7c902 58/* for a breakpoint, use "dbt || nop" */
ab0268b7
MH
59#define BREAKPOINT {0x2f, 0x90, 0x5e, 0x00}
60
61/* If your kernel resets the pc after the trap happens you may need to
62 define this before including this file. */
81dc176f 63#define DECR_PC_AFTER_BREAK 4
ab0268b7
MH
64
65#define REGISTER_NAMES \
66{ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \
67 "r8", "r9", "r10","r11","r12", "r13", "r14","sp",\
68 "psw","bpsw","pc","bpc", "cr4", "cr5", "cr6", "rpt_c",\
69 "rpt_s","rpt_e", "mod_s", "mod_e", "cr12", "cr13", "iba", "cr15",\
089f0d45 70 "imap0","imap1","dmap","a0", "a1"\
ab0268b7
MH
71 }
72
089f0d45 73#define NUM_REGS 37
ab0268b7
MH
74
75/* Register numbers of various important registers.
76 Note that some of these values are "real" register numbers,
77 and correspond to the general registers of the machine,
78 and some are "phony" register numbers which are too large
79 to be actual register numbers as far as the user is concerned
80 but do serve to get the desired values when passed to read_register. */
81
82#define R0_REGNUM 0
83#define LR_REGNUM 13
84#define SP_REGNUM 15
85#define FP_REGNUM 11
86#define PC_REGNUM 18
ab0268b7 87#define PSW_REGNUM 16
089f0d45
MH
88#define IMAP0_REGNUM 32
89#define IMAP1_REGNUM 33
90#define DMAP_REGNUM 34
91#define A0_REGNUM 35
ab0268b7
MH
92
93/* Say how much memory is needed to store a copy of the register set */
94#define REGISTER_BYTES ((NUM_REGS-2)*2+16)
95
96/* Index within `registers' of the first byte of the space for
97 register N. */
98
99#define REGISTER_BYTE(N) \
100( ((N) > A0_REGNUM) ? ( ((N)-A0_REGNUM)*8 + A0_REGNUM*2 ) : ((N) * 2) )
101
102/* Number of bytes of storage in the actual machine representation
103 for register N. */
104
105#define REGISTER_RAW_SIZE(N) ( ((N) >= A0_REGNUM) ? 8 : 2 )
106
107/* Number of bytes of storage in the program's representation
108 for register N. */
109#define REGISTER_VIRTUAL_SIZE(N) ( ((N) >= A0_REGNUM) ? 8 : 2 )
110
111/* Largest value REGISTER_RAW_SIZE can have. */
112
113#define MAX_REGISTER_RAW_SIZE 8
114
115/* Largest value REGISTER_VIRTUAL_SIZE can have. */
116
117#define MAX_REGISTER_VIRTUAL_SIZE 8
118
119/* Return the GDB type object for the "standard" data type
120 of data in register N. */
121
122#define REGISTER_VIRTUAL_TYPE(N) \
123( ((N) < A0_REGNUM ) ? builtin_type_short : builtin_type_long_long)
124
125
126/* Store the address of the place in which to copy the structure the
127 subroutine will return. This is called from call_function.
128
129 We store structs through a pointer passed in R2 */
130
131#define STORE_STRUCT_RETURN(ADDR, SP) \
132 { write_register (2, (ADDR)); }
133
ab0268b7
MH
134
135/* Write into appropriate registers a function return value
136 of type TYPE, given in virtual format.
137
138 Things always get returned in R2/R3 */
139
140#define STORE_RETURN_VALUE(TYPE,VALBUF) \
141 write_register_bytes (REGISTER_BYTE(2), VALBUF, TYPE_LENGTH (TYPE))
142
143
144/* Extract from an array REGBUF containing the (raw) register state
145 the address in which a function should return its structure value,
146 as a CORE_ADDR (or an expression that can be used as one). */
147
148#define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) (*(CORE_ADDR *)(REGBUF))
149\f
150
151/* Define other aspects of the stack frame.
152 we keep a copy of the worked out return pc lying around, since it
153 is a useful bit of info */
154
155#define EXTRA_FRAME_INFO \
156 CORE_ADDR return_pc; \
81a6f5b2 157 CORE_ADDR dummy; \
61e5b759 158 int frameless; \
8ebc9891 159 int size;
ab0268b7
MH
160
161#define INIT_EXTRA_FRAME_INFO(fromleaf, fi) \
162 d10v_init_extra_frame_info(fromleaf, fi)
163
61e5b759
MH
164extern void d10v_init_extra_frame_info PARAMS (( int fromleaf, struct frame_info *fi ));
165
ab0268b7
MH
166/* A macro that tells us whether the function invocation represented
167 by FI does not have a frame on the stack associated with it. If it
168 does not, FRAMELESS is set to 1, else 0. */
169
170#define FRAMELESS_FUNCTION_INVOCATION(FI, FRAMELESS) \
171 (FRAMELESS) = frameless_look_for_prologue(FI)
172
173#define FRAME_CHAIN(FRAME) d10v_frame_chain(FRAME)
61e5b759
MH
174#define FRAME_CHAIN_VALID(chain,frame) \
175 ((chain) != 0 && (frame) != 0 && (frame)->pc > IMEM_START)
8ebc9891 176#define FRAME_SAVED_PC(FRAME) ((FRAME)->return_pc)
ab0268b7
MH
177#define FRAME_ARGS_ADDRESS(fi) (fi)->frame
178#define FRAME_LOCALS_ADDRESS(fi) (fi)->frame
179
61e5b759
MH
180/* Immediately after a function call, return the saved pc. We can't */
181/* use frame->return_pc beause that is determined by reading R13 off the */
182/*stack and that may not be written yet. */
183
184#define SAVED_PC_AFTER_CALL(frame) ((read_register(LR_REGNUM) << 2) | IMEM_START)
185
ab0268b7
MH
186/* Set VAL to the number of args passed to frame described by FI.
187 Can set VAL to -1, meaning no way to tell. */
ab0268b7
MH
188/* We can't tell how many args there are */
189
190#define FRAME_NUM_ARGS(val,fi) (val = -1)
191
192/* Return number of bytes at start of arglist that are not really args. */
193
194#define FRAME_ARGS_SKIP 0
195
61e5b759 196
ab0268b7
MH
197/* Put here the code to store, into a struct frame_saved_regs,
198 the addresses of the saved registers of frame described by FRAME_INFO.
199 This includes special registers such as pc and fp saved in special
200 ways in the stack frame. sp is even more special:
201 the address we return for it IS the sp for the next frame. */
202
203#define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) \
204 d10v_frame_find_saved_regs(frame_info, &(frame_saved_regs))
205
61e5b759
MH
206extern void d10v_frame_find_saved_regs PARAMS ((struct frame_info *, struct frame_saved_regs *));
207
ab0268b7 208#define NAMES_HAVE_UNDERSCORE
7eb7c902
MH
209
210/*
211DUMMY FRAMES. Need these to support inferior function calls. They work
212like this on D10V: First we set a breakpoint at 0 or __start. Then we push
213all the registers onto the stack. Then put the function arguments in the proper
214registers and set r13 to our breakpoint address. Finally call the function directly.
215When it hits the breakpoint, clear the break point and pop the old register contents
216off the stack.
217*/
218
219#define CALL_DUMMY { }
220#define PUSH_DUMMY_FRAME
221#define CALL_DUMMY_START_OFFSET 0
222#define CALL_DUMMY_LOCATION AT_ENTRY_POINT
223#define CALL_DUMMY_BREAKPOINT_OFFSET (0)
224
225extern CORE_ADDR d10v_call_dummy_address PARAMS ((void));
226#define CALL_DUMMY_ADDRESS() d10v_call_dummy_address()
227
228#define FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p) \
61e5b759 229sp = d10v_fix_call_dummy (dummyname, pc, fun, nargs, args, type, gcc_p)
7eb7c902 230
61e5b759 231#define PC_IN_CALL_DUMMY(pc, sp, frame_address) ( pc == IMEM_START + 4 )
7eb7c902 232
61e5b759 233extern CORE_ADDR d10v_fix_call_dummy PARAMS ((char *, CORE_ADDR, CORE_ADDR,
7eb7c902
MH
234 int, struct value **,
235 struct type *, int));
236#define PUSH_ARGUMENTS(nargs, args, sp, struct_return, struct_addr) \
237 sp = d10v_push_arguments((nargs), (args), (sp), (struct_return), (struct_addr))
238extern CORE_ADDR d10v_push_arguments PARAMS ((int, struct value **, CORE_ADDR, int, CORE_ADDR));
ab0268b7 239
ab0268b7 240
7eb7c902
MH
241/* Extract from an array REGBUF containing the (raw) register state
242 a function return value of type TYPE, and copy that, in virtual format,
243 into VALBUF. */
244
245#define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
246d10v_extract_return_value(TYPE, REGBUF, VALBUF)
247 extern void
248d10v_extract_return_value PARAMS ((struct type *, char *, char *));
ab0268b7 249
ab0268b7
MH
250
251/* Discard from the stack the innermost frame,
252 restoring all saved registers. */
ab0268b7 253#define POP_FRAME d10v_pop_frame();
61e5b759 254extern void d10v_pop_frame PARAMS((void));
ab0268b7
MH
255
256#define REGISTER_SIZE 2
257
7eb7c902
MH
258#ifdef CC_HAS_LONG_LONG
259# define LONGEST long long
260#else
261# define LONGEST long
262#endif
9ef5835a 263#define ULONGEST unsigned LONGEST
ab0268b7 264
61e5b759 265void d10v_write_pc PARAMS ((CORE_ADDR val, int pid));
089f0d45 266CORE_ADDR d10v_read_pc PARAMS ((int pid));
61e5b759
MH
267void d10v_write_sp PARAMS ((CORE_ADDR val));
268CORE_ADDR d10v_read_sp PARAMS ((void));
ab0268b7 269
089f0d45
MH
270#define TARGET_READ_PC(pid) d10v_read_pc (pid)
271#define TARGET_WRITE_PC(val,pid) d10v_write_pc (val, pid)
61e5b759
MH
272#define TARGET_READ_FP() d10v_read_sp ()
273#define TARGET_WRITE_FP(val) d10v_write_sp (val)
274#define TARGET_READ_SP() d10v_read_sp ()
275#define TARGET_WRITE_SP(val) d10v_write_sp (val)
d266afa9 276
d266afa9
MM
277/* Number of bits in the appropriate type */
278#define TARGET_INT_BIT (2 * TARGET_CHAR_BIT)
279#define TARGET_PTR_BIT (2 * TARGET_CHAR_BIT)
280#define TARGET_DOUBLE_BIT (4 * TARGET_CHAR_BIT)
281#define TARGET_LONG_DOUBLE_BIT (8 * TARGET_CHAR_BIT)
This page took 0.107589 seconds and 4 git commands to generate.