@@ -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+
247368void UnifiedFuzzer::tick ()
248369{
249370 if (!cfg->unifiedSequenceEnable )
0 commit comments