diff options
author | Gordana Cmiljanovic <Gordana.Cmiljanovic@imgtec.com> | 2017-06-13 21:34:45 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2017-06-13 21:34:45 +0000 |
commit | b309f058cf7639951bebb86270ffbc116ea5f720 (patch) | |
tree | bd42dec0d4649a94e18384bf0294f3c473a6aa83 /sysdeps/unix/sysv/linux/mips/mips32/bug-getcontext-mips-gp.c | |
parent | c2528fef3b05bcffb1ac27c6c09cc3ff24b7f03f (diff) | |
download | glibc-b309f058cf7639951bebb86270ffbc116ea5f720.tar.gz glibc-b309f058cf7639951bebb86270ffbc116ea5f720.tar.xz glibc-b309f058cf7639951bebb86270ffbc116ea5f720.zip |
mips: Fix store/load gp registers to/from ucontext_t
General purpose registers in mcontext_t structure are 8 bytes long for both MIPS32/MIPS64. get/set/make/swap context implementations for MIPS O32 incorrectly assume that general purpose registers in this structure are 4 bytes long. This patch is fixing that. Tested for MIPS O32 LE and BE. Compared objdump of modified functions for mips n32 and mips n64. [BZ #21548] * sysdeps/unix/sysv/linux/mips/getcontext.S: Define MCONTEXT_SZGREG as 8 and use it when copying general purpose registers. * sysdeps/unix/sysv/linux/mips/makecontext.S: Likewise. * sysdeps/unix/sysv/linux/mips/mips32/Makefile: Include new test for mips o32. * sysdeps/unix/sysv/linux/mips/mips32/bug-getcontext-mips-gp.c: Added new test for mips o32. * sysdeps/unix/sysv/linux/mips/setcontext.S: Define MCONTEXT_SZGREG as 8 and use it when copying general purpose registers. * sysdeps/unix/sysv/linux/mips/swapcontext.S: Likewise.
Diffstat (limited to 'sysdeps/unix/sysv/linux/mips/mips32/bug-getcontext-mips-gp.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/mips/mips32/bug-getcontext-mips-gp.c | 63 |
1 files changed, 63 insertions, 0 deletions
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> |