OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [gdb/] [config/] [d30v/] [tm-d30v.h] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 578 markom
/* Target-specific definition for the Mitsubishi D30V
2
   Copyright 1997, 1998, 1999, 2000 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., 59 Temple Place - Suite 330,
19
   Boston, MA 02111-1307, USA.  */
20
 
21
#ifndef TM_D30V_H
22
#define TM_D30V_H
23
 
24
#include "regcache.h"
25
 
26
/* Define the bit, byte, and word ordering of the machine.  */
27
 
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
/* these are the addresses the D30V-EVA board maps data */
36
/* and instruction memory to. */
37
 
38
#define DMEM_START      0x20000000
39
#define IMEM_START      0x00000000      /* was 0x10000000 */
40
#define STACK_START     0x20007ffe
41
 
42
/* Forward decls for prototypes */
43
struct frame_info;
44
struct frame_saved_regs;
45
struct type;
46
struct value;
47
 
48
/* Advance PC across any function entry prologue instructions
49
   to reach some "real" code.  */
50
 
51
extern CORE_ADDR d30v_skip_prologue (CORE_ADDR);
52
#define SKIP_PROLOGUE(ip) (d30v_skip_prologue (ip))
53
 
54
 
55
/* Stack grows downward.  */
56
#define INNER_THAN(lhs,rhs) ((lhs) < (rhs))
57
 
58
/* for a breakpoint, use "dbt || nop" */
59
#define BREAKPOINT {0x00, 0xb0, 0x00, 0x00,\
60
                    0x00, 0xf0, 0x00, 0x00}
61
 
62
/* If your kernel resets the pc after the trap happens you may need to
63
   define this before including this file.  */
64
#define DECR_PC_AFTER_BREAK 0
65
 
66
#define REGISTER_NAMES \
67
{   "r0",  "r1",  "r2",  "r3",  "r4",  "r5",  "r6",  "r7",      \
68
    "r8",  "r9",  "r10", "r11", "r12", "r13", "r14", "r15",     \
69
    "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",     \
70
    "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",     \
71
    "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39",     \
72
    "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47",     \
73
    "r48", "r49", "r50", "r51", "r52", "r53", "r54", "r55",     \
74
    "r56", "r57", "r58", "r59", "r60", "r61", "r62", "r63",     \
75
    "spi", "spu", \
76
    "psw", "bpsw", "pc", "bpc", "dpsw", "dpc", "cr6", "rpt_c",  \
77
    "rpt_s", "rpt_e", "mod_s", "mod_e", "cr12", "cr13", "iba", "eit_vb",\
78
    "int_s", "int_m", "a0", "a1" \
79
    }
80
 
81
#define NUM_REGS 86
82
 
83
/* Register numbers of various important registers.
84
   Note that some of these values are "real" register numbers,
85
   and correspond to the general registers of the machine,
86
   and some are "phony" register numbers which are too large
87
   to be actual register numbers as far as the user is concerned
88
   but do serve to get the desired values when passed to read_register.  */
89
 
90
#define R0_REGNUM       0
91
#define FP_REGNUM       61
92
#define LR_REGNUM       62
93
#define SP_REGNUM       63
94
#define SPI_REGNUM      64      /* Interrupt stack pointer */
95
#define SPU_REGNUM      65      /* User stack pointer */
96
#define CREGS_START     66
97
 
98
#define PSW_REGNUM      (CREGS_START + 0)       /* psw, bpsw, or dpsw??? */
99
#define     PSW_SM (((unsigned long)0x80000000) >> 0)   /* Stack mode: 0/SPI */
100
                                                        /*             1/SPU */
