GDB (xrefs)
Loading...
Searching...
No Matches
hppa-tdep.h
Go to the documentation of this file.
1/* Target-dependent code for the HP PA-RISC architecture.
2
3 Copyright (C) 2003-2023 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20#ifndef HPPA_TDEP_H
21#define HPPA_TDEP_H
22
23#include "gdbarch.h"
24
26struct objfile;
27struct so_list;
28
29/* Register numbers of various important registers. */
30
32{
33 HPPA_R0_REGNUM = 0, /* Doesn't actually exist, used as base for
34 other r registers. */
36 HPPA_FLAGS_REGNUM = 0, /* Various status flags */
37 HPPA_RP_REGNUM = 2, /* return pointer */
38 HPPA_FP_REGNUM = 3, /* The ABI's frame pointer, when used */
42 HPPA_SP_REGNUM = 30, /* Stack pointer. */
44 HPPA_SAR_REGNUM = 32, /* Shift Amount Register */
45 HPPA_IPSW_REGNUM = 41, /* Interrupt Processor Status Word */
46 HPPA_PCOQ_HEAD_REGNUM = 33, /* instruction offset queue head */
47 HPPA_PCSQ_HEAD_REGNUM = 34, /* instruction space queue head */
48 HPPA_PCOQ_TAIL_REGNUM = 35, /* instruction offset queue tail */
49 HPPA_PCSQ_TAIL_REGNUM = 36, /* instruction space queue tail */
50 HPPA_EIEM_REGNUM = 37, /* External Interrupt Enable Mask */
51 HPPA_IIR_REGNUM = 38, /* Interrupt Instruction Register */
52 HPPA_ISR_REGNUM = 39, /* Interrupt Space Register */
53 HPPA_IOR_REGNUM = 40, /* Interrupt Offset Register */
54 HPPA_SR4_REGNUM = 43, /* space register 4 */
55 HPPA_SR0_REGNUM = 44, /* space register 0 */
56 HPPA_SR1_REGNUM = 45, /* space register 1 */
57 HPPA_SR2_REGNUM = 46, /* space register 2 */
58 HPPA_SR3_REGNUM = 47, /* space register 3 */
59 HPPA_SR5_REGNUM = 48, /* space register 5 */
60 HPPA_SR6_REGNUM = 49, /* space register 6 */
61 HPPA_SR7_REGNUM = 50, /* space register 7 */
62 HPPA_RCR_REGNUM = 51, /* Recover Counter (also known as cr0) */
63 HPPA_PID0_REGNUM = 52, /* Protection ID */
64 HPPA_PID1_REGNUM = 53, /* Protection ID */
65 HPPA_PID2_REGNUM = 55, /* Protection ID */
66 HPPA_PID3_REGNUM = 56, /* Protection ID */
67 HPPA_CCR_REGNUM = 54, /* Coprocessor Configuration Register */
68 HPPA_TR0_REGNUM = 57, /* Temporary Registers (cr24 -> cr31) */
70 HPPA_CR27_REGNUM = 60, /* Base register for thread-local
71 storage, cr27 */
72 HPPA_FP0_REGNUM = 64, /* First floating-point. */
75 HPPA_FP31R_REGNUM = 127, /* Last floating-point. */
76
77 HPPA_ARG0_REGNUM = 26, /* The first argument of a callee. */
78 HPPA_ARG1_REGNUM = 25, /* The second argument of a callee. */
79 HPPA_ARG2_REGNUM = 24, /* The third argument of a callee. */
80 HPPA_ARG3_REGNUM = 23 /* The fourth argument of a callee. */
81};
82
83/* Instruction size. */
84#define HPPA_INSN_SIZE 4
85
86/* Target-dependent structure in gdbarch. */
88{
89 /* The number of bytes in an address. For now, this field is designed
90 to allow us to differentiate hppa32 from hppa64 targets. */
92
93 /* Is this an ELF target? This can be 64-bit HP-UX, or a 32/64-bit GNU/Linux
94 system. */
95 int is_elf = 0;
96
97 /* Given a function address, try to find the global pointer for the
98 corresponding shared object. */
99 CORE_ADDR (*find_global_pointer) (struct gdbarch *, struct value *) = nullptr;
100
101 /* For shared libraries, each call goes through a small piece of
102 trampoline code in the ".plt" section. IN_SOLIB_CALL_TRAMPOLINE
103 evaluates to nonzero if we are currently stopped in one of these. */
105 CORE_ADDR pc) = nullptr;
106
107 /* For targets that support multiple spaces, we may have additional stubs
108 in the return path. These stubs are internal to the ABI, and users are
109 not interested in them. If we detect that we are returning to a stub,
110 adjust the pc to the real caller. This improves the behavior of commands
111 that traverse frames such as "up" and "finish". */
112 void (*unwind_adjust_stub) (frame_info_ptr this_frame, CORE_ADDR base,
113 trad_frame_saved_reg *saved_regs) = nullptr;
114
115 /* These are solib-dependent methods. They are really HPUX only, but
116 we don't have a HPUX-specific tdep vector at the moment. */
117 CORE_ADDR (*solib_thread_start_addr) (struct so_list *so) = nullptr;
118 CORE_ADDR (*solib_get_got_by_pc) (CORE_ADDR addr) = nullptr;
119 CORE_ADDR (*solib_get_solib_by_pc) (CORE_ADDR addr) = nullptr;
120 CORE_ADDR (*solib_get_text_base) (struct objfile *objfile) = nullptr;
121};
122
123/*
124 * Unwind table and descriptor.
125 */
126
128 {
129 CORE_ADDR region_start;
130 CORE_ADDR region_end;
131
132 unsigned int Cannot_unwind:1; /* 0 */
133 unsigned int Millicode:1; /* 1 */
134 unsigned int Millicode_save_sr0:1; /* 2 */
135 unsigned int Region_description:2; /* 3..4 */
136 unsigned int reserved:1; /* 5 */
137 unsigned int Entry_SR:1; /* 6 */
138 unsigned int Entry_FR:4; /* number saved *//* 7..10 */
139 unsigned int Entry_GR:5; /* number saved *//* 11..15 */
140 unsigned int Args_stored:1; /* 16 */
141 unsigned int Variable_Frame:1; /* 17 */
142 unsigned int Separate_Package_Body:1; /* 18 */
143 unsigned int Frame_Extension_Millicode:1; /* 19 */
144 unsigned int Stack_Overflow_Check:1; /* 20 */
145 unsigned int Two_Instruction_SP_Increment:1; /* 21 */
146 unsigned int sr4export:1; /* 22 */
147 unsigned int cxx_info:1; /* 23 */
148 unsigned int cxx_try_catch:1; /* 24 */
149 unsigned int sched_entry_seq:1; /* 25 */
150 unsigned int reserved1:1; /* 26 */
151 unsigned int Save_SP:1; /* 27 */
152 unsigned int Save_RP:1; /* 28 */
153 unsigned int Save_MRP_in_frame:1; /* 29 */
154 unsigned int save_r19:1; /* 30 */
155 unsigned int Cleanup_defined:1; /* 31 */
156
157 unsigned int MPE_XL_interrupt_marker:1; /* 0 */
158 unsigned int HP_UX_interrupt_marker:1; /* 1 */
159 unsigned int Large_frame:1; /* 2 */
160 unsigned int alloca_frame:1; /* 3 */
161 unsigned int reserved2:1; /* 4 */
162 unsigned int Total_frame_size:27; /* 5..31 */
163
164 /* This is *NOT* part of an actual unwind_descriptor in an object
165 file. It is *ONLY* part of the "internalized" descriptors that
166 we create from those in a file. */
167
168 struct
169 {
170 unsigned int stub_type:4; /* 0..3 */
171 unsigned int padding:28; /* 4..31 */
172 }
174 };
175
176/* HP linkers also generate unwinds for various linker-generated stubs.
177 GDB reads in the stubs from the $UNWIND_END$ subspace, then
178 "converts" them into normal unwind entries using some of the reserved
179 fields to store the stub type. */
180
181/* The gaps represent linker stubs used in MPE and space for future
182 expansion. */
191
192struct unwind_table_entry *find_unwind_entry (CORE_ADDR);
193
194int hppa_get_field (unsigned word, int from, int to);
195int hppa_extract_5_load (unsigned int);
196unsigned hppa_extract_5R_store (unsigned int);
197unsigned hppa_extract_5r_store (unsigned int);
198int hppa_extract_17 (unsigned int);
199int hppa_extract_21 (unsigned);
200int hppa_extract_14 (unsigned);
201CORE_ADDR hppa_symbol_address(const char *sym);
202
203extern struct value *
205 trad_frame_saved_reg *saved_regs,
206 int regnum);
207
208extern CORE_ADDR hppa_read_pc (struct regcache *regcache);
209extern void hppa_write_pc (struct regcache *regcache, CORE_ADDR pc);
210extern CORE_ADDR hppa_unwind_pc (struct gdbarch *gdbarch,
211 frame_info_ptr next_frame);
212
214 CORE_ADDR pc);
215extern CORE_ADDR hppa_skip_trampoline_code (frame_info_ptr, CORE_ADDR pc);
216
217#endif /* hppa-tdep.h */
int regnum
CORE_ADDR hppa_unwind_pc(struct gdbarch *gdbarch, frame_info_ptr next_frame)
Definition hppa-tdep.c:2492
struct value * hppa_frame_prev_register_helper(frame_info_ptr this_frame, trad_frame_saved_reg *saved_regs, int regnum)
int hppa_extract_14(unsigned)
Definition hppa-tdep.c:156
CORE_ADDR hppa_read_pc(struct regcache *regcache)
hppa_regnum
Definition hppa-tdep.h:32
@ HPPA_R31_REGNUM
Definition hppa-tdep.h:43
@ HPPA_R1_REGNUM
Definition hppa-tdep.h:35
@ HPPA_CCR_REGNUM
Definition hppa-tdep.h:67
@ HPPA_FLAGS_REGNUM
Definition hppa-tdep.h:36
@ HPPA_PCSQ_HEAD_REGNUM
Definition hppa-tdep.h:47
@ HPPA_IOR_REGNUM
Definition hppa-tdep.h:53
@ HPPA_PID3_REGNUM
Definition hppa-tdep.h:66
@ HPPA_RET1_REGNUM
Definition hppa-tdep.h:41
@ HPPA_SR2_REGNUM
Definition hppa-tdep.h:57
@ HPPA_ARG2_REGNUM
Definition hppa-tdep.h:79
@ HPPA_SAR_REGNUM
Definition hppa-tdep.h:44
@ HPPA_TR0_REGNUM
Definition hppa-tdep.h:68
@ HPPA_ARG1_REGNUM
Definition hppa-tdep.h:78
@ HPPA_IPSW_REGNUM
Definition hppa-tdep.h:45
@ HPPA_SR5_REGNUM
Definition hppa-tdep.h:59
@ HPPA_RP_REGNUM
Definition hppa-tdep.h:37
@ HPPA_ISR_REGNUM
Definition hppa-tdep.h:52
@ HPPA_PID1_REGNUM
Definition hppa-tdep.h:64
@ HPPA_SP_REGNUM
Definition hppa-tdep.h:42
@ HPPA_SR1_REGNUM
Definition hppa-tdep.h:56
@ HPPA_FP31R_REGNUM
Definition hppa-tdep.h:75
@ HPPA_FP_REGNUM
Definition hppa-tdep.h:38
@ HPPA_PID0_REGNUM
Definition hppa-tdep.h:63
@ HPPA_CR26_REGNUM
Definition hppa-tdep.h:69
@ HPPA_SR7_REGNUM
Definition hppa-tdep.h:61
@ HPPA_PCOQ_HEAD_REGNUM
Definition hppa-tdep.h:46
@ HPPA_SR6_REGNUM
Definition hppa-tdep.h:60
@ HPPA_FP4_REGNUM
Definition hppa-tdep.h:73
@ HPPA64_FP4_REGNUM
Definition hppa-tdep.h:74
@ HPPA_DP_REGNUM
Definition hppa-tdep.h:39
@ HPPA_PID2_REGNUM
Definition hppa-tdep.h:65
@ HPPA_ARG3_REGNUM
Definition hppa-tdep.h:80
@ HPPA_PCSQ_TAIL_REGNUM
Definition hppa-tdep.h:49
@ HPPA_PCOQ_TAIL_REGNUM
Definition hppa-tdep.h:48
@ HPPA_CR27_REGNUM
Definition hppa-tdep.h:70
@ HPPA_FP0_REGNUM
Definition hppa-tdep.h:72
@ HPPA_RCR_REGNUM
Definition hppa-tdep.h:62
@ HPPA_RET0_REGNUM
Definition hppa-tdep.h:40
@ HPPA_ARG0_REGNUM
Definition hppa-tdep.h:77
@ HPPA_SR0_REGNUM
Definition hppa-tdep.h:55
@ HPPA_EIEM_REGNUM
Definition hppa-tdep.h:50
@ HPPA_SR4_REGNUM
Definition hppa-tdep.h:54
@ HPPA_SR3_REGNUM
Definition hppa-tdep.h:58
@ HPPA_IIR_REGNUM
Definition hppa-tdep.h:51
@ HPPA_R0_REGNUM
Definition hppa-tdep.h:33
int hppa_extract_21(unsigned)
Definition hppa-tdep.c:164
unwind_stub_types
Definition hppa-tdep.h:184
@ LONG_BRANCH
Definition hppa-tdep.h:185
@ EXPORT
Definition hppa-tdep.h:187
@ PARAMETER_RELOCATION
Definition hppa-tdep.h:186
@ IMPORT
Definition hppa-tdep.h:188
@ IMPORT_SHLIB
Definition hppa-tdep.h:189
int hppa_get_field(unsigned word, int from, int to)
Definition hppa-tdep.c:124
CORE_ADDR hppa_skip_trampoline_code(frame_info_ptr, CORE_ADDR pc)
Definition hppa-tdep.c:2887
int hppa_extract_17(unsigned int)
int hppa_extract_5_load(unsigned int)
unsigned hppa_extract_5R_store(unsigned int)
void hppa_write_pc(struct regcache *regcache, CORE_ADDR pc)
Definition hppa-tdep.c:1301
CORE_ADDR hppa_symbol_address(const char *sym)
Definition hppa-tdep.c:195
int hppa_in_solib_call_trampoline(struct gdbarch *gdbarch, CORE_ADDR pc)
Definition hppa-tdep.c:2859
unsigned hppa_extract_5r_store(unsigned int)
struct unwind_table_entry * find_unwind_entry(CORE_ADDR)
Definition hppa-tdep.c:475
CORE_ADDR(* find_global_pointer)(struct gdbarch *, struct value *)
Definition hppa-tdep.h:99
CORE_ADDR(* solib_get_solib_by_pc)(CORE_ADDR addr)
Definition hppa-tdep.h:119
CORE_ADDR(* solib_get_got_by_pc)(CORE_ADDR addr)
Definition hppa-tdep.h:118
CORE_ADDR(* solib_get_text_base)(struct objfile *objfile)
Definition hppa-tdep.h:120
void(* unwind_adjust_stub)(frame_info_ptr this_frame, CORE_ADDR base, trad_frame_saved_reg *saved_regs)
Definition hppa-tdep.h:112
int(* in_solib_call_trampoline)(struct gdbarch *gdbarch, CORE_ADDR pc)
Definition hppa-tdep.h:104
CORE_ADDR(* solib_thread_start_addr)(struct so_list *so)
Definition hppa-tdep.h:117
Definition hppa-tdep.h:128
unsigned int Frame_Extension_Millicode
Definition hppa-tdep.h:143
unsigned int reserved2
Definition hppa-tdep.h:161
unsigned int stub_type
Definition hppa-tdep.h:170
unsigned int cxx_info
Definition hppa-tdep.h:147
unsigned int Millicode_save_sr0
Definition hppa-tdep.h:134
unsigned int sr4export
Definition hppa-tdep.h:146
unsigned int Args_stored
Definition hppa-tdep.h:140
unsigned int Save_MRP_in_frame
Definition hppa-tdep.h:153
unsigned int Millicode
Definition hppa-tdep.h:133
unsigned int padding
Definition hppa-tdep.h:171
unsigned int save_r19
Definition hppa-tdep.h:154
unsigned int Total_frame_size
Definition hppa-tdep.h:162
unsigned int Save_SP
Definition hppa-tdep.h:151
unsigned int cxx_try_catch
Definition hppa-tdep.h:148
unsigned int sched_entry_seq
Definition hppa-tdep.h:149
unsigned int Separate_Package_Body
Definition hppa-tdep.h:142
unsigned int HP_UX_interrupt_marker
Definition hppa-tdep.h:158
unsigned int Stack_Overflow_Check
Definition hppa-tdep.h:144
unsigned int Large_frame
Definition hppa-tdep.h:159
unsigned int reserved1
Definition hppa-tdep.h:150
unsigned int Save_RP
Definition hppa-tdep.h:152
unsigned int Entry_FR
Definition hppa-tdep.h:138
CORE_ADDR region_start
Definition hppa-tdep.h:129
unsigned int alloca_frame
Definition hppa-tdep.h:160
unsigned int Two_Instruction_SP_Increment
Definition hppa-tdep.h:145
unsigned int Variable_Frame
Definition hppa-tdep.h:141
struct unwind_table_entry::@79 stub_unwind
unsigned int Region_description
Definition hppa-tdep.h:135
unsigned int Entry_SR
Definition hppa-tdep.h:137
unsigned int MPE_XL_interrupt_marker
Definition hppa-tdep.h:157
unsigned int Entry_GR
Definition hppa-tdep.h:139
unsigned int Cannot_unwind
Definition hppa-tdep.h:132
CORE_ADDR region_end
Definition hppa-tdep.h:130
unsigned int reserved
Definition hppa-tdep.h:136
unsigned int Cleanup_defined
Definition hppa-tdep.h:155
Definition value.h:130