mirror of git://sourceware.org/git/glibc.git
2005-09-08 Roland McGrath <roland@redhat.com>
* sysdeps/generic/dl-sysdep.c (_dl_important_hwcaps): Decode DSOCAPS properly, first byte is bit number in mask. Skip disabled caps.
This commit is contained in:
parent
a3615024b9
commit
648068ce8f
|
|
@ -393,7 +393,7 @@ _dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
|
||||||
cnt += *p++;
|
cnt += *p++;
|
||||||
++p; /* Skip mask word. */
|
++p; /* Skip mask word. */
|
||||||
dsocaps = (const char *) p;
|
dsocaps = (const char *) p;
|
||||||
dsocapslen = note->datalen - sizeof *p;
|
dsocapslen = note->datalen - sizeof *p * 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
note = ((const void *) (note + 1)
|
note = ((const void *) (note + 1)
|
||||||
|
|
@ -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 defined NEED_DL_SYSINFO || defined NEED_DL_SYSINFO_DSO
|
||||||
if (dsocaps != NULL)
|
if (dsocaps != NULL)
|
||||||
{
|
{
|
||||||
GLRO(dl_hwcap) |= ((uint64_t) ((const ElfW(Word) *) dsocaps)[-1]
|
const ElfW(Word) mask = ((const ElfW(Word) *) dsocaps)[-1];
|
||||||
<< _DL_FIRST_EXTRA);
|
GLRO(dl_hwcap) |= (uint64_t) mask << _DL_FIRST_EXTRA;
|
||||||
for (const char *p = dsocaps;
|
size_t len;
|
||||||
p < dsocaps + dsocapslen;
|
for (const char *p = dsocaps; p < dsocaps + dsocapslen; p += len + 1)
|
||||||
p += temp[m++].len + 1)
|
|
||||||
{
|
{
|
||||||
temp[m].str = p;
|
uint_fast8_t bit = *p++;
|
||||||
temp[m].len = strlen (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
|
#endif
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue