diff options
Diffstat (limited to 'gdb/config/pa/tm-hppa.h')
-rw-r--r-- | gdb/config/pa/tm-hppa.h | 362 |
1 files changed, 185 insertions, 177 deletions
diff --git a/gdb/config/pa/tm-hppa.h b/gdb/config/pa/tm-hppa.h index ec83395..f284a18 100644 --- a/gdb/config/pa/tm-hppa.h +++ b/gdb/config/pa/tm-hppa.h @@ -5,21 +5,22 @@ Contributed by the Center for Software Science at the University of Utah (pa-gdb-bugs@cs.utah.edu). -This file is part of GDB. + 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 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. + 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. */ + 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. */ /* Forward declarations of some types we use in prototypes */ @@ -68,7 +69,7 @@ struct inferior_status; Zero on most machines. */ #define FUNCTION_START_OFFSET 0 - + /* Advance PC across any function entry prologue instructions to reach some "real" code. */ @@ -105,10 +106,10 @@ extern CORE_ADDR saved_pc_after_call PARAMS ((struct frame_info *)); /* elz: adjust the quantity to the next highest value which is 64-bit aligned. This is used in valops.c, when the sp is adjusted. - On hppa the sp must always be kept 64-bit aligned*/ + On hppa the sp must always be kept 64-bit aligned */ #define STACK_ALIGN(arg) ( ((arg)%8) ? (((arg)+7)&-8) : (arg)) -#define NO_EXTRA_ALIGNMENT_NEEDED 1 +#define NO_EXTRA_ALIGNMENT_NEEDED 1 /* Sequence of bytes for breakpoint instruction. */ @@ -145,11 +146,11 @@ extern CORE_ADDR saved_pc_after_call PARAMS ((struct frame_info *)); is of these "really, truly negative" addresses that come from the minimal symbols, I'm resorting to the gross hack of checking the top byte of the address for all 1's. Sigh. - */ + */ #define PC_REQUIRES_RUN_BEFORE_USE(pc) \ (! target_has_stack && (pc & 0xFF000000)) -/* return instruction is bv r0(rp) or bv,n r0(rp)*/ +/* return instruction is bv r0(rp) or bv,n r0(rp) */ #define ABOUT_TO_RETURN(pc) ((read_memory_integer (pc, 4) | 0x2) == 0xE840C002) @@ -212,14 +213,14 @@ extern CORE_ADDR saved_pc_after_call PARAMS ((struct frame_info *)); #define RCR_REGNUM 51 /* Recover Counter (also known as cr0) */ #define CCR_REGNUM 54 /* Coprocessor Configuration Register */ #define TR0_REGNUM 57 /* Temporary Registers (cr24 -> cr31) */ -#define CR27_REGNUM 60 /* Base register for thread-local storage, cr27 */ -#define FP0_REGNUM 64 /* floating point reg. 0 (fspr)*/ +#define CR27_REGNUM 60 /* Base register for thread-local storage, cr27 */ +#define FP0_REGNUM 64 /* floating point reg. 0 (fspr) */ #define FP4_REGNUM 72 -#define ARG0_REGNUM 26 /* The first argument of a callee. */ -#define ARG1_REGNUM 25 /* The second argument of a callee. */ -#define ARG2_REGNUM 24 /* The third argument of a callee. */ -#define ARG3_REGNUM 23 /* The fourth argument of a callee. */ +#define ARG0_REGNUM 26 /* The first argument of a callee. */ +#define ARG1_REGNUM 25 /* The second argument of a callee. */ +#define ARG2_REGNUM 24 /* The third argument of a callee. */ +#define ARG3_REGNUM 23 /* The fourth argument of a callee. */ /* compatibility with the rest of gdb. */ #define PC_REGNUM PCOQ_HEAD_REGNUM @@ -229,22 +230,22 @@ extern CORE_ADDR saved_pc_after_call PARAMS ((struct frame_info *)); * Processor Status Word Masks */ -#define PSW_T 0x01000000 /* Taken Branch Trap Enable */ -#define PSW_H 0x00800000 /* Higher-Privilege Transfer Trap Enable */ -#define PSW_L 0x00400000 /* Lower-Privilege Transfer Trap Enable */ -#define PSW_N 0x00200000 /* PC Queue Front Instruction Nullified */ -#define PSW_X 0x00100000 /* Data Memory Break Disable */ -#define PSW_B 0x00080000 /* Taken Branch in Previous Cycle */ -#define PSW_C 0x00040000 /* Code Address Translation Enable */ -#define PSW_V 0x00020000 /* Divide Step Correction */ -#define PSW_M 0x00010000 /* High-Priority Machine Check Disable */ -#define PSW_CB 0x0000ff00 /* Carry/Borrow Bits */ -#define PSW_R 0x00000010 /* Recovery Counter Enable */ -#define PSW_Q 0x00000008 /* Interruption State Collection Enable */ -#define PSW_P 0x00000004 /* Protection ID Validation Enable */ -#define PSW_D 0x00000002 /* Data Address Translation Enable */ -#define PSW_I 0x00000001 /* External, Power Failure, Low-Priority */ - /* Machine Check Interruption Enable */ +#define PSW_T 0x01000000 /* Taken Branch Trap Enable */ +#define PSW_H 0x00800000 /* Higher-Privilege Transfer Trap Enable */ +#define PSW_L 0x00400000 /* Lower-Privilege Transfer Trap Enable */ +#define PSW_N 0x00200000 /* PC Queue Front Instruction Nullified */ +#define PSW_X 0x00100000 /* Data Memory Break Disable */ +#define PSW_B 0x00080000 /* Taken Branch in Previous Cycle */ +#define PSW_C 0x00040000 /* Code Address Translation Enable */ +#define PSW_V 0x00020000 /* Divide Step Correction */ +#define PSW_M 0x00010000 /* High-Priority Machine Check Disable */ +#define PSW_CB 0x0000ff00 /* Carry/Borrow Bits */ +#define PSW_R 0x00000010 /* Recovery Counter Enable */ +#define PSW_Q 0x00000008 /* Interruption State Collection Enable */ +#define PSW_P 0x00000004 /* Protection ID Validation Enable */ +#define PSW_D 0x00000002 /* Data Address Translation Enable */ +#define PSW_I 0x00000001 /* External, Power Failure, Low-Priority */ + /* Machine Check Interruption Enable */ /* When fetching register values from an inferior or a core file, clean them up using this macro. BUF is a char pointer to @@ -347,7 +348,7 @@ extern void pa_do_strcat_registers_info PARAMS ((int, int, GDB_FILE *, enum prec fr4: floating point up to 64 bits sr1: space identifier (32-bit) stack: any lager than 64-bit, with the address in r28 - */ + */ extern use_struct_convention_fn hppa_use_struct_convention; #define USE_STRUCT_CONVENTION(gcc_p,type) hppa_use_struct_convention (gcc_p,type) @@ -384,7 +385,7 @@ extern use_struct_convention_fn hppa_use_struct_convention; convention doc. As far as I know, the only way to get the return value is to have the caller tell us where it told the callee to put it, rather than have the callee tell us. -*/ + */ #define VALUE_RETURNED_FROM_STACK(valtype,addr) \ hppa_value_returned_from_stack (valtype, addr) @@ -441,7 +442,7 @@ extern int hppa_frame_chain_valid PARAMS ((CORE_ADDR, struct frame_info *)); (frameless_function_invocation (FI)) extern int frameless_function_invocation PARAMS ((struct frame_info *)); -extern CORE_ADDR hppa_frame_saved_pc PARAMS ((struct frame_info *frame)); +extern CORE_ADDR hppa_frame_saved_pc PARAMS ((struct frame_info * frame)); #define FRAME_SAVED_PC(FRAME) hppa_frame_saved_pc (FRAME) #define FRAME_ARGS_ADDRESS(fi) ((fi)->frame) @@ -463,8 +464,8 @@ extern CORE_ADDR hppa_frame_saved_pc PARAMS ((struct frame_info *frame)); extern void hppa_frame_find_saved_regs PARAMS ((struct frame_info *, struct frame_saved_regs *)); - + /* Things needed for making the inferior call functions. */ /* Push an empty stack frame, to record the current PC, etc. */ @@ -486,40 +487,40 @@ extern void hppa_pop_frame PARAMS ((void)); /* This sequence of words is the instructions -; Call stack frame has already been built by gdb. Since we could be calling -; a varargs function, and we do not have the benefit of a stub to put things in -; the right place, we load the first 4 word of arguments into both the general -; and fp registers. -call_dummy - ldw -36(sp), arg0 - ldw -40(sp), arg1 - ldw -44(sp), arg2 - ldw -48(sp), arg3 - ldo -36(sp), r1 - fldws 0(0, r1), fr4 - fldds -4(0, r1), fr5 - fldws -8(0, r1), fr6 - fldds -12(0, r1), fr7 - ldil 0, r22 ; FUNC_LDIL_OFFSET must point here - ldo 0(r22), r22 ; FUNC_LDO_OFFSET must point here - ldsid (0,r22), r4 - ldil 0, r1 ; SR4EXPORT_LDIL_OFFSET must point here - ldo 0(r1), r1 ; SR4EXPORT_LDO_OFFSET must point here - ldsid (0,r1), r20 - combt,=,n r4, r20, text_space ; If target is in data space, do a - ble 0(sr5, r22) ; "normal" procedure call - copy r31, r2 - break 4, 8 - mtsp r21, sr0 - ble,n 0(sr0, r22) -text_space ; Otherwise, go through _sr4export, - ble (sr4, r1) ; which will return back here. - stw r31,-24(r30) - break 4, 8 - mtsp r21, sr0 - ble,n 0(sr0, r22) - nop ; To avoid kernel bugs - nop ; and keep the dummy 8 byte aligned + ; Call stack frame has already been built by gdb. Since we could be calling + ; a varargs function, and we do not have the benefit of a stub to put things in + ; the right place, we load the first 4 word of arguments into both the general + ; and fp registers. + call_dummy + ldw -36(sp), arg0 + ldw -40(sp), arg1 + ldw -44(sp), arg2 + ldw -48(sp), arg3 + ldo -36(sp), r1 + fldws 0(0, r1), fr4 + fldds -4(0, r1), fr5 + fldws -8(0, r1), fr6 + fldds -12(0, r1), fr7 + ldil 0, r22 ; FUNC_LDIL_OFFSET must point here + ldo 0(r22), r22 ; FUNC_LDO_OFFSET must point here + ldsid (0,r22), r4 + ldil 0, r1 ; SR4EXPORT_LDIL_OFFSET must point here + ldo 0(r1), r1 ; SR4EXPORT_LDO_OFFSET must point here + ldsid (0,r1), r20 + combt,=,n r4, r20, text_space ; If target is in data space, do a + ble 0(sr5, r22) ; "normal" procedure call + copy r31, r2 + break 4, 8 + mtsp r21, sr0 + ble,n 0(sr0, r22) + text_space ; Otherwise, go through _sr4export, + ble (sr4, r1) ; which will return back here. + stw r31,-24(r30) + break 4, 8 + mtsp r21, sr0 + ble,n 0(sr0, r22) + nop ; To avoid kernel bugs + nop ; and keep the dummy 8 byte aligned The dummy decides if the target is in text space or data space. If it's in data space, there's no problem because the target can @@ -570,21 +571,21 @@ text_space ; Otherwise, go through _sr4export, registers (or floating point??), so we skip all that inter-space call stuff, and avoid touching the fp regs. -call_dummy - - ldw -36(%sp), %arg0 - ldw -40(%sp), %arg1 - ldw -44(%sp), %arg2 - ldw -48(%sp), %arg3 - ldil 0, %r31 ; FUNC_LDIL_OFFSET must point here - ldo 0(%r31), %r31 ; FUNC_LDO_OFFSET must point here - ble 0(%sr0, %r31) - copy %r31, %r2 - break 4, 8 - nop ; restore_pc_queue expects these - bv,n 0(%r22) ; instructions to be here... - nop -*/ + call_dummy + + ldw -36(%sp), %arg0 + ldw -40(%sp), %arg1 + ldw -44(%sp), %arg2 + ldw -48(%sp), %arg3 + ldil 0, %r31 ; FUNC_LDIL_OFFSET must point here + ldo 0(%r31), %r31 ; FUNC_LDO_OFFSET must point here + ble 0(%sr0, %r31) + copy %r31, %r2 + break 4, 8 + nop ; restore_pc_queue expects these + bv,n 0(%r22) ; instructions to be here... + nop + */ /* Define offsets into the call dummy for the target function address */ #define FUNC_LDIL_OFFSET (INSTRUCTION_SIZE * 4) @@ -620,14 +621,14 @@ call_dummy #define FIX_CALL_DUMMY hppa_fix_call_dummy extern CORE_ADDR -hppa_fix_call_dummy PARAMS ((char *, CORE_ADDR, CORE_ADDR, int, - struct value **, struct type *, int)); + hppa_fix_call_dummy PARAMS ((char *, CORE_ADDR, CORE_ADDR, int, + struct value **, struct type *, int)); #define PUSH_ARGUMENTS(nargs, args, sp, struct_return, struct_addr) \ (hppa_push_arguments((nargs), (args), (sp), (struct_return), (struct_addr))) extern CORE_ADDR -hppa_push_arguments PARAMS ((int, struct value **, CORE_ADDR, int, - CORE_ADDR)); + hppa_push_arguments PARAMS ((int, struct value **, CORE_ADDR, int, + CORE_ADDR)); /* The low two bits of the PC on the PA contain the privilege level. Some genius implementing a (non-GCC) compiler apparently decided this means @@ -645,51 +646,54 @@ hppa_push_arguments PARAMS ((int, struct value **, CORE_ADDR, int, * Unwind table and descriptor. */ -struct unwind_table_entry { - unsigned int region_start; - unsigned int region_end; - - unsigned int Cannot_unwind : 1; /* 0 */ - unsigned int Millicode : 1; /* 1 */ - unsigned int Millicode_save_sr0 : 1; /* 2 */ - unsigned int Region_description : 2; /* 3..4 */ - unsigned int reserved1 : 1; /* 5 */ - unsigned int Entry_SR : 1; /* 6 */ - unsigned int Entry_FR : 4; /* number saved */ /* 7..10 */ - unsigned int Entry_GR : 5; /* number saved */ /* 11..15 */ - unsigned int Args_stored : 1; /* 16 */ - unsigned int Variable_Frame : 1; /* 17 */ - unsigned int Separate_Package_Body : 1; /* 18 */ - unsigned int Frame_Extension_Millicode:1; /* 19 */ - unsigned int Stack_Overflow_Check : 1; /* 20 */ - unsigned int Two_Instruction_SP_Increment:1; /* 21 */ - unsigned int Ada_Region : 1; /* 22 */ - unsigned int cxx_info : 1; /* 23 */ - unsigned int cxx_try_catch : 1; /* 24 */ - unsigned int sched_entry_seq : 1; /* 25 */ - unsigned int reserved2 : 1; /* 26 */ - unsigned int Save_SP : 1; /* 27 */ - unsigned int Save_RP : 1; /* 28 */ - unsigned int Save_MRP_in_frame : 1; /* 29 */ - unsigned int extn_ptr_defined : 1; /* 30 */ - unsigned int Cleanup_defined : 1; /* 31 */ - - unsigned int MPE_XL_interrupt_marker: 1; /* 0 */ - unsigned int HP_UX_interrupt_marker: 1; /* 1 */ - unsigned int Large_frame : 1; /* 2 */ - unsigned int Pseudo_SP_Set : 1; /* 3 */ - unsigned int reserved4 : 1; /* 4 */ - unsigned int Total_frame_size : 27; /* 5..31 */ - - /* This is *NOT* part of an actual unwind_descriptor in an object - file. It is *ONLY* part of the "internalized" descriptors that - we create from those in a file. +struct unwind_table_entry + { + unsigned int region_start; + unsigned int region_end; + + unsigned int Cannot_unwind:1; /* 0 */ + unsigned int Millicode:1; /* 1 */ + unsigned int Millicode_save_sr0:1; /* 2 */ + unsigned int Region_description:2; /* 3..4 */ + unsigned int reserved1:1; /* 5 */ + unsigned int Entry_SR:1; /* 6 */ + unsigned int Entry_FR:4; /* number saved *//* 7..10 */ + unsigned int Entry_GR:5; /* number saved *//* 11..15 */ + unsigned int Args_stored:1; /* 16 */ + unsigned int Variable_Frame:1; /* 17 */ + unsigned int Separate_Package_Body:1; /* 18 */ + unsigned int Frame_Extension_Millicode:1; /* 19 */ + unsigned int Stack_Overflow_Check:1; /* 20 */ + unsigned int Two_Instruction_SP_Increment:1; /* 21 */ + unsigned int Ada_Region:1; /* 22 */ + unsigned int cxx_info:1; /* 23 */ + unsigned int cxx_try_catch:1; /* 24 */ + unsigned int sched_entry_seq:1; /* 25 */ + unsigned int reserved2:1; /* 26 */ + unsigned int Save_SP:1; /* 27 */ + unsigned int Save_RP:1; /* 28 */ + unsigned int Save_MRP_in_frame:1; /* 29 */ + unsigned int extn_ptr_defined:1; /* 30 */ + unsigned int Cleanup_defined:1; /* 31 */ + + unsigned int MPE_XL_interrupt_marker:1; /* 0 */ + unsigned int HP_UX_interrupt_marker:1; /* 1 */ + unsigned int Large_frame:1; /* 2 */ + unsigned int Pseudo_SP_Set:1; /* 3 */ + unsigned int reserved4:1; /* 4 */ + unsigned int Total_frame_size:27; /* 5..31 */ + + /* This is *NOT* part of an actual unwind_descriptor in an object + file. It is *ONLY* part of the "internalized" descriptors that + we create from those in a file. */ - struct { - unsigned int stub_type : 4; /* 0..3 */ - unsigned int padding : 28; /* 4..31 */ - } stub_unwind; -}; + struct + { + unsigned int stub_type:4; /* 0..3 */ + unsigned int padding:28; /* 4..31 */ + } + stub_unwind; + }; /* HP linkers also generate unwinds for various linker-generated stubs. GDB reads in the stubs from the $UNWIND_END$ subspace, then @@ -697,19 +701,19 @@ struct unwind_table_entry { fields to store the stub type. */ struct stub_unwind_entry -{ - /* The offset within the executable for the associated stub. */ - unsigned stub_offset; + { + /* The offset within the executable for the associated stub. */ + unsigned stub_offset; - /* The type of stub this unwind entry describes. */ - char type; + /* The type of stub this unwind entry describes. */ + char type; - /* Unknown. Not needed by GDB at this time. */ - char prs_info; + /* Unknown. Not needed by GDB at this time. */ + char prs_info; - /* Length (in instructions) of the associated stub. */ - short stub_length; -}; + /* Length (in instructions) of the associated stub. */ + short stub_length; + }; /* Sizes (in bytes) of the native unwind entries. */ #define UNWIND_ENTRY_SIZE 16 @@ -718,61 +722,65 @@ struct stub_unwind_entry /* The gaps represent linker stubs used in MPE and space for future expansion. */ enum unwind_stub_types -{ - LONG_BRANCH = 1, - PARAMETER_RELOCATION = 2, - EXPORT = 10, - IMPORT = 11, - IMPORT_SHLIB = 12, -}; + { + LONG_BRANCH = 1, + PARAMETER_RELOCATION = 2, + EXPORT = 10, + IMPORT = 11, + IMPORT_SHLIB = 12, + }; /* We use the objfile->obj_private pointer for two things: - * + * 1. An unwind table; * * 2. A pointer to any associated shared library object. * * #defines are used to help refer to these objects. */ - + /* Info about the unwind table associated with an object file. - * + * This is hung off of the "objfile->obj_private" pointer, and * is allocated in the objfile's psymbol obstack. This allows * us to have unique unwind info for each executable and shared * library that we are debugging. */ -struct obj_unwind_info { - struct unwind_table_entry *table; /* Pointer to unwind info */ - struct unwind_table_entry *cache; /* Pointer to last entry we found */ - int last; /* Index of last entry */ -}; - -typedef struct obj_private_struct { - struct obj_unwind_info *unwind_info; /* a pointer */ - struct so_list *so_info; /* a pointer */ -} obj_private_data_t; +struct obj_unwind_info + { + struct unwind_table_entry *table; /* Pointer to unwind info */ + struct unwind_table_entry *cache; /* Pointer to last entry we found */ + int last; /* Index of last entry */ + }; + +typedef struct obj_private_struct + { + struct obj_unwind_info *unwind_info; /* a pointer */ + struct so_list *so_info; /* a pointer */ + } +obj_private_data_t; #if 0 -extern void target_write_pc PARAMS ((CORE_ADDR, int)) -extern CORE_ADDR target_read_pc PARAMS ((int)); -extern CORE_ADDR skip_trampoline_code PARAMS ((CORE_ADDR, char *)); +extern void target_write_pc +PARAMS ((CORE_ADDR, int)) + extern CORE_ADDR target_read_pc PARAMS ((int)); + extern CORE_ADDR skip_trampoline_code PARAMS ((CORE_ADDR, char *)); #endif #define TARGET_READ_PC(pid) target_read_pc (pid) -extern CORE_ADDR target_read_pc PARAMS ((int)); + extern CORE_ADDR target_read_pc PARAMS ((int)); #define TARGET_WRITE_PC(v,pid) target_write_pc (v,pid) -extern void target_write_pc PARAMS ((CORE_ADDR, int)); + extern void target_write_pc PARAMS ((CORE_ADDR, int)); #define TARGET_READ_FP() target_read_fp (inferior_pid) -extern CORE_ADDR target_read_fp PARAMS ((int)); + extern CORE_ADDR target_read_fp PARAMS ((int)); /* For a number of horrible reasons we may have to adjust the location of variables on the stack. Ugh. */ #define HPREAD_ADJUST_STACK_ADDRESS(ADDR) hpread_adjust_stack_address(ADDR) -extern int hpread_adjust_stack_address PARAMS ((CORE_ADDR)); + extern int hpread_adjust_stack_address PARAMS ((CORE_ADDR)); /* If the current gcc for for this target does not produce correct debugging information for float parameters, both prototyped and unprototyped, then |