101
#define     PSW_EA (((unsigned long)0x80000000) >> 2)   /* Execution status */
102
#define     PSW_DB (((unsigned long)0x80000000) >> 3)   /* Debug mode */
103
#define     PSW_DS (((unsigned long)0x80000000) >> 4)   /* Debug EIT status */
104
#define     PSW_IE (((unsigned long)0x80000000) >> 5)   /* Interrupt enable */
105
#define     PSW_RP (((unsigned long)0x80000000) >> 6)   /* Repeat enable */
106
#define     PSW_MD (((unsigned long)0x80000000) >> 7)   /* Modulo enable */
107
#define     PSW_F0 (((unsigned long)0x80000000) >> 17)  /* F0 flag */
108
#define     PSW_F1 (((unsigned long)0x80000000) >> 19)  /* F1 flag */
109
#define     PSW_F2 (((unsigned long)0x80000000) >> 21)  /* F2 flag */
110
#define     PSW_F3 (((unsigned long)0x80000000) >> 23)  /* F3 flag */
111
#define     PSW_S  (((unsigned long)0x80000000) >> 25)  /* Saturation flag */
112
#define     PSW_V  (((unsigned long)0x80000000) >> 27)  /* Overflow flag */
113
#define     PSW_VA (((unsigned long)0x80000000) >> 29)  /* Accum. overflow */
114
#define     PSW_C  (((unsigned long)0x80000000) >> 31)  /* Carry/Borrow flag */
115
 
116
#define BPSW_REGNUM     (CREGS_START + 1)       /* Backup PSW (on interrupt) */
117
#define PC_REGNUM       (CREGS_START + 2)       /* pc, bpc, or dpc??? */
118
#define BPC_REGNUM      (CREGS_START + 3)       /* Backup PC (on interrupt) */
119
#define DPSW_REGNUM     (CREGS_START + 4)       /* Backup PSW (on debug trap) */
120
#define DPC_REGNUM      (CREGS_START + 5)       /* Backup PC (on debug trap) */
121
#define RPT_C_REGNUM    (CREGS_START + 7)       /* Loop count */
122
#define RPT_S_REGNUM    (CREGS_START + 8)       /* Loop start address */
123
#define RPT_E_REGNUM    (CREGS_START + 9)       /* Loop end address */
124
#define MOD_S_REGNUM    (CREGS_START + 10)
125
#define MOD_E_REGNUM    (CREGS_START + 11)
126
#define IBA_REGNUM      (CREGS_START + 14)      /* Instruction break address */
127
#define EIT_VB_REGNUM   (CREGS_START + 15)      /* Vector base address */
128
#define INT_S_REGNUM    (CREGS_START + 16)      /* Interrupt status */
129
#define INT_M_REGNUM    (CREGS_START + 17)      /* Interrupt mask */
130
#define A0_REGNUM       84
131
#define A1_REGNUM       85
132
 
133
/* Say how much memory is needed to store a copy of the register set */
134
#define REGISTER_BYTES    ((NUM_REGS - 2) * 4 + 2 * 8)
135
 
136
/* Index within `registers' of the first byte of the space for
137
   register N.  */
138
 
139
#define REGISTER_BYTE(N)  \
140
( ((N) >= A0_REGNUM) ? ( ((N) - A0_REGNUM) * 8 + A0_REGNUM * 4 ) : ((N) * 4) )
141
 
142
/* Number of bytes of storage in the actual machine representation
143
   for register N.  */
144
 
145
#define REGISTER_RAW_SIZE(N) ( ((N) >= A0_REGNUM) ? 8 : 4 )
146
 
147
/* Number of bytes of storage in the program's representation
148
   for register N.  */
149
#define REGISTER_VIRTUAL_SIZE(N) REGISTER_RAW_SIZE(N)
150
 
151
/* Largest value REGISTER_RAW_SIZE can have.  */
152
 
153
#define MAX_REGISTER_RAW_SIZE 8
154
 
155
/* Largest value REGISTER_VIRTUAL_SIZE can have.  */
156
 
157
#define MAX_REGISTER_VIRTUAL_SIZE 8
158
 
159
/* Return the GDB type object for the "standard" data type
160
   of data in register N.  */
161
 
