diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/mips/mips32')
-rw-r--r-- | sysdeps/unix/sysv/linux/mips/mips32/Makefile | 4 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/mips/mips32/bug-getcontext-mips-gp.c | 63 |
2 files changed, 67 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/Makefile b/sysdeps/unix/sysv/linux/mips/mips32/Makefile index 9439d29dea..33b461500c 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/Makefile +++ b/sysdeps/unix/sysv/linux/mips/mips32/Makefile @@ -2,3 +2,7 @@ ifeq ($(subdir),conform) # For bugs 17786 and 21278. conformtest-xfail-conds += mips-o32-linux endif + +ifeq ($(subdir),stdlib) +tests += bug-getcontext-mips-gp +endif diff --git a/sysdeps/unix/sysv/linux/mips/mips32/bug-getcontext-mips-gp.c b/sysdeps/unix/sysv/linux/mips/mips32/bug-getcontext-mips-gp.c new file mode 100644 index 0000000000..9327f172a5 --- /dev/null +++ b/sysdeps/unix/sysv/linux/mips/mips32/bug-getcontext-mips-gp.c @@ -0,0 +1,63 @@ +/* Tests register values retreived by getcontext() for mips o32. + Copyright (C) 2017 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ucontext.h> + + +#if !defined __mips__ || _MIPS_SIM != _ABIO32 +# error "MIPS O32 specific test." +#endif + +#define SP_REG 29 + +static int +do_test (void) +{ + ucontext_t ctx; + memset (&ctx, 0, sizeof (ctx)); + int status = getcontext (&ctx); + if (status) + { + printf ("\ngetcontext() failed, errno: %d.\n", errno); + return 1; + } + + if (ctx.uc_mcontext.gregs[SP_REG] == 0 + || ctx.uc_mcontext.gregs[SP_REG] > 0xffffffff) + { + printf ("\nError getcontext(): invalid $sp = 0x%llx.\n", + ctx.uc_mcontext.gregs[SP_REG]); + return 1; + } + + if (ctx.uc_mcontext.pc == 0 + || ctx.uc_mcontext.pc > 0xffffffff) + { + printf ("\nError getcontext(): invalid ctx.uc_mcontext.pc = 0x%llx.\n", + ctx.uc_mcontext.pc); + return 1; + } + + return 0; +} + +#include <support/test-driver.c> |