Print this page
6069 libdisasm: instrlen arch op should have a sane default
Reviewed by: Robert Mustacchi <rm@joyent.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libdisasm/common/libdisasm.c
          +++ new/usr/src/lib/libdisasm/common/libdisasm.c
↓ open down ↓ 264 lines elided ↑ open up ↑
 265  265  {
 266  266          return (dhp->dh_arch->da_min_instrlen(dhp));
 267  267  }
 268  268  
 269  269  int
 270  270  dis_max_instrlen(dis_handle_t *dhp)
 271  271  {
 272  272          return (dhp->dh_arch->da_max_instrlen(dhp));
 273  273  }
 274  274  
      275 +static int
      276 +dis_generic_instrlen(dis_handle_t *dhp, uint64_t pc)
      277 +{
      278 +        if (dis_disassemble(dhp, pc, NULL, 0) != 0)
      279 +                return (-1);
      280 +
      281 +        return (dhp->dh_addr - pc);
      282 +}
      283 +
 275  284  int
 276  285  dis_instrlen(dis_handle_t *dhp, uint64_t pc)
 277  286  {
      287 +        if (dhp->dh_arch->da_instrlen == NULL)
      288 +                return (dis_generic_instrlen(dhp, pc));
      289 +
 278  290          return (dhp->dh_arch->da_instrlen(dhp, pc));
 279  291  }
 280  292  
 281  293  int
 282  294  dis_vsnprintf(char *restrict s, size_t n, const char *restrict format,
 283  295      va_list args)
 284  296  {
 285  297  #ifdef DIS_STANDALONE
 286  298          return (mdb_iob_vsnprintf(s, n, format, args));
 287  299  #else
↓ open down ↓ 15 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX