2002-11-13 Andrew Cagney <cagney@redhat.com>
[deliverable/binutils-gdb.git] / gdb / z8k-tdep.c
CommitLineData
c906108c 1/* Target-machine dependent code for Zilog Z8000, for GDB.
cda5a58a
AC
2
3 Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
4 2002 Free Software Foundation, Inc.
c906108c 5
c5aa993b 6 This file is part of GDB.
c906108c 7
c5aa993b
JM
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
c906108c 12
c5aa993b
JM
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
c906108c 17
c5aa993b
JM
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
c906108c
SS
22
23/*
c5aa993b
JM
24 Contributed by Steve Chamberlain
25 sac@cygnus.com
c906108c
SS
26 */
27
28#include "defs.h"
29#include "frame.h"
c906108c
SS
30#include "symtab.h"
31#include "gdbcmd.h"
32#include "gdbtypes.h"
33#include "dis-asm.h"
34#include "gdbcore.h"
4e052eda 35#include "regcache.h"
c906108c 36
d4f3574e
SS
37#include "value.h" /* For read_register() */
38
39
40static int read_memory_pointer (CORE_ADDR x);
c906108c
SS
41
42/* Return the saved PC from this frame.
43
44 If the frame has a memory copy of SRP_REGNUM, use that. If not,
45 just use the register SRP_REGNUM itself. */
46
47CORE_ADDR
fba45db2 48z8k_frame_saved_pc (struct frame_info *frame)
c906108c
SS
49{
50 return read_memory_pointer (frame->frame + (BIG ? 4 : 2));
51}
52
53#define IS_PUSHL(x) (BIG ? ((x & 0xfff0) == 0x91e0):((x & 0xfff0) == 0x91F0))
54#define IS_PUSHW(x) (BIG ? ((x & 0xfff0) == 0x93e0):((x & 0xfff0)==0x93f0))
55#define IS_MOVE_FP(x) (BIG ? x == 0xa1ea : x == 0xa1fa)
56#define IS_MOV_SP_FP(x) (BIG ? x == 0x94ea : x == 0x0d76)
57#define IS_SUB2_SP(x) (x==0x1b87)
58#define IS_MOVK_R5(x) (x==0x7905)
59#define IS_SUB_SP(x) ((x & 0xffff) == 0x020f)
60#define IS_PUSH_FP(x) (BIG ? (x == 0x93ea) : (x == 0x93fa))
61
62/* work out how much local space is on the stack and
63 return the pc pointing to the first push */
64
65static CORE_ADDR
fba45db2 66skip_adjust (CORE_ADDR pc, int *size)
c906108c
SS
67{
68 *size = 0;
69
70 if (IS_PUSH_FP (read_memory_short (pc))
71 && IS_MOV_SP_FP (read_memory_short (pc + 2)))
72 {
73 /* This is a function with an explict frame pointer */
74 pc += 4;
75 *size += 2; /* remember the frame pointer */
76 }
77
78 /* remember any stack adjustment */
79 if (IS_SUB_SP (read_memory_short (pc)))
80 {
81 *size += read_memory_short (pc + 2);
82 pc += 4;
83 }
84 return pc;
85}
86
a14ed312 87static CORE_ADDR examine_frame (CORE_ADDR, CORE_ADDR * regs, CORE_ADDR);
c906108c 88static CORE_ADDR
fba45db2 89examine_frame (CORE_ADDR pc, CORE_ADDR *regs, CORE_ADDR sp)
c906108c
SS
90{
91 int w = read_memory_short (pc);
92 int offset = 0;
93 int regno;
94
95 for (regno = 0; regno < NUM_REGS; regno++)
96 regs[regno] = 0;
97
98 while (IS_PUSHW (w) || IS_PUSHL (w))
99 {
100 /* work out which register is being pushed to where */
101 if (IS_PUSHL (w))
102 {
103 regs[w & 0xf] = offset;
104 regs[(w & 0xf) + 1] = offset + 2;
105 offset += 4;
106 }
107 else
108 {
109 regs[w & 0xf] = offset;
110 offset += 2;
111 }
112 pc += 2;
113 w = read_memory_short (pc);
114 }
115
116 if (IS_MOVE_FP (w))
117 {
118 /* We know the fp */
119
120 }
121 else if (IS_SUB_SP (w))
122 {
123 /* Subtracting a value from the sp, so were in a function
c5aa993b
JM
124 which needs stack space for locals, but has no fp. We fake up
125 the values as if we had an fp */
c906108c
SS
126 regs[FP_REGNUM] = sp;
127 }
128 else
129 {
130 /* This one didn't have an fp, we'll fake it up */
131 regs[SP_REGNUM] = sp;
132 }
133 /* stack pointer contains address of next frame */
c5aa993b 134 /* regs[fp_regnum()] = fp; */
c906108c
SS
135 regs[SP_REGNUM] = sp;
136 return pc;
137}
138
139CORE_ADDR
fba45db2 140z8k_skip_prologue (CORE_ADDR start_pc)
c906108c
SS
141{
142 CORE_ADDR dummy[NUM_REGS];
143
144 return examine_frame (start_pc, dummy, 0);
145}
146
147CORE_ADDR
fba45db2 148z8k_addr_bits_remove (CORE_ADDR addr)
c906108c
SS
149{
150 return (addr & PTR_MASK);
151}
152
d4f3574e
SS
153static int
154read_memory_pointer (CORE_ADDR x)
c906108c
SS
155{
156 return read_memory_integer (ADDR_BITS_REMOVE (x), BIG ? 4 : 2);
157}
158
159CORE_ADDR
fba45db2 160z8k_frame_chain (struct frame_info *thisframe)
c906108c 161{
c906108c
SS
162 if (!inside_entry_file (thisframe->pc))
163 {
164 return read_memory_pointer (thisframe->frame);
165 }
166 return 0;
167}
168
169void
fba45db2 170init_frame_pc (void)
c906108c 171{
e1e9e218 172 internal_error (__FILE__, __LINE__, "failed internal consistency check");
c906108c
SS
173}
174
175/* Put here the code to store, into a struct frame_saved_regs,
176 the addresses of the saved registers of frame described by FRAME_INFO.
177 This includes special registers such as pc and fp saved in special
178 ways in the stack frame. sp is even more special:
179 the address we return for it IS the sp for the next frame. */
180
181void
fba45db2 182z8k_frame_init_saved_regs (struct frame_info *frame_info)
c906108c
SS
183{
184 CORE_ADDR pc;
185 int w;
186
187 frame_saved_regs_zalloc (frame_info);
188 pc = get_pc_function_start (frame_info->pc);
189
190 /* wander down the instruction stream */
191 examine_frame (pc, frame_info->saved_regs, frame_info->frame);
192
193}
194
195void
fba45db2 196z8k_push_dummy_frame (void)
c906108c 197{
e1e9e218 198 internal_error (__FILE__, __LINE__, "failed internal consistency check");
c906108c
SS
199}
200
201int
fba45db2 202gdb_print_insn_z8k (bfd_vma memaddr, disassemble_info *info)
c906108c
SS
203{
204 if (BIG)
205 return print_insn_z8001 (memaddr, info);
206 else
207 return print_insn_z8002 (memaddr, info);
208}
209
210/* Fetch the instruction at ADDR, returning 0 if ADDR is beyond LIM or
211 is not the address of a valid instruction, the address of the next
212 instruction beyond ADDR otherwise. *PWORD1 receives the first word
c5aa993b 213 of the instruction. */
c906108c
SS
214
215CORE_ADDR
fba45db2 216NEXT_PROLOGUE_INSN (CORE_ADDR addr, CORE_ADDR lim, short *pword1)
c906108c
SS
217{
218 char buf[2];
219 if (addr < lim + 8)
220 {
221 read_memory (addr, buf, 2);
222 *pword1 = extract_signed_integer (buf, 2);
223
224 return addr + 2;
225 }
226 return 0;
227}
228
229#if 0
230/* Put here the code to store, into a struct frame_saved_regs,
231 the addresses of the saved registers of frame described by FRAME_INFO.
232 This includes special registers such as pc and fp saved in special
233 ways in the stack frame. sp is even more special:
234 the address we return for it IS the sp for the next frame.
235
236 We cache the result of doing this in the frame_cache_obstack, since
237 it is fairly expensive. */
238
239void
fba45db2 240frame_find_saved_regs (struct frame_info *fip, struct frame_saved_regs *fsrp)
c906108c
SS
241{
242 int locals;
243 CORE_ADDR pc;
244 CORE_ADDR adr;
245 int i;
246
247 memset (fsrp, 0, sizeof *fsrp);
248
249 pc = skip_adjust (get_pc_function_start (fip->pc), &locals);
250
251 {
252 adr = FRAME_FP (fip) - locals;
253 for (i = 0; i < 8; i++)
254 {
255 int word = read_memory_short (pc);
256
257 pc += 2;
258 if (IS_PUSHL (word))
259 {
260 fsrp->regs[word & 0xf] = adr;
261 fsrp->regs[(word & 0xf) + 1] = adr - 2;
262 adr -= 4;
263 }
264 else if (IS_PUSHW (word))
265 {
266 fsrp->regs[word & 0xf] = adr;
267 adr -= 2;
268 }
269 else
270 break;
271 }
272
273 }
274
275 fsrp->regs[PC_REGNUM] = fip->frame + 4;
276 fsrp->regs[FP_REGNUM] = fip->frame;
277
278}
279#endif
280
281int
d4f3574e 282z8k_saved_pc_after_call (struct frame_info *frame)
c906108c 283{
c5aa993b 284 return ADDR_BITS_REMOVE
c906108c
SS
285 (read_memory_integer (read_register (SP_REGNUM), PTR_SIZE));
286}
287
288
289void
fba45db2 290extract_return_value (struct type *type, char *regbuf, char *valbuf)
c906108c
SS
291{
292 int b;
293 int len = TYPE_LENGTH (type);
294
295 for (b = 0; b < len; b += 2)
296 {
297 int todo = len - b;
298
299 if (todo > 2)
300 todo = 2;
301 memcpy (valbuf + b, regbuf + b, todo);
302 }
303}
304
305void
fba45db2 306write_return_value (struct type *type, char *valbuf)
c906108c
SS
307{
308 int reg;
309 int len;
310
311 for (len = 0; len < TYPE_LENGTH (type); len += 2)
73937e03
AC
312 deprecated_write_register_bytes (REGISTER_BYTE (len / 2 + 2),
313 valbuf + len, 2);
c906108c
SS
314}
315
316void
fba45db2 317store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
c906108c
SS
318{
319 write_register (2, addr);
320}
321
322
0bdd672b 323static void
fba45db2 324z8k_print_register_hook (int regno)
c906108c
SS
325{
326 if ((regno & 1) == 0 && regno < 16)
327 {
df94e18a 328 unsigned char l[4];
c906108c 329
df94e18a
AC
330 frame_register_read (selected_frame, regno, l + 0);
331 frame_register_read (selected_frame, regno + 1, l + 2);
c906108c 332 printf_unfiltered ("\t");
df94e18a 333 printf_unfiltered ("0x%02x%02x%02x%02x", l[0], l[1], l[2], l[3]);
c906108c
SS
334 }
335
336 if ((regno & 3) == 0 && regno < 16)
337 {
df94e18a 338 unsigned char l[8];
c906108c 339
df94e18a
AC
340 frame_register_read (selected_frame, regno, l + 0);
341 frame_register_read (selected_frame, regno + 1, l + 2);
342 frame_register_read (selected_frame, regno + 2, l + 4);
343 frame_register_read (selected_frame, regno + 3, l + 6);
c906108c
SS
344
345 printf_unfiltered ("\t");
df94e18a
AC
346 printf_unfiltered ("0x%02x%02x%02x%02x%02x%02x%02x%02x",
347 l[0], l[1], l[2], l[3], l[4], l[5], l[6], l[7]);
c906108c
SS
348 }
349 if (regno == 15)
350 {
351 unsigned short rval;
352 int i;
353
cda5a58a 354 frame_register_read (selected_frame, regno, (char *) (&rval));
c906108c
SS
355
356 printf_unfiltered ("\n");
357 for (i = 0; i < 10; i += 2)
358 {
d4f3574e
SS
359 printf_unfiltered ("(sp+%d=%04x)", i,
360 (unsigned int)read_memory_short (rval + i));
c906108c
SS
361 }
362 }
0bdd672b
AC
363}
364
365static void
366z8k_print_registers_info (struct gdbarch *gdbarch,
367 struct ui_file *file,
368 struct frame_info *frame,
369 int regnum, int print_all)
370{
371 int i;
372 const int numregs = NUM_REGS + NUM_PSEUDO_REGS;
373 char *raw_buffer = alloca (MAX_REGISTER_RAW_SIZE);
374 char *virtual_buffer = alloca (MAX_REGISTER_VIRTUAL_SIZE);
375
376 for (i = 0; i < numregs; i++)
377 {
378 /* Decide between printing all regs, non-float / vector regs, or
379 specific reg. */
380 if (regnum == -1)
381 {
382 if (!print_all)
383 {
384 if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT)
385 continue;
386 if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i)))
387 continue;
388 }
389 }
390 else
391 {
392 if (i != regnum)
393 continue;
394 }
395
396 /* If the register name is empty, it is undefined for this
397 processor, so don't display anything. */
398 if (REGISTER_NAME (i) == NULL || *(REGISTER_NAME (i)) == '\0')
399 continue;
400
401 fputs_filtered (REGISTER_NAME (i), file);
402 print_spaces_filtered (15 - strlen (REGISTER_NAME (i)), file);
c906108c 403
0bdd672b
AC
404 /* Get the data in raw format. */
405 if (! frame_register_read (frame, i, raw_buffer))
406 {
407 fprintf_filtered (file, "*value not available*\n");
408 continue;
409 }
410
411 /* FIXME: cagney/2002-08-03: This code shouldn't be necessary.
412 The function frame_register_read() should have returned the
413 pre-cooked register so no conversion is necessary. */
414 /* Convert raw data to virtual format if necessary. */
415 if (REGISTER_CONVERTIBLE (i))
416 {
417 REGISTER_CONVERT_TO_VIRTUAL (i, REGISTER_VIRTUAL_TYPE (i),
418 raw_buffer, virtual_buffer);
419 }
420 else
421 {
422 memcpy (virtual_buffer, raw_buffer,
423 REGISTER_VIRTUAL_SIZE (i));
424 }
425
426 /* If virtual format is floating, print it that way, and in raw
427 hex. */
428 if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT)
429 {
430 int j;
431
432 val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
433 file, 0, 1, 0, Val_pretty_default);
434
435 fprintf_filtered (file, "\t(raw 0x");
436 for (j = 0; j < REGISTER_RAW_SIZE (i); j++)
437 {
438 int idx;
439 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
440 idx = j;
441 else
442 idx = REGISTER_RAW_SIZE (i) - 1 - j;
443 fprintf_filtered (file, "%02x", (unsigned char) raw_buffer[idx]);
444 }
445 fprintf_filtered (file, ")");
446 }
447 else
448 {
449 /* Print the register in hex. */
450 val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
451 file, 'x', 1, 0, Val_pretty_default);
452 /* If not a vector register, print it also according to its
453 natural format. */
454 if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i)) == 0)
455 {
456 fprintf_filtered (file, "\t");
457 val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
458 file, 0, 1, 0, Val_pretty_default);
459 }
460 }
461
462 /* Some z8k specific info. */
463 z8k_print_register_hook (i);
464
465 fprintf_filtered (file, "\n");
466 }
467}
468
469void
470z8k_do_registers_info (int regnum, int all)
471{
472 z8k_print_registers_info (current_gdbarch, gdb_stdout, selected_frame,
473 regnum, all);
c906108c
SS
474}
475
476void
fba45db2 477z8k_pop_frame (void)
c906108c
SS
478{
479}
480
481struct cmd_list_element *setmemorylist;
482
483void
fba45db2 484z8k_set_pointer_size (int newsize)
c906108c
SS
485{
486 static int oldsize = 0;
487
488 if (oldsize != newsize)
489 {
490 printf_unfiltered ("pointer size set to %d bits\n", newsize);
491 oldsize = newsize;
492 if (newsize == 32)
493 {
494 BIG = 1;
495 }
496 else
497 {
498 BIG = 0;
499 }
d4f3574e
SS
500 /* FIXME: This code should be using the GDBARCH framework to
501 handle changed type sizes. If this problem is ever fixed
502 (the direct reference to _initialize_gdbtypes() below
503 eliminated) then Makefile.in should be updated so that
504 z8k-tdep.c is again compiled with -Werror. */
c906108c
SS
505 _initialize_gdbtypes ();
506 }
507}
508
509static void
fba45db2 510segmented_command (char *args, int from_tty)
c906108c
SS
511{
512 z8k_set_pointer_size (32);
513}
514
515static void
fba45db2 516unsegmented_command (char *args, int from_tty)
c906108c
SS
517{
518 z8k_set_pointer_size (16);
519}
520
521static void
fba45db2 522set_memory (char *args, int from_tty)
c906108c
SS
523{
524 printf_unfiltered ("\"set memory\" must be followed by the name of a memory subcommand.\n");
525 help_list (setmemorylist, "set memory ", -1, gdb_stdout);
526}
527
528void
fba45db2 529_initialize_z8ktdep (void)
c906108c
SS
530{
531 tm_print_insn = gdb_print_insn_z8k;
532
533 add_prefix_cmd ("memory", no_class, set_memory,
534 "set the memory model", &setmemorylist, "set memory ", 0,
535 &setlist);
536 add_cmd ("segmented", class_support, segmented_command,
537 "Set segmented memory model.", &setmemorylist);
538 add_cmd ("unsegmented", class_support, unsegmented_command,
539 "Set unsegmented memory model.", &setmemorylist);
540
541}
This page took 0.317924 seconds and 4 git commands to generate.