mirror of
https://github.com/tobast/libunwind-eh_elf.git
synced 2024-11-23 16:07:37 +01:00
(inlined_uc_addr): Also handle f0 and f1.
(ia64_read_only_reg): New function. (ia64_putfp): Reject puts into read-only save-locations. (ia64_put): Likewise. (Logical change 1.229)
This commit is contained in:
parent
b8d777bc65
commit
ed18defb26
1 changed files with 41 additions and 11 deletions
|
@ -59,8 +59,15 @@ inlined_uc_addr (ucontext_t *uc, int reg, uint8_t *nat_bitnr)
|
||||||
|
|
||||||
switch (reg)
|
switch (reg)
|
||||||
{
|
{
|
||||||
case UNW_IA64_GR + 0: addr = &unw.r0; break;
|
case UNW_IA64_GR + 0: addr = &unw.read_only.r0; break;
|
||||||
case UNW_IA64_NAT + 0: addr = &unw.r0; break;
|
case UNW_IA64_NAT + 0: addr = &unw.read_only.r0; break;
|
||||||
|
case UNW_IA64_FR + 0: addr = &unw.read_only.f0; break;
|
||||||
|
case UNW_IA64_FR + 1:
|
||||||
|
if (__BYTE_ORDER == __BIG_ENDIAN)
|
||||||
|
addr = &unw.read_only.f1_be;
|
||||||
|
else
|
||||||
|
addr = &unw.read_only.f1_le;
|
||||||
|
break;
|
||||||
case UNW_IA64_IP: addr = &uc->uc_mcontext.sc_br[0]; break;
|
case UNW_IA64_IP: addr = &uc->uc_mcontext.sc_br[0]; break;
|
||||||
case UNW_IA64_CFM: addr = &uc->uc_mcontext.sc_ar_pfs; break;
|
case UNW_IA64_CFM: addr = &uc->uc_mcontext.sc_ar_pfs; break;
|
||||||
case UNW_IA64_AR_RNAT: addr = &uc->uc_mcontext.sc_ar_rnat; break;
|
case UNW_IA64_AR_RNAT: addr = &uc->uc_mcontext.sc_ar_rnat; break;
|
||||||
|
@ -113,6 +120,15 @@ uc_addr (ucontext_t *uc, int reg, uint8_t *nat_bitnr)
|
||||||
return tdep_uc_addr (uc, reg, nat_bitnr);
|
return tdep_uc_addr (uc, reg, nat_bitnr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return TRUE if ADDR points inside unw.read_only_reg. */
|
||||||
|
|
||||||
|
static inline long
|
||||||
|
ia64_read_only_reg (void *addr)
|
||||||
|
{
|
||||||
|
return ((unsigned long) ((char *) addr - (char *) &unw.read_only)
|
||||||
|
< sizeof (unw.read_only));
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* !defined(HAVE_SYS_UC_ACCESS_H) && !defined(UNW_REMOTE_ONLY) */
|
#endif /* !defined(HAVE_SYS_UC_ACCESS_H) && !defined(UNW_REMOTE_ONLY) */
|
||||||
|
|
||||||
/* Bits 0 and 1 of a location are used to encode its type:
|
/* Bits 0 and 1 of a location are used to encode its type:
|
||||||
|
@ -165,19 +181,26 @@ ia64_getfp (struct cursor *c, unw_word_t loc, unw_fpreg_t *val)
|
||||||
static inline int
|
static inline int
|
||||||
ia64_putfp (struct cursor *c, unw_word_t loc, unw_fpreg_t val)
|
ia64_putfp (struct cursor *c, unw_word_t loc, unw_fpreg_t val)
|
||||||
{
|
{
|
||||||
if (IA64_IS_NULL_LOC(loc))
|
unw_fpreg_t *addr = (unw_fpreg_t *) IA64_GET_ADDR (loc);
|
||||||
|
|
||||||
|
if (IA64_IS_NULL_LOC (loc))
|
||||||
{
|
{
|
||||||
Debug (16, "access to unsaved register\n");
|
Debug (16, "access to unsaved register\n");
|
||||||
return -UNW_EBADREG;
|
return -UNW_EBADREG;
|
||||||
}
|
}
|
||||||
*(unw_fpreg_t *) IA64_GET_ADDR (loc) = val;
|
else if (ia64_read_only_reg (addr))
|
||||||
|
{
|
||||||
|
Debug (16, "attempt to read-only register\n");
|
||||||
|
return -UNW_EREADONLYREG;
|
||||||
|
}
|
||||||
|
*addr = val;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
ia64_get (struct cursor *c, unw_word_t loc, unw_word_t *val)
|
ia64_get (struct cursor *c, unw_word_t loc, unw_word_t *val)
|
||||||
{
|
{
|
||||||
if (IA64_IS_NULL_LOC(loc))
|
if (IA64_IS_NULL_LOC (loc))
|
||||||
{
|
{
|
||||||
Debug (16, "access to unsaved register\n");
|
Debug (16, "access to unsaved register\n");
|
||||||
return -UNW_EBADREG;
|
return -UNW_EBADREG;
|
||||||
|
@ -189,12 +212,19 @@ ia64_get (struct cursor *c, unw_word_t loc, unw_word_t *val)
|
||||||
static inline int
|
static inline int
|
||||||
ia64_put (struct cursor *c, unw_word_t loc, unw_word_t val)
|
ia64_put (struct cursor *c, unw_word_t loc, unw_word_t val)
|
||||||
{
|
{
|
||||||
if (IA64_IS_NULL_LOC(loc))
|
unw_word_t *addr = (unw_word_t *) IA64_GET_ADDR (loc);
|
||||||
|
|
||||||
|
if (IA64_IS_NULL_LOC (loc))
|
||||||
{
|
{
|
||||||
Debug (16, "access to unsaved register\n");
|
Debug (16, "access to unsaved register\n");
|
||||||
return -UNW_EBADREG;
|
return -UNW_EBADREG;
|
||||||
}
|
}
|
||||||
*(unw_word_t *) IA64_GET_ADDR (loc) = (val);
|
else if (ia64_read_only_reg (addr))
|
||||||
|
{
|
||||||
|
Debug (16, "attempt to read-only register\n");
|
||||||
|
return -UNW_EREADONLYREG;
|
||||||
|
}
|
||||||
|
*addr = val;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,7 +281,7 @@ 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_NULL_LOC(loc))
|
if (IA64_IS_NULL_LOC (loc))
|
||||||
{
|
{
|
||||||
Debug (16, "access to unsaved register\n");
|
Debug (16, "access to unsaved register\n");
|
||||||
return -UNW_EBADREG;
|
return -UNW_EBADREG;
|
||||||
|
@ -280,7 +310,7 @@ 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_NULL_LOC(loc))
|
if (IA64_IS_NULL_LOC (loc))
|
||||||
{
|
{
|
||||||
Debug (16, "access to unsaved register\n");
|
Debug (16, "access to unsaved register\n");
|
||||||
return -UNW_EBADREG;
|
return -UNW_EBADREG;
|
||||||
|
@ -311,7 +341,7 @@ ia64_putfp (struct cursor *c, ia64_loc_t loc, unw_fpreg_t val)
|
||||||
static inline int
|
static inline int
|
||||||
ia64_get (struct cursor *c, ia64_loc_t loc, unw_word_t *val)
|
ia64_get (struct cursor *c, ia64_loc_t loc, unw_word_t *val)
|
||||||
{
|
{
|
||||||
if (IA64_IS_NULL_LOC(loc))
|
if (IA64_IS_NULL_LOC (loc))
|
||||||
{
|
{
|
||||||
Debug (16, "access to unsaved register\n");
|
Debug (16, "access to unsaved register\n");
|
||||||
return -UNW_EBADREG;
|
return -UNW_EBADREG;
|
||||||
|
@ -347,7 +377,7 @@ ia64_get (struct cursor *c, ia64_loc_t loc, unw_word_t *val)
|
||||||
static inline int
|
static inline int
|
||||||
ia64_put (struct cursor *c, ia64_loc_t loc, unw_word_t val)
|
ia64_put (struct cursor *c, ia64_loc_t loc, unw_word_t val)
|
||||||
{
|
{
|
||||||
if (IA64_IS_NULL_LOC(loc))
|
if (IA64_IS_NULL_LOC (loc))
|
||||||
{
|
{
|
||||||
Debug (16, "access to unsaved register\n");
|
Debug (16, "access to unsaved register\n");
|
||||||
return -UNW_EBADREG;
|
return -UNW_EBADREG;
|
||||||
|
|
Loading…
Reference in a new issue