diff options
author | Liubov Dmitrieva <liubov.dmitrieva@intel.com> | 2012-10-24 16:00:49 +0400 |
---|---|---|
committer | Liubov Dmitrieva <ldmitrie@sourceware.org> | 2013-10-23 19:07:24 +0400 |
commit | acc53d3aea3db1d1dfe714a825abda83588ecc48 (patch) | |
tree | 2914de679d68dd8eecab96dbc88817fffcc48746 | |
parent | 805b4bcb83ca924e3437c4918b68a081ff3a1862 (diff) | |
download | glibc-acc53d3aea3db1d1dfe714a825abda83588ecc48.tar.gz glibc-acc53d3aea3db1d1dfe714a825abda83588ecc48.tar.xz glibc-acc53d3aea3db1d1dfe714a825abda83588ecc48.zip |
Intel MPX support for mmap and mremap wrappers of syscalls for x86_32 and x86_64.
Create bounds. Use C wrapper of syscall instead of assembler wrapper for x86_64.
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/Makefile | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/mmap.S | 5 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/mmap64.S | 4 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/mremap.c | 36 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/x86_64/mmap.c | 52 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/x86_64/mmap64.c | 0 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/x86_64/mremap.c | 0 |
7 files changed, 98 insertions, 1 deletions
diff --git a/sysdeps/unix/sysv/linux/i386/Makefile b/sysdeps/unix/sysv/linux/i386/Makefile index acc30219e8..f38f4b2866 100644 --- a/sysdeps/unix/sysv/linux/i386/Makefile +++ b/sysdeps/unix/sysv/linux/i386/Makefile @@ -2,7 +2,7 @@ default-abi := 32 ifeq ($(subdir),misc) -sysdep_routines += ioperm iopl vm86 call_pselect6 call_fallocate +sysdep_routines += ioperm iopl vm86 call_pselect6 call_fallocate mremap endif ifeq ($(subdir),elf) diff --git a/sysdeps/unix/sysv/linux/i386/mmap.S b/sysdeps/unix/sysv/linux/i386/mmap.S index 0addf65e44..6877641a1c 100644 --- a/sysdeps/unix/sysv/linux/i386/mmap.S +++ b/sysdeps/unix/sysv/linux/i386/mmap.S @@ -74,6 +74,11 @@ L(skip): ja SYSCALL_ERROR_LABEL /* Successful; return the syscall's value. */ + mov 8(%esp), %ecx +#if defined __CHKP__ || defined __CHKWR__ + bndmk -1(%eax, %ecx), %bnd0 +#endif + ret PSEUDO_END (__mmap) diff --git a/sysdeps/unix/sysv/linux/i386/mmap64.S b/sysdeps/unix/sysv/linux/i386/mmap64.S index 31a0f67827..fd3b9ec925 100644 --- a/sysdeps/unix/sysv/linux/i386/mmap64.S +++ b/sysdeps/unix/sysv/linux/i386/mmap64.S @@ -89,6 +89,10 @@ L(do_syscall): ja SYSCALL_ERROR_LABEL /* Successful; return the syscall's value. */ + mov 8(%esp), %ecx +#if defined __CHKP__ || defined __CHKWR__ + bndmk -1(%eax, %ecx), %bnd0 +#endif ret cfi_adjust_cfa_offset (16) diff --git a/sysdeps/unix/sysv/linux/i386/mremap.c b/sysdeps/unix/sysv/linux/i386/mremap.c new file mode 100644 index 0000000000..ad55d9d885 --- /dev/null +++ b/sysdeps/unix/sysv/linux/i386/mremap.c @@ -0,0 +1,36 @@ +/* Copyright (C) 2013 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/>. */ + +#define _GNU_SOURCE +#include <errno.h> +#include <unistd.h> +#include <sys/mman.h> +#include <sysdeps/unix/sysv/linux/i386/sysdep.h> + +void * +__mremap (void *old_address, size_t old_size, size_t new_size, int flags, ...) +{ + void *p = INLINE_SYSCALL (mremap, 4, old_address, old_size, new_size, flags); + if ((long) p == -1) return MAP_FAILED; +#ifdef __CHKP__ + return __bnd_set_ptr_bounds (p, new_size); +#else + return p; +#endif +} + +weak_alias (__mremap, mremap) diff --git a/sysdeps/unix/sysv/linux/x86_64/mmap.c b/sysdeps/unix/sysv/linux/x86_64/mmap.c new file mode 100644 index 0000000000..1ee6f96294 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86_64/mmap.c @@ -0,0 +1,52 @@ +/* Copyright (C) 2012 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/>. */ + +#define _GNU_SOURCE +#include <errno.h> +#include <unistd.h> +#include <sys/mman.h> +#include <sysdeps/unix/sysv/linux/x86_64/sysdep.h> + +void * +__mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset) +{ + void *p = INLINE_SYSCALL (mmap, 6, addr, len, prot, flags, fd, offset); + if ((long) p == -1) return MAP_FAILED; +#ifdef __CHKP__ + return __bnd_set_ptr_bounds (p, len); +#else + return p; +#endif +} + +weak_alias (__mmap, mmap64) +weak_alias (__mmap, __mmap64) +weak_alias (__mmap, mmap) + +void * +__mremap (void *old_address, size_t old_size, size_t new_size, int flags, ...) +{ + void *p = INLINE_SYSCALL (mremap, 4, old_address, old_size, new_size, flags); + if ((long) p == -1) return MAP_FAILED; +#ifdef __CHKP__ + return __bnd_set_ptr_bounds (p, new_size); +#else + return p; +#endif +} + +weak_alias (__mremap, mremap) diff --git a/sysdeps/unix/sysv/linux/x86_64/mmap64.c b/sysdeps/unix/sysv/linux/x86_64/mmap64.c new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86_64/mmap64.c diff --git a/sysdeps/unix/sysv/linux/x86_64/mremap.c b/sysdeps/unix/sysv/linux/x86_64/mremap.c new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/sysdeps/unix/sysv/linux/x86_64/mremap.c |