1
0
Fork 0
mirror of https://github.com/tobast/libunwind-eh_elf.git synced 2024-11-27 01:27:39 +01:00

(MIN): If it's defined already, #undef it first.

(IA64_LOC_UC_REG): New macro.
(IA64_GET_AUX_ADDR): New macro.
(ia64_uc_access_reg): New function.
(ia64_uc_access_fpreg): Ditto.
(ia64_getfp): Forward uc-locations to ia64_uc_access_fpreg().
(ia64_putfp): Ditto.
(ia64_get): Ditto.
(ia64_put): Ditto.
(rbs_on_uc): New function.

(Logical change 1.87)
This commit is contained in:
mostang.com!davidm 2003-04-24 20:45:07 +00:00
parent 08230509a3
commit 8fee91bd13

View file

@ -42,6 +42,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#define IA64_UNW_FLAG_UHANDLER(x) ((x) & 0x0000000200000000L) #define IA64_UNW_FLAG_UHANDLER(x) ((x) & 0x0000000200000000L)
#define IA64_UNW_LENGTH(x) ((x) & 0x00000000ffffffffL) #define IA64_UNW_LENGTH(x) ((x) & 0x00000000ffffffffL)
#ifdef MIN
# undef MIN
#endif
#define MIN(a,b) ((a) < (b) ? (a) : (b)) #define MIN(a,b) ((a) < (b) ? (a) : (b))
#include "tdep.h" #include "tdep.h"
@ -58,6 +61,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#define IA64_LOC_REG(r,t) (((r) << 2) | (t)) #define IA64_LOC_REG(r,t) (((r) << 2) | (t))
#define IA64_LOC_ADDR(a,t) (((a) & ~0x3) | (t)) #define IA64_LOC_ADDR(a,t) (((a) & ~0x3) | (t))
#define IA64_LOC_UC_ADDR(a,t) IA64_LOC_ADDR(a, t) #define IA64_LOC_UC_ADDR(a,t) IA64_LOC_ADDR(a, t)
#define IA64_LOC_UC_REG(a,t)
#define IA64_NULL_LOC (0) #define IA64_NULL_LOC (0)
#define IA64_GET_REG(l) ((l) >> 2) #define IA64_GET_REG(l) ((l) >> 2)
@ -144,10 +148,14 @@ ia64_put (struct cursor *c, unw_word_t loc, unw_word_t val)
#define IA64_LOC_ADDR(a,t) ((ia64_loc_t) { ((a) & ~0x3) | (t), 0 }) #define IA64_LOC_ADDR(a,t) ((ia64_loc_t) { ((a) & ~0x3) | (t), 0 })
#define IA64_LOC_UC_ADDR(a,t) ((ia64_loc_t) { ((a) & ~0x3) | (t), \ #define IA64_LOC_UC_ADDR(a,t) ((ia64_loc_t) { ((a) & ~0x3) | (t), \
IA64_LOC_TYPE_UC }) IA64_LOC_TYPE_UC })
#define IA64_LOC_UC_REG(r,a) ((ia64_loc_t) { ((r) << 2), \
((a) | IA64_LOC_TYPE_REG \
| IA64_LOC_TYPE_UC) })
#define IA64_NULL_LOC ((ia64_loc_t) { 0, 0 }) #define IA64_NULL_LOC ((ia64_loc_t) { 0, 0 })
#define IA64_GET_REG(l) ((l).w0 >> 2) #define IA64_GET_REG(l) ((l).w0 >> 2)
#define IA64_GET_ADDR(l) ((l).w0 & ~0x3) #define IA64_GET_ADDR(l) ((l).w0 & ~0x3)
#define IA64_GET_AUX_ADDR(l) ((l).w1 & ~0x3)
#define IA64_IS_NULL_LOC(l) (((l).w0 | (l).w1) == 0) #define IA64_IS_NULL_LOC(l) (((l).w0 | (l).w1) == 0)
#define IA64_IS_FP_LOC(l) (((l).w0 & IA64_LOC_TYPE_FP) != 0) #define IA64_IS_FP_LOC(l) (((l).w0 & IA64_LOC_TYPE_FP) != 0)
#define IA64_IS_MEMSTK_NAT(l) (((l).w0 & IA64_LOC_TYPE_MEMSTK_NAT) != 0) #define IA64_IS_MEMSTK_NAT(l) (((l).w0 & IA64_LOC_TYPE_MEMSTK_NAT) != 0)
@ -163,12 +171,23 @@ ia64_put (struct cursor *c, unw_word_t loc, unw_word_t val)
# define ia64_put_unwind_info(c,pi) \ # define ia64_put_unwind_info(c,pi) \
(*(c)->as->acc.put_unwind_info)((c)->as, (pi), (c)->as_arg) (*(c)->as->acc.put_unwind_info)((c)->as, (pi), (c)->as_arg)
#define ia64_uc_access_reg UNW_OBJ(uc_access_reg)
#define ia64_uc_access_fpreg UNW_OBJ(uc_access_fpreg)
extern int ia64_uc_access_reg (struct cursor *c, ia64_loc_t loc,
unw_word_t *valp, int write);
extern int ia64_uc_access_fpreg (struct cursor *c, ia64_loc_t loc,
unw_fpreg_t *valp, int write);
static inline int static inline int
ia64_getfp (struct cursor *c, ia64_loc_t loc, unw_fpreg_t *val) ia64_getfp (struct cursor *c, ia64_loc_t loc, unw_fpreg_t *val)
{ {
unw_word_t addr; unw_word_t addr;
int ret; int ret;
if (IA64_IS_UC_LOC (loc))
return ia64_uc_access_fpreg (c, loc, val, 0);
if (IA64_IS_REG_LOC (loc)) if (IA64_IS_REG_LOC (loc))
return (*c->as->acc.access_fpreg) (c->as, IA64_GET_REG (loc), return (*c->as->acc.access_fpreg) (c->as, IA64_GET_REG (loc),
val, 0, c->as_arg); val, 0, c->as_arg);
@ -189,6 +208,9 @@ ia64_putfp (struct cursor *c, ia64_loc_t loc, unw_fpreg_t val)
unw_word_t addr; unw_word_t addr;
int ret; int ret;
if (IA64_IS_UC_LOC (loc))
return ia64_uc_access_fpreg (c, loc, &val, 1);
if (IA64_IS_REG_LOC (loc)) if (IA64_IS_REG_LOC (loc))
return (*c->as->acc.access_fpreg) (c->as, IA64_GET_REG (loc), &val, 1, return (*c->as->acc.access_fpreg) (c->as, IA64_GET_REG (loc), &val, 1,
c->as_arg); c->as_arg);
@ -227,6 +249,9 @@ ia64_get (struct cursor *c, ia64_loc_t loc, unw_word_t *val)
return 0; return 0;
} }
if (IA64_IS_UC_LOC (loc))
return ia64_uc_access_reg (c, loc, val, 0);
if (IA64_IS_REG_LOC (loc)) if (IA64_IS_REG_LOC (loc))
return (*c->as->acc.access_reg)(c->as, IA64_GET_REG (loc), val, 0, return (*c->as->acc.access_reg)(c->as, IA64_GET_REG (loc), val, 0,
c->as_arg); c->as_arg);
@ -250,6 +275,9 @@ ia64_put (struct cursor *c, ia64_loc_t loc, unw_word_t val)
return ia64_putfp (c, loc, tmp); return ia64_putfp (c, loc, tmp);
} }
if (IA64_IS_UC_LOC (loc))
return ia64_uc_access_reg (c, loc, &val, 1);
if (IA64_IS_REG_LOC (loc)) if (IA64_IS_REG_LOC (loc))
return (*c->as->acc.access_reg)(c->as, IA64_GET_REG (loc), &val, 1, return (*c->as->acc.access_reg)(c->as, IA64_GET_REG (loc), &val, 1,
c->as_arg); c->as_arg);
@ -383,6 +411,15 @@ extern int rbs_cover_and_flush (struct cursor *c, unw_word_t nregs);
/* Warning: ia64_strloc() is for debugging only and it is NOT re-entrant! */ /* Warning: ia64_strloc() is for debugging only and it is NOT re-entrant! */
extern const char *ia64_strloc (ia64_loc_t loc); extern const char *ia64_strloc (ia64_loc_t loc);
/* Return true if the register-backing store is inside a ucontext_t
that needs to be accessed via uc_access(3). */
static inline int
rbs_on_uc (struct rbs_area *rbs)
{
return IA64_IS_UC_LOC (rbs->rnat_loc) && !IA64_IS_REG_LOC (rbs->rnat_loc);
}
/* Return true if BSP points to a word that's stored on register /* Return true if BSP points to a word that's stored on register
backing-store RBS. */ backing-store RBS. */
static inline int static inline int
@ -407,7 +444,7 @@ rbs_get_rnat_loc (struct rbs_area *rbs, unw_word_t bsp)
if (rbs_contains (rbs, rnat_addr)) if (rbs_contains (rbs, rnat_addr))
{ {
if (IA64_IS_UC_LOC (rbs->rnat_loc)) if (rbs_on_uc (rbs))
rnat_loc = IA64_LOC_UC_ADDR (rnat_addr, 0); rnat_loc = IA64_LOC_UC_ADDR (rnat_addr, 0);
else else
rnat_loc = IA64_LOC_ADDR (rnat_addr, 0); rnat_loc = IA64_LOC_ADDR (rnat_addr, 0);
@ -420,7 +457,7 @@ rbs_get_rnat_loc (struct rbs_area *rbs, unw_word_t bsp)
static ia64_loc_t static ia64_loc_t
rbs_loc (struct rbs_area *rbs, unw_word_t bsp) rbs_loc (struct rbs_area *rbs, unw_word_t bsp)
{ {
if (IA64_IS_UC_LOC (rbs->rnat_loc)) if (rbs_on_uc (rbs))
return IA64_LOC_UC_ADDR (bsp, 0); return IA64_LOC_UC_ADDR (bsp, 0);
else else
return IA64_LOC_ADDR (bsp, 0); return IA64_LOC_ADDR (bsp, 0);