* h8500-tdep.c: General linting and cleanup.
(opcodes/h8500-opc.h): Don't include. (code_size, data_size): Make static. (frame_locals_address, frame_args_address): Remove. (h8300_pop_frame): Rename to h8500_pop_frame. (big_command, medium_command, compact_command, small_command): Define as regular functions rather than with macro trickery. (tm_print_insn): Set to correct disassembler function. * config/h8500/tm-h8500.h: Minor cleanup, add prototypes. (ABOUT_TO_RETURN): #if 0 out. (FRAME_ARGS_ADDRESS, FRAME_LOCALS_ADDRESS): Use usual define. (GDB_TARGET_IS_H8500): Remove duplicate definition. (regoff): Remove, never used. * config/h8500/h8500.mt (TDEPFILES): Add monitor.o.
This commit is contained in:
parent
ac24997f36
commit
ec7b6fcf7f
|
@ -1,3 +1,20 @@
|
|||
Mon Jul 31 19:12:48 1995 Stan Shebs <shebs@andros.cygnus.com>
|
||||
|
||||
* h8500-tdep.c: General linting and cleanup.
|
||||
(opcodes/h8500-opc.h): Don't include.
|
||||
(code_size, data_size): Make static.
|
||||
(frame_locals_address, frame_args_address): Remove.
|
||||
(h8300_pop_frame): Rename to h8500_pop_frame.
|
||||
(big_command, medium_command, compact_command, small_command):
|
||||
Define as regular functions rather than with macro trickery.
|
||||
(tm_print_insn): Set to correct disassembler function.
|
||||
* config/h8500/tm-h8500.h: Minor cleanup, add prototypes.
|
||||
(ABOUT_TO_RETURN): #if 0 out.
|
||||
(FRAME_ARGS_ADDRESS, FRAME_LOCALS_ADDRESS): Use usual define.
|
||||
(GDB_TARGET_IS_H8500): Remove duplicate definition.
|
||||
(regoff): Remove, never used.
|
||||
* config/h8500/h8500.mt (TDEPFILES): Add monitor.o.
|
||||
|
||||
Mon Jul 31 14:32:30 1995 J.T. Conklin <jtc@rtl.cygnus.com>
|
||||
|
||||
* configure.in: Check for unistd.h.
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# Target: H8500 with HMS monitor and H8 simulator
|
||||
TDEPFILES= h8500-tdep.o remote-hms.o
|
||||
TDEPFILES= h8500-tdep.o monitor.o remote-hms.o
|
||||
TM_FILE= tm-h8500.h
|
||||
|
||||
SIM_OBS = remote-sim.o
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Parameters for execution on a H8/500 series machine.
|
||||
Copyright (C) 1993 Free Software Foundation, Inc.
|
||||
Copyright (C) 1993, 1995 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
|
@ -27,16 +27,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
|
||||
#define TARGET_BYTE_ORDER BIG_ENDIAN
|
||||
|
||||
#undef TARGET_INT_BIT
|
||||
/* Define the sizes of integers and pointers. */
|
||||
|
||||
#define TARGET_INT_BIT 16
|
||||
|
||||
#undef TARGET_LONG_BIT
|
||||
#define TARGET_LONG_BIT 32
|
||||
|
||||
#undef TARGET_PTR_BIT
|
||||
#define TARGET_PTR_BIT (minimum_mode ? 16 : 32)
|
||||
|
||||
|
||||
/* Offset from address of function to start of its code.
|
||||
Zero on most machines. */
|
||||
|
||||
|
@ -45,17 +43,16 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
/* Advance PC across any function entry prologue instructions
|
||||
to reach some "real" code. */
|
||||
|
||||
#define SKIP_PROLOGUE(ip) {(ip) = h8500_skip_prologue(ip);}
|
||||
extern CORE_ADDR h8500_skip_prologue ();
|
||||
|
||||
#define SKIP_PROLOGUE(ip) { (ip) = h8500_skip_prologue(ip); }
|
||||
extern CORE_ADDR h8500_skip_prologue PARAMS ((CORE_ADDR));
|
||||
|
||||
/* Immediately after a function call, return the saved pc.
|
||||
Can't always go through the frames for this because on some machines
|
||||
the new frame is not set up until the new function executes
|
||||
some instructions. */
|
||||
|
||||
#define SAVED_PC_AFTER_CALL(frame) saved_pc_after_call(frame)
|
||||
|
||||
#define SAVED_PC_AFTER_CALL(frame) saved_pc_after_call()
|
||||
extern CORE_ADDR saved_pc_after_call PARAMS ((void));
|
||||
|
||||
/* Stack grows downward. */
|
||||
|
||||
|
@ -63,18 +60,19 @@ extern CORE_ADDR h8500_skip_prologue ();
|
|||
|
||||
/* Illegal instruction - used by the simulator for breakpoint
|
||||
detection */
|
||||
#define BREAKPOINT {0x0b}
|
||||
|
||||
#define BREAKPOINT {0x0b}
|
||||
|
||||
/* If your kernel resets the pc after the trap happens you may need to
|
||||
define this before including this file. */
|
||||
|
||||
#define DECR_PC_AFTER_BREAK 0
|
||||
|
||||
|
||||
#if 0 /* never used */
|
||||
/* Nonzero if instruction at PC is a return instruction. */
|
||||
|
||||
#define ABOUT_TO_RETURN(pc) about_to_return(pc)
|
||||
#endif
|
||||
|
||||
/* Say how long registers are. */
|
||||
|
||||
|
@ -93,7 +91,7 @@ extern CORE_ADDR h8500_skip_prologue ();
|
|||
for register N. */
|
||||
|
||||
#define REGISTER_RAW_SIZE(N) h8500_register_size(N)
|
||||
int h8500_register_size PARAMS ((int regno));
|
||||
extern int h8500_register_size PARAMS ((int regno));
|
||||
|
||||
#define REGISTER_SIZE 4
|
||||
|
||||
|
@ -111,23 +109,22 @@ int h8500_register_size PARAMS ((int regno));
|
|||
of data in register N. */
|
||||
|
||||
#define REGISTER_VIRTUAL_TYPE(N) h8500_register_virtual_type(N)
|
||||
struct type *h8500_register_virtual_type PARAMS ((int regno));
|
||||
extern struct type *h8500_register_virtual_type PARAMS ((int regno));
|
||||
|
||||
/* Initializer for an array of names of registers.
|
||||
Entries beyond the first NUM_REGS are ignored. */
|
||||
|
||||
#define REGISTER_NAMES \
|
||||
{"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \
|
||||
"pr0", "pr1", "pr2","pr3","pr4","pr5","pr6","pr7","cp","dp","ep","tp","sr","pc"}
|
||||
|
||||
|
||||
/* Register numbers of various important registers.
|
||||
Note that some of these values are "real" register numbers,
|
||||
and correspond to the general registers of the machine,
|
||||
and some are "phony" register numbers which are too large
|
||||
to be actual register numbers as far as the user is concerned
|
||||
but do serve to get the desired values when passed to read_register. */
|
||||
{ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \
|
||||
"pr0","pr1","pr2","pr3","pr4","pr5","pr6","pr7", \
|
||||
"cp", "dp", "ep", "tp", "sr", "pc"}
|
||||
|
||||
/* Register numbers of various important registers. Note that some of
|
||||
these values are "real" register numbers, and correspond to the
|
||||
general registers of the machine, and some are "phony" register
|
||||
numbers which are too large to be actual register numbers as far as
|
||||
the user is concerned but do serve to get the desired values when
|
||||
passed to read_register. */
|
||||
|
||||
#define R0_REGNUM 0
|
||||
#define R1_REGNUM 1
|
||||
|
@ -138,7 +135,6 @@ struct type *h8500_register_virtual_type PARAMS ((int regno));
|
|||
#define R6_REGNUM 6
|
||||
#define R7_REGNUM 7
|
||||
|
||||
|
||||
#define PR0_REGNUM 8
|
||||
#define PR1_REGNUM 9
|
||||
#define PR2_REGNUM 10
|
||||
|
@ -153,18 +149,15 @@ struct type *h8500_register_virtual_type PARAMS ((int regno));
|
|||
#define SEG_E_REGNUM 18
|
||||
#define SEG_T_REGNUM 19
|
||||
|
||||
|
||||
#define CCR_REGNUM 20 /* Contains processor status */
|
||||
#define PC_REGNUM 21 /* Contains program counter */
|
||||
|
||||
|
||||
#define NUM_REGS 22
|
||||
|
||||
|
||||
#define SP_REGNUM PR7_REGNUM /* Contains address of top of stack */
|
||||
#define FP_REGNUM PR6_REGNUM /* Contains address of executing stack frame */
|
||||
|
||||
#define PTR_SIZE (minimum_mode ? 2: 4)
|
||||
#define PTR_SIZE (minimum_mode ? 2 : 4)
|
||||
#define PTR_MASK (minimum_mode ? 0x0000ffff : 0x00ffffff)
|
||||
|
||||
/* Store the address of the place in which to copy the structure the
|
||||
|
@ -180,28 +173,25 @@ struct type *h8500_register_virtual_type PARAMS ((int regno));
|
|||
#define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \
|
||||
memcpy (VALBUF, (char *)(REGBUF), TYPE_LENGTH(TYPE))
|
||||
|
||||
|
||||
/* Write into appropriate registers a function return value
|
||||
of type TYPE, given in virtual format. Assumes floats are passed
|
||||
in d0/d1. */
|
||||
|
||||
of type TYPE, given in virtual format. */
|
||||
|
||||
#define STORE_RETURN_VALUE(TYPE,VALBUF) \
|
||||
write_register_bytes (0, VALBUF, TYPE_LENGTH (TYPE))
|
||||
|
||||
|
||||
/* Extract from an array REGBUF containing the (raw) register state
|
||||
the address in which a function should return its structure value,
|
||||
as a CORE_ADDR (or an expression that can be used as one). */
|
||||
|
||||
#define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) (*(CORE_ADDR *)(REGBUF))
|
||||
|
||||
|
||||
|
||||
/* Define other aspects of the stack frame. */
|
||||
|
||||
/* A macro that tells us whether the function invocation represented
|
||||
by FI does not have a frame on the stack associated with it. If it
|
||||
does not, FRAMELESS is set to 1, else 0. */
|
||||
|
||||
#define FRAMELESS_FUNCTION_INVOCATION(FI, FRAMELESS) \
|
||||
(FRAMELESS) = frameless_look_for_prologue(FI)
|
||||
|
||||
|
@ -217,18 +207,19 @@ struct type *h8500_register_virtual_type PARAMS ((int regno));
|
|||
|
||||
*/
|
||||
|
||||
CORE_ADDR h8500_frame_chain PARAMS ((struct frame_info *));
|
||||
|
||||
#define INIT_EXTRA_FRAME_INFO(fromleaf, fci) ;
|
||||
/* (fci)->frame |= read_register(SEG_T_REGNUM) << 16;*/
|
||||
|
||||
#define FRAME_CHAIN(FRAME) h8500_frame_chain(FRAME)
|
||||
struct frame_info;
|
||||
extern CORE_ADDR h8500_frame_chain PARAMS ((struct frame_info *));
|
||||
|
||||
#define FRAME_SAVED_PC(FRAME) frame_saved_pc(FRAME)
|
||||
extern CORE_ADDR frame_saved_pc PARAMS ((struct frame_info *frame));
|
||||
|
||||
#define FRAME_ARGS_ADDRESS(fi) frame_args_address(fi)
|
||||
#define FRAME_ARGS_ADDRESS(fi) ((fi)->frame)
|
||||
|
||||
#define FRAME_LOCALS_ADDRESS(fi) frame_locals_address(fi);
|
||||
#define FRAME_LOCALS_ADDRESS(fi) ((fi)->frame)
|
||||
|
||||
/* Set VAL to the number of args passed to frame described by FI.
|
||||
Can set VAL to -1, meaning no way to tell. */
|
||||
|
@ -250,20 +241,18 @@ CORE_ADDR h8500_frame_chain PARAMS ((struct frame_info *));
|
|||
|
||||
#define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) \
|
||||
frame_find_saved_regs(frame_info, &(frame_saved_regs))
|
||||
struct frame_saved_regs;
|
||||
extern void frame_find_saved_regs PARAMS ((struct frame_info *frame_info, struct frame_saved_regs *frame_saved_regs));
|
||||
|
||||
|
||||
/* Push an empty stack frame, to record the current PC, etc. */
|
||||
|
||||
/*#define PUSH_DUMMY_FRAME { h8300_push_dummy_frame (); }*/
|
||||
|
||||
/* Discard from the stack the innermost frame, restoring all registers. */
|
||||
|
||||
#define POP_FRAME { h8300_pop_frame (); }
|
||||
#define POP_FRAME { h8500_pop_frame (); }
|
||||
extern void h8500_pop_frame PARAMS ((void));
|
||||
|
||||
#define SHORT_INT_MAX 32767
|
||||
#define SHORT_INT_MIN -32768
|
||||
|
||||
|
||||
#define NAMES_HAVE_UNDERSCORE
|
||||
|
||||
typedef unsigned short INSN_WORD;
|
||||
|
@ -273,32 +262,31 @@ typedef unsigned short INSN_WORD;
|
|||
#define read_memory_short(x) (read_memory_integer(x,2) & 0xffff)
|
||||
|
||||
#define PRINT_REGISTER_HOOK(regno) print_register_hook(regno)
|
||||
extern void print_register_hook PARAMS ((int));
|
||||
|
||||
int minimum_mode;
|
||||
extern int minimum_mode;
|
||||
|
||||
#define CALL_DUMMY_LENGTH 10
|
||||
|
||||
/* Fake variables to make it easy to use 24 bit register pointers */
|
||||
|
||||
int h8500_is_trapped_internalvar PARAMS ((char *name));
|
||||
#define IS_TRAPPED_INTERNALVAR h8500_is_trapped_internalvar
|
||||
extern int h8500_is_trapped_internalvar PARAMS ((char *name));
|
||||
|
||||
struct value * h8500_value_of_trapped_internalvar (/* struct internalvar *var */);
|
||||
#define VALUE_OF_TRAPPED_INTERNALVAR h8500_value_of_trapped_internalvar
|
||||
extern struct value * h8500_value_of_trapped_internalvar (/* struct internalvar *var */);
|
||||
|
||||
void h8500_set_trapped_internalvar (/* struct internalvar *var, value newval, int bitpos, int bitsize, int offset */);
|
||||
#define SET_TRAPPED_INTERNALVAR h8500_set_trapped_internalvar
|
||||
extern void h8500_set_trapped_internalvar (/* struct internalvar *var, value newval, int bitpos, int bitsize, int offset */);
|
||||
|
||||
int regoff[NUM_REGS];
|
||||
extern CORE_ADDR h8500_read_sp PARAMS ((void));
|
||||
extern void h8500_write_sp PARAMS ((CORE_ADDR));
|
||||
|
||||
CORE_ADDR h8500_read_sp PARAMS ((void));
|
||||
void h8500_write_sp PARAMS ((CORE_ADDR));
|
||||
extern CORE_ADDR h8500_read_fp PARAMS ((void));
|
||||
extern void h8500_write_fp PARAMS ((CORE_ADDR));
|
||||
|
||||
CORE_ADDR h8500_read_fp PARAMS ((void));
|
||||
void h8500_write_fp PARAMS ((CORE_ADDR));
|
||||
|
||||
CORE_ADDR h8500_read_pc PARAMS ((int));
|
||||
void h8500_write_pc PARAMS ((CORE_ADDR, int));
|
||||
extern CORE_ADDR h8500_read_pc PARAMS ((int));
|
||||
extern void h8500_write_pc PARAMS ((CORE_ADDR, int));
|
||||
|
||||
#define TARGET_READ_SP() h8500_read_sp()
|
||||
#define TARGET_WRITE_SP(x) h8500_write_sp(x)
|
||||
|
@ -308,4 +296,3 @@ void h8500_write_pc PARAMS ((CORE_ADDR, int));
|
|||
|
||||
#define TARGET_READ_FP() h8500_read_fp()
|
||||
#define TARGET_WRITE_FP(x) h8500_write_fp(x)
|
||||
#define GDB_TARGET_IS_H8500
|
||||
|
|
207
gdb/h8500-tdep.c
207
gdb/h8500-tdep.c
|
@ -1,4 +1,4 @@
|
|||
/* Target-machine dependent code for Hitachi H8/500, for GDB.
|
||||
/* Target-dependent code for Hitachi H8/500, for GDB.
|
||||
Copyright 1993, 1994, 1995 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
@ -30,16 +30,16 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
#include "gdbcmd.h"
|
||||
#include "value.h"
|
||||
#include "dis-asm.h"
|
||||
#include "../opcodes/h8500-opc.h"
|
||||
;
|
||||
#include "gdbcore.h"
|
||||
|
||||
#define UNSIGNED_SHORT(X) ((X) & 0xffff)
|
||||
int code_size = 2;
|
||||
int data_size = 2;
|
||||
|
||||
static int code_size = 2;
|
||||
|
||||
static int data_size = 2;
|
||||
|
||||
/* Shape of an H8/500 frame :
|
||||
|
||||
|
||||
arg-n
|
||||
..
|
||||
arg-2
|
||||
|
@ -53,7 +53,6 @@ int data_size = 2;
|
|||
|
||||
*/
|
||||
|
||||
|
||||
/* an easy to debug H8 stack frame looks like:
|
||||
0x6df6 push r6
|
||||
0x0d76 mov.w r7,r6
|
||||
|
@ -76,19 +75,14 @@ int data_size = 2;
|
|||
#define LINK_16 0x1f
|
||||
|
||||
int minimum_mode = 1;
|
||||
CORE_ADDR examine_prologue ();
|
||||
|
||||
void frame_find_saved_regs ();
|
||||
|
||||
|
||||
CORE_ADDR
|
||||
h8500_skip_prologue (start_pc)
|
||||
CORE_ADDR start_pc;
|
||||
|
||||
{
|
||||
short int w;
|
||||
|
||||
w = read_memory_integer (start_pc, 1);
|
||||
w = read_memory_integer (start_pc, 1);
|
||||
if (w == LINK_8)
|
||||
{
|
||||
start_pc += 2;
|
||||
|
@ -121,7 +115,6 @@ h8500_frame_chain (thisframe)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Fetch the instruction at ADDR, returning 0 if ADDR is beyond LIM or
|
||||
is not the address of a valid instruction, the address of the next
|
||||
instruction beyond ADDR otherwise. *PWORD1 receives the first word
|
||||
|
@ -142,15 +135,15 @@ NEXT_PROLOGUE_INSN (addr, lim, pword1)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Examine the prologue of a function. `ip' points to the first instruction.
|
||||
`limit' is the limit of the prologue (e.g. the addr of the first
|
||||
linenumber, or perhaps the program counter if we're stepping through).
|
||||
`frame_sp' is the stack pointer value in use in this frame.
|
||||
`fsr' is a pointer to a frame_saved_regs structure into which we put
|
||||
info about the registers saved by this frame.
|
||||
`fi' is a struct frame_info pointer; we fill in various fields in it
|
||||
to reflect the offsets of the arg pointer and the locals pointer. */
|
||||
|
||||
/* Examine the prologue of a function. `ip' points to the first
|
||||
instruction. `limit' is the limit of the prologue (e.g. the addr
|
||||
of the first linenumber, or perhaps the program counter if we're
|
||||
stepping through). `frame_sp' is the stack pointer value in use in
|
||||
this frame. `fsr' is a pointer to a frame_saved_regs structure
|
||||
into which we put info about the registers saved by this frame.
|
||||
`fi' is a struct frame_info pointer; we fill in various fields in
|
||||
it to reflect the offsets of the arg pointer and the locals
|
||||
pointer. */
|
||||
|
||||
/* Return the saved PC from this frame. */
|
||||
|
||||
|
@ -161,25 +154,8 @@ frame_saved_pc (frame)
|
|||
return read_memory_integer (FRAME_FP (frame) + 2, PTR_SIZE);
|
||||
}
|
||||
|
||||
CORE_ADDR
|
||||
frame_locals_address (fi)
|
||||
struct frame_info *fi;
|
||||
{
|
||||
return fi->frame;
|
||||
}
|
||||
|
||||
/* Return the address of the argument block for the frame
|
||||
described by FI. Returns 0 if the address is unknown. */
|
||||
|
||||
CORE_ADDR
|
||||
frame_args_address (fi)
|
||||
struct frame_info *fi;
|
||||
{
|
||||
return fi->frame;
|
||||
}
|
||||
|
||||
void
|
||||
h8300_pop_frame ()
|
||||
void
|
||||
h8500_pop_frame ()
|
||||
{
|
||||
unsigned regnum;
|
||||
struct frame_saved_regs fsr;
|
||||
|
@ -190,15 +166,15 @@ h8300_pop_frame ()
|
|||
for (regnum = 0; regnum < 8; regnum++)
|
||||
{
|
||||
if (fsr.regs[regnum])
|
||||
write_register (regnum, read_memory_short (fsr.regs[regnum]));
|
||||
write_register (regnum, read_memory_short (fsr.regs[regnum]));
|
||||
|
||||
flush_cached_frames ();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
print_register_hook (regno)
|
||||
int regno;
|
||||
{
|
||||
if (regno == CCR_REGNUM)
|
||||
{
|
||||
|
@ -247,34 +223,37 @@ int
|
|||
h8500_register_size (regno)
|
||||
int regno;
|
||||
{
|
||||
switch (regno) {
|
||||
case SEG_C_REGNUM:
|
||||
case SEG_D_REGNUM:
|
||||
case SEG_E_REGNUM:
|
||||
case SEG_T_REGNUM:
|
||||
return 1;
|
||||
case R0_REGNUM:
|
||||
case R1_REGNUM:
|
||||
case R2_REGNUM:
|
||||
case R3_REGNUM:
|
||||
case R4_REGNUM:
|
||||
case R5_REGNUM:
|
||||
case R6_REGNUM:
|
||||
case R7_REGNUM:
|
||||
case CCR_REGNUM:
|
||||
return 2;
|
||||
switch (regno)
|
||||
{
|
||||
case SEG_C_REGNUM:
|
||||
case SEG_D_REGNUM:
|
||||
case SEG_E_REGNUM:
|
||||
case SEG_T_REGNUM:
|
||||
return 1;
|
||||
case R0_REGNUM:
|
||||
case R1_REGNUM:
|
||||
case R2_REGNUM:
|
||||
case R3_REGNUM:
|
||||
case R4_REGNUM:
|
||||
case R5_REGNUM:
|
||||
case R6_REGNUM:
|
||||
case R7_REGNUM:
|
||||
case CCR_REGNUM:
|
||||
return 2;
|
||||
|
||||
case PR0_REGNUM:
|
||||
case PR1_REGNUM:
|
||||
case PR2_REGNUM:
|
||||
case PR3_REGNUM:
|
||||
case PR4_REGNUM:
|
||||
case PR5_REGNUM:
|
||||
case PR6_REGNUM:
|
||||
case PR7_REGNUM:
|
||||
case PC_REGNUM:
|
||||
return 4;
|
||||
}
|
||||
case PR0_REGNUM:
|
||||
case PR1_REGNUM:
|
||||
case PR2_REGNUM:
|
||||
case PR3_REGNUM:
|
||||
case PR4_REGNUM:
|
||||
case PR5_REGNUM:
|
||||
case PR6_REGNUM:
|
||||
case PR7_REGNUM:
|
||||
case PC_REGNUM:
|
||||
return 4;
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
}
|
||||
|
||||
struct type *
|
||||
|
@ -323,7 +302,6 @@ void
|
|||
frame_find_saved_regs (frame_info, frame_saved_regs)
|
||||
struct frame_info *frame_info;
|
||||
struct frame_saved_regs *frame_saved_regs;
|
||||
|
||||
{
|
||||
register int regnum;
|
||||
register int regmask;
|
||||
|
@ -400,10 +378,12 @@ lose:;
|
|||
(frame_saved_regs)->regs[PC_REGNUM] = (frame_info)->frame + 2;
|
||||
}
|
||||
|
||||
saved_pc_after_call (frame)
|
||||
CORE_ADDR
|
||||
saved_pc_after_call ()
|
||||
{
|
||||
int x;
|
||||
int a = read_register (SP_REGNUM);
|
||||
|
||||
x = read_memory_integer (a, code_size);
|
||||
if (code_size == 2)
|
||||
{
|
||||
|
@ -415,10 +395,12 @@ saved_pc_after_call (frame)
|
|||
return x;
|
||||
}
|
||||
|
||||
|
||||
#if 0 /* never called */
|
||||
/* Nonzero if instruction at PC is a return instruction. */
|
||||
|
||||
int
|
||||
about_to_return (pc)
|
||||
CORE_ADDR pc;
|
||||
{
|
||||
int b1 = read_memory_integer (pc, 1);
|
||||
|
||||
|
@ -443,7 +425,7 @@ about_to_return (pc)
|
|||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void
|
||||
h8500_set_pointer_size (newsize)
|
||||
|
@ -467,16 +449,39 @@ h8500_set_pointer_size (newsize)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
big_command ()
|
||||
{
|
||||
h8500_set_pointer_size (32);
|
||||
code_size = 4;
|
||||
data_size = 4;
|
||||
}
|
||||
|
||||
struct cmd_list_element *setmemorylist;
|
||||
static void
|
||||
medium_command ()
|
||||
{
|
||||
h8500_set_pointer_size (32);
|
||||
code_size = 4;
|
||||
data_size = 2;
|
||||
}
|
||||
|
||||
static void
|
||||
compact_command ()
|
||||
{
|
||||
h8500_set_pointer_size (32);
|
||||
code_size = 2;
|
||||
data_size = 4;
|
||||
}
|
||||
|
||||
#define C(name,a,b,c) name () { h8500_set_pointer_size(a); code_size = b; data_size = c; }
|
||||
static void
|
||||
small_command ()
|
||||
{
|
||||
h8500_set_pointer_size (16);
|
||||
code_size = 2;
|
||||
data_size = 2;
|
||||
}
|
||||
|
||||
C(big_command, 32,4,4);
|
||||
C(medium_command, 32, 4,2);
|
||||
C(compact_command, 32,2,4);
|
||||
C(small_command, 16,2,2);
|
||||
static struct cmd_list_element *setmemorylist;
|
||||
|
||||
static void
|
||||
set_memory (args, from_tty)
|
||||
|
@ -608,27 +613,6 @@ h8500_set_trapped_internalvar (var, newval, bitpos, bitsize, offset)
|
|||
parse_and_eval (expression);
|
||||
}
|
||||
|
||||
void
|
||||
_initialize_h8500_tdep ()
|
||||
{
|
||||
add_prefix_cmd ("memory", no_class, set_memory,
|
||||
"set the memory model", &setmemorylist, "set memory ", 0,
|
||||
&setlist);
|
||||
|
||||
add_cmd ("small", class_support, small_command,
|
||||
"Set small memory model. (16 bit code, 16 bit data)", &setmemorylist);
|
||||
|
||||
add_cmd ("big", class_support, big_command,
|
||||
"Set big memory model. (32 bit code, 32 bit data)", &setmemorylist);
|
||||
|
||||
add_cmd ("medium", class_support, medium_command,
|
||||
"Set medium memory model. (32 bit code, 16 bit data)", &setmemorylist);
|
||||
|
||||
add_cmd ("compact", class_support, compact_command,
|
||||
"Set compact memory model. (16 bit code, 32 bit data)", &setmemorylist);
|
||||
|
||||
}
|
||||
|
||||
CORE_ADDR
|
||||
h8500_read_sp ()
|
||||
{
|
||||
|
@ -673,5 +657,22 @@ h8500_write_fp (v)
|
|||
void
|
||||
_initialize_h8500_tdep ()
|
||||
{
|
||||
tm_print_insn = gdb_print_insn_sh;
|
||||
tm_print_insn = print_insn_h8500;
|
||||
|
||||
add_prefix_cmd ("memory", no_class, set_memory,
|
||||
"set the memory model", &setmemorylist, "set memory ", 0,
|
||||
&setlist);
|
||||
|
||||
add_cmd ("small", class_support, small_command,
|
||||
"Set small memory model. (16 bit code, 16 bit data)", &setmemorylist);
|
||||
|
||||
add_cmd ("big", class_support, big_command,
|
||||
"Set big memory model. (32 bit code, 32 bit data)", &setmemorylist);
|
||||
|
||||
add_cmd ("medium", class_support, medium_command,
|
||||
"Set medium memory model. (32 bit code, 16 bit data)", &setmemorylist);
|
||||
|
||||
add_cmd ("compact", class_support, compact_command,
|
||||
"Set compact memory model. (16 bit code, 32 bit data)", &setmemorylist);
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue