Home | History | Annotate | Download | only in amd64
      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 }
     39