1eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovint
2eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovmain (int argc, char **argv)
3eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov{
4eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  // Since MPX is disabled all these are just NOPS.
5eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  // Some of these instructions are just random.
6eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  // Once the GCC support is merged creating real test cases will be easier.
7eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  // http://gcc.gnu.org/wiki/Intel%20MPX%20support%20in%20the%20GCC%20compiler
8eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
9eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  // This is what ld.so does in _dl_runtime_resolve to save the bnds.
10eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  asm ("bndmov %bnd0, (%rsp)");
11eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  asm ("bndmov %bnd1, 16(%rsp)");
12eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  asm ("bndmov %bnd2, 32(%rsp)");
13eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  asm ("bndmov %bnd3, 48(%rsp)");
14eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
15eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  // Create a bnd, check lower and upper...
16eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  asm ("bndmk (%rax,%rdx), %bnd0");
17eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  asm ("bndcl (%rax,%rdi,4), %bnd0");
18eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  asm ("bndcu 3(%rax,%rdi,4), %bnd0");
19eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  asm ("bndcn 3(%rax,%rdi,4), %bnd0");
20eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
21eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  // Load bnd pointer and update...
22eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  asm ("bndldx 3(%rbx,%rdx), %bnd2");
23eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  asm ("bndstx %bnd2, 3(,%r12,1)");
24eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
25eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  // "bnd" prefixed call, return and jmp...
26eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  asm ("bnd call foo\n\
27eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov        bnd jmp  end\n\
28eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov        foo: bnd ret\n\
29eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov        end: nop");
30eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
31eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  // And set the bnds back...
32eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  asm ("bndmov 48(%rsp), %bnd3");
33eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  asm ("bndmov 32(%rsp), %bnd2");
34eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  asm ("bndmov 16(%rsp), %bnd1");
35eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  asm ("bndmov (%rsp), %bnd0");
36eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov
37eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov  return 0;
38eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov}
39