1999-01-19 Fernando Nasser <fnasser@totem.to.cygnus.com>
[deliverable/binutils-gdb.git] / gdb / h8300-tdep.c
CommitLineData
1f46923f
SC
1/* Target-machine dependent code for Hitachi H8/300, for GDB.
2 Copyright (C) 1988, 1990, 1991 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
6c9638b4 18Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
1f46923f 19
ec25d19b 20/*
1f46923f 21 Contributed by Steve Chamberlain
ec25d19b 22 sac@cygnus.com
1f46923f
SC
23 */
24
400943fb 25#include "defs.h"
1f46923f
SC
26#include "frame.h"
27#include "obstack.h"
28#include "symtab.h"
7f4c8595 29#include "dis-asm.h"
a3059251
SC
30#include "gdbcmd.h"
31#include "gdbtypes.h"
f9fedc48
MA
32#include "gdbcore.h"
33#include "gdb_string.h"
34#include "value.h"
35
dc1b349d 36extern int h8300hmode, h8300smode;
a3059251 37
256b4f37
SC
38#undef NUM_REGS
39#define NUM_REGS 11
40
1f46923f 41#define UNSIGNED_SHORT(X) ((X) & 0xffff)
400943fb 42
31778db0 43#define IS_PUSH(x) ((x & 0xfff0)==0x6df0)
ec25d19b 44#define IS_PUSH_FP(x) (x == 0x6df6)
31778db0
JL
45#define IS_MOVE_FP(x) (x == 0x0d76 || x == 0x0ff6)
46#define IS_MOV_SP_FP(x) (x == 0x0d76 || x == 0x0ff6)
1f46923f 47#define IS_SUB2_SP(x) (x==0x1b87)
31778db0
JL
48#define IS_SUB4_SP(x) (x==0x1b97)
49#define IS_SUBL_SP(x) (x==0x7a37)
1f46923f 50#define IS_MOVK_R5(x) (x==0x7905)
ec25d19b 51#define IS_SUB_R5SP(x) (x==0x1957)
1ca9e7c9 52
f9fedc48
MA
53/* Local function declarations. */
54
1ca9e7c9 55static CORE_ADDR examine_prologue ();
f9fedc48 56static void set_machine_hook PARAMS ((char *filename));
1f46923f 57
dc1b349d
MS
58void h8300_frame_find_saved_regs ();
59
ec25d19b
SC
60CORE_ADDR
61h8300_skip_prologue (start_pc)
62 CORE_ADDR start_pc;
0a8f9d31 63{
ec25d19b 64 short int w;
31778db0 65 int adjust = 0;
1f46923f 66
4679717d
JL
67 /* Skip past all push and stm insns. */
68 while (1)
31778db0 69 {
4679717d
JL
70 w = read_memory_unsigned_integer (start_pc, 2);
71 /* First look for push insns. */
72 if (w == 0x0100 || w == 0x0110 || w == 0x0120 || w == 0x0130)
73 {
74 w = read_memory_unsigned_integer (start_pc + 2, 2);
75 adjust = 2;
76 }
77
78 if (IS_PUSH (w))
79 {
80 start_pc += 2 + adjust;
81 w = read_memory_unsigned_integer (start_pc, 2);
82 continue;
83 }
84 adjust = 0;
85 break;
31778db0
JL
86 }
87
4679717d
JL
88 /* Skip past a move to FP, either word or long sized */
89 w = read_memory_unsigned_integer (start_pc, 2);
90 if (w == 0x0100)
ec25d19b 91 {
4679717d
JL
92 w = read_memory_unsigned_integer (start_pc + 2, 2);
93 adjust += 2;
ec25d19b 94 }
0a8f9d31 95
ec25d19b
SC
96 if (IS_MOVE_FP (w))
97 {
4679717d 98 start_pc += 2 + adjust;
df14b38b 99 w = read_memory_unsigned_integer (start_pc, 2);
1f46923f
SC
100 }
101
4679717d
JL
102 /* Check for loading either a word constant into r5;
103 long versions are handled by the SUBL_SP below. */
ec25d19b
SC
104 if (IS_MOVK_R5 (w))
105 {
106 start_pc += 2;
df14b38b 107 w = read_memory_unsigned_integer (start_pc, 2);
ec25d19b 108 }
4679717d
JL
109
110 /* Now check for subtracting r5 from sp, word sized only. */
ec25d19b
SC
111 if (IS_SUB_R5SP (w))
112 {
4679717d 113 start_pc += 2 + adjust;
df14b38b 114 w = read_memory_unsigned_integer (start_pc, 2);
ec25d19b 115 }
4679717d
JL
116
117 /* Check for subs #2 and subs #4. */
31778db0 118 while (IS_SUB2_SP (w) || IS_SUB4_SP (w))
ec25d19b 119 {
4679717d 120 start_pc += 2 + adjust;
df14b38b 121 w = read_memory_unsigned_integer (start_pc, 2);
ec25d19b
SC
122 }
123
4679717d 124 /* Check for a 32bit subtract. */
31778db0 125 if (IS_SUBL_SP (w))
4679717d 126 start_pc += 6 + adjust;
31778db0 127
ec25d19b 128 return start_pc;
ec25d19b 129}
1f46923f 130
400943fb 131int
18b46e7c
SS
132gdb_print_insn_h8300 (memaddr, info)
133 bfd_vma memaddr;
134 disassemble_info *info;
0a8f9d31 135{
d15396df
JL
136 if (h8300smode)
137 return print_insn_h8300s (memaddr, info);
239889fd 138 else if (h8300hmode)
5076ecd0 139 return print_insn_h8300h (memaddr, info);
d0414a11 140 else
5076ecd0 141 return print_insn_h8300 (memaddr, info);
0a8f9d31 142}
ec25d19b 143
1f46923f
SC
144/* Given a GDB frame, determine the address of the calling function's frame.
145 This will be used to create a new GDB frame struct, and then
146 INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC will be called for the new frame.
147
148 For us, the frame address is its stack pointer value, so we look up
149 the function prologue to determine the caller's sp value, and return it. */
150
669caa9c
SS
151CORE_ADDR
152h8300_frame_chain (thisframe)
153 struct frame_info *thisframe;
1f46923f 154{
dc1b349d
MS
155 if (PC_IN_CALL_DUMMY(thisframe->pc, thisframe->frame, thisframe->frame))
156 { /* initialize the from_pc now */
157 thisframe->from_pc = generic_read_register_dummy (thisframe->pc,
158 thisframe->frame,
159 PC_REGNUM);
160 return thisframe->frame;
161 }
162 h8300_frame_find_saved_regs (thisframe, (struct frame_saved_regs *) 0);
ec25d19b 163 return thisframe->fsr->regs[SP_REGNUM];
1f46923f
SC
164}
165
1f46923f
SC
166/* Put here the code to store, into a struct frame_saved_regs,
167 the addresses of the saved registers of frame described by FRAME_INFO.
168 This includes special registers such as pc and fp saved in special
169 ways in the stack frame. sp is even more special:
170 the address we return for it IS the sp for the next frame.
171
86a51f41
AC
172 We cache the result of doing this in the frame_obstack, since it is
173 fairly expensive. */
1f46923f
SC
174
175void
dc1b349d 176h8300_frame_find_saved_regs (fi, fsr)
1f46923f
SC
177 struct frame_info *fi;
178 struct frame_saved_regs *fsr;
179{
1f46923f 180 register struct frame_saved_regs *cache_fsr;
1f46923f
SC
181 CORE_ADDR ip;
182 struct symtab_and_line sal;
183 CORE_ADDR limit;
184
185 if (!fi->fsr)
186 {
187 cache_fsr = (struct frame_saved_regs *)
86a51f41 188 frame_obstack_alloc (sizeof (struct frame_saved_regs));
4ed97c9a 189 memset (cache_fsr, '\0', sizeof (struct frame_saved_regs));
ec25d19b 190
1f46923f
SC
191 fi->fsr = cache_fsr;
192
dc1b349d
MS
193 if (PC_IN_CALL_DUMMY(fi->pc, fi->frame, fi->frame))
194 { /* no more to do. */
195 if (fsr)
196 *fsr = *fi->fsr;
197 return;
198 }
1f46923f
SC
199 /* Find the start and end of the function prologue. If the PC
200 is in the function prologue, we only consider the part that
201 has executed already. */
ec25d19b 202
1f46923f
SC
203 ip = get_pc_function_start (fi->pc);
204 sal = find_pc_line (ip, 0);
ec25d19b 205 limit = (sal.end && sal.end < fi->pc) ? sal.end : fi->pc;
1f46923f
SC
206
207 /* This will fill in fields in *fi as well as in cache_fsr. */
208 examine_prologue (ip, limit, fi->frame, cache_fsr, fi);
209 }
210
211 if (fsr)
212 *fsr = *fi->fsr;
213}
1f46923f
SC
214
215/* Fetch the instruction at ADDR, returning 0 if ADDR is beyond LIM or
216 is not the address of a valid instruction, the address of the next
217 instruction beyond ADDR otherwise. *PWORD1 receives the first word
218 of the instruction.*/
219
1f46923f 220CORE_ADDR
ec25d19b
SC
221NEXT_PROLOGUE_INSN (addr, lim, pword1)
222 CORE_ADDR addr;
223 CORE_ADDR lim;
58e49e21 224 INSN_WORD *pword1;
1f46923f 225{
34df79fc 226 char buf[2];
ec25d19b
SC
227 if (addr < lim + 8)
228 {
34df79fc
JK
229 read_memory (addr, buf, 2);
230 *pword1 = extract_signed_integer (buf, 2);
1f46923f 231
ec25d19b
SC
232 return addr + 2;
233 }
1f46923f 234 return 0;
1f46923f
SC
235}
236
237/* Examine the prologue of a function. `ip' points to the first instruction.
ec25d19b 238 `limit' is the limit of the prologue (e.g. the addr of the first
1f46923f 239 linenumber, or perhaps the program counter if we're stepping through).
ec25d19b 240 `frame_sp' is the stack pointer value in use in this frame.
1f46923f 241 `fsr' is a pointer to a frame_saved_regs structure into which we put
ec25d19b 242 info about the registers saved by this frame.
1f46923f
SC
243 `fi' is a struct frame_info pointer; we fill in various fields in it
244 to reflect the offsets of the arg pointer and the locals pointer. */
245
1f46923f
SC
246static CORE_ADDR
247examine_prologue (ip, limit, after_prolog_fp, fsr, fi)
248 register CORE_ADDR ip;
249 register CORE_ADDR limit;
669caa9c 250 CORE_ADDR after_prolog_fp;
1f46923f
SC
251 struct frame_saved_regs *fsr;
252 struct frame_info *fi;
253{
254 register CORE_ADDR next_ip;
255 int r;
1f46923f 256 int have_fp = 0;
1f46923f 257 INSN_WORD insn_word;
d0414a11
DE
258 /* Number of things pushed onto stack, starts at 2/4, 'cause the
259 PC is already there */
a3059251 260 unsigned int reg_save_depth = h8300hmode ? 4 : 2;
1f46923f
SC
261
262 unsigned int auto_depth = 0; /* Number of bytes of autos */
1f46923f 263
ddf30c37 264 char in_frame[11]; /* One for each reg */
1f46923f 265
31778db0
JL
266 int adjust = 0;
267
ddf30c37 268 memset (in_frame, 1, 11);
256b4f37 269 for (r = 0; r < 8; r++)
ec25d19b
SC
270 {
271 fsr->regs[r] = 0;
272 }
273 if (after_prolog_fp == 0)
274 {
275 after_prolog_fp = read_register (SP_REGNUM);
276 }
4679717d
JL
277
278 /* If the PC isn't valid, quit now. */
31778db0 279 if (ip == 0 || ip & (h8300hmode ? ~0xffffff : ~0xffff))
ec25d19b 280 return 0;
1f46923f 281
ec25d19b 282 next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn_word);
1f46923f 283
31778db0
JL
284 if (insn_word == 0x0100)
285 {
286 insn_word = read_memory_unsigned_integer (ip + 2, 2);
287 adjust = 2;
288 }
289
ec25d19b
SC
290 /* Skip over any fp push instructions */
291 fsr->regs[6] = after_prolog_fp;
292 while (next_ip && IS_PUSH_FP (insn_word))
293 {
31778db0 294 ip = next_ip + adjust;
1f46923f 295
ec25d19b
SC
296 in_frame[insn_word & 0x7] = reg_save_depth;
297 next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn_word);
31778db0 298 reg_save_depth += 2 + adjust;
ec25d19b 299 }
1f46923f
SC
300
301 /* Is this a move into the fp */
ec25d19b
SC
302 if (next_ip && IS_MOV_SP_FP (insn_word))
303 {
304 ip = next_ip;
305 next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn_word);
306 have_fp = 1;
307 }
1f46923f
SC
308
309 /* Skip over any stack adjustment, happens either with a number of
310 sub#2,sp or a mov #x,r5 sub r5,sp */
311
31778db0 312 if (next_ip && (IS_SUB2_SP (insn_word) || IS_SUB4_SP (insn_word)))
1f46923f 313 {
31778db0 314 while (next_ip && (IS_SUB2_SP (insn_word) || IS_SUB4_SP (insn_word)))
ec25d19b 315 {
31778db0 316 auto_depth += IS_SUB2_SP (insn_word) ? 2 : 4;
ec25d19b
SC
317 ip = next_ip;
318 next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn_word);
319 }
1f46923f 320 }
ec25d19b
SC
321 else
322 {
323 if (next_ip && IS_MOVK_R5 (insn_word))
324 {
325 ip = next_ip;
326 next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn_word);
327 auto_depth += insn_word;
328
329 next_ip = NEXT_PROLOGUE_INSN (next_ip, limit, &insn_word);
330 auto_depth += insn_word;
ec25d19b 331 }
31778db0
JL
332 if (next_ip && IS_SUBL_SP (insn_word))
333 {
334 ip = next_ip;
335 auto_depth += read_memory_unsigned_integer (ip, 4);
336 ip += 4;
337
338 next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn_word);
339 }
ec25d19b 340 }
31778db0 341
4679717d
JL
342 /* Now examine the push insns to determine where everything lives
343 on the stack. */
344 while (1)
1f46923f 345 {
4679717d
JL
346 adjust = 0;
347 if (!next_ip)
348 break;
349
350 if (insn_word == 0x0100)
351 {
352 ip = next_ip;
353 next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn_word);
354 adjust = 2;
355 }
356
357 if (IS_PUSH (insn_word))
358 {
359 ip = next_ip;
360 next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn_word);
361 fsr->regs[r] = after_prolog_fp + auto_depth;
362 auto_depth += 2 + adjust;
363 continue;
364 }
365
366 /* Now check for push multiple insns. */
367 if (insn_word == 0x0110 || insn_word == 0x0120 || insn_word == 0x0130)
368 {
369 int count = ((insn_word >> 4) & 0xf) + 1;
370 int start, i;
371
372 ip = next_ip;
373 next_ip = NEXT_PROLOGUE_INSN (ip, limit, &insn_word);
374 start = insn_word & 0x7;
375
376 for (i = start; i <= start + count; i++)
377 {
378 fsr->regs[i] = after_prolog_fp + auto_depth;
379 auto_depth += 4;
380 }
381 }
382 break;
1f46923f 383 }
1f46923f 384
1f46923f 385 /* The args are always reffed based from the stack pointer */
ec25d19b 386 fi->args_pointer = after_prolog_fp;
1f46923f 387 /* Locals are always reffed based from the fp */
ec25d19b 388 fi->locals_pointer = after_prolog_fp;
1f46923f 389 /* The PC is at a known place */
31778db0 390 fi->from_pc = read_memory_unsigned_integer (after_prolog_fp + BINWORD, BINWORD);
1f46923f
SC
391
392 /* Rememeber any others too */
1f46923f 393 in_frame[PC_REGNUM] = 0;
dc1b349d 394
ec25d19b
SC
395 if (have_fp)
396 /* We keep the old FP in the SP spot */
b1d0b161 397 fsr->regs[SP_REGNUM] = read_memory_unsigned_integer (fsr->regs[6], BINWORD);
ec25d19b
SC
398 else
399 fsr->regs[SP_REGNUM] = after_prolog_fp + auto_depth;
400
1f46923f
SC
401 return (ip);
402}
403
404void
dc1b349d 405h8300_init_extra_frame_info (fromleaf, fi)
1f46923f
SC
406 int fromleaf;
407 struct frame_info *fi;
408{
409 fi->fsr = 0; /* Not yet allocated */
410 fi->args_pointer = 0; /* Unknown */
411 fi->locals_pointer = 0; /* Unknown */
412 fi->from_pc = 0;
dc1b349d
MS
413 if (PC_IN_CALL_DUMMY(fi->pc, fi->frame, fi->frame))
414 { /* anything special to do? */
415 return;
416 }
1f46923f 417}
ec25d19b 418
1f46923f
SC
419/* Return the saved PC from this frame.
420
421 If the frame has a memory copy of SRP_REGNUM, use that. If not,
422 just use the register SRP_REGNUM itself. */
423
424CORE_ADDR
dc1b349d 425h8300_frame_saved_pc (frame)
669caa9c 426 struct frame_info *frame;
1f46923f 427{
dc1b349d
MS
428 if (PC_IN_CALL_DUMMY(frame->pc, frame->frame, frame->frame))
429 return generic_read_register_dummy (frame->pc, frame->frame, PC_REGNUM);
430 else
431 return frame->from_pc;
1f46923f
SC
432}
433
1f46923f
SC
434CORE_ADDR
435frame_locals_address (fi)
436 struct frame_info *fi;
437{
dc1b349d
MS
438 if (PC_IN_CALL_DUMMY(fi->pc, fi->frame, fi->frame))
439 return (CORE_ADDR) 0; /* Not sure what else to do... */
ec25d19b
SC
440 if (!fi->locals_pointer)
441 {
442 struct frame_saved_regs ignore;
443
444 get_frame_saved_regs (fi, &ignore);
1f46923f 445
ec25d19b 446 }
1f46923f
SC
447 return fi->locals_pointer;
448}
449
450/* Return the address of the argument block for the frame
451 described by FI. Returns 0 if the address is unknown. */
452
453CORE_ADDR
454frame_args_address (fi)
455 struct frame_info *fi;
456{
dc1b349d
MS
457 if (PC_IN_CALL_DUMMY(fi->pc, fi->frame, fi->frame))
458 return (CORE_ADDR) 0; /* Not sure what else to do... */
ec25d19b
SC
459 if (!fi->args_pointer)
460 {
461 struct frame_saved_regs ignore;
462
463 get_frame_saved_regs (fi, &ignore);
464
465 }
1f46923f 466
1f46923f
SC
467 return fi->args_pointer;
468}
469
dc1b349d
MS
470/* Function: push_arguments
471 Setup the function arguments for calling a function in the inferior.
472
473 On the Hitachi H8/300 architecture, there are three registers (R0 to R2)
474 which are dedicated for passing function arguments. Up to the first
475 three arguments (depending on size) may go into these registers.
476 The rest go on the stack.
477
478 Arguments that are smaller than WORDSIZE bytes will still take up a
479 whole register or a whole WORDSIZE word on the stack, and will be
480 right-justified in the register or the stack word. This includes
481 chars and small aggregate types. Note that WORDSIZE depends on the
482 cpu type.
483
484 Arguments that are larger than WORDSIZE bytes will be split between
485 two or more registers as available, but will NOT be split between a
486 register and the stack.
487
488 An exceptional case exists for struct arguments (and possibly other
489 aggregates such as arrays) -- if the size is larger than WORDSIZE
490 bytes but not a multiple of WORDSIZE bytes. In this case the
491 argument is never split between the registers and the stack, but
492 instead is copied in its entirety onto the stack, AND also copied
493 into as many registers as there is room for. In other words, space
494 in registers permitting, two copies of the same argument are passed
495 in. As far as I can tell, only the one on the stack is used,
496 although that may be a function of the level of compiler
497 optimization. I suspect this is a compiler bug. Arguments of
498 these odd sizes are left-justified within the word (as opposed to
499 arguments smaller than WORDSIZE bytes, which are right-justified).
500
501 If the function is to return an aggregate type such as a struct,
502 the caller must allocate space into which the callee will copy the
503 return value. In this case, a pointer to the return value location
504 is passed into the callee in register R0, which displaces one of
505 the other arguments passed in via registers R0 to R2. */
506
507CORE_ADDR
508h8300_push_arguments(nargs, args, sp, struct_return, struct_addr)
509 int nargs;
510 struct value **args;
511 CORE_ADDR sp;
512 unsigned char struct_return;
513 CORE_ADDR struct_addr;
514{
515 int stack_align, stack_alloc, stack_offset;
516 int wordsize;
517 int argreg;
518 int argnum;
519 struct type *type;
520 CORE_ADDR regval;
521 char *val;
522 char valbuf[4];
523 int len;
524
525 if (h8300hmode || h8300smode)
526 {
527 stack_align = 3;
528 wordsize = 4;
529 }
530 else
531 {
532 stack_align = 1;
533 wordsize = 2;
534 }
535
536 /* first force sp to a n-byte alignment */
537 sp = sp & ~stack_align;
538
539 /* Now make sure there's space on the stack */
540 for (argnum = 0, stack_alloc = 0;
541 argnum < nargs; argnum++)
542 stack_alloc += ((TYPE_LENGTH(VALUE_TYPE(args[argnum])) + stack_align)
543 & ~stack_align);
544 sp -= stack_alloc; /* make room on stack for args */
545 /* we may over-allocate a little here, but that won't hurt anything */
546
547 argreg = ARG0_REGNUM;
548 if (struct_return) /* "struct return" pointer takes up one argreg */
549 {
550 write_register (argreg++, struct_addr);
551 }
552
553 /* Now load as many as possible of the first arguments into
554 registers, and push the rest onto the stack. There are 3N bytes
555 in three registers available. Loop thru args from first to last. */
556
557 for (argnum = 0, stack_offset = 0; argnum < nargs; argnum++)
558 {
559 type = VALUE_TYPE (args[argnum]);
560 len = TYPE_LENGTH (type);
561 memset(valbuf, 0, sizeof(valbuf));
562 if (len < wordsize)
563 {
564 /* the purpose of this is to right-justify the value within the word */
565 memcpy(valbuf + (wordsize - len),
566 (char *) VALUE_CONTENTS (args[argnum]), len);
567 val = valbuf;
568 }
569 else
570 val = (char *) VALUE_CONTENTS (args[argnum]);
571
572 if (len > (ARGLAST_REGNUM+1 - argreg) * REGISTER_RAW_SIZE(ARG0_REGNUM) ||
573 (len > wordsize && (len & stack_align) != 0))
574 { /* passed on the stack */
575 write_memory (sp + stack_offset, val,
576 len < wordsize ? wordsize : len);
577 stack_offset += (len + stack_align) & ~stack_align;
578 }
579 /* NOTE WELL!!!!! This is not an "else if" clause!!!
580 That's because some *&^%$ things get passed on the stack
581 AND in the registers! */
582 if (len <= (ARGLAST_REGNUM+1 - argreg) * REGISTER_RAW_SIZE(ARG0_REGNUM))
583 while (len > 0)
584 { /* there's room in registers */
585 regval = extract_address (val, wordsize);
586 write_register (argreg, regval);
587 len -= wordsize;
588 val += wordsize;
589 argreg++;
590 }
591 }
592 return sp;
593}
594
595/* Function: push_return_address
596 Setup the return address for a dummy frame, as called by
597 call_function_by_hand. Only necessary when you are using an
598 empty CALL_DUMMY, ie. the target will not actually be executing
599 a JSR/BSR instruction. */
600
601CORE_ADDR
602h8300_push_return_address (pc, sp)
603 CORE_ADDR pc;
604 CORE_ADDR sp;
605{
606 unsigned char buf[4];
607 int wordsize;
608
609 if (h8300hmode || h8300smode)
610 wordsize = 4;
611 else
612 wordsize = 2;
613
dc1b349d 614 sp -= wordsize;
409f64ae 615 store_unsigned_integer (buf, wordsize, CALL_DUMMY_ADDRESS ());
dc1b349d
MS
616 write_memory (sp, buf, wordsize);
617 return sp;
618}
619
620/* Function: pop_frame
621 Restore the machine to the state it had before the current frame
622 was created. Usually used either by the "RETURN" command, or by
623 call_function_by_hand after the dummy_frame is finished. */
624
ec25d19b
SC
625void
626h8300_pop_frame ()
1f46923f
SC
627{
628 unsigned regnum;
629 struct frame_saved_regs fsr;
669caa9c 630 struct frame_info *frame = get_current_frame ();
1f46923f 631
dc1b349d 632 if (PC_IN_CALL_DUMMY(frame->pc, frame->frame, frame->frame))
1f46923f 633 {
dc1b349d 634 generic_pop_dummy_frame();
1f46923f 635 }
dc1b349d
MS
636 else
637 {
638 get_frame_saved_regs (frame, &fsr);
6bafbdfb 639
dc1b349d
MS
640 for (regnum = 0; regnum < 8; regnum++)
641 {
642 /* Don't forget SP_REGNUM is a frame_saved_regs struct is the
643 actual value we want, not the address of the value we want. */
644 if (fsr.regs[regnum] && regnum != SP_REGNUM)
645 write_register (regnum,
646 read_memory_integer(fsr.regs[regnum], BINWORD));
647 else if (fsr.regs[regnum] && regnum == SP_REGNUM)
648 write_register (regnum, frame->frame + 2 * BINWORD);
649 }
650
651 /* Don't forget the update the PC too! */
652 write_pc (frame->from_pc);
653 }
6bafbdfb 654 flush_cached_frames ();
1f46923f 655}
ec25d19b 656
dc1b349d
MS
657/* Function: extract_return_value
658 Figure out where in REGBUF the called function has left its return value.
659 Copy that into VALBUF. Be sure to account for CPU type. */
660
661void
662h8300_extract_return_value (type, regbuf, valbuf)
663 struct type *type;
664 char *regbuf;
665 char *valbuf;
666{
667 int wordsize, len;
668
669 if (h8300smode || h8300hmode)
670 wordsize = 4;
671 else
672 wordsize = 2;
673
674 len = TYPE_LENGTH(type);
675
676 switch (len) {
677 case 1: /* (char) */
678 case 2: /* (short), (int) */
679 memcpy (valbuf, regbuf + REGISTER_BYTE(0) + (wordsize - len), len);
680 break;
681 case 4: /* (long), (float) */
682 if (h8300smode || h8300hmode)
683 {
684 memcpy (valbuf, regbuf + REGISTER_BYTE(0), 4);
685 }
686 else
687 {
688 memcpy (valbuf, regbuf + REGISTER_BYTE(0), 2);
689 memcpy (valbuf+2, regbuf + REGISTER_BYTE(1), 2);
690 }
691 break;
692 case 8: /* (double) (doesn't seem to happen, which is good,
693 because this almost certainly isn't right. */
694 error ("I don't know how a double is returned.");
695 break;
696 }
697}
698
699/* Function: store_return_value
700 Place the appropriate value in the appropriate registers.
701 Primarily used by the RETURN command. */
702
703void
704h8300_store_return_value (type, valbuf)
705 struct type *type;
706 char *valbuf;
707{
708 int wordsize, len, regval;
709
710 if (h8300hmode || h8300smode)
711 wordsize = 4;
712 else
713 wordsize = 2;
714
715 len = TYPE_LENGTH(type);
716 switch (len) {
717 case 1: /* char */
718 case 2: /* short, int */
719 regval = extract_address(valbuf, len);
720 write_register (0, regval);
721 break;
722 case 4: /* long, float */
723 regval = extract_address(valbuf, len);
724 if (h8300smode || h8300hmode)
725 {
726 write_register (0, regval);
727 }
728 else
729 {
730 write_register (0, regval >> 16);
731 write_register (1, regval & 0xffff);
732 }
733 break;
734 case 8: /* presumeably double, but doesn't seem to happen */
735 error ("I don't know how to return a double.");
736 break;
737 }
738}
739
740/* Function: get_saved_register
741 Just call the generic_get_saved_register function. */
742
743void
744get_saved_register (raw_buffer, optimized, addrp, frame, regnum, lval)
745 char *raw_buffer;
746 int *optimized;
747 CORE_ADDR *addrp;
748 struct frame_info *frame;
749 int regnum;
750 enum lval_type *lval;
751{
752 generic_get_saved_register (raw_buffer, optimized, addrp,
753 frame, regnum, lval);
754}
a3059251
SC
755
756struct cmd_list_element *setmemorylist;
757
758static void
759h8300_command(args, from_tty)
760{
761 extern int h8300hmode;
762 h8300hmode = 0;
d15396df 763 h8300smode = 0;
a3059251
SC
764}
765
766static void
767h8300h_command(args, from_tty)
768{
769 extern int h8300hmode;
770 h8300hmode = 1;
d15396df 771 h8300smode = 0;
d15396df 772}
d15396df
JL
773static void
774h8300s_command(args, from_tty)
775{
776 extern int h8300smode;
777 extern int h8300hmode;
778 h8300smode = 1;
779 h8300hmode = 1;
a3059251 780}
d15396df 781
a3059251
SC
782
783static void
784set_machine (args, from_tty)
785 char *args;
786 int from_tty;
787{
d15396df 788 printf_unfiltered ("\"set machine\" must be followed by h8300, h8300h");
d15396df 789 printf_unfiltered ("or h8300s");
199b2450 790 help_list (setmemorylist, "set memory ", -1, gdb_stdout);
a3059251
SC
791}
792
f9fedc48
MA
793/* set_machine_hook is called as the exec file is being opened, but
794 before the symbol file is opened. This allows us to set the
795 h8300hmode flag based on the machine type specified in the exec
796 file. This in turn will cause subsequently defined pointer types
797 to be 16 or 32 bits as appropriate for the machine. */
798
799static void
800set_machine_hook (filename)
801 char *filename;
802{
d15396df
JL
803 if (bfd_get_mach (exec_bfd) == bfd_mach_h8300s)
804 {
805 h8300smode = 1;
806 h8300hmode = 1;
807 }
808 else
d15396df
JL
809 if (bfd_get_mach (exec_bfd) == bfd_mach_h8300h)
810 {
d15396df 811 h8300smode = 0;
d15396df
JL
812 h8300hmode = 1;
813 }
814 else
815 {
d15396df 816 h8300smode = 0;
d15396df
JL
817 h8300hmode = 0;
818 }
f9fedc48
MA
819}
820
a3059251
SC
821void
822_initialize_h8300m ()
823{
824 add_prefix_cmd ("machine", no_class, set_machine,
dc1b349d
MS
825 "set the machine type",
826 &setmemorylist, "set machine ", 0,
a3059251
SC
827 &setlist);
828
829 add_cmd ("h8300", class_support, h8300_command,
830 "Set machine to be H8/300.", &setmemorylist);
831
832 add_cmd ("h8300h", class_support, h8300h_command,
833 "Set machine to be H8/300H.", &setmemorylist);
f9fedc48 834
d15396df
JL
835 add_cmd ("h8300s", class_support, h8300s_command,
836 "Set machine to be H8/300S.", &setmemorylist);
d15396df 837
f9fedc48
MA
838 /* Add a hook to set the machine type when we're loading a file. */
839
840 specify_exec_file_hook(set_machine_hook);
a3059251
SC
841}
842
843
844
ec25d19b
SC
845void
846print_register_hook (regno)
847{
848 if (regno == 8)
849 {
850 /* CCR register */
ec25d19b 851 int C, Z, N, V;
08c0d7b8 852 unsigned char b[4];
ec25d19b 853 unsigned char l;
ec25d19b 854 read_relative_register_raw_bytes (regno, b);
08c0d7b8 855 l = b[REGISTER_VIRTUAL_SIZE(8) -1];
199b2450
TL
856 printf_unfiltered ("\t");
857 printf_unfiltered ("I-%d - ", (l & 0x80) != 0);
858 printf_unfiltered ("H-%d - ", (l & 0x20) != 0);
ec25d19b
SC
859 N = (l & 0x8) != 0;
860 Z = (l & 0x4) != 0;
861 V = (l & 0x2) != 0;
862 C = (l & 0x1) != 0;
199b2450
TL
863 printf_unfiltered ("N-%d ", N);
864 printf_unfiltered ("Z-%d ", Z);
865 printf_unfiltered ("V-%d ", V);
866 printf_unfiltered ("C-%d ", C);
ec25d19b 867 if ((C | Z) == 0)
199b2450 868 printf_unfiltered ("u> ");
ec25d19b 869 if ((C | Z) == 1)
199b2450 870 printf_unfiltered ("u<= ");
ec25d19b 871 if ((C == 0))
199b2450 872 printf_unfiltered ("u>= ");
ec25d19b 873 if (C == 1)
199b2450 874 printf_unfiltered ("u< ");
ec25d19b 875 if (Z == 0)
199b2450 876 printf_unfiltered ("!= ");
ec25d19b 877 if (Z == 1)
199b2450 878 printf_unfiltered ("== ");
ec25d19b 879 if ((N ^ V) == 0)
199b2450 880 printf_unfiltered (">= ");
ec25d19b 881 if ((N ^ V) == 1)
199b2450 882 printf_unfiltered ("< ");
ec25d19b 883 if ((Z | (N ^ V)) == 0)
199b2450 884 printf_unfiltered ("> ");
ec25d19b 885 if ((Z | (N ^ V)) == 1)
199b2450 886 printf_unfiltered ("<= ");
ec25d19b
SC
887 }
888}
a3059251 889
18b46e7c
SS
890void
891_initialize_h8300_tdep ()
892{
893 tm_print_insn = gdb_print_insn_h8300;
894}
This page took 0.343741 seconds and 4 git commands to generate.