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