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