97b50585a5258883bb16889dca9de0ff915a067c
[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 <cpuid.h>
11 #include <cstddef>
12
13 int
14 main(int argc, char const *argv[])
15 {
16 // PR_MPX_ENABLE_MANAGEMENT won't be defined on linux kernel versions below 3.19
17 #ifndef PR_MPX_ENABLE_MANAGEMENT
18     return -1;
19 #endif
20
21     // This call returns 0 only if the CPU and the kernel support Intel(R) MPX.
22     if (prctl(PR_MPX_ENABLE_MANAGEMENT, 0, 0, 0, 0) != 0)
23         return -1;
24
25 // Run Intel(R) MPX test code.
26 #if defined(__x86_64__)
27     asm("mov $16, %rax\n\t"
28         "mov $9, %rdx\n\t"
29         "bndmk (%rax,%rdx), %bnd0\n\t"
30         "mov $32, %rax\n\t"
31         "mov $9, %rdx\n\t"
32         "bndmk (%rax,%rdx), %bnd1\n\t"
33         "mov $48, %rax\n\t"
34         "mov $9, %rdx\n\t"
35         "bndmk (%rax,%rdx), %bnd2\n\t"
36         "mov $64, %rax\n\t"
37         "mov $9, %rdx\n\t"
38         "bndmk (%rax,%rdx), %bnd3\n\t"
39         "bndstx %bnd3, (%rax) \n\t"
40         "nop\n\t");
41 #endif
42 #if defined(__i386__)
43     asm("mov $16, %eax\n\t"
44         "mov $9, %edx\n\t"
45         "bndmk (%eax,%edx), %bnd0\n\t"
46         "mov $32, %eax\n\t"
47         "mov $9, %edx\n\t"
48         "bndmk (%eax,%edx), %bnd1\n\t"
49         "mov $48, %eax\n\t"
50         "mov $9, %edx\n\t"
51         "bndmk (%eax,%edx), %bnd2\n\t"
52         "mov $64, %eax\n\t"
53         "mov $9, %edx\n\t"
54         "bndmk (%eax,%edx), %bnd3\n\t"
55         "bndstx  %bnd3, (%eax)\n\t"
56         "nop\n\t");
57 #endif
58     asm("nop\n\t"); // Set a break point here.
59
60     return 0;
61 }