Linux and UNIX Man Pages

Linux & Unix Commands - Search Man Pages

unw_get_fpreg(3) [debian man page]

UNW_GET_FPREG(3)					       Programming Library						  UNW_GET_FPREG(3)

unw_get_fpreg -- get contents of floating-point register SYNOPSIS
#include <libunwind.h> int unw_get_fpreg(unw_cursor_t *cp, unw_regnum_t reg, unw_fpreg_t *valp); DESCRIPTION
The unw_get_fpreg() routine reads the value of floating-point register reg in the stack frame identified by cursor cp and stores the value in the variable pointed to by valp. The register numbering is target-dependent and described in separate manual pages (e.g., libunwind-ia64(3) for the IA-64 target). Further- more, the exact set of accessible registers may depend on the type of frame that cp is referring to. For ordinary stack frames, it is nor- mally possible to access only the preserved (``callee-saved'') registers and frame-related registers (such as the stack-pointer). However, for signal frames (see unw_is_signal_frame(3)), it is usually possible to access all registers. Note that unw_get_fpreg() can only read the contents of floating-point registers. See unw_get_fpreg(3) for a way to read registers which fit in a single word. RETURN VALUE
On successful completion, unw_get_fpreg() returns 0. Otherwise the negative value of one of the error-codes below is returned. THREAD AND SIGNAL SAFETY
unw_get_fpreg() is thread-safe as well as safe to use from a signal handler. ERRORS
UNW_EUNSPEC An unspecified error occurred. UNW_EBADREG An attempt was made to read a register that is either invalid or not accessible in the current frame. In addition, unw_get_fpreg() may return any error returned by the access_mem(), access_reg(), and access_fpreg() call-backs (see unw_cre- ate_addr_space(3)). SEE ALSO
libunwind(3), libunwind-ia64(3), unw_get_reg(3), unw_is_fpreg(3), unw_is_signal_frame(3), unw_set_fpreg(3) AUTHOR
David Mosberger-Tang Email: WWW: Programming Library 16 August 2007 UNW_GET_FPREG(3)

Check Out this Related Man Page

LIBUNWIND-IA64(3)					       Programming Library						 LIBUNWIND-IA64(3)

