]>
Commit | Line | Data |
---|---|---|
c906108c | 1 | /* Macro definitions for GDB on an Intel i[345]86. |
b6ba6518 KB |
2 | Copyright 1995, 1996, 1998, 1999, 2000, 2001 |
3 | Free Software Foundation, Inc. | |
c906108c | 4 | |
c5aa993b | 5 | This file is part of GDB. |
c906108c | 6 | |
c5aa993b JM |
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 2 of the License, or | |
10 | (at your option) any later version. | |
c906108c | 11 | |
c5aa993b JM |
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. | |
c906108c | 16 | |
c5aa993b JM |
17 | You should have received a copy of the GNU General Public License |
18 | along with this program; if not, write to the Free Software | |
19 | Foundation, Inc., 59 Temple Place - Suite 330, | |
20 | Boston, MA 02111-1307, USA. */ | |
c906108c SS |
21 | |
22 | #ifndef TM_I386_H | |
23 | #define TM_I386_H 1 | |
24 | ||
a62cc96e AC |
25 | #define GDB_MULTI_ARCH GDB_MULTI_ARCH_PARTIAL |
26 | ||
f88e2c52 AC |
27 | #include "regcache.h" |
28 | ||
a7769679 | 29 | /* Forward declarations for prototypes. */ |
c906108c SS |
30 | struct frame_info; |
31 | struct frame_saved_regs; | |
a7769679 | 32 | struct value; |
c906108c | 33 | struct type; |
c906108c | 34 | |
c906108c SS |
35 | /* Offset from address of function to start of its code. |
36 | Zero on most machines. */ | |
37 | ||
38 | #define FUNCTION_START_OFFSET 0 | |
39 | ||
40 | /* Advance PC across any function entry prologue instructions to reach some | |
41 | "real" code. */ | |
42 | ||
b83266a0 | 43 | #define SKIP_PROLOGUE(frompc) (i386_skip_prologue (frompc)) |
c906108c | 44 | |
a14ed312 | 45 | extern int i386_skip_prologue (int); |
c906108c | 46 | |
c906108c SS |
47 | /* Stack grows downward. */ |
48 | ||
49 | #define INNER_THAN(lhs,rhs) ((lhs) < (rhs)) | |
50 | ||
51 | /* Sequence of bytes for breakpoint instruction. */ | |
52 | ||
53 | #define BREAKPOINT {0xcc} | |
54 | ||
55 | /* Amount PC must be decremented by after a breakpoint. This is often the | |
56 | number of bytes in BREAKPOINT but not always. */ | |
57 | ||
58 | #define DECR_PC_AFTER_BREAK 1 | |
a2585ce7 MK |
59 | \f |
60 | ||
d7a0d72c MK |
61 | /* Return the GDB type object for the "standard" data type of data in |
62 | register REGNUM. */ | |
63 | ||
64 | #define REGISTER_VIRTUAL_TYPE(regnum) i386_register_virtual_type (regnum) | |
65 | extern struct type *i386_register_virtual_type (int regnum); | |
66 | ||
67 | /* Return true iff register REGNUM's virtual format is different from | |
68 | its raw format. */ | |
69 | ||
70 | #define REGISTER_CONVERTIBLE(regnum) i386_register_convertible (regnum) | |
71 | extern int i386_register_convertible (int regnum); | |
917317f4 | 72 | |
ac27f131 MK |
73 | /* Convert data from raw format for register REGNUM in buffer FROM to |
74 | virtual format with type TYPE in buffer TO. */ | |
917317f4 | 75 | |
ac27f131 | 76 | #define REGISTER_CONVERT_TO_VIRTUAL(regnum, type, from, to) \ |
cc533b9d | 77 | i386_register_convert_to_virtual ((regnum), (type), (from), (to)) |
ac27f131 MK |
78 | extern void i386_register_convert_to_virtual (int regnum, struct type *type, |
79 | char *from, char *to); | |
917317f4 | 80 | |
ac27f131 MK |
81 | /* Convert data from virtual format with type TYPE in buffer FROM to |
82 | raw format for register REGNUM in buffer TO. */ | |
917317f4 | 83 | |
ac27f131 | 84 | #define REGISTER_CONVERT_TO_RAW(type, regnum, from, to) \ |
cc533b9d | 85 | i386_register_convert_to_raw ((type), (regnum), (from), (to)) |
ac27f131 MK |
86 | extern void i386_register_convert_to_raw (struct type *type, int regnum, |
87 | char *from, char *to); | |
c906108c | 88 | |
de57eccd | 89 | /* Print out the i387 floating point state. */ |
de57eccd JM |
90 | extern void i387_float_info (void); |
91 | #define FLOAT_INFO { i387_float_info (); } | |
de57eccd | 92 | \f |
22f8ba57 MK |
93 | |
94 | #define PUSH_ARGUMENTS(nargs, args, sp, struct_return, struct_addr) \ | |
95 | i386_push_arguments ((nargs), (args), (sp), (struct_return), (struct_addr)) | |
96 | extern CORE_ADDR i386_push_arguments (int nargs, struct value **args, | |
97 | CORE_ADDR sp, int struct_return, | |
98 | CORE_ADDR struct_addr); | |
99 | ||
c906108c | 100 | /* Store the address of the place in which to copy the structure the |
22f8ba57 | 101 | subroutine will return. This is called from call_function. */ |
c906108c | 102 | |
22f8ba57 MK |
103 | #define STORE_STRUCT_RETURN(addr, sp) \ |
104 | i386_store_struct_return ((addr), (sp)) | |
105 | extern void i386_store_struct_return (CORE_ADDR addr, CORE_ADDR sp); | |
c906108c SS |
106 | |
107 | /* Extract from an array REGBUF containing the (raw) register state | |
108 | a function return value of type TYPE, and copy that, in virtual format, | |
109 | into VALBUF. */ | |
110 | ||
26e9b323 | 111 | #define DEPRECATED_EXTRACT_RETURN_VALUE(type, regbuf, valbuf) \ |
ac27f131 MK |
112 | i386_extract_return_value ((type), (regbuf), (valbuf)) |
113 | extern void i386_extract_return_value (struct type *type, char *regbuf, | |
114 | char *valbuf); | |
c906108c | 115 | |
ef9dff19 MK |
116 | /* Write into the appropriate registers a function return value stored |
117 | in VALBUF of type TYPE, given in virtual format. */ | |
f7af9647 | 118 | |
ef9dff19 MK |
119 | #define STORE_RETURN_VALUE(type, valbuf) \ |
120 | i386_store_return_value ((type), (valbuf)) | |
121 | extern void i386_store_return_value (struct type *type, char *valbuf); | |
c906108c | 122 | |
f7af9647 MK |
123 | /* Extract from an array REGBUF containing the (raw) register state |
124 | the address in which a function should return its structure value, | |
125 | as a CORE_ADDR. */ | |
c906108c | 126 | |
26e9b323 | 127 | #define DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS(regbuf) \ |
f7af9647 MK |
128 | i386_extract_struct_value_address ((regbuf)) |
129 | extern CORE_ADDR i386_extract_struct_value_address (char *regbuf); | |
c906108c | 130 | |
539ffe0b MK |
131 | /* Determine whether the function invocation represented by FRAME does |
132 | not have a from on the stack associated with it. If it does not, | |
133 | return non-zero, otherwise return zero. */ | |
c906108c | 134 | |
539ffe0b MK |
135 | #define FRAMELESS_FUNCTION_INVOCATION(frame) \ |
136 | i386_frameless_function_invocation (frame) | |
137 | extern int i386_frameless_function_invocation (struct frame_info *frame); | |
c906108c | 138 | |
c906108c SS |
139 | #define FRAME_ARGS_ADDRESS(fi) ((fi)->frame) |
140 | ||
141 | #define FRAME_LOCALS_ADDRESS(fi) ((fi)->frame) | |
142 | ||
143 | /* Return number of args passed to a frame. Can return -1, meaning no way | |
144 | to tell, which is typical now that the C compiler delays popping them. */ | |
145 | ||
392a587b | 146 | #define FRAME_NUM_ARGS(fi) (i386_frame_num_args(fi)) |
c906108c | 147 | |
a14ed312 | 148 | extern int i386_frame_num_args (struct frame_info *); |
c906108c SS |
149 | |
150 | /* Return number of bytes at start of arglist that are not really args. */ | |
151 | ||
152 | #define FRAME_ARGS_SKIP 8 | |
153 | ||
154 | /* Put here the code to store, into a struct frame_saved_regs, | |
155 | the addresses of the saved registers of frame described by FRAME_INFO. | |
156 | This includes special registers such as pc and fp saved in special | |
157 | ways in the stack frame. sp is even more special: | |
158 | the address we return for it IS the sp for the next frame. */ | |
159 | ||
a14ed312 | 160 | extern void i386_frame_init_saved_regs (struct frame_info *); |
1211c4e4 | 161 | #define FRAME_INIT_SAVED_REGS(FI) i386_frame_init_saved_regs (FI) |
c906108c | 162 | |
c906108c | 163 | \f |
c5aa993b | 164 | |
c906108c SS |
165 | /* Things needed for making the inferior call functions. */ |
166 | ||
2df3850c JM |
167 | /* "An argument's size is increased, if necessary, to make it a |
168 | multiple of [32 bit] words. This may require tail padding, | |
169 | depending on the size of the argument" - from the x86 ABI. */ | |
170 | #define PARM_BOUNDARY 32 | |
171 | ||
c906108c SS |
172 | /* Push an empty stack frame, to record the current PC, etc. */ |
173 | ||
174 | #define PUSH_DUMMY_FRAME { i386_push_dummy_frame (); } | |
175 | ||
a14ed312 | 176 | extern void i386_push_dummy_frame (void); |
c906108c SS |
177 | |
178 | /* Discard from the stack the innermost frame, restoring all registers. */ | |
179 | ||
180 | #define POP_FRAME { i386_pop_frame (); } | |
181 | ||
a14ed312 | 182 | extern void i386_pop_frame (void); |
c906108c | 183 | \f |
c5aa993b | 184 | |
c906108c SS |
185 | /* this is |
186 | * call 11223344 (32 bit relative) | |
187 | * int3 | |
188 | */ | |
189 | ||
190 | #define CALL_DUMMY { 0x223344e8, 0xcc11 } | |
191 | ||
192 | #define CALL_DUMMY_LENGTH 8 | |
193 | ||
c5aa993b | 194 | #define CALL_DUMMY_START_OFFSET 0 /* Start execution at beginning of dummy */ |
c906108c SS |
195 | |
196 | #define CALL_DUMMY_BREAKPOINT_OFFSET 5 | |
197 | ||
198 | /* Insert the specified number of args and function address | |
199 | into a call sequence of the above form stored at DUMMYNAME. */ | |
200 | ||
a7769679 MK |
201 | #define FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p) \ |
202 | i386_fix_call_dummy (dummyname, pc, fun, nargs, args, type, gcc_p) | |
203 | extern void i386_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, | |
204 | int nargs, struct value **args, | |
205 | struct type *type, int gcc_p); | |
c906108c | 206 | |
a7769679 | 207 | /* FIXME: kettenis/2000-06-12: These do not belong here. */ |
a14ed312 KB |
208 | extern void print_387_control_word (unsigned int); |
209 | extern void print_387_status_word (unsigned int); | |
c906108c SS |
210 | |
211 | /* Offset from SP to first arg on stack at first instruction of a function */ | |
212 | ||
213 | #define SP_ARG0 (1 * 4) | |
214 | ||
215 | #endif /* ifndef TM_I386_H */ |