mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
39 lines
1.1 KiB
C
39 lines
1.1 KiB
C
int
|
|
main (int argc, char **argv)
|
|
{
|
|
// Since MPX is disabled all these are just NOPS.
|
|
// Some of these instructions are just random.
|
|
// Once the GCC support is merged creating real test cases will be easier.
|
|
// http://gcc.gnu.org/wiki/Intel%20MPX%20support%20in%20the%20GCC%20compiler
|
|
|
|
// This is what ld.so does in _dl_runtime_resolve to save the bnds.
|
|
asm ("bndmov %bnd0, (%rsp)");
|
|
asm ("bndmov %bnd1, 16(%rsp)");
|
|
asm ("bndmov %bnd2, 32(%rsp)");
|
|
asm ("bndmov %bnd3, 48(%rsp)");
|
|
|
|
// Create a bnd, check lower and upper...
|
|
asm ("bndmk (%rax,%rdx), %bnd0");
|
|
asm ("bndcl (%rax,%rdi,4), %bnd0");
|
|
asm ("bndcu 3(%rax,%rdi,4), %bnd0");
|
|
asm ("bndcn 3(%rax,%rdi,4), %bnd0");
|
|
|
|
// Load bnd pointer and update...
|
|
asm ("bndldx 3(%rbx,%rdx), %bnd2");
|
|
asm ("bndstx %bnd2, 3(,%r12,1)");
|
|
|
|
// "bnd" prefixed call, return and jmp...
|
|
asm ("bnd call foo\n\
|
|
bnd jmp end\n\
|
|
foo: bnd ret\n\
|
|
end: nop");
|
|
|
|
// And set the bnds back...
|
|
asm ("bndmov 48(%rsp), %bnd3");
|
|
asm ("bndmov 32(%rsp), %bnd2");
|
|
asm ("bndmov 16(%rsp), %bnd1");
|
|
asm ("bndmov (%rsp), %bnd0");
|
|
|
|
return 0;
|
|
}
|