Skip to content

Commit 4e9f6c2

Browse files
feat(UnifiedFuzzer): support noise generation for Anvil mode (#80)
1 parent ac1b124 commit 4e9f6c2

File tree

2 files changed

+131
-8
lines changed

2 files changed

+131
-8
lines changed

main/Fuzzer/Fuzzer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,8 @@ class UnifiedFuzzer : public Fuzzer {
240240
void InitAnvil();
241241
void TickAnvil();
242242

243+
void RandomC(tl_agent::CAgent* cAgent, paddr_t begin, paddr_t end, bool cmoEnabled = true);
244+
243245
public:
244246
void tick();
245247
};

main/Fuzzer/UnifiedFuzzer.cpp

Lines changed: 129 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ void UnifiedFuzzer::InitAnvil()
8383

8484
decltype(cfg->unifiedSequenceModeAnvil)& cfgAnvil = cfg->unifiedSequenceModeAnvil;
8585

86-
for (int i = 0; i < (cfgAnvil.widthB + 1); i++)
86+
for (int i = 0; i < cAgentCount; i++)
8787
contextAnvil.ordinal.push_back(i);
8888

8989
tlsys_assert(cfgAnvil.size >= 8, Gravity::StringAppender(
@@ -95,9 +95,6 @@ void UnifiedFuzzer::InitAnvil()
9595
tlsys_assert(cAgentCount >= (1 + cfgAnvil.widthB), Gravity::StringAppender(
9696
"coherent agent count = ", cAgentCount, " of Anvil mode must be >= (1 + widthB = ", (1 + cfgAnvil.widthB) , ")").ToString());
9797

98-
tlsys_assert(!cfgAnvil.noise || cAgentCount >= 4, Gravity::StringAppender(
99-
"coherent agent count = ", cAgentCount, " of Anvil mode with noise generation enabled must be >= 4").ToString());
100-
10198
if (!cfgAnvil.thresholdR)
10299
cfgAnvil.thresholdR = cfgAnvil.size * 3 / 4;
103100

@@ -138,6 +135,14 @@ void UnifiedFuzzer::TickAnvil()
138135

139136
if (denial)
140137
monitoredGrant[agentIndex].insert(address);
138+
else
139+
{
140+
if (cfgAnvil.noise)
141+
{
142+
RandomC(cAgents[agentIndex],
143+
cfg->memoryStart, cfg->memoryStart + cfgAnvil.size * DATASIZE, true);
144+
}
145+
}
141146
}
142147
else
143148
stageUComplete = true;
@@ -148,7 +153,15 @@ void UnifiedFuzzer::TickAnvil()
148153
size_t agentIndex = contextAnvil.ordinal[0];
149154

150155
if (contextAnvil.counterR >= contextAnvil.counterU)
156+
{
151157
; // don't skip and retry on running ahead
158+
159+
if (cfgAnvil.noise)
160+
{
161+
RandomC(cAgents[agentIndex],
162+
cfg->memoryStart, cfg->memoryStart + cfgAnvil.size * DATASIZE, true);
163+
}
164+
}
152165
else if (contextAnvil.counterU >= cfgAnvil.thresholdR &&
153166
monitoredGrant[agentIndex].find(address) == monitoredGrant[agentIndex].end())
154167
{
@@ -161,10 +174,29 @@ void UnifiedFuzzer::TickAnvil()
161174
;
162175
else
163176
contextAnvil.counterR++;
177+
178+
if (!denial)
179+
{
180+
if (cfgAnvil.noise)
181+
{
182+
RandomC(cAgents[agentIndex],
183+
cfg->memoryStart, cfg->memoryStart + cfgAnvil.size * DATASIZE, true);
184+
}
185+
}
164186
}
165187
}
166188
else
167-
stageRComplete = true;
189+
{
190+
stageRComplete = true;
191+
192+
size_t agentIndex = contextAnvil.ordinal[0];
193+
194+
if (cfgAnvil.noise)
195+
{
196+
RandomC(cAgents[agentIndex],
197+
cfg->memoryStart, cfg->memoryStart + cfgAnvil.size * DATASIZE, true);
198+
}
199+
}
168200

169201
if (contextAnvil.counterB < cfgAnvil.size)
170202
{
@@ -186,8 +218,10 @@ void UnifiedFuzzer::TickAnvil()
186218
}
187219

188220
{
221+
size_t agentIndex = contextAnvil.ordinal[1 + i];
222+
189223
// alternative AcquirePerm toT operation on B stage
190-
auto denial = cAgents[contextAnvil.ordinal[1 + i]]->do_acquireBlock(
224+
auto denial = cAgents[agentIndex]->do_acquireBlock(
191225
cfg->memoryStart + contextAnvil.counterB * DATASIZE, TLParamAcquire::NtoB, 0);
192226

193227
if (denial == tl_agent::ActionDenial::CHANNEL_CONGESTION
@@ -199,6 +233,15 @@ void UnifiedFuzzer::TickAnvil()
199233
contextAnvil.counterB++;
200234
continue;
201235
}
236+
237+
if (!denial)
238+
{
239+
if (cfgAnvil.noise)
240+
{
241+
RandomC(cAgents[agentIndex],
242+
cfg->memoryStart, cfg->memoryStart + cfgAnvil.size * DATASIZE, true);
243+
}
244+
}
202245
}
203246

204247
if (ulAgentCountPerC)
@@ -208,20 +251,37 @@ void UnifiedFuzzer::TickAnvil()
208251
cfg->memoryStart + contextAnvil.counterB * DATASIZE);
209252

210253
if (denial == tl_agent::ActionDenial::CHANNEL_CONGESTION
211-
|| denial == tl_agent::ActionDenial::CHANNEL_RESOURCE)
254+
|| denial == tl_agent::ActionDenial::CHANNEL_RESOURCE)
212255
;
213256
else
214257
contextAnvil.counterB++;
215258
}
216259
}
217260
}
261+
else
262+
{
263+
for (int i = 0; i < cfgAnvil.widthB && contextAnvil.counterB < cfgAnvil.size; i++)
264+
{
265+
size_t agentIndex = contextAnvil.ordinal[1 + i];
266+
267+
if (cfgAnvil.noise)
268+
{
269+
RandomC(cAgents[agentIndex],
270+
cfg->memoryStart, cfg->memoryStart + cfgAnvil.size * DATASIZE, true);
271+
}
272+
}
273+
}
218274
}
219275
else
220276
stageBComplete = true;
221277

