3c5ef07e4b6d4d4b5e2a2682bc085b89b6fabaf3
[openbsd] /
1 //===-- main.cpp ------------------------------------------------*- C++ -*-===//
2 ////
3 //// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 //// See https://llvm.org/LICENSE.txt for license information.
5 //// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 ////
7 ////===----------------------------------------------------------------------===//
8 //
9
10 #include <cstddef>
11 #include <sys/prctl.h>
12
13 static void violate_upper_bound(int *ptr, int size)
14 {
15   int i;
16   i = *(ptr + size);
17 }
18
19 static void violate_lower_bound (int *ptr, int size)
20 {
21   int i;
22   i = *(ptr - size);
23 }
24
25 int
26 main(int argc, char const *argv[])
27 {
28   unsigned int rax, rbx, rcx, rdx;
29   int array[5];
30
31 // PR_MPX_ENABLE_MANAGEMENT won't be defined on linux kernel versions below 3.19
32 #ifndef PR_MPX_ENABLE_MANAGEMENT
33     return -1;
34 #endif
35
36   // This call returns 0 only if the CPU and the kernel support Intel(R) MPX.
37   if (prctl(PR_MPX_ENABLE_MANAGEMENT, 0, 0, 0, 0) != 0)
38     return -1;
39
40   violate_upper_bound(array, 5);
41   violate_lower_bound(array, 5);
42
43   return 0;
44 }