Skip to content

Commit

Permalink
2005-09-08 Roland McGrath <roland@redhat.com>
Browse files Browse the repository at this point in the history
	* sysdeps/generic/dl-sysdep.c (_dl_important_hwcaps): Decode DSOCAPS
	properly, first byte is bit number in mask.  Skip disabled caps.
  • Loading branch information
Roland McGrath committed Sep 8, 2005
1 parent a361502 commit 648068c
Showing 1 changed file with 17 additions and 8 deletions.
25 changes: 17 additions & 8 deletions sysdeps/generic/dl-sysdep.c
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,7 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
cnt += *p++;
++p; /* Skip mask word. */
dsocaps = (const char *) p;
dsocapslen = note->datalen - sizeof *p;
dsocapslen = note->datalen - sizeof *p * 2;
break;
}
note = ((const void *) (note + 1)
Expand Down Expand Up @@ -431,14 +431,23 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
#if defined NEED_DL_SYSINFO || defined NEED_DL_SYSINFO_DSO
if (dsocaps != NULL)
{
GLRO(dl_hwcap) |= ((uint64_t) ((const ElfW(Word) *) dsocaps)[-1]
<< _DL_FIRST_EXTRA);
for (const char *p = dsocaps;
p < dsocaps + dsocapslen;
p += temp[m++].len + 1)
const ElfW(Word) mask = ((const ElfW(Word) *) dsocaps)[-1];
GLRO(dl_hwcap) |= (uint64_t) mask << _DL_FIRST_EXTRA;
size_t len;
for (const char *p = dsocaps; p < dsocaps + dsocapslen; p += len + 1)
{
temp[m].str = p;
temp[m].len = strlen (p);
uint_fast8_t bit = *p++;
len = strlen (p);

/* Skip entries that are not enabled in the mask word. */
if (__builtin_expect (mask & ((ElfW(Word)) 1 << bit), 1))
{
temp[m].str = p;
temp[m].len = len;
++m;
}
else
--cnt;
}
}
#endif
Expand Down

0 comments on commit 648068c

Please sign in to comment.