Bug#519391: libgcrypt11: SIGILL on _gcry_detect_hw_features
Ben Hutchings
ben at decadent.org.uk
Sun Nov 29 02:04:12 UTC 2009
On Thu, 2009-03-12 at 11:20 +0100, Werner Koch wrote:
> On Thu, 12 Mar 2009 09:32, dexter at debian.org said:
>
> > Program received signal SIGILL, Illegal instruction.
> > [Switching to Thread 0xb7b9c6e0 (LWP 2196)]
> > 0xb7bae10e in _gcry_detect_hw_features () at hwfeatures.c:78
>
> That seems to be the cpuid opcode which is not available, Linux knows
> about it:
>
> > cpuid level : -1
>
> but my code gets the detection wrong:
>
> /* Detect the CPUID feature by testing some undefined behaviour (16
> vs 32 bit pushf/popf). */
> asm volatile
> ("pushf\n\t" /* Copy flags to EAX. */
> "popl %%eax\n\t"
> "movl %%eax, %%ecx\n\t" /* Save flags into ECX. */
> "xorl $0x200000, %%eax\n\t" /* Toggle ID bit and copy it to the flags. */
> "pushl %%eax\n\t"
> "popf\n\t"
> "pushf\n\t" /* Copy changed flags again to EAX. */
> "popl %%eax\n\t"
> "pushl %%ecx\n\t" /* Restore flags from ECX. */
> "popf\n\t"
> "xorl %%eax, %%ecx\n\t" /* Compare flags against saved flags. */
> "jz .Lno_cpuid%=\n\t" /* Toggling did not work, thus no CPUID. */
> "movl $1, %0\n" /* Worked. true -> HAS_CPUID. */
> ".Lno_cpuid%=:\n\t"
> : "=r" (has_cpuid)
[...]
"=r" means that the code *will* write to register %0, which is then
written to has_cpuid. But if this code does not detect cpuid, the
register is uninitialised and probably has a non-zero value.
You must either change the detection code to set %0 to 0 if the
condition is not met, or change "=r" to "+r" so that %0 will be
initialised to the previous value of has_cpuid (i.e. 0).
Ben.
--
Ben Hutchings
Quantity is no substitute for quality, but it's the only one we've got.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 828 bytes
Desc: This is a digitally signed message part
URL: <http://lists.alioth.debian.org/pipermail/pkg-gnutls-maint/attachments/20091129/4de0bfc7/attachment.pgp>
More information about the Pkg-gnutls-maint
mailing list