libunwind-ia64 -- IA-64-specific support in libunwind INTRODUCTION
The IA-64 version of libunwind uses a platform-string of ia64 and, at least in theory, should be able to support all operating systems adhering to the processor-specific ABI defined for the Itanium Processor Family. This includes both little-endian Linux and big-endian HP-UX. Furthermore, to make it possible for a single library to unwind both 32- and 64-bit targets, the type unw_word_t is always defined to be 64 bits wide (independent of the natural word-size of the host). Having said that, the current implementation has been tested only with IA-64 Linux. When targeting IA-64, the libunwind header file defines the macro UNW_TARGET_IA64 as 1 and the macro UNW_TARGET as ``ia64'' (without the quotation marks). The former makes it possible for platform-dependent unwind code to use conditional-compilation to select an appropriate implementation. The latter is useful for stringification purposes and to construct target-platform-specific symbols. One special feature of IA-64 is the use of NaT bits to support speculative execution. Often, NaT bits are thought of as the ``65-th bit'' of a general register. However, to make everything fit into 64-bit wide unw_word_t values, libunwind treats the NaT-bits like separate boolean registers, whose 64-bit value is either TRUE (non-zero) or FALSE (zero). MACHINE-STATE The machine-state (set of registers) that is accessible through libunwind depends on the type of stack frame that a cursor points to. For normal frames, all ``preserved'' (callee-saved) registers are accessible. For signal-trampoline frames, all registers (including ``scratch'' (caller-saved) registers) are accessible. Most applications do not have to worry a-priori about which registers are accessible when. In case of doubt, it is always safe to try to access a register (via unw_get_reg() or unw_get_fpreg()) and if the register isn't accessible, the call will fail with a return-value of -UNW_EBADREG. As a special exception to the above general rule, scratch registers r15-r18 are always accessible, even in normal frames. This makes it possible to pass arguments, e.g., to exception handlers. For a detailed description of the IA-64 register usage convention, please see the ``Itanium Software Conventions and Runtime Architecture Guide'', available at: REGISTER NAMES
The IA-64-version of libunwind defines three kinds of register name macros: frame-register macros, normal register macros, and convenience macros. Below, we describe each kind in turn: FRAME-REGISTER MACROS Frame-registers are special (pseudo) registers because they always have a valid value, even though sometimes they do not get saved explic- itly (e.g., if a memory stack frame is 16 bytes in size, the previous stack-pointer value can be calculated simply as sp+16, so there is no need to save the stack-pointer explicitly). Moreover, the set of frame register values uniquely identifies a stack frame. The IA-64 archi- tecture defines two stacks (a memory and a register stack). Including the instruction-pointer (IP), this means there are three frame regis- ters: UNW_IA64_IP: Contains the instruction pointer (IP, or ``program counter'') of the current stack frame. Given this value, the remaining machine-state corresponds to the register-values that were present in the CPU when it was just about to execute the instruction pointed to by UNW_IA64_IP. Bits 0 and 1 of this frame-register encode the slot number of the instruction. Note: Due to the way the call instruction works on IA-64, the slot number is usually zero, but can be non-zero, e.g., in the stack-frame of a signal-handler trampoline. UNW_IA64_SP: Contains the (memory) stack-pointer value (SP). UNW_IA64_BSP: Contains the register backing-store pointer (BSP). Note: the value in this register is equal to the contents of register ar.bsp at the time the instruction at UNW_IA64_IP was about to begin execution. NORMAL REGISTER MACROS The following normal register name macros are available: UNW_IA64_GR: The base-index for general (integer) registers. Add an index in the range from 0..127 to get a particular general register. For example, to access r4, the index UNW_IA64_GR+4 should be used. Registers r0 and r1 (gp) are read-only, and any attempt to write them will result in an error (-UNW_EREADONLYREG). Even though r1 is read-only, libunwind will automatically adjust its value if the instruction-pointer (UNW_IA64_IP) is modified. For example, if UNW_IA64_IP is set to a value inside a function func(), then reading UNW_IA64_GR+1 will return the global-pointer value for this function. UNW_IA64_NAT: The base-index for the NaT bits of the general (integer) registers. A non-zero value in these registers corresponds to a set NaT-bit. Add an index in the range from 0..127 to get a particular NaT-bit register. For example, to access the NaT bit of r4, the index UNW_IA64_NAT+4 should be used. UNW_IA64_FR: The base-index for floating-point registers. Add an index in the range from 0..127 to get a particular floating-point register. For example, to access f2, the index UNW_IA64_FR+2 should be used. Registers f0 and f1 are read-only, and any attempt to write to indices UNW_IA64_FR+0 or UNW_IA64_FR+1 will result in an error (-UNW_EREADONLYREG). UNW_IA64_AR: The base-index for application registers. Add an index in the range from 0..127 to get a particular application register. For exam- ple, to access ar40, the index UNW_IA64_AR+40 should be used. The IA-64 architecture defines several application registers as ``reserved for future use''. Attempting to access such registers results in an error (-UNW_EBADREG). UNW_IA64_BR: The base-index for branch registers. Add an index in the range from 0..7 to get a particular branch register. For example, to access b6, the index UNW_IA64_BR+6 should be used. UNW_IA64_PR: Contains the set of predicate registers. This 64-bit wide register contains registers p0 through p63 in the ``broad-side'' format. Just like with the ``move predicates'' instruction, the registers are mapped as if were set to 0. Thus, in general the value of predicate register pN with N>=16 can be found in bit 16 + ((N-16) % 48. UNW_IA64_CFM: Contains the current-frame-mask register. CONVENIENCE MACROS Convenience macros are simply aliases for certain frequently used registers: UNW_IA64_GP: Alias for UNW_IA64_GR+1, the global-pointer register. UNW_IA64_TP: Alias for UNW_IA64_GR+13, the thread-pointer register. UNW_IA64_AR_RSC: Alias for UNW_IA64_GR+16, the register-stack configuration register. UNW_IA64_AR_BSP: Alias for UNW_IA64_GR+17. This register index accesses the value of register ar.bsp as of the time it was last saved explicitly. This is rarely what you want. Normally, you'll want to use UNW_IA64_BSP instead. UNW_IA64_AR_BSPSTORE: Alias for UNW_IA64_GR+18, the register-backing store write pointer. UNW_IA64_AR_RNAT: Alias for UNW_IA64_GR+19, the register-backing store NaT-collection register. UNW_IA64_AR_CCV: Alias for UNW_IA64_GR+32, the compare-and-swap value register. UNW_IA64_AR_CSD: Alias for UNW_IA64_GR+25, the compare-and-swap-data register (used by 16-byte atomic operations). UNW_IA64_AR_UNAT: Alias for UNW_IA64_GR+36, the user NaT-collection register. UNW_IA64_AR_FPSR: Alias for UNW_IA64_GR+40, the floating-point status (and control) register. UNW_IA64_AR_PFS: Alias for UNW_IA64_GR+64, the previous frame-state register. UNW_IA64_AR_LC: Alias for UNW_IA64_GR+65 the loop-count register. UNW_IA64_AR_EC: Alias for UNW_IA64_GR+66, the epilogue-count register. THE UNWIND-CONTEXT TYPE On IA-64, unw_context_t is simply an alias for ucontext_t (as defined by the Single UNIX Spec). This implies that it is possible to ini- tialize a value of this type not just with unw_getcontext(), but also with getcontext(), for example. However, since this is an IA-64-spe- cific extension to libunwind, portable code should not rely on this equivalence. SEE ALSO
libunwind(3) AUTHOR
David Mosberger-Tang Email: WWW: Programming Library 16 August 2007 LIBUNWIND-IA64(3)
Man Page