1 2/* 3 * Validate the ability to instrument a variety of NOP 4 * instructions. This covers 1 - 10 byte NOPs, including 5 * those with segment override prefixes. 6 */ 7 8#pragma D option destructive 9 10pid$1:a.out:waiting:entry 11{ 12 this->value = (int *)alloca(sizeof (int)); 13 *this->value = 1; 14 copyout(this->value, arg0, sizeof (int)); 15} 16 17/* 18 * This is a bit hacky, but... 19 * The target method is just a bunch of NOPs. 20 * We know that even optimized, the prologue is 21 * two instructions, a push and mov. These are the 22 * same size in i386 & x86_64. We start instrumenting 23 * the NOPs following and count how many we hit. 24 */ 25 26/* 1 byte NOP */ 27pid$1:a.out:nop:0 28{ 29 /* This defaults to zero */ 30 self->nopCount++; 31} 32 33/* 2 byte NOP */ 34pid$1:a.out:nop:1 35{ 36 self->nopCount++; 37} 38 39/* 3 byte NOP */ 40pid$1:a.out:nop:3 41{ 42 self->nopCount++; 43} 44 45/* 4 byte NOP */ 46pid$1:a.out:nop:6 47{ 48 self->nopCount++; 49} 50 51/* 5 byte NOP */ 52pid$1:a.out:nop:a 53{ 54 self->nopCount++; 55} 56 57/* 6 byte NOP */ 58pid$1:a.out:nop:f 59{ 60 self->nopCount++; 61} 62 63/* 7 byte NOP */ 64pid$1:a.out:nop:15 65{ 66 self->nopCount++; 67} 68 69/* 8 byte NOP */ 70pid$1:a.out:nop:1c 71{ 72 self->nopCount++; 73} 74 75/* 9 byte NOP */ 76pid$1:a.out:nop:24 77{ 78 self->nopCount++; 79} 80 81/* 10 byte NOP, CS segment override prefix */ 82pid$1:a.out:nop:2d 83{ 84 self->nopCount++; 85} 86 87/* 10 byte NOP, SS segment override prefix */ 88pid$1:a.out:nop:37 89{ 90 self->nopCount++; 91} 92 93/* 10 byte NOP, DS segment override prefix */ 94pid$1:a.out:nop:41 95{ 96 self->nopCount++; 97} 98 99/* 10 byte NOP, ES segment override prefix */ 100pid$1:a.out:nop:4b 101{ 102 self->nopCount++; 103} 104 105/* 10 byte NOP, FS segment override prefix */ 106pid$1:a.out:nop:55 107{ 108 self->nopCount++; 109} 110 111/* 10 byte NOP, GS segment override prefix */ 112pid$1:a.out:nop:5f 113{ 114 self->nopCount++; 115} 116 117pid$1:a.out:nop:return 118/ self->nopCount == 15 / 119{ 120 /* Success, test passes */ 121 exit(0); 122} 123 124pid$1:a.out:nop:return 125{ 126 /* FAIL */ 127 printf("Test matched %d NOPs, expected 15.\n", self->nopCount); 128 exit(1); 129} 130 131BEGIN 132{ 133 /* 134 * Let's just do this for 5 seconds. 135 */ 136 timeout = timestamp + 5000000000; 137} 138 139profile:::tick-4 140/timestamp > timeout/ 141{ 142 trace("test timed out"); 143 exit(1); 144} 145 146