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