libunwind-ia64.tex revision 0cae8247a870cfb8c370046640923423f4a62ea1
1bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\documentclass{article}
2bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\usepackage[fancyhdr,pdf]{latex2man}
3bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
4bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\input{common.tex}
5bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
6bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\begin{document}
7bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
8972aec70ba48f64db9b635a47a497cd65489d343esiee.fr!m.delahaye\begin{Name}{3}{libunwind-ia64}{David Mosberger-Tang}{Programming Library}{IA-64-specific support in libunwind}libunwind-ia64 -- IA-64-specific support in libunwind
9bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\end{Name}
10bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
11bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
12bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\section{Introduction}
13bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
14bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmThe IA-64 version of \Prog{libunwind} uses a platform-string of
15bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\texttt{ia64} and, at least in theory, should be able to support all
16bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmoperating systems adhering to the processor-specific ABI defined for
17bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmthe Itanium Processor Family.  This includes both little-endian Linux
18bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmand big-endian HP-UX.  Furthermore, to make it possible for a single
19bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmlibrary to unwind both 32- and 64-bit targets, the type
20bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\Type{unw\_word\_t} is always defined to be 64 bits wide (independent
21bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmof the natural word-size of the host).  Having said that, the current
22bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmimplementation has been tested only with IA-64 Linux.
23bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
24bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmWhen targeting IA-64, the \Prog{libunwind} header file defines the
25bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmmacro \Const{UNW\_TARGET\_IA64} as 1 and the macro \Const{UNW\_TARGET}
26bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmas ``ia64'' (without the quotation marks).  The former makes it
27bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmpossible for platform-dependent unwind code to use
28bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmconditional-compilation to select an appropriate implementation.  The
29bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmlatter is useful for stringification purposes and to construct
30bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmtarget-platform-specific symbols.
31bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
32bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmOne special feature of IA-64 is the use of NaT bits to support
33bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmspeculative execution.  Often, NaT bits are thought of as the ``65-th
34bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmbit'' of a general register.  However, to make everything fit into
35bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm64-bit wide \Type{unw\_word\_t} values, \Prog{libunwind} treats the
36bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmNaT-bits like separate boolean registers, whose 64-bit value is either
37bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmTRUE (non-zero) or FALSE (zero).
38bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
39bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
40bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\section{Machine-State}
41bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
42bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmThe machine-state (set of registers) that is accessible through
43bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\Prog{libunwind} depends on the type of stack frame that a cursor
44bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmpoints to.  For normal frames, all ``preserved'' (callee-saved)
45bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmregisters are accessible.  For signal-trampoline frames, all registers
46bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm(including ``scratch'' (caller-saved) registers) are accessible.  Most
47bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmapplications do not have to worry a-priori about which registers are
48bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmaccessible when.  In case of doubt, it is always safe to \emph{try} to
49bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmaccess a register (via \Func{unw\_get\_reg}() or
50bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\Func{unw\_get\_fpreg}()) and if the register isn't accessible, the
51bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmcall will fail with a return-value of \texttt{-}\Const{UNW\_EBADREG}.
52bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
53bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmAs a special exception to the above general rule, scratch registers
54bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\texttt{r15}-\texttt{r18} are always accessible, even in normal
55bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmframes.  This makes it possible to pass arguments, e.g., to exception
56bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmhandlers.
57bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
58bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmFor a detailed description of the IA-64 register usage convention,
59bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmplease see the ``Itanium Software Conventions and Runtime Architecture
60bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmGuide'', available at:
61bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\begin{center}
62bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  \URL{http://www.intel.com/design/itanium/downloads/245358.htm}
63bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\end{center}
64bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
65bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
66bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\section{Register Names}
67bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
68bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmThe IA-64-version of \Prog{libunwind} defines three kinds of register
69bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmname macros: frame-register macros, normal register macros, and
70bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmconvenience macros.  Below, we describe each kind in turn:
71bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
72bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
73bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\subsection{Frame-register Macros}
74bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
75bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmFrame-registers are special (pseudo) registers because they always
76bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmhave a valid value, even though sometimes they do not get saved
77bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmexplicitly (e.g., if a memory stack frame is 16 bytes in size, the
78bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmprevious stack-pointer value can be calculated simply as
79bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\texttt{sp+16}, so there is no need to save the stack-pointer
80bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmexplicitly).  Moreover, the set of frame register values uniquely
81bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmidentifies a stack frame.  The IA-64 architecture defines two stacks
82bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm(a memory and a register stack). Including the instruction-pointer
83bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm(IP), this means there are three frame registers:
84bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\begin{Description}
85bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\item[\Const{UNW\_IA64\_IP}:] Contains the instruction pointer (IP, or
86bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  ``program counter'') of the current stack frame.  Given this value,
87bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  the remaining machine-state corresponds to the register-values that
88bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  were present in the CPU when it was just about to execute the
89bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  instruction pointed to by \Const{UNW\_IA64\_IP}.  Bits 0 and 1 of
90bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  this frame-register encode the slot number of the instruction.
91bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  \textbf{Note:} Due to the way the call instruction works on IA-64,
92bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  the slot number is usually zero, but can be non-zero, e.g., in the
93bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  stack-frame of a signal-handler trampoline.
94bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\item[\Const{UNW\_IA64\_SP}:] Contains the (memory) stack-pointer
95bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  value (SP).  This frame-register is read-only.
96bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\item[\Const{UNW\_IA64\_BSP}:] Contains the register backing-store
97bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  pointer (BSP).  This frame-register is read-only.  \textbf{Note:}
98bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  the value in this register is equal to the contents of register
99bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  \texttt{ar.bsp} at the time the instruction at \Const{UNW\_IA64\_IP}
100bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  was about to begin execution.
101bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\end{Description}
102bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
103bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
104bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\subsection{Normal Register Macros}
105bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
106bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmThe following normal register name macros are available:
107bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\begin{Description}
108bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\item[\Const{UNW\_IA64\_GR}:] The base-index for general (integer)
109bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  registers.  Add an index in the range from 0..127 to get a
110bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  particular general register.  For example, to access \texttt{r4},
111eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  the index \Const{UNW\_IA64\_GR}\texttt{+4} should be used.
112eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  Registers \texttt{r0} and \texttt{r1} (\texttt{gp}) are read-only,
113eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  and any attempt to write them will result in an error
114eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  (\texttt{-}\Const{UNW\_EREADONLYREG}).  Even though \texttt{r1} is
115eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  read-only, \Prog{libunwind} will automatically adjust its value if
116eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  the instruction-pointer (\Const{UNW\_IA64\_IP}) is modified.  For
117eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  example, if \Const{UNW\_IA64\_IP} is set to a value inside a
118eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  function \Func{func}(), then reading
119eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  \Const{UNW\_IA64\_GR}\texttt{+1} will return the global-pointer
120eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  value for this function.
121bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\item[\Const{UNW\_IA64\_NAT}:] The base-index for the NaT bits of the
122bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  general (integer) registers.  A non-zero value in these registers
123bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  corresponds to a set NaT-bit.  Add an index in the range from 0..127
124bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  to get a particular NaT-bit register.  For example, to access the
125bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  NaT bit of \texttt{r4}, the index \Const{UNW\_IA64\_NAT}\texttt{+4}
126bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  should be used.
127bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\item[\Const{UNW\_IA64\_FR}:] The base-index for floating-point
128bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  registers.  Add an index in the range from 0..127 to get a
129bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  particular floating-point register.  For example, to access
130bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  \texttt{f2}, the index \Const{UNW\_IA64\_FR}\texttt{+2} should be
131bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  used.  Registers \texttt{f0} and \texttt{f1} are read-only, and any
132bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  attempt to write to indices \Const{UNW\_IA64\_FR}\texttt{+0} or
133bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  \Const{UNW\_IA64\_FR}\texttt{+1} will result in an error
134bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  (\texttt{-}\Const{UNW\_EREADONLYREG}).
135bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\item[\Const{UNW\_IA64\_AR}:] The base-index for application
136bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  registers.  Add an index in the range from 0..127 to get a
137bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  particular application register.  For example, to access
138bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  \texttt{ar40}, the index \Const{UNW\_IA64\_AR}\texttt{+40} should be
139bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  used.  The IA-64 architecture defines several application registers
140bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  as ``reserved for future use''.  Attempting to access such registers
141bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  results in an error (\texttt{-}\Const{UNW\_EBADREG}).
142bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\item[\Const{UNW\_IA64\_BR}:] The base-index for branch registers.
143bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  Add an index in the range from 0..7 to get a particular branch
144bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  register.  For example, to access \texttt{b6}, the index
145bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  \Const{UNW\_IA64\_BR}\texttt{+6} should be used.
146bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\item[\Const{UNW\_IA64\_PR}:] Contains the set of predicate registers.
147bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  This 64-bit wide register contains registers \texttt{p0} through
1480cae8247a870cfb8c370046640923423f4a62ea1hp.com!davidm  \texttt{p63} in the ``broad-side'' format.  Just like with the
1490cae8247a870cfb8c370046640923423f4a62ea1hp.com!davidm  ``move predicates'' instruction, the registers are mapped as if
1500cae8247a870cfb8c370046640923423f4a62ea1hp.com!davidm  \texttt{CFM.rrb.pr} were set to 0.  Thus, in general the value of
1510cae8247a870cfb8c370046640923423f4a62ea1hp.com!davidm  predicate register \texttt{p}$N$ with $N$>=16 can be found
1520cae8247a870cfb8c370046640923423f4a62ea1hp.com!davidm  in bit \texttt{16 + (($N$-16)+CFM.rrb.pr) \% 48}.
153bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\item[\Const{UNW\_IA64\_CFM}:] Contains the current-frame-mask
154bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  register.
155bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\end{Description}
156bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
157bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
158bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\subsection{Convenience Macros}
159bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
160bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmConvenience macros are simply aliases for certain frequently used
161bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmregisters:
162bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\begin{Description}
163eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm\item[\Const{UNW\_IA64\_GP}:] Alias for \Const{UNW\_IA64\_GR}\texttt{+1},
164eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  the global-pointer register.
165eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm\item[\Const{UNW\_IA64\_TP}:] Alias for \Const{UNW\_IA64\_GR}\texttt{+13},
166eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  the thread-pointer register.
167eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm\item[\Const{UNW\_IA64\_AR\_RSC}:] Alias for \Const{UNW\_IA64\_GR}\texttt{+16},
168eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  the register-stack configuration register.
169bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\item[\Const{UNW\_IA64\_AR\_BSP}:] Alias for
170bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  \Const{UNW\_IA64\_GR}\texttt{+17}.  This register index accesses the
171bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  value of register \texttt{ar.bsp} as of the time it was last saved
172bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  explicitly.  This is rarely what you want.  Normally, you'll want to
173bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm  use \Const{UNW\_IA64\_BSP} instead.
174eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm\item[\Const{UNW\_IA64\_AR\_BSPSTORE}:] Alias for \Const{UNW\_IA64\_GR}\texttt{+18},
175eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  the register-backing store write pointer.
176eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm\item[\Const{UNW\_IA64\_AR\_RNAT}:] Alias for \Const{UNW\_IA64\_GR}\texttt{+19},
177eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  the register-backing store NaT-collection register.
178eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm\item[\Const{UNW\_IA64\_AR\_CCV}:] Alias for \Const{UNW\_IA64\_GR}\texttt{+32},
179eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  the compare-and-swap value register.
180eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm\item[\Const{UNW\_IA64\_AR\_CSD}:] Alias for \Const{UNW\_IA64\_GR}\texttt{+25},
181eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  the compare-and-swap-data register (used by 16-byte atomic operations).
182eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm\item[\Const{UNW\_IA64\_AR\_UNAT}:] Alias for \Const{UNW\_IA64\_GR}\texttt{+36},
183eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  the user NaT-collection register.
184eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm\item[\Const{UNW\_IA64\_AR\_FPSR}:] Alias for \Const{UNW\_IA64\_GR}\texttt{+40},
185eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  the floating-point status (and control) register.
186eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm\item[\Const{UNW\_IA64\_AR\_PFS}:] Alias for \Const{UNW\_IA64\_GR}\texttt{+64},
187eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  the previous frame-state register.
188eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm\item[\Const{UNW\_IA64\_AR\_LC}:] Alias for \Const{UNW\_IA64\_GR}\texttt{+65}
189eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  the loop-count register.
190eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm\item[\Const{UNW\_IA64\_AR\_EC}:] Alias for \Const{UNW\_IA64\_GR}\texttt{+66},
191eb6d0a751f8a27db70e850530180459df9cfe091mostang.com!davidm  the epilogue-count register.
192bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\end{Description}
193bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
194bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
195bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\section{The Unwind-Context Type}
196bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
197bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmOn IA-64, \Type{unw\_context\_t} is simply an alias for
198bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\Type{ucontext\_t} (as defined by the Single UNIX Spec).  This implies
199bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmthat it is possible to initialize a value of this type not just with
200bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\Func{unw\_getcontext}(), but also with \Func{getcontext}(), for
201bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmexample.  However, since this is an IA-64-specific extension to
202bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\Prog{libunwind}, portable code should not rely on this equivalence.
203bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
204bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
205bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\section{See Also}
206bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
207bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\SeeAlso{libunwind(3)}
208bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
209bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\section{Author}
210bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
211bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\noindent
212bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmDavid Mosberger-Tang\\
213bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmHewlett-Packard Labs\\
214bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmPalo-Alto, CA 94304\\
215bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmEmail: \Email{davidm@hpl.hp.com}\\
216bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidmWWW: \URL{http://www.hpl.hp.com/research/linux/libunwind/}.
217bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\LatexManEnd
218bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm
219bd2b4658cb223d68a339dc9b838aa7f9eb3a6c3emostang.com!davidm\end{document}
220