222278
if (cfgAnvil.noise)
223279
{
224-
// TODO
280+
for (int i = 0; i < (cAgentCount - 1 - cfgAnvil.widthB); i++)
281+
{
282+
RandomC(cAgents[contextAnvil.ordinal[1 + cfgAnvil.widthB + i]],
283+
cfg->memoryStart, cfg->memoryStart + cfgAnvil.size * DATASIZE, true);
284+
}
225285
}
226286

227287
if (stageUComplete && stageRComplete && stageBComplete)
@@ -244,6 +304,67 @@ void UnifiedFuzzer::TickAnvil()
244304
}
245305
}
246306

307+
void UnifiedFuzzer::RandomC(tl_agent::CAgent* cAgent, paddr_t begin, paddr_t end, bool cmoEnabled)
308+
{
309+
paddr_t addr;
310+
int alias;
311+
312+
bool do_alias = CAGENT_RAND64(cAgent, "UnifiedFuzzer") % 2;
313+
314+
addr = ((CAGENT_RAND64(cAgent, "UnifiedFuzzer") % (end - begin)) + begin) & ~(DATASIZE - 1);
315+
alias = (do_alias) ? (CAGENT_RAND64(cAgent, "UnifiedFuzzer") % 4) : 0;
316+
317+
if (CAGENT_RAND64(cAgent, "UnifiedFuzzer") % 4)
318+
{
319+
if (!cAgent->config().memoryEnable)
320+
return;
321+
322+
if (CAGENT_RAND64(cAgent, "UnifiedFuzzer") % 2)
323+
{
324+
if (CAGENT_RAND64(cAgent, "UnifiedFuzzer") % 3)
325+
{
326+
if (CAGENT_RAND64(cAgent, "UnifiedFuzzer") % 2)
327+
cAgent->do_acquireBlock(addr, TLParamAcquire::NtoT, alias); // AcquireBlock NtoT
328+
else
329+
cAgent->do_acquireBlock(addr, TLParamAcquire::NtoB, alias); // AcquireBlock NtoB
330+
}
331+
else
332+
cAgent->do_acquirePerm(addr, TLParamAcquire::NtoT, alias); // AcquirePerm
333+
}
334+
else
335+
{
336+
cAgent->do_releaseDataAuto(addr, alias,
337+
CAGENT_RAND64(cAgent, "UnifiedFuzzer") & 0x1,
338+
CAGENT_RAND64(cAgent, "UnifiedFuzzer") & 0x1);
339+
}
340+
}
341+
else if (cmoEnabled && cAgent->config().cmoEnable)
342+
{
343+
bool alwaysHit = (CAGENT_RAND64(cAgent, "UnifiedFuzzer") % 8) == 0;
344+
345+
switch (CAGENT_RAND64(cAgent, "UnifiedFuzzer") % 3)
346+
{
347+
case 0: // cbo.clean
348+
if (cAgent->config().cmoEnableCBOClean)
349+
cAgent->do_cbo_clean(addr, alwaysHit);
350+
break;
351+
352+
case 1: // cbo.flush
353+
if (cAgent->config().cmoEnableCBOFlush)
354+
cAgent->do_cbo_flush(addr, alwaysHit);
355+
break;
356+
357+
case 2: // cbo.inval
358+
if (cAgent->config().cmoEnableCBOInval)
359+
cAgent->do_cbo_inval(addr, alwaysHit);
360+
break;
361+
362+
default:
363+
break;
364+
}
365+
}
366+
}
367+
247368
void UnifiedFuzzer::tick()
248369
{
249370
if (!cfg->unifiedSequenceEnable)

0 commit comments

Comments
 (0)