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