162
#define REGISTER_VIRTUAL_TYPE(N) \
163
( ((N) < A0_REGNUM ) ? builtin_type_long : builtin_type_long_long)
164
 
165
/* Writing to r0 is a noop (not an error or exception or anything like
166
   that, however).  */
167
 
168
#define CANNOT_STORE_REGISTER(regno) ((regno) == R0_REGNUM)
169
 
170
void d30v_do_registers_info (int regnum, int fpregs);
171
 
172
#define DO_REGISTERS_INFO d30v_do_registers_info
173
 
174
/* Store the address of the place in which to copy the structure the
175
   subroutine will return.  This is called from call_function.
176
 
177
   We store structs through a pointer passed in R2 */
178
 
179
#define STORE_STRUCT_RETURN(ADDR, SP) \
180
    { write_register (2, (ADDR));  }
181
 
182
 
183
/* Write into appropriate registers a function return value
184
   of type TYPE, given in virtual format.
185
 
186
   Things always get returned in R2/R3 */
187
 
188
#define STORE_RETURN_VALUE(TYPE,VALBUF) \
189
  write_register_bytes (REGISTER_BYTE(2), VALBUF, TYPE_LENGTH (TYPE))
190
 
191
 
192
/* Extract from an array REGBUF containing the (raw) register state
193
   the address in which a function should return its structure value,
194
   as a CORE_ADDR (or an expression that can be used as one).  */
195
#define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) (((CORE_ADDR *)(REGBUF))[2])
196
 
197
 
198
/* Define other aspects of the stack frame.
199
   we keep a copy of the worked out return pc lying around, since it
200
   is a useful bit of info */
201
 
202
#define EXTRA_FRAME_INFO \
203
    CORE_ADDR return_pc; \
204
    CORE_ADDR dummy; \
205
    int frameless; \
206
    int size;
207
 
208
#define INIT_EXTRA_FRAME_INFO(fromleaf, fi) \
209
    d30v_init_extra_frame_info(fromleaf, fi)
210
 
211
extern void d30v_init_extra_frame_info (int fromleaf, struct frame_info *fi);
212
 
213
/* A macro that tells us whether the function invocation represented
214
   by FI does not have a frame on the stack associated with it.  If it
215
   does not, FRAMELESS is set to 1, else 0.  */
216
 
217
#define FRAMELESS_FUNCTION_INVOCATION(FI) \
218
  (frameless_look_for_prologue (FI))
219
 
220
CORE_ADDR d30v_frame_chain (struct frame_info *frame);
221
#define FRAME_CHAIN(FRAME)       d30v_frame_chain(FRAME)
222
extern int d30v_frame_chain_valid (CORE_ADDR, struct frame_info *);
223
#define FRAME_CHAIN_VALID(chain, thisframe) d30v_frame_chain_valid (chain, thisframe)
224
#define FRAME_SAVED_PC(FRAME)    ((FRAME)->return_pc)
225
#define FRAME_ARGS_ADDRESS(fi)   (fi)->frame
226
#define FRAME_LOCALS_ADDRESS(fi) (fi)->frame
227
 
228
void d30v_init_frame_pc (int fromleaf, struct frame_info *prev);
229
#define INIT_FRAME_PC_FIRST(fromleaf, prev)     d30v_init_frame_pc(fromleaf, prev)
230
#define INIT_FRAME_PC(fromleaf, prev)   /* nada */
231
 
232
/* Immediately after a function call, return the saved pc.  We can't */
233
/* use frame->return_pc beause that is determined by reading R62 off the */
234
/* stack and that may not be written yet. */
235
 
236
#define SAVED_PC_AFTER_CALL(frame) (read_register(LR_REGNUM))
237
 
238
/* Set VAL to the number of args passed to frame described by FI.
239
   Can set VAL to -1, meaning no way to tell.  */
240
/* We can't tell how many args there are */
241
 
242
#define FRAME_NUM_ARGS(fi) (-1)
243
 
244
/* Return number of bytes at start of arglist that are not really args.  */
245
 
