diff options
-rw-r--r-- | gdb/ChangeLog | 10 | ||||
-rw-r--r-- | gdb/MAINTAINERS | 4 | ||||
-rw-r--r-- | gdb/NEWS | 2 | ||||
-rw-r--r-- | gdb/config/h8500/h8500.mt | 12 | ||||
-rw-r--r-- | gdb/config/h8500/tm-h8500.h | 590 | ||||
-rw-r--r-- | gdb/configure.tgt | 2 | ||||
-rw-r--r-- | gdb/findvar.c | 148 | ||||
-rw-r--r-- | gdb/h8500-tdep.c | 1478 |
8 files changed, 1130 insertions, 1116 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4136db9..10ae172 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2003-02-04 Andrew Cagney <ac131313@redhat.com> + + * MAINTAINERS: Mark h8500 as obsolete. + * configure.tgt (h8500-*-*): Mark h8500 code as obsolete. + * findvar.c (value_from_register): Ditto. + * h8500-tdep.c: Mark file as obsolete. + * config/h8500/h8500.mt: Ditto. + * config/h8500/tm-h8500.h: Ditto. + * NEWS: Mention that h8500 is obsolete. + 2003-02-04 David Carlton <carlton@math.stanford.edu> * objfiles.c (allocate_objfile): Always set name. Add comment at diff --git a/gdb/MAINTAINERS b/gdb/MAINTAINERS index cc6b053..15aad3a 100644 --- a/gdb/MAINTAINERS +++ b/gdb/MAINTAINERS @@ -83,9 +83,7 @@ maintainer works with the native maintainer when resolving API issues. h8300 --target=h8300hms ,-Werror Maintenance only - h8500 (--target=h8500hms broken) - Maintenance only - Not multi-arch, work in progress + h8500 (--target=h8500hms OBSOLETE) i386 --target=i386-elf ,-Werror Mark Kettenis kettenis@gnu.org @@ -37,6 +37,8 @@ been commented out. Unless there is activity to revive these configurations, the next release of GDB will have their sources permanently REMOVED. +H8/500 simulator h8500-hitachi-hms or h8500hms + * REMOVED configurations and files V850EA ISA diff --git a/gdb/config/h8500/h8500.mt b/gdb/config/h8500/h8500.mt index 35f6b4d..64608a0 100644 --- a/gdb/config/h8500/h8500.mt +++ b/gdb/config/h8500/h8500.mt @@ -1,6 +1,6 @@ -# Target: H8500 with HMS monitor and H8 simulator -TDEPFILES= h8500-tdep.o monitor.o remote-hms.o dsrec.o -TM_FILE= tm-h8500.h - -SIM_OBS = remote-sim.o -SIM = ../sim/h8500/libsim.a +# OBSOLETE # Target: H8500 with HMS monitor and H8 simulator +# OBSOLETE TDEPFILES= h8500-tdep.o monitor.o remote-hms.o dsrec.o +# OBSOLETE TM_FILE= tm-h8500.h +# OBSOLETE +# OBSOLETE SIM_OBS = remote-sim.o +# OBSOLETE SIM = ../sim/h8500/libsim.a diff --git a/gdb/config/h8500/tm-h8500.h b/gdb/config/h8500/tm-h8500.h index 5915565..4d0f640 100644 --- a/gdb/config/h8500/tm-h8500.h +++ b/gdb/config/h8500/tm-h8500.h @@ -1,295 +1,295 @@ -/* Parameters for execution on a H8/500 series machine. - - Copyright 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002, 2003 Free - Software Foundation, Inc. - - This file is part of GDB. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include "regcache.h" - -/* NOTE: cagney/2002-11-24: This is a guess. */ -#define DEPRECATED_USE_GENERIC_DUMMY_FRAMES 0 -#define CALL_DUMMY_LOCATION ON_STACK -#define DEPRECATED_PC_IN_CALL_DUMMY(pc, sp, frame_address) deprecated_pc_in_call_dummy_on_stack (pc, sp, frame_address) - -/* Contributed by Steve Chamberlain sac@cygnus.com */ - -#define GDB_TARGET_IS_H8500 - -/* Define the sizes of integers and pointers. */ - -#define TARGET_INT_BIT 16 - -#define TARGET_LONG_BIT 32 - -#define TARGET_PTR_BIT (minimum_mode ? 16 : 32) - -/* Offset from address of function to start of its code. - Zero on most machines. */ - -#define FUNCTION_START_OFFSET 0 - -/* Advance PC across any function entry prologue instructions - to reach some "real" code. */ - -#define SKIP_PROLOGUE(ip) (h8500_skip_prologue (ip)) -extern CORE_ADDR h8500_skip_prologue (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() -extern CORE_ADDR saved_pc_after_call (void); - -/* Stack grows downward. */ - -#define INNER_THAN(lhs,rhs) ((lhs) < (rhs)) - -/* Illegal instruction - used by the simulator for breakpoint - detection */ - -#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 - -/* Say how long registers are. */ - -#define REGISTER_TYPE unsigned long - -/* Say how much memory is needed to store a copy of the register set */ - -#define REGISTER_BYTES (NUM_REGS * 4) - -/* Index within `registers' of the first byte of the space for - register N. */ - -#define REGISTER_BYTE(N) ((N)*4) - -/* Number of bytes of storage in the actual machine representation - for register N. */ - -#define REGISTER_RAW_SIZE(N) h8500_register_size(N) -extern int h8500_register_size (int regno); - -#define REGISTER_SIZE 4 - -#define REGISTER_VIRTUAL_SIZE(N) h8500_register_size(N) - -/* Largest value REGISTER_RAW_SIZE can have. */ - -#define MAX_REGISTER_RAW_SIZE 4 - -/* Largest value REGISTER_VIRTUAL_SIZE can have. */ - -#define MAX_REGISTER_VIRTUAL_SIZE 4 - -/* Return the GDB type object for the "standard" data type - of data in register N. */ - -#define REGISTER_VIRTUAL_TYPE(N) h8500_register_virtual_type(N) -extern struct type *h8500_register_virtual_type (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. */ - -#define R0_REGNUM 0 -#define R1_REGNUM 1 -#define R2_REGNUM 2 -#define R3_REGNUM 3 -#define R4_REGNUM 4 -#define R5_REGNUM 5 -#define R6_REGNUM 6 -#define R7_REGNUM 7 - -#define PR0_REGNUM 8 -#define PR1_REGNUM 9 -#define PR2_REGNUM 10 -#define PR3_REGNUM 11 -#define PR4_REGNUM 12 -#define PR5_REGNUM 13 -#define PR6_REGNUM 14 -#define PR7_REGNUM 15 - -#define SEG_C_REGNUM 16 /* Segment registers */ -#define SEG_D_REGNUM 17 -#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_MASK (minimum_mode ? 0x0000ffff : 0x00ffffff) - -/* Store the address of the place in which to copy the structure the - subroutine will return. This is called from call_function. */ - -/*#define STORE_STRUCT_RETURN(ADDR, SP) \ - { write_register (0, (ADDR)); internal_error (__FILE__, __LINE__, "failed internal consistency check"); } */ - -/* Extract from an array REGBUF containing the (raw) register state - a function return value of type TYPE, and copy that, in virtual format, - into VALBUF. */ - -#define DEPRECATED_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. */ - -#define DEPRECATED_STORE_RETURN_VALUE(TYPE,VALBUF) \ - deprecated_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 DEPRECATED_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_look_for_prologue (FI)) - -/* Any function with a frame looks like this - SECOND ARG - FIRST ARG - RET PC - SAVED R2 - SAVED R3 - SAVED FP <-FP POINTS HERE - LOCALS0 - LOCALS1 <-SP POINTS HERE - - */ - -#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 (struct frame_info *); - -#define FRAME_SAVED_PC(FRAME) frame_saved_pc(FRAME) -extern CORE_ADDR frame_saved_pc (struct frame_info *frame); - -#define FRAME_ARGS_ADDRESS(fi) (get_frame_base (fi)) - -#define FRAME_LOCALS_ADDRESS(fi) (get_frame_base (fi)) - -/* Set VAL to the number of args passed to frame described by FI. - Can set VAL to -1, meaning no way to tell. */ - -/* We can't tell how many args there are - now that the C compiler delays popping them. */ - -#define FRAME_NUM_ARGS(fi) (-1) - -/* Return number of bytes at start of arglist that are not really args. */ - -#define FRAME_ARGS_SKIP 0 - -/* Put here the code to store, into a struct frame_saved_regs, - the addresses of the saved registers of frame described by FRAME_INFO. - This includes special registers such as pc and fp saved in special - ways in the stack frame. sp is even more special: - the address we return for it IS the sp for the next frame. */ - -#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 (struct frame_info *frame_info, - struct frame_saved_regs *frame_saved_regs); - - -/* Discard from the stack the innermost frame, restoring all registers. */ - -#define POP_FRAME { h8500_pop_frame (); } -extern void h8500_pop_frame (void); - -#define SHORT_INT_MAX 32767 -#define SHORT_INT_MIN -32768 - -typedef unsigned short INSN_WORD; - -extern CORE_ADDR h8500_addr_bits_remove (CORE_ADDR); -#define ADDR_BITS_REMOVE(addr) h8500_addr_bits_remove (addr) - -#define read_memory_short(x) (read_memory_integer(x,2) & 0xffff) - -extern void h8500_do_registers_info (int regnum, int all); -#define DEPRECATED_DO_REGISTERS_INFO(REGNUM,ALL) \ - h8500_do_registers_info (REGNUM, ALL) - -extern int minimum_mode; - -#define CALL_DUMMY_LENGTH 10 - -/* Fake variables to make it easy to use 24 bit register pointers */ - -#define IS_TRAPPED_INTERNALVAR h8500_is_trapped_internalvar -extern int h8500_is_trapped_internalvar (char *name); - -#define VALUE_OF_TRAPPED_INTERNALVAR h8500_value_of_trapped_internalvar -extern struct value *h8500_value_of_trapped_internalvar ( /* struct internalvar *var */ ); - -#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 */ ); - -extern CORE_ADDR h8500_read_sp (void); -extern void h8500_write_sp (CORE_ADDR); - -extern CORE_ADDR h8500_read_fp (void); - -extern CORE_ADDR h8500_read_pc (ptid_t); -extern void h8500_write_pc (CORE_ADDR, ptid_t); - -#define TARGET_READ_SP() h8500_read_sp() -#define TARGET_WRITE_SP(x) h8500_write_sp(x) - -#define TARGET_READ_PC(pid) h8500_read_pc(pid) -#define TARGET_WRITE_PC(x,pid) h8500_write_pc(x,pid) - -#define TARGET_READ_FP() h8500_read_fp() +// OBSOLETE /* Parameters for execution on a H8/500 series machine. +// OBSOLETE +// OBSOLETE Copyright 1993, 1994, 1995, 1998, 1999, 2000, 2001, 2002, 2003 Free +// OBSOLETE Software Foundation, Inc. +// OBSOLETE +// OBSOLETE This file is part of GDB. +// OBSOLETE +// OBSOLETE This program is free software; you can redistribute it and/or modify +// OBSOLETE it under the terms of the GNU General Public License as published by +// OBSOLETE the Free Software Foundation; either version 2 of the License, or +// OBSOLETE (at your option) any later version. +// OBSOLETE +// OBSOLETE This program is distributed in the hope that it will be useful, +// OBSOLETE but WITHOUT ANY WARRANTY; without even the implied warranty of +// OBSOLETE MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// OBSOLETE GNU General Public License for more details. +// OBSOLETE +// OBSOLETE You should have received a copy of the GNU General Public License +// OBSOLETE along with this program; if not, write to the Free Software +// OBSOLETE Foundation, Inc., 59 Temple Place - Suite 330, +// OBSOLETE Boston, MA 02111-1307, USA. */ +// OBSOLETE +// OBSOLETE #include "regcache.h" +// OBSOLETE +// OBSOLETE /* NOTE: cagney/2002-11-24: This is a guess. */ +// OBSOLETE #define DEPRECATED_USE_GENERIC_DUMMY_FRAMES 0 +// OBSOLETE #define CALL_DUMMY_LOCATION ON_STACK +// OBSOLETE #define DEPRECATED_PC_IN_CALL_DUMMY(pc, sp, frame_address) deprecated_pc_in_call_dummy_on_stack (pc, sp, frame_address) +// OBSOLETE +// OBSOLETE /* Contributed by Steve Chamberlain sac@cygnus.com */ +// OBSOLETE +// OBSOLETE #define GDB_TARGET_IS_H8500 +// OBSOLETE +// OBSOLETE /* Define the sizes of integers and pointers. */ +// OBSOLETE +// OBSOLETE #define TARGET_INT_BIT 16 +// OBSOLETE +// OBSOLETE #define TARGET_LONG_BIT 32 +// OBSOLETE +// OBSOLETE #define TARGET_PTR_BIT (minimum_mode ? 16 : 32) +// OBSOLETE +// OBSOLETE /* Offset from address of function to start of its code. +// OBSOLETE Zero on most machines. */ +// OBSOLETE +// OBSOLETE #define FUNCTION_START_OFFSET 0 +// OBSOLETE +// OBSOLETE /* Advance PC across any function entry prologue instructions +// OBSOLETE to reach some "real" code. */ +// OBSOLETE +// OBSOLETE #define SKIP_PROLOGUE(ip) (h8500_skip_prologue (ip)) +// OBSOLETE extern CORE_ADDR h8500_skip_prologue (CORE_ADDR); +// OBSOLETE +// OBSOLETE /* Immediately after a function call, return the saved pc. +// OBSOLETE Can't always go through the frames for this because on some machines +// OBSOLETE the new frame is not set up until the new function executes +// OBSOLETE some instructions. */ +// OBSOLETE +// OBSOLETE #define SAVED_PC_AFTER_CALL(frame) saved_pc_after_call() +// OBSOLETE extern CORE_ADDR saved_pc_after_call (void); +// OBSOLETE +// OBSOLETE /* Stack grows downward. */ +// OBSOLETE +// OBSOLETE #define INNER_THAN(lhs,rhs) ((lhs) < (rhs)) +// OBSOLETE +// OBSOLETE /* Illegal instruction - used by the simulator for breakpoint +// OBSOLETE detection */ +// OBSOLETE +// OBSOLETE #define BREAKPOINT {0x0b} +// OBSOLETE +// OBSOLETE /* If your kernel resets the pc after the trap happens you may need to +// OBSOLETE define this before including this file. */ +// OBSOLETE +// OBSOLETE #define DECR_PC_AFTER_BREAK 0 +// OBSOLETE +// OBSOLETE /* Say how long registers are. */ +// OBSOLETE +// OBSOLETE #define REGISTER_TYPE unsigned long +// OBSOLETE +// OBSOLETE /* Say how much memory is needed to store a copy of the register set */ +// OBSOLETE +// OBSOLETE #define REGISTER_BYTES (NUM_REGS * 4) +// OBSOLETE +// OBSOLETE /* Index within `registers' of the first byte of the space for +// OBSOLETE register N. */ +// OBSOLETE +// OBSOLETE #define REGISTER_BYTE(N) ((N)*4) +// OBSOLETE +// OBSOLETE /* Number of bytes of storage in the actual machine representation +// OBSOLETE for register N. */ +// OBSOLETE +// OBSOLETE #define REGISTER_RAW_SIZE(N) h8500_register_size(N) +// OBSOLETE extern int h8500_register_size (int regno); +// OBSOLETE +// OBSOLETE #define REGISTER_SIZE 4 +// OBSOLETE +// OBSOLETE #define REGISTER_VIRTUAL_SIZE(N) h8500_register_size(N) +// OBSOLETE +// OBSOLETE /* Largest value REGISTER_RAW_SIZE can have. */ +// OBSOLETE +// OBSOLETE #define MAX_REGISTER_RAW_SIZE 4 +// OBSOLETE +// OBSOLETE /* Largest value REGISTER_VIRTUAL_SIZE can have. */ +// OBSOLETE +// OBSOLETE #define MAX_REGISTER_VIRTUAL_SIZE 4 +// OBSOLETE +// OBSOLETE /* Return the GDB type object for the "standard" data type +// OBSOLETE of data in register N. */ +// OBSOLETE +// OBSOLETE #define REGISTER_VIRTUAL_TYPE(N) h8500_register_virtual_type(N) +// OBSOLETE extern struct type *h8500_register_virtual_type (int regno); +// OBSOLETE +// OBSOLETE /* Initializer for an array of names of registers. +// OBSOLETE Entries beyond the first NUM_REGS are ignored. */ +// OBSOLETE +// OBSOLETE #define REGISTER_NAMES \ +// OBSOLETE { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \ +// OBSOLETE "pr0","pr1","pr2","pr3","pr4","pr5","pr6","pr7", \ +// OBSOLETE "cp", "dp", "ep", "tp", "sr", "pc"} +// OBSOLETE +// OBSOLETE /* Register numbers of various important registers. Note that some of +// OBSOLETE these values are "real" register numbers, and correspond to the +// OBSOLETE general registers of the machine, and some are "phony" register +// OBSOLETE numbers which are too large to be actual register numbers as far as +// OBSOLETE the user is concerned but do serve to get the desired values when +// OBSOLETE passed to read_register. */ +// OBSOLETE +// OBSOLETE #define R0_REGNUM 0 +// OBSOLETE #define R1_REGNUM 1 +// OBSOLETE #define R2_REGNUM 2 +// OBSOLETE #define R3_REGNUM 3 +// OBSOLETE #define R4_REGNUM 4 +// OBSOLETE #define R5_REGNUM 5 +// OBSOLETE #define R6_REGNUM 6 +// OBSOLETE #define R7_REGNUM 7 +// OBSOLETE +// OBSOLETE #define PR0_REGNUM 8 +// OBSOLETE #define PR1_REGNUM 9 +// OBSOLETE #define PR2_REGNUM 10 +// OBSOLETE #define PR3_REGNUM 11 +// OBSOLETE #define PR4_REGNUM 12 +// OBSOLETE #define PR5_REGNUM 13 +// OBSOLETE #define PR6_REGNUM 14 +// OBSOLETE #define PR7_REGNUM 15 +// OBSOLETE +// OBSOLETE #define SEG_C_REGNUM 16 /* Segment registers */ +// OBSOLETE #define SEG_D_REGNUM 17 +// OBSOLETE #define SEG_E_REGNUM 18 +// OBSOLETE #define SEG_T_REGNUM 19 +// OBSOLETE +// OBSOLETE #define CCR_REGNUM 20 /* Contains processor status */ +// OBSOLETE #define PC_REGNUM 21 /* Contains program counter */ +// OBSOLETE +// OBSOLETE #define NUM_REGS 22 +// OBSOLETE +// OBSOLETE #define SP_REGNUM PR7_REGNUM /* Contains address of top of stack */ +// OBSOLETE #define FP_REGNUM PR6_REGNUM /* Contains address of executing stack frame */ +// OBSOLETE +// OBSOLETE #define PTR_SIZE (minimum_mode ? 2 : 4) +// OBSOLETE #define PTR_MASK (minimum_mode ? 0x0000ffff : 0x00ffffff) +// OBSOLETE +// OBSOLETE /* Store the address of the place in which to copy the structure the +// OBSOLETE subroutine will return. This is called from call_function. */ +// OBSOLETE +// OBSOLETE /*#define STORE_STRUCT_RETURN(ADDR, SP) \ +// OBSOLETE { write_register (0, (ADDR)); internal_error (__FILE__, __LINE__, "failed internal consistency check"); } */ +// OBSOLETE +// OBSOLETE /* Extract from an array REGBUF containing the (raw) register state +// OBSOLETE a function return value of type TYPE, and copy that, in virtual format, +// OBSOLETE into VALBUF. */ +// OBSOLETE +// OBSOLETE #define DEPRECATED_EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \ +// OBSOLETE memcpy (VALBUF, (char *)(REGBUF), TYPE_LENGTH(TYPE)) +// OBSOLETE +// OBSOLETE /* Write into appropriate registers a function return value +// OBSOLETE of type TYPE, given in virtual format. */ +// OBSOLETE +// OBSOLETE #define DEPRECATED_STORE_RETURN_VALUE(TYPE,VALBUF) \ +// OBSOLETE deprecated_write_register_bytes (0, VALBUF, TYPE_LENGTH (TYPE)) +// OBSOLETE +// OBSOLETE /* Extract from an array REGBUF containing the (raw) register state +// OBSOLETE the address in which a function should return its structure value, +// OBSOLETE as a CORE_ADDR (or an expression that can be used as one). */ +// OBSOLETE +// OBSOLETE #define DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) (*(CORE_ADDR *)(REGBUF)) +// OBSOLETE +// OBSOLETE +// OBSOLETE /* Define other aspects of the stack frame. */ +// OBSOLETE +// OBSOLETE /* A macro that tells us whether the function invocation represented +// OBSOLETE by FI does not have a frame on the stack associated with it. If it +// OBSOLETE does not, FRAMELESS is set to 1, else 0. */ +// OBSOLETE +// OBSOLETE #define FRAMELESS_FUNCTION_INVOCATION(FI) \ +// OBSOLETE (frameless_look_for_prologue (FI)) +// OBSOLETE +// OBSOLETE /* Any function with a frame looks like this +// OBSOLETE SECOND ARG +// OBSOLETE FIRST ARG +// OBSOLETE RET PC +// OBSOLETE SAVED R2 +// OBSOLETE SAVED R3 +// OBSOLETE SAVED FP <-FP POINTS HERE +// OBSOLETE LOCALS0 +// OBSOLETE LOCALS1 <-SP POINTS HERE +// OBSOLETE +// OBSOLETE */ +// OBSOLETE +// OBSOLETE #define INIT_EXTRA_FRAME_INFO(fromleaf, fci) ; +// OBSOLETE /* (fci)->frame |= read_register(SEG_T_REGNUM) << 16; */ +// OBSOLETE +// OBSOLETE #define FRAME_CHAIN(FRAME) h8500_frame_chain(FRAME) +// OBSOLETE struct frame_info; +// OBSOLETE extern CORE_ADDR h8500_frame_chain (struct frame_info *); +// OBSOLETE +// OBSOLETE #define FRAME_SAVED_PC(FRAME) frame_saved_pc(FRAME) +// OBSOLETE extern CORE_ADDR frame_saved_pc (struct frame_info *frame); +// OBSOLETE +// OBSOLETE #define FRAME_ARGS_ADDRESS(fi) (get_frame_base (fi)) +// OBSOLETE +// OBSOLETE #define FRAME_LOCALS_ADDRESS(fi) (get_frame_base (fi)) +// OBSOLETE +// OBSOLETE /* Set VAL to the number of args passed to frame described by FI. +// OBSOLETE Can set VAL to -1, meaning no way to tell. */ +// OBSOLETE +// OBSOLETE /* We can't tell how many args there are +// OBSOLETE now that the C compiler delays popping them. */ +// OBSOLETE +// OBSOLETE #define FRAME_NUM_ARGS(fi) (-1) +// OBSOLETE +// OBSOLETE /* Return number of bytes at start of arglist that are not really args. */ +// OBSOLETE +// OBSOLETE #define FRAME_ARGS_SKIP 0 +// OBSOLETE +// OBSOLETE /* Put here the code to store, into a struct frame_saved_regs, +// OBSOLETE the addresses of the saved registers of frame described by FRAME_INFO. +// OBSOLETE This includes special registers such as pc and fp saved in special +// OBSOLETE ways in the stack frame. sp is even more special: +// OBSOLETE the address we return for it IS the sp for the next frame. */ +// OBSOLETE +// OBSOLETE #define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) \ +// OBSOLETE frame_find_saved_regs(frame_info, &(frame_saved_regs)) +// OBSOLETE struct frame_saved_regs; +// OBSOLETE extern void frame_find_saved_regs (struct frame_info *frame_info, +// OBSOLETE struct frame_saved_regs *frame_saved_regs); +// OBSOLETE +// OBSOLETE +// OBSOLETE /* Discard from the stack the innermost frame, restoring all registers. */ +// OBSOLETE +// OBSOLETE #define POP_FRAME { h8500_pop_frame (); } +// OBSOLETE extern void h8500_pop_frame (void); +// OBSOLETE +// OBSOLETE #define SHORT_INT_MAX 32767 +// OBSOLETE #define SHORT_INT_MIN -32768 +// OBSOLETE +// OBSOLETE typedef unsigned short INSN_WORD; +// OBSOLETE +// OBSOLETE extern CORE_ADDR h8500_addr_bits_remove (CORE_ADDR); +// OBSOLETE #define ADDR_BITS_REMOVE(addr) h8500_addr_bits_remove (addr) +// OBSOLETE +// OBSOLETE #define read_memory_short(x) (read_memory_integer(x,2) & 0xffff) +// OBSOLETE +// OBSOLETE extern void h8500_do_registers_info (int regnum, int all); +// OBSOLETE #define DEPRECATED_DO_REGISTERS_INFO(REGNUM,ALL) \ +// OBSOLETE h8500_do_registers_info (REGNUM, ALL) +// OBSOLETE +// OBSOLETE extern int minimum_mode; +// OBSOLETE +// OBSOLETE #define CALL_DUMMY_LENGTH 10 +// OBSOLETE +// OBSOLETE /* Fake variables to make it easy to use 24 bit register pointers */ +// OBSOLETE +// OBSOLETE #define IS_TRAPPED_INTERNALVAR h8500_is_trapped_internalvar +// OBSOLETE extern int h8500_is_trapped_internalvar (char *name); +// OBSOLETE +// OBSOLETE #define VALUE_OF_TRAPPED_INTERNALVAR h8500_value_of_trapped_internalvar +// OBSOLETE extern struct value *h8500_value_of_trapped_internalvar ( /* struct internalvar *var */ ); +// OBSOLETE +// OBSOLETE #define SET_TRAPPED_INTERNALVAR h8500_set_trapped_internalvar +// OBSOLETE extern void h8500_set_trapped_internalvar ( /* struct internalvar *var, value newval, int bitpos, int bitsize, int offset */ ); +// OBSOLETE +// OBSOLETE extern CORE_ADDR h8500_read_sp (void); +// OBSOLETE extern void h8500_write_sp (CORE_ADDR); +// OBSOLETE +// OBSOLETE extern CORE_ADDR h8500_read_fp (void); +// OBSOLETE +// OBSOLETE extern CORE_ADDR h8500_read_pc (ptid_t); +// OBSOLETE extern void h8500_write_pc (CORE_ADDR, ptid_t); +// OBSOLETE +// OBSOLETE #define TARGET_READ_SP() h8500_read_sp() +// OBSOLETE #define TARGET_WRITE_SP(x) h8500_write_sp(x) +// OBSOLETE +// OBSOLETE #define TARGET_READ_PC(pid) h8500_read_pc(pid) +// OBSOLETE #define TARGET_WRITE_PC(x,pid) h8500_write_pc(x,pid) +// OBSOLETE +// OBSOLETE #define TARGET_READ_FP() h8500_read_fp() diff --git a/gdb/configure.tgt b/gdb/configure.tgt index 488b41f..75edf6f 100644 --- a/gdb/configure.tgt +++ b/gdb/configure.tgt @@ -68,7 +68,7 @@ cris*) gdb_target=cris ;; d10v-*-*) gdb_target=d10v ;; h8300-*-*) gdb_target=h8300 ;; -h8500-*-*) gdb_target=h8500 ;; +# OBSOLETE h8500-*-*) gdb_target=h8500 ;; frv-*-*) gdb_target=frv ;; diff --git a/gdb/findvar.c b/gdb/findvar.c index ccdb18d..4e8a42d 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -663,8 +663,10 @@ value_from_register (struct type *type, int regnum, struct frame_info *frame) 1); if (num_storage_locs > 1 -#ifdef GDB_TARGET_IS_H8500 - || TYPE_CODE (type) == TYPE_CODE_PTR +#if 0 + // OBSOLETE #ifdef GDB_TARGET_IS_H8500 + // OBSOLETE || TYPE_CODE (type) == TYPE_CODE_PTR + // OBSOLETE #endif #endif ) { @@ -680,76 +682,78 @@ value_from_register (struct type *type, int regnum, struct frame_info *frame) /* Copy all of the data out, whereever it may be. */ -#ifdef GDB_TARGET_IS_H8500 -/* This piece of hideosity is required because the H8500 treats registers - differently depending upon whether they are used as pointers or not. As a - pointer, a register needs to have a page register tacked onto the front. - An alternate way to do this would be to have gcc output different register - numbers for the pointer & non-pointer form of the register. But, it - doesn't, so we're stuck with this. */ - - if (TYPE_CODE (type) == TYPE_CODE_PTR - && len > 2) - { - int page_regnum; - - switch (regnum) - { - case R0_REGNUM: - case R1_REGNUM: - case R2_REGNUM: - case R3_REGNUM: - page_regnum = SEG_D_REGNUM; - break; - case R4_REGNUM: - case R5_REGNUM: - page_regnum = SEG_E_REGNUM; - break; - case R6_REGNUM: - case R7_REGNUM: - page_regnum = SEG_T_REGNUM; - break; - } - - value_bytes[0] = 0; - get_saved_register (value_bytes + 1, - &optim, - &addr, - frame, - page_regnum, - &lval); - - if (register_cached (page_regnum) == -1) - return NULL; /* register value not available */ - - if (lval == lval_register) - reg_stor++; - else - mem_stor++; - first_addr = addr; - last_addr = addr; - - get_saved_register (value_bytes + 2, - &optim, - &addr, - frame, - regnum, - &lval); - - if (register_cached (regnum) == -1) - return NULL; /* register value not available */ - - if (lval == lval_register) - reg_stor++; - else - { - mem_stor++; - mem_tracking = mem_tracking && (addr == last_addr); - } - last_addr = addr; - } - else -#endif /* GDB_TARGET_IS_H8500 */ +#if 0 + // OBSOLETE #ifdef GDB_TARGET_IS_H8500 + // OBSOLETE /* This piece of hideosity is required because the H8500 treats registers + // OBSOLETE differently depending upon whether they are used as pointers or not. As a + // OBSOLETE pointer, a register needs to have a page register tacked onto the front. + // OBSOLETE An alternate way to do this would be to have gcc output different register + // OBSOLETE numbers for the pointer & non-pointer form of the register. But, it + // OBSOLETE doesn't, so we're stuck with this. */ + // OBSOLETE + // OBSOLETE if (TYPE_CODE (type) == TYPE_CODE_PTR + // OBSOLETE && len > 2) + // OBSOLETE { + // OBSOLETE int page_regnum; + // OBSOLETE + // OBSOLETE switch (regnum) + // OBSOLETE { + // OBSOLETE case R0_REGNUM: + // OBSOLETE case R1_REGNUM: + // OBSOLETE case R2_REGNUM: + // OBSOLETE case R3_REGNUM: + // OBSOLETE page_regnum = SEG_D_REGNUM; + // OBSOLETE break; + // OBSOLETE case R4_REGNUM: + // OBSOLETE case R5_REGNUM: + // OBSOLETE page_regnum = SEG_E_REGNUM; + // OBSOLETE break; + // OBSOLETE case R6_REGNUM: + // OBSOLETE case R7_REGNUM: + // OBSOLETE page_regnum = SEG_T_REGNUM; + // OBSOLETE break; + // OBSOLETE } + // OBSOLETE + // OBSOLETE value_bytes[0] = 0; + // OBSOLETE get_saved_register (value_bytes + 1, + // OBSOLETE &optim, + // OBSOLETE &addr, + // OBSOLETE frame, + // OBSOLETE page_regnum, + // OBSOLETE &lval); + // OBSOLETE + // OBSOLETE if (register_cached (page_regnum) == -1) + // OBSOLETE return NULL; /* register value not available */ + // OBSOLETE + // OBSOLETE if (lval == lval_register) + // OBSOLETE reg_stor++; + // OBSOLETE else + // OBSOLETE mem_stor++; + // OBSOLETE first_addr = addr; + // OBSOLETE last_addr = addr; + // OBSOLETE + // OBSOLETE get_saved_register (value_bytes + 2, + // OBSOLETE &optim, + // OBSOLETE &addr, + // OBSOLETE frame, + // OBSOLETE regnum, + // OBSOLETE &lval); + // OBSOLETE + // OBSOLETE if (register_cached (regnum) == -1) + // OBSOLETE return NULL; /* register value not available */ + // OBSOLETE + // OBSOLETE if (lval == lval_register) + // OBSOLETE reg_stor++; + // OBSOLETE else + // OBSOLETE { + // OBSOLETE mem_stor++; + // OBSOLETE mem_tracking = mem_tracking && (addr == last_addr); + // OBSOLETE } + // OBSOLETE last_addr = addr; + // OBSOLETE } + // OBSOLETE else + // OBSOLETE #endif /* GDB_TARGET_IS_H8500 */ +#endif for (local_regnum = regnum; value_bytes_copied < len; (value_bytes_copied += REGISTER_RAW_SIZE (local_regnum), diff --git a/gdb/h8500-tdep.c b/gdb/h8500-tdep.c index 944a297..f30fbd0 100644 --- a/gdb/h8500-tdep.c +++ b/gdb/h8500-tdep.c @@ -1,739 +1,739 @@ -/* Target-dependent code for Hitachi H8/500, for GDB. - - Copyright 1993, 1994, 1995, 1998, 2000, 2001, 2002 Free Software - Foundation, Inc. - - This file is part of GDB. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* - Contributed by Steve Chamberlain - sac@cygnus.com - */ - -#include "defs.h" -#include "frame.h" -#include "symtab.h" -#include "gdbtypes.h" -#include "gdbcmd.h" -#include "value.h" -#include "dis-asm.h" -#include "gdbcore.h" -#include "regcache.h" - -#define UNSIGNED_SHORT(X) ((X) & 0xffff) - -static int code_size = 2; - -static int data_size = 2; - -/* Shape of an H8/500 frame : - - arg-n - .. - arg-2 - arg-1 - return address <2 or 4 bytes> - old fp <2 bytes> - auto-n - .. - auto-1 - saved registers - - */ - -/* an easy to debug H8 stack frame looks like: - 0x6df6 push r6 - 0x0d76 mov.w r7,r6 - 0x6dfn push reg - 0x7905 nnnn mov.w #n,r5 or 0x1b87 subs #2,sp - 0x1957 sub.w r5,sp - - */ - -#define IS_PUSH(x) (((x) & 0xff00)==0x6d00) -#define IS_LINK_8(x) ((x) == 0x17) -#define IS_LINK_16(x) ((x) == 0x1f) -#define IS_MOVE_FP(x) ((x) == 0x0d76) -#define IS_MOV_SP_FP(x) ((x) == 0x0d76) -#define IS_SUB2_SP(x) ((x) == 0x1b87) -#define IS_MOVK_R5(x) ((x) == 0x7905) -#define IS_SUB_R5SP(x) ((x) == 0x1957) - -#define LINK_8 0x17 -#define LINK_16 0x1f - -int minimum_mode = 1; - -CORE_ADDR -h8500_skip_prologue (CORE_ADDR start_pc) -{ - short int w; - - w = read_memory_integer (start_pc, 1); - if (w == LINK_8) - { - start_pc += 2; - w = read_memory_integer (start_pc, 1); - } - - if (w == LINK_16) - { - start_pc += 3; - w = read_memory_integer (start_pc, 2); - } - - return start_pc; -} - -CORE_ADDR -h8500_addr_bits_remove (CORE_ADDR addr) -{ - return ((addr) & 0xffffff); -} - -/* Given a GDB frame, determine the address of the calling function's - frame. This will be used to create a new GDB frame struct, and - then INIT_EXTRA_FRAME_INFO and DEPRECATED_INIT_FRAME_PC will be - called for the new frame. - - For us, the frame address is its stack pointer value, so we look up - the function prologue to determine the caller's sp value, and return it. */ - -CORE_ADDR -h8500_frame_chain (struct frame_info *thisframe) -{ - if (!inside_entry_file (thisframe->pc)) - return (read_memory_integer (get_frame_base (thisframe), PTR_SIZE)); - else - 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 - of the instruction. */ - -CORE_ADDR -NEXT_PROLOGUE_INSN (CORE_ADDR addr, CORE_ADDR lim, char *pword1) -{ - if (addr < lim + 8) - { - read_memory (addr, pword1, 1); - read_memory (addr, pword1 + 1, 1); - return 1; - } - 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. */ - -/* Return the saved PC from this frame. */ - -CORE_ADDR -frame_saved_pc (struct frame_info *frame) -{ - return read_memory_integer (get_frame_base (frame) + 2, PTR_SIZE); -} - -void -h8500_pop_frame (void) -{ - unsigned regnum; - struct frame_saved_regs fsr; - struct frame_info *frame = get_current_frame (); - - deprecated_get_frame_saved_regs (frame, &fsr); - - for (regnum = 0; regnum < 8; regnum++) - { - if (fsr.regs[regnum]) - write_register (regnum, read_memory_short (fsr.regs[regnum])); - - flush_cached_frames (); - } -} - -static void -h8500_print_register_hook (int regno) -{ - if (regno == CCR_REGNUM) - { - /* CCR register */ - - int C, Z, N, V; - unsigned char b[2]; - unsigned char l; - - frame_register_read (deprecated_selected_frame, regno, b); - l = b[1]; - printf_unfiltered ("\t"); - printf_unfiltered ("I-%d - ", (l & 0x80) != 0); - N = (l & 0x8) != 0; - Z = (l & 0x4) != 0; - V = (l & 0x2) != 0; - C = (l & 0x1) != 0; - printf_unfiltered ("N-%d ", N); - printf_unfiltered ("Z-%d ", Z); - printf_unfiltered ("V-%d ", V); - printf_unfiltered ("C-%d ", C); - if ((C | Z) == 0) - printf_unfiltered ("u> "); - if ((C | Z) == 1) - printf_unfiltered ("u<= "); - if ((C == 0)) - printf_unfiltered ("u>= "); - if (C == 1) - printf_unfiltered ("u< "); - if (Z == 0) - printf_unfiltered ("!= "); - if (Z == 1) - printf_unfiltered ("== "); - if ((N ^ V) == 0) - printf_unfiltered (">= "); - if ((N ^ V) == 1) - printf_unfiltered ("< "); - if ((Z | (N ^ V)) == 0) - printf_unfiltered ("> "); - if ((Z | (N ^ V)) == 1) - printf_unfiltered ("<= "); - } -} - -static void -h8500_print_registers_info (struct gdbarch *gdbarch, - struct ui_file *file, - struct frame_info *frame, - int regnum, int print_all) -{ - int i; - const int numregs = NUM_REGS + NUM_PSEUDO_REGS; - char *raw_buffer = alloca (MAX_REGISTER_RAW_SIZE); - char *virtual_buffer = alloca (MAX_REGISTER_VIRTUAL_SIZE); - - for (i = 0; i < numregs; i++) - { - /* Decide between printing all regs, non-float / vector regs, or - specific reg. */ - if (regnum == -1) - { - if (!print_all) - { - if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT) - continue; - if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i))) - continue; - } - } - else - { - if (i != regnum) - continue; - } - - /* If the register name is empty, it is undefined for this - processor, so don't display anything. */ - if (REGISTER_NAME (i) == NULL || *(REGISTER_NAME (i)) == '\0') - continue; - - fputs_filtered (REGISTER_NAME (i), file); - print_spaces_filtered (15 - strlen (REGISTER_NAME (i)), file); - - /* Get the data in raw format. */ - if (! frame_register_read (frame, i, raw_buffer)) - { - fprintf_filtered (file, "*value not available*\n"); - continue; - } - - /* FIXME: cagney/2002-08-03: This code shouldn't be necessary. - The function frame_register_read() should have returned the - pre-cooked register so no conversion is necessary. */ - /* Convert raw data to virtual format if necessary. */ - if (REGISTER_CONVERTIBLE (i)) - { - REGISTER_CONVERT_TO_VIRTUAL (i, REGISTER_VIRTUAL_TYPE (i), - raw_buffer, virtual_buffer); - } - else - { - memcpy (virtual_buffer, raw_buffer, - REGISTER_VIRTUAL_SIZE (i)); - } - - /* If virtual format is floating, print it that way, and in raw - hex. */ - if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT) - { - int j; - - val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0, - file, 0, 1, 0, Val_pretty_default); - - fprintf_filtered (file, "\t(raw 0x"); - for (j = 0; j < REGISTER_RAW_SIZE (i); j++) - { - int idx; - if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) - idx = j; - else - idx = REGISTER_RAW_SIZE (i) - 1 - j; - fprintf_filtered (file, "%02x", (unsigned char) raw_buffer[idx]); - } - fprintf_filtered (file, ")"); - } - else - { - /* Print the register in hex. */ - val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0, - file, 'x', 1, 0, Val_pretty_default); - /* If not a vector register, print it also according to its - natural format. */ - if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i)) == 0) - { - fprintf_filtered (file, "\t"); - val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0, - file, 0, 1, 0, Val_pretty_default); - } - } - - /* Some h8500 specific info. */ - h8500_print_register_hook (i); - - fprintf_filtered (file, "\n"); - } -} - -void -h8500_do_registers_info (int regnum, int all) -{ - h8500_print_registers_info (current_gdbarch, gdb_stdout, deprecated_selected_frame, - regnum, all); -} - -int -h8500_register_size (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; - - 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: - internal_error (__FILE__, __LINE__, "failed internal consistency check"); - } -} - -struct type * -h8500_register_virtual_type (int regno) -{ - switch (regno) - { - case SEG_C_REGNUM: - case SEG_E_REGNUM: - case SEG_D_REGNUM: - case SEG_T_REGNUM: - return builtin_type_unsigned_char; - 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 builtin_type_unsigned_short; - 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 builtin_type_unsigned_long; - default: - internal_error (__FILE__, __LINE__, "failed internal consistency check"); - } -} - -/* Put here the code to store, into a struct frame_saved_regs, - the addresses of the saved registers of frame described by FRAME_INFO. - This includes special registers such as pc and fp saved in special - ways in the stack frame. sp is even more special: - the address we return for it IS the sp for the next frame. */ - -void -frame_find_saved_regs (struct frame_info *frame_info, - struct frame_saved_regs *frame_saved_regs) -{ - register int regnum; - register int regmask; - register CORE_ADDR next_addr; - register CORE_ADDR pc; - unsigned char thebyte; - - memset (frame_saved_regs, '\0', sizeof *frame_saved_regs); - - if ((frame_info)->pc >= (frame_info)->frame - CALL_DUMMY_LENGTH - FP_REGNUM * 4 - 4 - && (frame_info)->pc <= (frame_info)->frame) - { - next_addr = (frame_info)->frame; - pc = (frame_info)->frame - CALL_DUMMY_LENGTH - FP_REGNUM * 4 - 4; - } - else - { - pc = get_pc_function_start ((frame_info)->pc); - /* Verify we have a link a6 instruction next; - if not we lose. If we win, find the address above the saved - regs using the amount of storage from the link instruction. - */ - - thebyte = read_memory_integer (pc, 1); - if (0x1f == thebyte) - next_addr = (frame_info)->frame + read_memory_integer (pc += 1, 2), pc += 2; - else if (0x17 == thebyte) - next_addr = (frame_info)->frame + read_memory_integer (pc += 1, 1), pc += 1; - else - goto lose; -#if 0 - /* FIXME steve */ - /* If have an add:g.waddal #-n, sp next, adjust next_addr. */ - if ((0x0c0177777 & read_memory_integer (pc, 2)) == 0157774) - next_addr += read_memory_integer (pc += 2, 4), pc += 4; -#endif - } - - thebyte = read_memory_integer (pc, 1); - if (thebyte == 0x12) - { - /* Got stm */ - pc++; - regmask = read_memory_integer (pc, 1); - pc++; - for (regnum = 0; regnum < 8; regnum++, regmask >>= 1) - { - if (regmask & 1) - { - (frame_saved_regs)->regs[regnum] = (next_addr += 2) - 2; - } - } - thebyte = read_memory_integer (pc, 1); - } - /* Maybe got a load of pushes */ - while (thebyte == 0xbf) - { - pc++; - regnum = read_memory_integer (pc, 1) & 0x7; - pc++; - (frame_saved_regs)->regs[regnum] = (next_addr += 2) - 2; - thebyte = read_memory_integer (pc, 1); - } - -lose:; - - /* Remember the address of the frame pointer */ - (frame_saved_regs)->regs[FP_REGNUM] = (frame_info)->frame; - - /* This is where the old sp is hidden */ - (frame_saved_regs)->regs[SP_REGNUM] = (frame_info)->frame; - - /* And the PC - remember the pushed FP is always two bytes long */ - (frame_saved_regs)->regs[PC_REGNUM] = (frame_info)->frame + 2; -} - -CORE_ADDR -saved_pc_after_call (void) -{ - int x; - int a = read_register (SP_REGNUM); - - x = read_memory_integer (a, code_size); - if (code_size == 2) - { - /* Stick current code segement onto top */ - x &= 0xffff; - x |= read_register (SEG_C_REGNUM) << 16; - } - x &= 0xffffff; - return x; -} - -void -h8500_set_pointer_size (int newsize) -{ - static int oldsize = 0; - - if (oldsize != newsize) - { - printf_unfiltered ("pointer size set to %d bits\n", newsize); - oldsize = newsize; - if (newsize == 32) - { - minimum_mode = 0; - } - else - { - minimum_mode = 1; - } - _initialize_gdbtypes (); - } -} - -static void -big_command (char *arg, int from_tty) -{ - h8500_set_pointer_size (32); - code_size = 4; - data_size = 4; -} - -static void -medium_command (char *arg, int from_tty) -{ - h8500_set_pointer_size (32); - code_size = 4; - data_size = 2; -} - -static void -compact_command (char *arg, int from_tty) -{ - h8500_set_pointer_size (32); - code_size = 2; - data_size = 4; -} - -static void -small_command (char *arg, int from_tty) -{ - h8500_set_pointer_size (16); - code_size = 2; - data_size = 2; -} - -static struct cmd_list_element *setmemorylist; - -static void -set_memory (char *args, int from_tty) -{ - printf_unfiltered ("\"set memory\" must be followed by the name of a memory subcommand.\n"); - help_list (setmemorylist, "set memory ", -1, gdb_stdout); -} - -/* See if variable name is ppc or pr[0-7] */ - -int -h8500_is_trapped_internalvar (char *name) -{ - if (name[0] != 'p') - return 0; - - if (strcmp (name + 1, "pc") == 0) - return 1; - - if (name[1] == 'r' - && name[2] >= '0' - && name[2] <= '7' - && name[3] == '\000') - return 1; - else - return 0; -} - -struct value * -h8500_value_of_trapped_internalvar (struct internalvar *var) -{ - LONGEST regval; - unsigned char regbuf[4]; - int page_regnum, regnum; - - regnum = var->name[2] == 'c' ? PC_REGNUM : var->name[2] - '0'; - - switch (var->name[2]) - { - case 'c': - page_regnum = SEG_C_REGNUM; - break; - case '0': - case '1': - case '2': - case '3': - page_regnum = SEG_D_REGNUM; - break; - case '4': - case '5': - page_regnum = SEG_E_REGNUM; - break; - case '6': - case '7': - page_regnum = SEG_T_REGNUM; - break; - } - - get_saved_register (regbuf, NULL, NULL, deprecated_selected_frame, page_regnum, NULL); - regval = regbuf[0] << 16; - - get_saved_register (regbuf, NULL, NULL, deprecated_selected_frame, regnum, NULL); - regval |= regbuf[0] << 8 | regbuf[1]; /* XXX host/target byte order */ - - xfree (var->value); /* Free up old value */ - - var->value = value_from_longest (builtin_type_unsigned_long, regval); - release_value (var->value); /* Unchain new value */ - - VALUE_LVAL (var->value) = lval_internalvar; - VALUE_INTERNALVAR (var->value) = var; - return var->value; -} - -void -h8500_set_trapped_internalvar (struct internalvar *var, struct value *newval, - int bitpos, int bitsize, int offset) -{ - char *page_regnum, *regnum; - char expression[100]; - unsigned new_regval; - struct type *type; - enum type_code newval_type_code; - - type = check_typedef (VALUE_TYPE (newval)); - newval_type_code = TYPE_CODE (type); - - if ((newval_type_code != TYPE_CODE_INT - && newval_type_code != TYPE_CODE_PTR) - || TYPE_LENGTH (type) != sizeof (new_regval)) - error ("Illegal type (%s) for assignment to $%s\n", - TYPE_NAME (VALUE_TYPE (newval)), var->name); - - new_regval = *(long *) VALUE_CONTENTS_RAW (newval); - - regnum = var->name + 1; - - switch (var->name[2]) - { - case 'c': - page_regnum = "cp"; - break; - case '0': - case '1': - case '2': - case '3': - page_regnum = "dp"; - break; - case '4': - case '5': - page_regnum = "ep"; - break; - case '6': - case '7': - page_regnum = "tp"; - break; - } - - sprintf (expression, "$%s=%d", page_regnum, new_regval >> 16); - parse_and_eval (expression); - - sprintf (expression, "$%s=%d", regnum, new_regval & 0xffff); - parse_and_eval (expression); -} - -CORE_ADDR -h8500_read_sp (void) -{ - return read_register (PR7_REGNUM); -} - -void -h8500_write_sp (CORE_ADDR v) -{ - write_register (PR7_REGNUM, v); -} - -CORE_ADDR -h8500_read_pc (ptid_t ptid) -{ - return read_register (PC_REGNUM); -} - -void -h8500_write_pc (CORE_ADDR v, ptid_t ptid) -{ - write_register (PC_REGNUM, v); -} - -CORE_ADDR -h8500_read_fp (void) -{ - return read_register (PR6_REGNUM); -} - -void -_initialize_h8500_tdep (void) -{ - 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); - -} +// OBSOLETE /* Target-dependent code for Hitachi H8/500, for GDB. +// OBSOLETE +// OBSOLETE Copyright 1993, 1994, 1995, 1998, 2000, 2001, 2002 Free Software +// OBSOLETE Foundation, Inc. +// OBSOLETE +// OBSOLETE This file is part of GDB. +// OBSOLETE +// OBSOLETE This program is free software; you can redistribute it and/or modify +// OBSOLETE it under the terms of the GNU General Public License as published by +// OBSOLETE the Free Software Foundation; either version 2 of the License, or +// OBSOLETE (at your option) any later version. +// OBSOLETE +// OBSOLETE This program is distributed in the hope that it will be useful, +// OBSOLETE but WITHOUT ANY WARRANTY; without even the implied warranty of +// OBSOLETE MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// OBSOLETE GNU General Public License for more details. +// OBSOLETE +// OBSOLETE You should have received a copy of the GNU General Public License +// OBSOLETE along with this program; if not, write to the Free Software +// OBSOLETE Foundation, Inc., 59 Temple Place - Suite 330, +// OBSOLETE Boston, MA 02111-1307, USA. */ +// OBSOLETE +// OBSOLETE /* +// OBSOLETE Contributed by Steve Chamberlain +// OBSOLETE sac@cygnus.com +// OBSOLETE */ +// OBSOLETE +// OBSOLETE #include "defs.h" +// OBSOLETE #include "frame.h" +// OBSOLETE #include "symtab.h" +// OBSOLETE #include "gdbtypes.h" +// OBSOLETE #include "gdbcmd.h" +// OBSOLETE #include "value.h" +// OBSOLETE #include "dis-asm.h" +// OBSOLETE #include "gdbcore.h" +// OBSOLETE #include "regcache.h" +// OBSOLETE +// OBSOLETE #define UNSIGNED_SHORT(X) ((X) & 0xffff) +// OBSOLETE +// OBSOLETE static int code_size = 2; +// OBSOLETE +// OBSOLETE static int data_size = 2; +// OBSOLETE +// OBSOLETE /* Shape of an H8/500 frame : +// OBSOLETE +// OBSOLETE arg-n +// OBSOLETE .. +// OBSOLETE arg-2 +// OBSOLETE arg-1 +// OBSOLETE return address <2 or 4 bytes> +// OBSOLETE old fp <2 bytes> +// OBSOLETE auto-n +// OBSOLETE .. +// OBSOLETE auto-1 +// OBSOLETE saved registers +// OBSOLETE +// OBSOLETE */ +// OBSOLETE +// OBSOLETE /* an easy to debug H8 stack frame looks like: +// OBSOLETE 0x6df6 push r6 +// OBSOLETE 0x0d76 mov.w r7,r6 +// OBSOLETE 0x6dfn push reg +// OBSOLETE 0x7905 nnnn mov.w #n,r5 or 0x1b87 subs #2,sp +// OBSOLETE 0x1957 sub.w r5,sp +// OBSOLETE +// OBSOLETE */ +// OBSOLETE +// OBSOLETE #define IS_PUSH(x) (((x) & 0xff00)==0x6d00) +// OBSOLETE #define IS_LINK_8(x) ((x) == 0x17) +// OBSOLETE #define IS_LINK_16(x) ((x) == 0x1f) +// OBSOLETE #define IS_MOVE_FP(x) ((x) == 0x0d76) +// OBSOLETE #define IS_MOV_SP_FP(x) ((x) == 0x0d76) +// OBSOLETE #define IS_SUB2_SP(x) ((x) == 0x1b87) +// OBSOLETE #define IS_MOVK_R5(x) ((x) == 0x7905) +// OBSOLETE #define IS_SUB_R5SP(x) ((x) == 0x1957) +// OBSOLETE +// OBSOLETE #define LINK_8 0x17 +// OBSOLETE #define LINK_16 0x1f +// OBSOLETE +// OBSOLETE int minimum_mode = 1; +// OBSOLETE +// OBSOLETE CORE_ADDR +// OBSOLETE h8500_skip_prologue (CORE_ADDR start_pc) +// OBSOLETE { +// OBSOLETE short int w; +// OBSOLETE +// OBSOLETE w = read_memory_integer (start_pc, 1); +// OBSOLETE if (w == LINK_8) +// OBSOLETE { +// OBSOLETE start_pc += 2; +// OBSOLETE w = read_memory_integer (start_pc, 1); +// OBSOLETE } +// OBSOLETE +// OBSOLETE if (w == LINK_16) +// OBSOLETE { +// OBSOLETE start_pc += 3; +// OBSOLETE w = read_memory_integer (start_pc, 2); +// OBSOLETE } +// OBSOLETE +// OBSOLETE return start_pc; +// OBSOLETE } +// OBSOLETE +// OBSOLETE CORE_ADDR +// OBSOLETE h8500_addr_bits_remove (CORE_ADDR addr) +// OBSOLETE { +// OBSOLETE return ((addr) & 0xffffff); +// OBSOLETE } +// OBSOLETE +// OBSOLETE /* Given a GDB frame, determine the address of the calling function's +// OBSOLETE frame. This will be used to create a new GDB frame struct, and +// OBSOLETE then INIT_EXTRA_FRAME_INFO and DEPRECATED_INIT_FRAME_PC will be +// OBSOLETE called for the new frame. +// OBSOLETE +// OBSOLETE For us, the frame address is its stack pointer value, so we look up +// OBSOLETE the function prologue to determine the caller's sp value, and return it. */ +// OBSOLETE +// OBSOLETE CORE_ADDR +// OBSOLETE h8500_frame_chain (struct frame_info *thisframe) +// OBSOLETE { +// OBSOLETE if (!inside_entry_file (thisframe->pc)) +// OBSOLETE return (read_memory_integer (get_frame_base (thisframe), PTR_SIZE)); +// OBSOLETE else +// OBSOLETE return 0; +// OBSOLETE } +// OBSOLETE +// OBSOLETE /* Fetch the instruction at ADDR, returning 0 if ADDR is beyond LIM or +// OBSOLETE is not the address of a valid instruction, the address of the next +// OBSOLETE instruction beyond ADDR otherwise. *PWORD1 receives the first word +// OBSOLETE of the instruction. */ +// OBSOLETE +// OBSOLETE CORE_ADDR +// OBSOLETE NEXT_PROLOGUE_INSN (CORE_ADDR addr, CORE_ADDR lim, char *pword1) +// OBSOLETE { +// OBSOLETE if (addr < lim + 8) +// OBSOLETE { +// OBSOLETE read_memory (addr, pword1, 1); +// OBSOLETE read_memory (addr, pword1 + 1, 1); +// OBSOLETE return 1; +// OBSOLETE } +// OBSOLETE return 0; +// OBSOLETE } +// OBSOLETE +// OBSOLETE /* Examine the prologue of a function. `ip' points to the first +// OBSOLETE instruction. `limit' is the limit of the prologue (e.g. the addr +// OBSOLETE of the first linenumber, or perhaps the program counter if we're +// OBSOLETE stepping through). `frame_sp' is the stack pointer value in use in +// OBSOLETE this frame. `fsr' is a pointer to a frame_saved_regs structure +// OBSOLETE into which we put info about the registers saved by this frame. +// OBSOLETE `fi' is a struct frame_info pointer; we fill in various fields in +// OBSOLETE it to reflect the offsets of the arg pointer and the locals +// OBSOLETE pointer. */ +// OBSOLETE +// OBSOLETE /* Return the saved PC from this frame. */ +// OBSOLETE +// OBSOLETE CORE_ADDR +// OBSOLETE frame_saved_pc (struct frame_info *frame) +// OBSOLETE { +// OBSOLETE return read_memory_integer (get_frame_base (frame) + 2, PTR_SIZE); +// OBSOLETE } +// OBSOLETE +// OBSOLETE void +// OBSOLETE h8500_pop_frame (void) +// OBSOLETE { +// OBSOLETE unsigned regnum; +// OBSOLETE struct frame_saved_regs fsr; +// OBSOLETE struct frame_info *frame = get_current_frame (); +// OBSOLETE +// OBSOLETE deprecated_get_frame_saved_regs (frame, &fsr); +// OBSOLETE +// OBSOLETE for (regnum = 0; regnum < 8; regnum++) +// OBSOLETE { +// OBSOLETE if (fsr.regs[regnum]) +// OBSOLETE write_register (regnum, read_memory_short (fsr.regs[regnum])); +// OBSOLETE +// OBSOLETE flush_cached_frames (); +// OBSOLETE } +// OBSOLETE } +// OBSOLETE +// OBSOLETE static void +// OBSOLETE h8500_print_register_hook (int regno) +// OBSOLETE { +// OBSOLETE if (regno == CCR_REGNUM) +// OBSOLETE { +// OBSOLETE /* CCR register */ +// OBSOLETE +// OBSOLETE int C, Z, N, V; +// OBSOLETE unsigned char b[2]; +// OBSOLETE unsigned char l; +// OBSOLETE +// OBSOLETE frame_register_read (deprecated_selected_frame, regno, b); +// OBSOLETE l = b[1]; +// OBSOLETE printf_unfiltered ("\t"); +// OBSOLETE printf_unfiltered ("I-%d - ", (l & 0x80) != 0); +// OBSOLETE N = (l & 0x8) != 0; +// OBSOLETE Z = (l & 0x4) != 0; +// OBSOLETE V = (l & 0x2) != 0; +// OBSOLETE C = (l & 0x1) != 0; +// OBSOLETE printf_unfiltered ("N-%d ", N); +// OBSOLETE printf_unfiltered ("Z-%d ", Z); +// OBSOLETE printf_unfiltered ("V-%d ", V); +// OBSOLETE printf_unfiltered ("C-%d ", C); +// OBSOLETE if ((C | Z) == 0) +// OBSOLETE printf_unfiltered ("u> "); +// OBSOLETE if ((C | Z) == 1) +// OBSOLETE printf_unfiltered ("u<= "); +// OBSOLETE if ((C == 0)) +// OBSOLETE printf_unfiltered ("u>= "); +// OBSOLETE if (C == 1) +// OBSOLETE printf_unfiltered ("u< "); +// OBSOLETE if (Z == 0) +// OBSOLETE printf_unfiltered ("!= "); +// OBSOLETE if (Z == 1) +// OBSOLETE printf_unfiltered ("== "); +// OBSOLETE if ((N ^ V) == 0) +// OBSOLETE printf_unfiltered (">= "); +// OBSOLETE if ((N ^ V) == 1) +// OBSOLETE printf_unfiltered ("< "); +// OBSOLETE if ((Z | (N ^ V)) == 0) +// OBSOLETE printf_unfiltered ("> "); +// OBSOLETE if ((Z | (N ^ V)) == 1) +// OBSOLETE printf_unfiltered ("<= "); +// OBSOLETE } +// OBSOLETE } +// OBSOLETE +// OBSOLETE static void +// OBSOLETE h8500_print_registers_info (struct gdbarch *gdbarch, +// OBSOLETE struct ui_file *file, +// OBSOLETE struct frame_info *frame, +// OBSOLETE int regnum, int print_all) +// OBSOLETE { +// OBSOLETE int i; +// OBSOLETE const int numregs = NUM_REGS + NUM_PSEUDO_REGS; +// OBSOLETE char *raw_buffer = alloca (MAX_REGISTER_RAW_SIZE); +// OBSOLETE char *virtual_buffer = alloca (MAX_REGISTER_VIRTUAL_SIZE); +// OBSOLETE +// OBSOLETE for (i = 0; i < numregs; i++) +// OBSOLETE { +// OBSOLETE /* Decide between printing all regs, non-float / vector regs, or +// OBSOLETE specific reg. */ +// OBSOLETE if (regnum == -1) +// OBSOLETE { +// OBSOLETE if (!print_all) +// OBSOLETE { +// OBSOLETE if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT) +// OBSOLETE continue; +// OBSOLETE if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i))) +// OBSOLETE continue; +// OBSOLETE } +// OBSOLETE } +// OBSOLETE else +// OBSOLETE { +// OBSOLETE if (i != regnum) +// OBSOLETE continue; +// OBSOLETE } +// OBSOLETE +// OBSOLETE /* If the register name is empty, it is undefined for this +// OBSOLETE processor, so don't display anything. */ +// OBSOLETE if (REGISTER_NAME (i) == NULL || *(REGISTER_NAME (i)) == '\0') +// OBSOLETE continue; +// OBSOLETE +// OBSOLETE fputs_filtered (REGISTER_NAME (i), file); +// OBSOLETE print_spaces_filtered (15 - strlen (REGISTER_NAME (i)), file); +// OBSOLETE +// OBSOLETE /* Get the data in raw format. */ +// OBSOLETE if (! frame_register_read (frame, i, raw_buffer)) +// OBSOLETE { +// OBSOLETE fprintf_filtered (file, "*value not available*\n"); +// OBSOLETE continue; +// OBSOLETE } +// OBSOLETE +// OBSOLETE /* FIXME: cagney/2002-08-03: This code shouldn't be necessary. +// OBSOLETE The function frame_register_read() should have returned the +// OBSOLETE pre-cooked register so no conversion is necessary. */ +// OBSOLETE /* Convert raw data to virtual format if necessary. */ +// OBSOLETE if (REGISTER_CONVERTIBLE (i)) +// OBSOLETE { +// OBSOLETE REGISTER_CONVERT_TO_VIRTUAL (i, REGISTER_VIRTUAL_TYPE (i), +// OBSOLETE raw_buffer, virtual_buffer); +// OBSOLETE } +// OBSOLETE else +// OBSOLETE { +// OBSOLETE memcpy (virtual_buffer, raw_buffer, +// OBSOLETE REGISTER_VIRTUAL_SIZE (i)); +// OBSOLETE } +// OBSOLETE +// OBSOLETE /* If virtual format is floating, print it that way, and in raw +// OBSOLETE hex. */ +// OBSOLETE if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT) +// OBSOLETE { +// OBSOLETE int j; +// OBSOLETE +// OBSOLETE val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0, +// OBSOLETE file, 0, 1, 0, Val_pretty_default); +// OBSOLETE +// OBSOLETE fprintf_filtered (file, "\t(raw 0x"); +// OBSOLETE for (j = 0; j < REGISTER_RAW_SIZE (i); j++) +// OBSOLETE { +// OBSOLETE int idx; +// OBSOLETE if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) +// OBSOLETE idx = j; +// OBSOLETE else +// OBSOLETE idx = REGISTER_RAW_SIZE (i) - 1 - j; +// OBSOLETE fprintf_filtered (file, "%02x", (unsigned char) raw_buffer[idx]); +// OBSOLETE } +// OBSOLETE fprintf_filtered (file, ")"); +// OBSOLETE } +// OBSOLETE else +// OBSOLETE { +// OBSOLETE /* Print the register in hex. */ +// OBSOLETE val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0, +// OBSOLETE file, 'x', 1, 0, Val_pretty_default); +// OBSOLETE /* If not a vector register, print it also according to its +// OBSOLETE natural format. */ +// OBSOLETE if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i)) == 0) +// OBSOLETE { +// OBSOLETE fprintf_filtered (file, "\t"); +// OBSOLETE val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0, +// OBSOLETE file, 0, 1, 0, Val_pretty_default); +// OBSOLETE } +// OBSOLETE } +// OBSOLETE +// OBSOLETE /* Some h8500 specific info. */ +// OBSOLETE h8500_print_register_hook (i); +// OBSOLETE +// OBSOLETE fprintf_filtered (file, "\n"); +// OBSOLETE } +// OBSOLETE } +// OBSOLETE +// OBSOLETE void +// OBSOLETE h8500_do_registers_info (int regnum, int all) +// OBSOLETE { +// OBSOLETE h8500_print_registers_info (current_gdbarch, gdb_stdout, deprecated_selected_frame, +// OBSOLETE regnum, all); +// OBSOLETE } +// OBSOLETE +// OBSOLETE int +// OBSOLETE h8500_register_size (int regno) +// OBSOLETE { +// OBSOLETE switch (regno) +// OBSOLETE { +// OBSOLETE case SEG_C_REGNUM: +// OBSOLETE case SEG_D_REGNUM: +// OBSOLETE case SEG_E_REGNUM: +// OBSOLETE case SEG_T_REGNUM: +// OBSOLETE return 1; +// OBSOLETE case R0_REGNUM: +// OBSOLETE case R1_REGNUM: +// OBSOLETE case R2_REGNUM: +// OBSOLETE case R3_REGNUM: +// OBSOLETE case R4_REGNUM: +// OBSOLETE case R5_REGNUM: +// OBSOLETE case R6_REGNUM: +// OBSOLETE case R7_REGNUM: +// OBSOLETE case CCR_REGNUM: +// OBSOLETE return 2; +// OBSOLETE +// OBSOLETE case PR0_REGNUM: +// OBSOLETE case PR1_REGNUM: +// OBSOLETE case PR2_REGNUM: +// OBSOLETE case PR3_REGNUM: +// OBSOLETE case PR4_REGNUM: +// OBSOLETE case PR5_REGNUM: +// OBSOLETE case PR6_REGNUM: +// OBSOLETE case PR7_REGNUM: +// OBSOLETE case PC_REGNUM: +// OBSOLETE return 4; +// OBSOLETE default: +// OBSOLETE internal_error (__FILE__, __LINE__, "failed internal consistency check"); +// OBSOLETE } +// OBSOLETE } +// OBSOLETE +// OBSOLETE struct type * +// OBSOLETE h8500_register_virtual_type (int regno) +// OBSOLETE { +// OBSOLETE switch (regno) +// OBSOLETE { +// OBSOLETE case SEG_C_REGNUM: +// OBSOLETE case SEG_E_REGNUM: +// OBSOLETE case SEG_D_REGNUM: +// OBSOLETE case SEG_T_REGNUM: +// OBSOLETE return builtin_type_unsigned_char; +// OBSOLETE case R0_REGNUM: +// OBSOLETE case R1_REGNUM: +// OBSOLETE case R2_REGNUM: +// OBSOLETE case R3_REGNUM: +// OBSOLETE case R4_REGNUM: +// OBSOLETE case R5_REGNUM: +// OBSOLETE case R6_REGNUM: +// OBSOLETE case R7_REGNUM: +// OBSOLETE case CCR_REGNUM: +// OBSOLETE return builtin_type_unsigned_short; +// OBSOLETE case PR0_REGNUM: +// OBSOLETE case PR1_REGNUM: +// OBSOLETE case PR2_REGNUM: +// OBSOLETE case PR3_REGNUM: +// OBSOLETE case PR4_REGNUM: +// OBSOLETE case PR5_REGNUM: +// OBSOLETE case PR6_REGNUM: +// OBSOLETE case PR7_REGNUM: +// OBSOLETE case PC_REGNUM: +// OBSOLETE return builtin_type_unsigned_long; +// OBSOLETE default: +// OBSOLETE internal_error (__FILE__, __LINE__, "failed internal consistency check"); +// OBSOLETE } +// OBSOLETE } +// OBSOLETE +// OBSOLETE /* Put here the code to store, into a struct frame_saved_regs, +// OBSOLETE the addresses of the saved registers of frame described by FRAME_INFO. +// OBSOLETE This includes special registers such as pc and fp saved in special +// OBSOLETE ways in the stack frame. sp is even more special: +// OBSOLETE the address we return for it IS the sp for the next frame. */ +// OBSOLETE +// OBSOLETE void +// OBSOLETE frame_find_saved_regs (struct frame_info *frame_info, +// OBSOLETE struct frame_saved_regs *frame_saved_regs) +// OBSOLETE { +// OBSOLETE register int regnum; +// OBSOLETE register int regmask; +// OBSOLETE register CORE_ADDR next_addr; +// OBSOLETE register CORE_ADDR pc; +// OBSOLETE unsigned char thebyte; +// OBSOLETE +// OBSOLETE memset (frame_saved_regs, '\0', sizeof *frame_saved_regs); +// OBSOLETE +// OBSOLETE if ((frame_info)->pc >= (frame_info)->frame - CALL_DUMMY_LENGTH - FP_REGNUM * 4 - 4 +// OBSOLETE && (frame_info)->pc <= (frame_info)->frame) +// OBSOLETE { +// OBSOLETE next_addr = (frame_info)->frame; +// OBSOLETE pc = (frame_info)->frame - CALL_DUMMY_LENGTH - FP_REGNUM * 4 - 4; +// OBSOLETE } +// OBSOLETE else +// OBSOLETE { +// OBSOLETE pc = get_pc_function_start ((frame_info)->pc); +// OBSOLETE /* Verify we have a link a6 instruction next; +// OBSOLETE if not we lose. If we win, find the address above the saved +// OBSOLETE regs using the amount of storage from the link instruction. +// OBSOLETE */ +// OBSOLETE +// OBSOLETE thebyte = read_memory_integer (pc, 1); +// OBSOLETE if (0x1f == thebyte) +// OBSOLETE next_addr = (frame_info)->frame + read_memory_integer (pc += 1, 2), pc += 2; +// OBSOLETE else if (0x17 == thebyte) +// OBSOLETE next_addr = (frame_info)->frame + read_memory_integer (pc += 1, 1), pc += 1; +// OBSOLETE else +// OBSOLETE goto lose; +// OBSOLETE #if 0 +// OBSOLETE /* FIXME steve */ +// OBSOLETE /* If have an add:g.waddal #-n, sp next, adjust next_addr. */ +// OBSOLETE if ((0x0c0177777 & read_memory_integer (pc, 2)) == 0157774) +// OBSOLETE next_addr += read_memory_integer (pc += 2, 4), pc += 4; +// OBSOLETE #endif +// OBSOLETE } +// OBSOLETE +// OBSOLETE thebyte = read_memory_integer (pc, 1); +// OBSOLETE if (thebyte == 0x12) +// OBSOLETE { +// OBSOLETE /* Got stm */ +// OBSOLETE pc++; +// OBSOLETE regmask = read_memory_integer (pc, 1); +// OBSOLETE pc++; +// OBSOLETE for (regnum = 0; regnum < 8; regnum++, regmask >>= 1) +// OBSOLETE { +// OBSOLETE if (regmask & 1) +// OBSOLETE { +// OBSOLETE (frame_saved_regs)->regs[regnum] = (next_addr += 2) - 2; +// OBSOLETE } +// OBSOLETE } +// OBSOLETE thebyte = read_memory_integer (pc, 1); +// OBSOLETE } +// OBSOLETE /* Maybe got a load of pushes */ +// OBSOLETE while (thebyte == 0xbf) +// OBSOLETE { +// OBSOLETE pc++; +// OBSOLETE regnum = read_memory_integer (pc, 1) & 0x7; +// OBSOLETE pc++; +// OBSOLETE (frame_saved_regs)->regs[regnum] = (next_addr += 2) - 2; +// OBSOLETE thebyte = read_memory_integer (pc, 1); +// OBSOLETE } +// OBSOLETE +// OBSOLETE lose:; +// OBSOLETE +// OBSOLETE /* Remember the address of the frame pointer */ +// OBSOLETE (frame_saved_regs)->regs[FP_REGNUM] = (frame_info)->frame; +// OBSOLETE +// OBSOLETE /* This is where the old sp is hidden */ +// OBSOLETE (frame_saved_regs)->regs[SP_REGNUM] = (frame_info)->frame; +// OBSOLETE +// OBSOLETE /* And the PC - remember the pushed FP is always two bytes long */ +// OBSOLETE (frame_saved_regs)->regs[PC_REGNUM] = (frame_info)->frame + 2; +// OBSOLETE } +// OBSOLETE +// OBSOLETE CORE_ADDR +// OBSOLETE saved_pc_after_call (void) +// OBSOLETE { +// OBSOLETE int x; +// OBSOLETE int a = read_register (SP_REGNUM); +// OBSOLETE +// OBSOLETE x = read_memory_integer (a, code_size); +// OBSOLETE if (code_size == 2) +// OBSOLETE { +// OBSOLETE /* Stick current code segement onto top */ +// OBSOLETE x &= 0xffff; +// OBSOLETE x |= read_register (SEG_C_REGNUM) << 16; +// OBSOLETE } +// OBSOLETE x &= 0xffffff; +// OBSOLETE return x; +// OBSOLETE } +// OBSOLETE +// OBSOLETE void +// OBSOLETE h8500_set_pointer_size (int newsize) +// OBSOLETE { +// OBSOLETE static int oldsize = 0; +// OBSOLETE +// OBSOLETE if (oldsize != newsize) +// OBSOLETE { +// OBSOLETE printf_unfiltered ("pointer size set to %d bits\n", newsize); +// OBSOLETE oldsize = newsize; +// OBSOLETE if (newsize == 32) +// OBSOLETE { +// OBSOLETE minimum_mode = 0; +// OBSOLETE } +// OBSOLETE else +// OBSOLETE { +// OBSOLETE minimum_mode = 1; +// OBSOLETE } +// OBSOLETE _initialize_gdbtypes (); +// OBSOLETE } +// OBSOLETE } +// OBSOLETE +// OBSOLETE static void +// OBSOLETE big_command (char *arg, int from_tty) +// OBSOLETE { +// OBSOLETE h8500_set_pointer_size (32); +// OBSOLETE code_size = 4; +// OBSOLETE data_size = 4; +// OBSOLETE } +// OBSOLETE +// OBSOLETE static void +// OBSOLETE medium_command (char *arg, int from_tty) +// OBSOLETE { +// OBSOLETE h8500_set_pointer_size (32); +// OBSOLETE code_size = 4; +// OBSOLETE data_size = 2; +// OBSOLETE } +// OBSOLETE +// OBSOLETE static void +// OBSOLETE compact_command (char *arg, int from_tty) +// OBSOLETE { +// OBSOLETE h8500_set_pointer_size (32); +// OBSOLETE code_size = 2; +// OBSOLETE data_size = 4; +// OBSOLETE } +// OBSOLETE +// OBSOLETE static void +// OBSOLETE small_command (char *arg, int from_tty) +// OBSOLETE { +// OBSOLETE h8500_set_pointer_size (16); +// OBSOLETE code_size = 2; +// OBSOLETE data_size = 2; +// OBSOLETE } +// OBSOLETE +// OBSOLETE static struct cmd_list_element *setmemorylist; +// OBSOLETE +// OBSOLETE static void +// OBSOLETE set_memory (char *args, int from_tty) +// OBSOLETE { +// OBSOLETE printf_unfiltered ("\"set memory\" must be followed by the name of a memory subcommand.\n"); +// OBSOLETE help_list (setmemorylist, "set memory ", -1, gdb_stdout); +// OBSOLETE } +// OBSOLETE +// OBSOLETE /* See if variable name is ppc or pr[0-7] */ +// OBSOLETE +// OBSOLETE int +// OBSOLETE h8500_is_trapped_internalvar (char *name) +// OBSOLETE { +// OBSOLETE if (name[0] != 'p') +// OBSOLETE return 0; +// OBSOLETE +// OBSOLETE if (strcmp (name + 1, "pc") == 0) +// OBSOLETE return 1; +// OBSOLETE +// OBSOLETE if (name[1] == 'r' +// OBSOLETE && name[2] >= '0' +// OBSOLETE && name[2] <= '7' +// OBSOLETE && name[3] == '\000') +// OBSOLETE return 1; +// OBSOLETE else +// OBSOLETE return 0; +// OBSOLETE } +// OBSOLETE +// OBSOLETE struct value * +// OBSOLETE h8500_value_of_trapped_internalvar (struct internalvar *var) +// OBSOLETE { +// OBSOLETE LONGEST regval; +// OBSOLETE unsigned char regbuf[4]; +// OBSOLETE int page_regnum, regnum; +// OBSOLETE +// OBSOLETE regnum = var->name[2] == 'c' ? PC_REGNUM : var->name[2] - '0'; +// OBSOLETE +// OBSOLETE switch (var->name[2]) +// OBSOLETE { +// OBSOLETE case 'c': +// OBSOLETE page_regnum = SEG_C_REGNUM; +// OBSOLETE break; +// OBSOLETE case '0': +// OBSOLETE case '1': +// OBSOLETE case '2': +// OBSOLETE case '3': +// OBSOLETE page_regnum = SEG_D_REGNUM; +// OBSOLETE break; +// OBSOLETE case '4': +// OBSOLETE case '5': +// OBSOLETE page_regnum = SEG_E_REGNUM; +// OBSOLETE break; +// OBSOLETE case '6': +// OBSOLETE case '7': +// OBSOLETE page_regnum = SEG_T_REGNUM; +// OBSOLETE break; +// OBSOLETE } +// OBSOLETE +// OBSOLETE get_saved_register (regbuf, NULL, NULL, deprecated_selected_frame, page_regnum, NULL); +// OBSOLETE regval = regbuf[0] << 16; +// OBSOLETE +// OBSOLETE get_saved_register (regbuf, NULL, NULL, deprecated_selected_frame, regnum, NULL); +// OBSOLETE regval |= regbuf[0] << 8 | regbuf[1]; /* XXX host/target byte order */ +// OBSOLETE +// OBSOLETE xfree (var->value); /* Free up old value */ +// OBSOLETE +// OBSOLETE var->value = value_from_longest (builtin_type_unsigned_long, regval); +// OBSOLETE release_value (var->value); /* Unchain new value */ +// OBSOLETE +// OBSOLETE VALUE_LVAL (var->value) = lval_internalvar; +// OBSOLETE VALUE_INTERNALVAR (var->value) = var; +// OBSOLETE return var->value; +// OBSOLETE } +// OBSOLETE +// OBSOLETE void +// OBSOLETE h8500_set_trapped_internalvar (struct internalvar *var, struct value *newval, +// OBSOLETE int bitpos, int bitsize, int offset) +// OBSOLETE { +// OBSOLETE char *page_regnum, *regnum; +// OBSOLETE char expression[100]; +// OBSOLETE unsigned new_regval; +// OBSOLETE struct type *type; +// OBSOLETE enum type_code newval_type_code; +// OBSOLETE +// OBSOLETE type = check_typedef (VALUE_TYPE (newval)); +// OBSOLETE newval_type_code = TYPE_CODE (type); +// OBSOLETE +// OBSOLETE if ((newval_type_code != TYPE_CODE_INT +// OBSOLETE && newval_type_code != TYPE_CODE_PTR) +// OBSOLETE || TYPE_LENGTH (type) != sizeof (new_regval)) +// OBSOLETE error ("Illegal type (%s) for assignment to $%s\n", +// OBSOLETE TYPE_NAME (VALUE_TYPE (newval)), var->name); +// OBSOLETE +// OBSOLETE new_regval = *(long *) VALUE_CONTENTS_RAW (newval); +// OBSOLETE +// OBSOLETE regnum = var->name + 1; +// OBSOLETE +// OBSOLETE switch (var->name[2]) +// OBSOLETE { +// OBSOLETE case 'c': +// OBSOLETE page_regnum = "cp"; +// OBSOLETE break; +// OBSOLETE case '0': +// OBSOLETE case '1': +// OBSOLETE case '2': +// OBSOLETE case '3': +// OBSOLETE page_regnum = "dp"; +// OBSOLETE break; +// OBSOLETE case '4': +// OBSOLETE case '5': +// OBSOLETE page_regnum = "ep"; +// OBSOLETE break; +// OBSOLETE case '6': +// OBSOLETE case '7': +// OBSOLETE page_regnum = "tp"; +// OBSOLETE break; +// OBSOLETE } +// OBSOLETE +// OBSOLETE sprintf (expression, "$%s=%d", page_regnum, new_regval >> 16); +// OBSOLETE parse_and_eval (expression); +// OBSOLETE +// OBSOLETE sprintf (expression, "$%s=%d", regnum, new_regval & 0xffff); +// OBSOLETE parse_and_eval (expression); +// OBSOLETE } +// OBSOLETE +// OBSOLETE CORE_ADDR +// OBSOLETE h8500_read_sp (void) +// OBSOLETE { +// OBSOLETE return read_register (PR7_REGNUM); +// OBSOLETE } +// OBSOLETE +// OBSOLETE void +// OBSOLETE h8500_write_sp (CORE_ADDR v) +// OBSOLETE { +// OBSOLETE write_register (PR7_REGNUM, v); +// OBSOLETE } +// OBSOLETE +// OBSOLETE CORE_ADDR +// OBSOLETE h8500_read_pc (ptid_t ptid) +// OBSOLETE { +// OBSOLETE return read_register (PC_REGNUM); +// OBSOLETE } +// OBSOLETE +// OBSOLETE void +// OBSOLETE h8500_write_pc (CORE_ADDR v, ptid_t ptid) +// OBSOLETE { +// OBSOLETE write_register (PC_REGNUM, v); +// OBSOLETE } +// OBSOLETE +// OBSOLETE CORE_ADDR +// OBSOLETE h8500_read_fp (void) +// OBSOLETE { +// OBSOLETE return read_register (PR6_REGNUM); +// OBSOLETE } +// OBSOLETE +// OBSOLETE void +// OBSOLETE _initialize_h8500_tdep (void) +// OBSOLETE { +// OBSOLETE tm_print_insn = print_insn_h8500; +// OBSOLETE +// OBSOLETE add_prefix_cmd ("memory", no_class, set_memory, +// OBSOLETE "set the memory model", &setmemorylist, "set memory ", 0, +// OBSOLETE &setlist); +// OBSOLETE +// OBSOLETE add_cmd ("small", class_support, small_command, +// OBSOLETE "Set small memory model. (16 bit code, 16 bit data)", &setmemorylist); +// OBSOLETE +// OBSOLETE add_cmd ("big", class_support, big_command, +// OBSOLETE "Set big memory model. (32 bit code, 32 bit data)", &setmemorylist); +// OBSOLETE +// OBSOLETE add_cmd ("medium", class_support, medium_command, +// OBSOLETE "Set medium memory model. (32 bit code, 16 bit data)", &setmemorylist); +// OBSOLETE +// OBSOLETE add_cmd ("compact", class_support, compact_command, +// OBSOLETE "Set compact memory model. (16 bit code, 32 bit data)", &setmemorylist); +// OBSOLETE +// OBSOLETE } |