]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/tic80-tdep.c
import gdb-1999-07-07 post reformat
[thirdparty/binutils-gdb.git] / gdb / tic80-tdep.c
CommitLineData
e49d4fa6
SS
1/* Target-dependent code for the TI TMS320C80 (MVP) for GDB, the GNU debugger.
2 Copyright 1996, Free Software Foundation, Inc.
3
c5aa993b 4 This file is part of GDB.
e49d4fa6 5
c5aa993b
JM
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.
e49d4fa6 10
c5aa993b
JM
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.
e49d4fa6 15
c5aa993b
JM
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. */
e49d4fa6
SS
20
21#include "defs.h"
22#include "value.h"
23#include "frame.h"
24#include "inferior.h"
25#include "obstack.h"
26#include "target.h"
27#include "bfd.h"
28#include "gdb_string.h"
29#include "gdbcore.h"
30#include "symfile.h"
31
32/* Function: frame_find_saved_regs
33 Return the frame_saved_regs structure for the frame.
34 Doesn't really work for dummy frames, but it does pass back
35 an empty frame_saved_regs, so I guess that's better than total failure */
36
c5aa993b 37void
e49d4fa6
SS
38tic80_frame_find_saved_regs (fi, regaddr)
39 struct frame_info *fi;
40 struct frame_saved_regs *regaddr;
41{
42 memcpy (regaddr, &fi->fsr, sizeof (struct frame_saved_regs));
43}
44
45/* Function: skip_prologue
46 Find end of function prologue. */
47
48CORE_ADDR
49tic80_skip_prologue (pc)
50 CORE_ADDR pc;
51{
52 CORE_ADDR func_addr, func_end;
53 struct symtab_and_line sal;
54
55 /* See what the symbol table says */
56
57 if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
58 {
59 sal = find_pc_line (func_addr, 0);
60
61 if (sal.line != 0 && sal.end < func_end)
62 return sal.end;
63 else
64 /* Either there's no line info, or the line after the prologue is after
65 the end of the function. In this case, there probably isn't a
66 prologue. */
67 return pc;
68 }
69
70 /* We can't find the start of this function, so there's nothing we can do. */
71 return pc;
72}
73
74/* Function: tic80_scan_prologue
75 This function decodes the target function prologue to determine:
c5aa993b
JM
76 1) the size of the stack frame
77 2) which registers are saved on it
78 3) the offsets of saved regs
79 4) the frame size
e49d4fa6
SS
80 This information is stored in the "extra" fields of the frame_info. */
81
82static void
83tic80_scan_prologue (fi)
84 struct frame_info *fi;
85{
86 struct symtab_and_line sal;
87 CORE_ADDR prologue_start, prologue_end, current_pc;
88
89 /* Assume there is no frame until proven otherwise. */
90 fi->framereg = SP_REGNUM;
91 fi->framesize = 0;
92 fi->frameoffset = 0;
93
94 /* this code essentially duplicates skip_prologue,
95 but we need the start address below. */
96
97 if (find_pc_partial_function (fi->pc, NULL, &prologue_start, &prologue_end))
98 {
99 sal = find_pc_line (prologue_start, 0);
100
c5aa993b 101 if (sal.line == 0) /* no line info, use current PC */
e49d4fa6
SS
102 if (prologue_start != entry_point_address ())
103 prologue_end = fi->pc;
104 else
c5aa993b 105 return; /* _start has no frame or prologue */
e49d4fa6 106 else if (sal.end < prologue_end) /* next line begins after fn end */
c5aa993b 107 prologue_end = sal.end; /* (probably means no prologue) */
e49d4fa6
SS
108 }
109 else
110/* FIXME */
c5aa993b
JM
111 prologue_end = prologue_start + 40; /* We're in the boondocks: allow for */
112 /* 16 pushes, an add, and "mv fp,sp" */
e49d4fa6
SS
113
114 prologue_end = min (prologue_end, fi->pc);
115
116 /* Now search the prologue looking for instructions that set up the
117 frame pointer, adjust the stack pointer, and save registers. */
118
119 for (current_pc = prologue_start; current_pc < prologue_end; current_pc += 4)
120 {
121 unsigned int insn;
122 int regno;
123 int offset = 0;
124
125 insn = read_memory_unsigned_integer (current_pc, 4);
126
127 if ((insn & 0x301000) == 0x301000) /* Long immediate? */
128/* FIXME - set offset for long immediate instructions */
129 current_pc += 4;
130 else
131 {
c5aa993b
JM
132 offset = insn & 0x7fff; /* extract 15-bit offset */
133 if (offset & 0x4000) /* if negative, sign-extend */
e49d4fa6
SS
134 offset = -(0x8000 - offset);
135 }
136
137 if ((insn & 0x7fd0000) == 0x590000) /* st.{w,d} reg, xx(r1) */
138 {
139 regno = ((insn >> 27) & 0x1f);
140 fi->fsr.regs[regno] = offset;
c5aa993b
JM
141 if (insn & 0x8000) /* 64-bit store (st.d)? */
142 fi->fsr.regs[regno + 1] = offset + 4;
e49d4fa6 143 }
c5aa993b 144 else if ((insn & 0xffff8000) == 0x086c8000) /* addu xx, r1, r1 */
e49d4fa6 145 fi->framesize = -offset;
c5aa993b 146 else if ((insn & 0xffff8000) == 0xf06c8000) /* addu xx, r1, r30 */
e49d4fa6 147 {
c5aa993b 148 fi->framereg = FP_REGNUM; /* fp is now valid */
e49d4fa6 149 fi->frameoffset = offset;
c5aa993b 150 break; /* end of stack adjustments */
e49d4fa6 151 }
c5aa993b 152 else if (insn == 0xf03b2001) /* addu r1, r0, r30 */
e49d4fa6 153 {
c5aa993b 154 fi->framereg = FP_REGNUM; /* fp is now valid */
e49d4fa6 155 fi->frameoffset = 0;
c5aa993b 156 break; /* end of stack adjustments */
e49d4fa6
SS
157 }
158 else
159/* FIXME - handle long immediate instructions */
c5aa993b 160 break; /* anything else isn't prologue */
e49d4fa6
SS
161 }
162}
163
164/* Function: init_extra_frame_info
165 This function actually figures out the frame address for a given pc and
166 sp. This is tricky on the c80 because we sometimes don't use an explicit
167 frame pointer, and the previous stack pointer isn't necessarily recorded
168 on the stack. The only reliable way to get this info is to
169 examine the prologue. */
170
171void
172tic80_init_extra_frame_info (fi)
173 struct frame_info *fi;
174{
175 int reg;
176
177 if (fi->next)
178 fi->pc = FRAME_SAVED_PC (fi->next);
179
180 /* Because zero is a valid register offset relative to SP, we initialize
181 the offsets to -1 to indicate unused entries. */
182 for (reg = 0; reg < NUM_REGS; reg++)
183 fi->fsr.regs[reg] = -1;
184
185 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
186 {
187 /* We need to setup fi->frame here because run_stack_dummy gets it wrong
c5aa993b 188 by assuming it's always FP. */
e49d4fa6
SS
189 fi->frame = generic_read_register_dummy (fi->pc, fi->frame, SP_REGNUM);
190 fi->framesize = 0;
191 fi->frameoffset = 0;
192 return;
193 }
c5aa993b 194 else
e49d4fa6
SS
195 {
196 tic80_scan_prologue (fi);
197
c5aa993b 198 if (!fi->next) /* this is the innermost frame? */
e49d4fa6 199 fi->frame = read_register (fi->framereg);
c5aa993b
JM
200 else
201 /* not the innermost frame */
e49d4fa6 202 /* If this function uses FP as the frame register, and the function
c5aa993b
JM
203 it called saved the FP, get the saved FP. */ if (fi->framereg == FP_REGNUM &&
204 fi->next->fsr.regs[FP_REGNUM] != (unsigned) -1)
205 fi->frame = read_memory_integer (fi->next->fsr.regs[FP_REGNUM], 4);
e49d4fa6
SS
206
207 /* Convert SP-relative offsets of saved registers to real addresses. */
208 for (reg = 0; reg < NUM_REGS; reg++)
209 if (fi->fsr.regs[reg] == (unsigned) -1)
c5aa993b
JM
210 fi->fsr.regs[reg] = 0; /* unused entry */
211 else
212 fi->fsr.regs[reg] += fi->frame - fi->frameoffset;
e49d4fa6
SS
213 }
214}
215
216/* Function: find_callers_reg
217 Find REGNUM on the stack. Otherwise, it's in an active register. One thing
218 we might want to do here is to check REGNUM against the clobber mask, and
219 somehow flag it as invalid if it isn't saved on the stack somewhere. This
220 would provide a graceful failure mode when trying to get the value of
221 caller-saves registers for an inner frame. */
222
223CORE_ADDR
224tic80_find_callers_reg (fi, regnum)
225 struct frame_info *fi;
226 int regnum;
227{
228 for (; fi; fi = fi->next)
229 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
230 return generic_read_register_dummy (fi->pc, fi->frame, regnum);
231 else if (fi->fsr.regs[regnum] != 0)
c5aa993b
JM
232 return read_memory_integer (fi->fsr.regs[regnum],
233 REGISTER_RAW_SIZE (regnum));
e49d4fa6
SS
234 return read_register (regnum);
235}
236
237/* Function: frame_chain
238 Given a GDB frame, determine the address of the calling function's frame.
239 This will be used to create a new GDB frame struct, and then
240 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
241 For c80, we save the frame size when we initialize the frame_info. */
242
243CORE_ADDR
244tic80_frame_chain (fi)
245 struct frame_info *fi;
246{
247 CORE_ADDR fn_start, callers_pc, fp;
248
249 /* is this a dummy frame? */
c5aa993b
JM
250 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
251 return fi->frame; /* dummy frame same as caller's frame */
e49d4fa6
SS
252
253 /* is caller-of-this a dummy frame? */
c5aa993b 254 callers_pc = FRAME_SAVED_PC (fi); /* find out who called us: */
e49d4fa6 255 fp = tic80_find_callers_reg (fi, FP_REGNUM);
c5aa993b
JM
256 if (PC_IN_CALL_DUMMY (callers_pc, fp, fp))
257 return fp; /* dummy frame's frame may bear no relation to ours */
e49d4fa6
SS
258
259 if (find_pc_partial_function (fi->pc, 0, &fn_start, 0))
260 if (fn_start == entry_point_address ())
c5aa993b 261 return 0; /* in _start fn, don't chain further */
e49d4fa6
SS
262
263 if (fi->framereg == FP_REGNUM)
264 return tic80_find_callers_reg (fi, FP_REGNUM);
265 else
266 return fi->frame + fi->framesize;
267}
268
269/* Function: pop_frame
270 Discard from the stack the innermost frame,
271 restoring all saved registers. */
272
273struct frame_info *
274tic80_pop_frame (frame)
275 struct frame_info *frame;
276{
277 int regnum;
278
279 if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
280 generic_pop_dummy_frame ();
281 else
282 {
283 for (regnum = 0; regnum < NUM_REGS; regnum++)
284 if (frame->fsr.regs[regnum] != 0)
c5aa993b 285 write_register (regnum,
e49d4fa6
SS
286 read_memory_integer (frame->fsr.regs[regnum], 4));
287
288 write_register (PC_REGNUM, FRAME_SAVED_PC (frame));
289 write_register (SP_REGNUM, read_register (FP_REGNUM));
290#if 0
291 if (read_register (PSW_REGNUM) & 0x80)
292 write_register (SPU_REGNUM, read_register (SP_REGNUM));
293 else
294 write_register (SPI_REGNUM, read_register (SP_REGNUM));
295#endif
296 }
297 flush_cached_frames ();
298 return NULL;
299}
300
301/* Function: frame_saved_pc
302 Find the caller of this frame. We do this by seeing if LR_REGNUM is saved
303 in the stack anywhere, otherwise we get it from the registers. */
304
305CORE_ADDR
306tic80_frame_saved_pc (fi)
307 struct frame_info *fi;
308{
c5aa993b 309 if (PC_IN_CALL_DUMMY (fi->pc, fi->frame, fi->frame))
e49d4fa6
SS
310 return generic_read_register_dummy (fi->pc, fi->frame, PC_REGNUM);
311 else
312 return tic80_find_callers_reg (fi, LR_REGNUM);
313}
314
315/* Function: tic80_push_return_address (pc, sp)
316 Set up the return address for the inferior function call.
317 Necessary for targets that don't actually execute a JSR/BSR instruction
318 (ie. when using an empty CALL_DUMMY) */
319
320CORE_ADDR
321tic80_push_return_address (pc, sp)
322 CORE_ADDR pc;
323 CORE_ADDR sp;
324{
325 write_register (LR_REGNUM, CALL_DUMMY_ADDRESS ());
326 return sp;
327}
328
329
330/* Function: push_arguments
331 Setup the function arguments for calling a function in the inferior.
332
333 On the TI C80 architecture, there are six register pairs (R2/R3 to R12/13)
334 which are dedicated for passing function arguments. Up to the first six
335 arguments (depending on size) may go into these registers.
336 The rest go on the stack.
337
338 Arguments that are smaller than 4 bytes will still take up a whole
339 register or a whole 32-bit word on the stack, and will be
340 right-justified in the register or the stack word. This includes
341 chars, shorts, and small aggregate types.
c5aa993b 342
e49d4fa6
SS
343 Arguments that are four bytes or less in size are placed in the
344 even-numbered register of a register pair, and the odd-numbered
345 register is not used.
346
347 Arguments of 8 bytes size (such as floating point doubles) are placed
348 in a register pair. The least significant 32-bit word is placed in
349 the even-numbered register, and the most significant word in the
350 odd-numbered register.
351
352 Aggregate types with sizes between 4 and 8 bytes are passed
353 entirely on the stack, and are left-justified within the
354 double-word (as opposed to aggregates smaller than 4 bytes
355 which are right-justified).
356
357 Aggregates of greater than 8 bytes are first copied onto the stack,
358 and then a pointer to the copy is passed in the place of the normal
359 argument (either in a register if available, or on the stack).
360
361 Functions that must return an aggregate type can return it in the
362 normal return value registers (R2 and R3) if its size is 8 bytes or
363 less. For larger return values, the caller must allocate space for
364 the callee to copy the return value to. A pointer to this space is
365 passed as an implicit first argument, always in R0. */
366
367CORE_ADDR
368tic80_push_arguments (nargs, args, sp, struct_return, struct_addr)
369 int nargs;
370 value_ptr *args;
371 CORE_ADDR sp;
372 unsigned char struct_return;
373 CORE_ADDR struct_addr;
374{
375 int stack_offset, stack_alloc;
376 int argreg;
377 int argnum;
378 struct type *type;
379 CORE_ADDR regval;
380 char *val;
381 char valbuf[4];
382 int len;
383 int odd_sized_struct;
384 int is_struct;
385
386 /* first force sp to a 4-byte alignment */
387 sp = sp & ~3;
388
c5aa993b 389 argreg = ARG0_REGNUM;
e49d4fa6
SS
390 /* The "struct return pointer" pseudo-argument goes in R0 */
391 if (struct_return)
c5aa993b
JM
392 write_register (argreg++, struct_addr);
393
e49d4fa6
SS
394 /* Now make sure there's space on the stack */
395 for (argnum = 0, stack_alloc = 0;
396 argnum < nargs; argnum++)
c5aa993b
JM
397 stack_alloc += ((TYPE_LENGTH (VALUE_TYPE (args[argnum])) + 3) & ~3);
398 sp -= stack_alloc; /* make room on stack for args */
399
400
e49d4fa6
SS
401 /* Now load as many as possible of the first arguments into
402 registers, and push the rest onto the stack. There are 16 bytes
403 in four registers available. Loop thru args from first to last. */
c5aa993b 404
e49d4fa6
SS
405 argreg = ARG0_REGNUM;
406 for (argnum = 0, stack_offset = 0; argnum < nargs; argnum++)
407 {
408 type = VALUE_TYPE (args[argnum]);
c5aa993b 409 len = TYPE_LENGTH (type);
e49d4fa6
SS
410 memset (valbuf, 0, sizeof (valbuf));
411 val = (char *) VALUE_CONTENTS (args[argnum]);
c5aa993b 412
e49d4fa6
SS
413/* FIXME -- tic80 can take doubleword arguments in register pairs */
414 is_struct = (type->code == TYPE_CODE_STRUCT);
415 odd_sized_struct = 0;
416
c5aa993b 417 if (!is_struct)
e49d4fa6
SS
418 {
419 if (len < 4)
c5aa993b 420 { /* value gets right-justified in the register or stack word */
e49d4fa6
SS
421 memcpy (valbuf + (4 - len), val, len);
422 val = valbuf;
423 }
424 if (len > 4 && (len & 3) != 0)
c5aa993b 425 odd_sized_struct = 1; /* such structs go entirely on stack */
e49d4fa6
SS
426 }
427 else
428 {
429 /* Structs are always passed by reference. */
430 write_register (argreg, sp + stack_offset);
c5aa993b 431 argreg++;
e49d4fa6
SS
432 }
433
434 while (len > 0)
c5aa993b
JM
435 {
436 if (is_struct || argreg > ARGLAST_REGNUM || odd_sized_struct)
437 { /* must go on the stack */
438 write_memory (sp + stack_offset, val, 4);
439 stack_offset += 4;
440 }
441 /* NOTE WELL!!!!! This is not an "else if" clause!!!
442 That's because some things get passed on the stack
443 AND in the registers! */
444 if (!is_struct && argreg <= ARGLAST_REGNUM)
445 { /* there's room in a register */
446 regval = extract_address (val, REGISTER_RAW_SIZE (argreg));
447 write_register (argreg, regval);
e49d4fa6 448 argreg += 2; /* FIXME -- what about doubleword args? */
c5aa993b
JM
449 }
450 /* Store the value 4 bytes at a time. This means that things
451 larger than 4 bytes may go partly in registers and partly
452 on the stack. */
453 len -= REGISTER_RAW_SIZE (argreg);
454 val += REGISTER_RAW_SIZE (argreg);
455 }
e49d4fa6
SS
456 }
457 return sp;
458}
459
460/* Function: tic80_write_sp
461 Because SP is really a read-only register that mirrors either SPU or SPI,
462 we must actually write one of those two as well, depending on PSW. */
463
464void
465tic80_write_sp (val)
466 CORE_ADDR val;
467{
468#if 0
469 unsigned long psw = read_register (PSW_REGNUM);
470
c5aa993b 471 if (psw & 0x80) /* stack mode: user or interrupt */
e49d4fa6
SS
472 write_register (SPU_REGNUM, val);
473 else
474 write_register (SPI_REGNUM, val);
475#endif
476 write_register (SP_REGNUM, val);
477}
478
479void
480_initialize_tic80_tdep ()
481{
482 tm_print_insn = print_insn_tic80;
483}