mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-06 12:09:26 +08:00
4a612d6f67
This patch initializes the BND registers before executing the inferior call. BND registers can be in arbitrary values at the moment of the inferior call. In case the function being called uses as part of the parameters BND register, e.g. when passing a pointer as parameter, the current value of the register will be used. This can cause boundary violations that are not due to a real bug or even desired by the user. In this sense the best to be done is set the BND registers to allow access to the whole memory, i.e. initialized state, before pushing the inferior call. 2017-03-07 Walfred Tedeschi <walfred.tedeschi@intel.com> gdb/ChangeLog: * i387-tdep.h (i387_reset_bnd_regs): Add function definition. * i387-tdep.c (i387_reset_bnd_regs): Add function implementation. * i386-tdep.c (i386_push_dummy_call): Call i387_reset_bnd_regs. * amd64-tdep (amd64_push_dummy_call): Call i387_reset_bnd_regs. gdb/testsuite/ChangeLog: * i386-mpx-call.c: New file. * i386-mpx-call.exp: New file. gdb/doc/ChangeLog: * Memory Protection Extensions: Add information about inferior calls.
132 lines
2.5 KiB
C
132 lines
2.5 KiB
C
/* Test for inferior function calls MPX context.
|
|
|
|
Copyright (C) 2017 Free Software Foundation, Inc.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program 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 General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "x86-cpuid.h"
|
|
|
|
/* Defined size for arrays. */
|
|
#define ARRAY_LENGTH 5
|
|
|
|
unsigned int
|
|
have_mpx (void)
|
|
{
|
|
unsigned int eax, ebx, ecx, edx;
|
|
|
|
if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
|
|
return 0;
|
|
|
|
if ((ecx & bit_OSXSAVE) == bit_OSXSAVE)
|
|
{
|
|
if (__get_cpuid_max (0, NULL) < 7)
|
|
return 0;
|
|
|
|
__cpuid_count (7, 0, eax, ebx, ecx, edx);
|
|
|
|
if ((ebx & bit_MPX) == bit_MPX)
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
int
|
|
upper (int *a, int *b, int *c, int *d, int len)
|
|
{
|
|
int value;
|
|
|
|
value = *(a + len);
|
|
value = *(b + len);
|
|
value = *(c + len);
|
|
value = *(d + len);
|
|
|
|
value = value - *a + 1;
|
|
return value;
|
|
}
|
|
|
|
|
|
int
|
|
lower (int *a, int *b, int *c, int *d, int len)
|
|
{
|
|
int value;
|
|
|
|
value = *(a - len);
|
|
value = *(b - len);
|
|
value = *(c - len);
|
|
value = *(d - len);
|
|
|
|
value = value - *a + 1;
|
|
return value;
|
|
}
|
|
|
|
|
|
char
|
|
char_upper (char *str, int length)
|
|
{
|
|
char ch;
|
|
ch = *(str + length);
|
|
|
|
return ch;
|
|
}
|
|
|
|
|
|
char
|
|
char_lower (char *str, int length)
|
|
{
|
|
char ch;
|
|
ch = *(str - length);
|
|
|
|
return ch;
|
|
}
|
|
|
|
|
|
int
|
|
main (void)
|
|
{
|
|
if (have_mpx ())
|
|
{
|
|
int sa[ARRAY_LENGTH];
|
|
int sb[ARRAY_LENGTH];
|
|
int sc[ARRAY_LENGTH];
|
|
int sd[ARRAY_LENGTH];
|
|
int *x, *a, *b, *c, *d;
|
|
char mchar;
|
|
char hello[] = "Hello";
|
|
|
|
x = malloc (sizeof (int) * ARRAY_LENGTH);
|
|
a = malloc (sizeof (int) * ARRAY_LENGTH);
|
|
b = malloc (sizeof (int) * ARRAY_LENGTH);
|
|
c = malloc (sizeof (int) * ARRAY_LENGTH);
|
|
d = malloc (sizeof (int) * ARRAY_LENGTH);
|
|
|
|
*x = upper (sa, sb, sc, sd, 0); /* bkpt 1. */
|
|
*x = lower (a, b, c, d, 0);
|
|
|
|
mchar = char_upper (hello, 10);
|
|
mchar = char_lower (hello, 10);
|
|
|
|
free (x);
|
|
free (a);
|
|
free (b);
|
|
free (c);
|
|
free (d);
|
|
}
|
|
return 0;
|
|
}
|