libunwind-x86.h revision c61e0b932cccc2b56068a527575cb09dfabfa32b
1/* libunwind - a platform-independent unwind library
2   Copyright (C) 2002-2004 Hewlett-Packard Co
3	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
4
5This file is part of libunwind.
6
7Permission is hereby granted, free of charge, to any person obtaining
8a copy of this software and associated documentation files (the
9"Software"), to deal in the Software without restriction, including
10without limitation the rights to use, copy, modify, merge, publish,
11distribute, sublicense, and/or sell copies of the Software, and to
12permit persons to whom the Software is furnished to do so, subject to
13the following conditions:
14
15The above copyright notice and this permission notice shall be
16included in all copies or substantial portions of the Software.
17
18THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
25
26#ifndef LIBUNWIND_H
27#define LIBUNWIND_H
28
29#if defined(__cplusplus) || defined(c_plusplus)
30extern "C" {
31#endif
32
33#include <sys/types.h>
34#include <inttypes.h>
35#include <ucontext.h>
36
37#define UNW_TARGET	x86
38#define UNW_TARGET_X86	1
39
40#define _U_TDEP_QP_TRUE	0	/* see libunwind-dynamic.h  */
41
42/* This needs to be big enough to accommodate "struct cursor", while
43   leaving some slack for future expansion.  Changing this value will
44   require recompiling all users of this library.  Stack allocation is
45   relatively cheap and unwind-state copying is relatively rare, so we
46   want to err on making it rather too big than too small.  */
47#define UNW_TDEP_CURSOR_LEN	127
48
49typedef uint32_t unw_word_t;
50typedef int32_t unw_sword_t;
51
52typedef union {
53  struct { uint8_t b[4]; } val32;
54  struct { uint8_t b[10]; } val80;
55  struct { uint8_t b[16]; } val128;
56} unw_tdep_fpreg_t;
57
58typedef enum
59  {
60    /* Note: general registers are expected to start with index 0.
61       This convention facilitates architecture-independent
62       implementation of the C++ exception handling ABI.  See
63       _Unwind_SetGR() and _Unwind_GetGR() for details.
64
65       The described register usage convention is based on "System V
66       Application Binary Interface, Intel386 Architecture Processor
67       Supplement, Fourth Edition" at
68
69         http://www.linuxbase.org/spec/refspecs/elf/abi386-4.pdf
70
71       It would have been nice to use the same register numbering as
72       DWARF, but that doesn't work because the libunwind requires
73       that the exception argument registers be consecutive, which the
74       wouldn't be with the DWARF numbering.  */
75    UNW_X86_EAX,	/* scratch (exception argument 1) */
76    UNW_X86_EDX,	/* scratch (exception argument 2) */
77    UNW_X86_ECX,	/* scratch */
78    UNW_X86_EBX,	/* preserved */
79    UNW_X86_ESI,	/* preserved */
80    UNW_X86_EDI,	/* preserved */
81    UNW_X86_EBP,	/* (optional) frame-register */
82    UNW_X86_ESP,	/* (optional) frame-register */
83    UNW_X86_EIP,	/* frame-register */
84    UNW_X86_EFLAGS,	/* scratch (except for "direction", which is fixed */
85    UNW_X86_TRAPNO,	/* scratch */
86
87    /* MMX/stacked-fp registers */
88    UNW_X86_ST0,	/* fp return value */
89    UNW_X86_ST1,	/* scratch */
90    UNW_X86_ST2,	/* scratch */
91    UNW_X86_ST3,	/* scratch */
92    UNW_X86_ST4,	/* scratch */
93    UNW_X86_ST5,	/* scratch */
94    UNW_X86_ST6,	/* scratch */
95    UNW_X86_ST7,	/* scratch */
96
97    UNW_X86_FCW,	/* scratch */
98    UNW_X86_FSW,	/* scratch */
99    UNW_X86_FTW,	/* scratch */
100    UNW_X86_FOP,	/* scratch */
101    UNW_X86_FCS,	/* scratch */
102    UNW_X86_FIP,	/* scratch */
103    UNW_X86_FEA,	/* scratch */
104    UNW_X86_FDS,	/* scratch */
105
106    /* SSE registers */
107    UNW_X86_XMM0_lo,	/* scratch */
108    UNW_X86_XMM0_hi,	/* scratch */
109    UNW_X86_XMM1_lo,	/* scratch */
110    UNW_X86_XMM1_hi,	/* scratch */
111    UNW_X86_XMM2_lo,	/* scratch */
112    UNW_X86_XMM2_hi,	/* scratch */
113    UNW_X86_XMM3_lo,	/* scratch */
114    UNW_X86_XMM3_hi,	/* scratch */
115    UNW_X86_XMM4_lo,	/* scratch */
116    UNW_X86_XMM4_hi,	/* scratch */
117    UNW_X86_XMM5_lo,	/* scratch */
118    UNW_X86_XMM5_hi,	/* scratch */
119    UNW_X86_XMM6_lo,	/* scratch */
120    UNW_X86_XMM6_hi,	/* scratch */
121    UNW_X86_XMM7_lo,	/* scratch */
122    UNW_X86_XMM7_hi,	/* scratch */
123
124    UNW_X86_MXCSR,	/* scratch */
125
126    /* segment registers */
127    UNW_X86_GS,		/* special */
128    UNW_X86_FS,		/* special */
129    UNW_X86_ES,		/* special */
130    UNW_X86_DS,		/* special */
131    UNW_X86_SS,		/* special */
132    UNW_X86_CS,		/* special */
133    UNW_X86_TSS,	/* special */
134    UNW_X86_LDT,	/* special */
135
136    /* frame info (read-only) */
137    UNW_X86_CFA,
138
139    UNW_X86_XMM0,	/* scratch */
140    UNW_X86_XMM1,	/* scratch */
141    UNW_X86_XMM2,	/* scratch */
142    UNW_X86_XMM3,	/* scratch */
143    UNW_X86_XMM4,	/* scratch */
144    UNW_X86_XMM5,	/* scratch */
145    UNW_X86_XMM6,	/* scratch */
146    UNW_X86_XMM7,	/* scratch */
147
148    UNW_TDEP_LAST_REG = UNW_X86_XMM7,
149
150    UNW_TDEP_IP = UNW_X86_EIP,
151    UNW_TDEP_SP = UNW_X86_ESP,
152    UNW_TDEP_EH = UNW_X86_EAX
153  }
154x86_regnum_t;
155
156#define UNW_TDEP_NUM_EH_REGS	2	/* eax and edx are exception args */
157
158typedef struct unw_tdep_save_loc
159  {
160    /* Additional target-dependent info on a save location.  */
161  }
162unw_tdep_save_loc_t;
163
164/* On x86, we can directly use ucontext_t as the unwind context.  */
165typedef ucontext_t unw_tdep_context_t;
166
167#include "libunwind-dynamic.h"
168
169typedef struct
170  {
171    /* no x86-specific auxiliary proc-info */
172  }
173unw_tdep_proc_info_t;
174
175#include "libunwind-common.h"
176
177#define unw_tdep_getcontext		UNW_ARCH_OBJ(getcontext)
178extern int unw_tdep_getcontext (unw_tdep_context_t *);
179
180#define unw_tdep_is_fpreg		UNW_ARCH_OBJ(is_fpreg)
181extern int unw_tdep_is_fpreg (int);
182
183#if defined(__cplusplus) || defined(c_plusplus)
184}
185#endif
186
187#endif /* LIBUNWIND_H */
188