246
#define FRAME_ARGS_SKIP 0
247
 
248
 
249
/* Put here the code to store, into a struct frame_saved_regs,
250
   the addresses of the saved registers of frame described by FRAME_INFO.
251
   This includes special registers such as pc and fp saved in special
252
   ways in the stack frame.  sp is even more special:
253
   the address we return for it IS the sp for the next frame.  */
254
 
255
#define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs)         \
256
   d30v_frame_find_saved_regs(frame_info, &(frame_saved_regs))
257
 
258
extern void d30v_frame_find_saved_regs (struct frame_info *,
259
                                        struct frame_saved_regs *);
260
 
261
/* DUMMY FRAMES.  Need these to support inferior function calls.
262
   They work like this on D30V:
263
   First we set a breakpoint at 0 or __start.
264
   Then we push all the registers onto the stack.
265
   Then put the function arguments in the proper registers and set r13
266
   to our breakpoint address.
267
   Finally call the function directly.
268
   When it hits the breakpoint, clear the break point and pop the old
269
   register contents off the stack. */
270
 
271
#define CALL_DUMMY              { 0 }
272
#define PUSH_DUMMY_FRAME
273
#define CALL_DUMMY_START_OFFSET 0
274
#define CALL_DUMMY_LOCATION     AT_ENTRY_POINT
275
#define CALL_DUMMY_BREAKPOINT_OFFSET (0)
276
 
277
extern CORE_ADDR d30v_call_dummy_address (void);
278
#define CALL_DUMMY_ADDRESS() d30v_call_dummy_address()
279
 
280
#define FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p) \
281
sp = d30v_fix_call_dummy (dummyname, pc, fun, nargs, args, type, gcc_p)
282
 
283
#define PC_IN_CALL_DUMMY(pc, sp, frame_address) ( pc == IMEM_START + 4 )
284
 
285
extern CORE_ADDR d30v_fix_call_dummy (char *, CORE_ADDR, CORE_ADDR,
286
                                      int, struct value **,
287
                                      struct type *, int);
288
#define PUSH_ARGUMENTS(nargs, args, sp, struct_return, struct_addr) \
289
  (d30v_push_arguments((nargs), (args), (sp), (struct_return), (struct_addr)))
290
extern CORE_ADDR d30v_push_arguments (int, struct value **, CORE_ADDR, int,
291
                                      CORE_ADDR);
292
 
293
 
294
/* Extract from an array REGBUF containing the (raw) register state
295
   a function return value of type TYPE, and copy that, in virtual format,
296
   into VALBUF.  */
297
 
298
#define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
299
d30v_extract_return_value(TYPE, REGBUF, VALBUF)
300
extern void d30v_extract_return_value (struct type *, char *, char *);
301
 
302
 
303
/* Discard from the stack the innermost frame,
304
   restoring all saved registers.  */
305
#define POP_FRAME d30v_pop_frame();
306
extern void d30v_pop_frame (void);
307
 
308
#define REGISTER_SIZE 4
309
 
310
/* Need to handle SP special, as we need to select between spu and spi.  */
311
#if 0                           /* XXX until the simulator is fixed */
312
#define TARGET_READ_SP() ((read_register (PSW_REGNUM) & PSW_SM) \
313
                          ? read_register (SPU_REGNUM) \
314
                          : read_register (SPI_REGNUM))
315
 
316
#define TARGET_WRITE_SP(val) ((read_register (PSW_REGNUM) & PSW_SM) \
317
                          ? write_register (SPU_REGNUM, (val)) \
318
                          : write_register (SPI_REGNUM, (val)))
319
#endif
320
 
321
#define STACK_ALIGN(len)        (((len) + 7 ) & ~7)
322
 
323
/* Turn this on to cause remote-sim.c to use sim_set/clear_breakpoint. */
324
 
325
#define SIM_HAS_BREAKPOINTS
326
 
327
#endif /* TM_D30V_H */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.