Summary:
The Boundary Table Entries are stored in the application memory and allow
to store boundary info for all the pointers of the program, also those that
otherwise wouldn't fit in the 4 bound registers provided by the HW.
Here is an example of how it works:
* mpx-table show <pointer>
lbound = 0x..., ubound = 0x..., (pointer value = 0x..., metadata = 0x...)
* mpx-table set <pointer>
Signed-off-by: Valentina Giusti <valentina.giusti@intel.com>
Reviewers: labath, clayborg
Reviewed By: clayborg
Subscribers: lldb-commits, mgorny
Differential Revision: https://reviews.llvm.org/D29078
llvm-svn: 293660
49 lines
1.2 KiB
C++
49 lines
1.2 KiB
C++
//===-- main.cpp ------------------------------------------------*- C++ -*-===//
|
|
////
|
|
//// The LLVM Compiler Infrastructure
|
|
////
|
|
//// This file is distributed under the University of Illinois Open Source
|
|
//// License. See LICENSE.TXT for details.
|
|
////
|
|
////===----------------------------------------------------------------------===//
|
|
//
|
|
|
|
const int size = 5;
|
|
|
|
#include <cstddef>
|
|
#include <cstdlib>
|
|
#include <sys/prctl.h>
|
|
|
|
void func(int *ptr) {
|
|
int *tmp;
|
|
|
|
#if defined __GNUC__ && !defined __INTEL_COMPILER
|
|
__builtin___bnd_store_ptr_bounds ((void**)&ptr, ptr);
|
|
#endif
|
|
tmp = ptr + size - 1;
|
|
#if defined __GNUC__ && !defined __INTEL_COMPILER
|
|
__builtin___bnd_store_ptr_bounds ((void**)&tmp, tmp);
|
|
#endif
|
|
tmp = (int*)0x2; // Break 2.
|
|
|
|
return; // Break 3.
|
|
}
|
|
|
|
int
|
|
main(int argc, char const *argv[])
|
|
{
|
|
// This call returns 0 only if the CPU and the kernel support Intel(R) MPX.
|
|
if (prctl(PR_MPX_ENABLE_MANAGEMENT, 0, 0, 0, 0) != 0)
|
|
return -1;
|
|
|
|
int* a = (int *) calloc(size, sizeof(int));
|
|
#if defined __GNUC__ && !defined __INTEL_COMPILER
|
|
__builtin___bnd_store_ptr_bounds ((void**)&a, a);
|
|
#endif
|
|
func(a); // Break 1.
|
|
|
|
free(a); // Break 4.
|
|
|
|
return 0;
|
|
}
|