Fix FPU context handling in getcontext on x86-64.

fnstenv on x86-64 seems to clear the state.  Work around.
This commit is contained in:
Ulrich Drepper 2011-04-17 21:51:26 -04:00
parent 94409c736b
commit 75ea32abcd
5 changed files with 70 additions and 6 deletions

View file

@ -1,3 +1,11 @@
2011-04-17 Ulrich Drepper <drepper@gmail.com>
[BZ #12420]
* sysdeps/unix/sysv/linux/x86_64/getcontext.S: Reload context after
storing it.
* stdlib/bug-getcontext.c: New file.
* stdlib/Makefile: Add rules to build and run bug-getcontext.
2011-04-13 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
* sysdeps/s390/s390-64/utf16-utf32-z9.c: Wrap the z9-109

6
NEWS
View file

@ -1,4 +1,4 @@
GNU C Library NEWS -- history of user-visible changes. 2011-4-16
GNU C Library NEWS -- history of user-visible changes. 2011-4-17
Copyright (C) 1992-2009, 2010, 2011 Free Software Foundation, Inc.
See the end for copying conditions.
@ -18,8 +18,8 @@ Version 2.14
* The following bugs are resolved with this release:
11724, 12445, 12454, 12460, 12469, 12489, 12509, 12510, 12518, 12583, 12587,
12597, 12631, 12650, 12655
11724, 12420, 12445, 12454, 12460, 12469, 12489, 12509, 12510, 12518, 12583,
12587, 12597, 12631, 12650, 12655
Version 2.13

View file

@ -1,4 +1,4 @@
# Copyright (C) 1991-2006, 2007, 2008, 2009 Free Software Foundation, Inc.
# Copyright (C) 1991-2009, 2011 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or
@ -71,7 +71,7 @@ tests := tst-strtol tst-strtod testmb testrand testsort testdiv \
tst-atof1 tst-atof2 tst-strtod2 tst-strtod3 tst-rand48-2 \
tst-makecontext tst-strtod4 tst-strtod5 tst-qsort2 \
tst-makecontext2 tst-strtod6 tst-unsetenv1 \
tst-makecontext3
tst-makecontext3 bug-getcontext
include ../Makeconfig
@ -145,3 +145,10 @@ $(objpfx)tst-putenv: $(objpfx)tst-putenvmod.so
$(objpfx)tst-putenvmod.so: $(objpfx)tst-putenvmod.os
$(build-module)
CFLAGS-tst-putenvmod.c = -DNOT_IN_libc=1
ifeq ($(build-shared),yes)
link-libm = $(common-objpfx)math/libm.so
else
link-libm = $(common-objpfx)math/libm.a
endif
$(objpfx)bug-getcontext: $(link-libm)

48
stdlib/bug-getcontext.c Normal file
View file

@ -0,0 +1,48 @@
/* BZ 12420 */
#include <errno.h>
#include <fenv.h>
#include <stdio.h>
#include <stdlib.h>
#include <ucontext.h>
static int
do_test (void)
{
int except_mask = FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW;
int status = feenableexcept (except_mask);
except_mask = fegetexcept ();
if (except_mask == -1)
{
printf("\nBefore getcontext(): fegetexcept returned: %d\n",
except_mask);
return 1;
}
ucontext_t ctx;
status = getcontext(&ctx);
if (status)
{
printf("\ngetcontext failed, errno: %d.\n", errno);
return 1;
}
printf ("\nDone with getcontext()!\n");
fflush (NULL);
int mask = fegetexcept ();
if (mask != except_mask)
{
printf("\nAfter getcontext(): fegetexcept returned: %d, expected: %d.\n",
mask, except_mask);
return 1;
}
printf("\nAt end fegetexcept() returned %d, expected: %d.\n",
mask, except_mask);
return 0;
}
#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"

View file

@ -1,5 +1,5 @@
/* Save current context.
Copyright (C) 2002, 2005 Free Software Foundation, Inc.
Copyright (C) 2002, 2005, 2011 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Jaeger <aj@suse.de>, 2002.
@ -62,6 +62,7 @@ ENTRY(__getcontext)
movq %rcx, oFPREGS(%rdi)
/* Save the floating-point environment. */
fnstenv (%rcx)
fldenv (%rcx)
stmxcsr oMXCSR(%rdi)
/* Save the current signal mask with