enum regrecord_type{
/* Register contents live ( and therefore untouched ). */
UNSAVED,
/* .offset field is the saved content. */
IMMED,
/* Register saved in one of the Branch Registers. */
BRREL,
/*
* Register saved in one of the Stacked GRs
* regstate.offset contains GR number (usually >= 32)
*/
GRREL,
/*
* Register saved on the memory stack frame.
* regstate.offset is in words; ie; location == (sp + 4 * spoff).
*/
SPREL,
/*
* Register saved on the memory stack frame but offseted via psp
* regstate.offset is in words; ie,
* location == (psp + 16 �– 4 * pspoff)
*/
PSPREL
};
/* A staterecord contains the net state of
* sequentially parsing unwind descriptors.
* The entry state of the current prologue region
* is the exit state of the previous region.
* We record info about registers we care about
* ie; just enough to re-construct an unwind frame,
* and ignore the rest.
* Initial state is where = UNSAVED for all .where fields.
*/
/* The unwind frame is a simpler version of the trap frame
* and contains a subset of preserved registers, which are
* useful in unwinding an ia64 stack frame.
* Keep this in sync with the staterecord. See: stackframe.c:updateregs()
*/
struct unwind_frame {
uint64_t bsp; /* Base of the RSE. */
/* !!! XXX: Stack Frame discontinuities */
uint64_t psp; /* Mem stack (variable size) base. */
uint64_t rp; /* Return Pointer */
uint64_t pfs; /* Previous Frame size info */
/* Don't mirror anything below this line with struct staterecord */
uint64_t sp;
};
/* Obeys Table 6:2 RSE Operation Instructions and State Modification */
/* These functions adjust for RSE rnat saves to bsp in the forward and
* reverse directions respectively.
*/
#define ia64_rnat_adjust ia64_bsp_adjust_call