diff -r 3be64e1f80ed -r b7f2abdbce1a src/sim/System.py --- a/src/sim/System.py Fri Dec 04 00:19:05 2015 +0000 +++ b/src/sim/System.py Sat Dec 05 00:26:50 2015 +0000 @@ -73,6 +73,8 @@ cache_line_size = Param.Unsigned(64, "Cache line size in bytes") + exit_on_work_items = Param.Bool(True, "Exit from the simulation loop when " + "encountering work item annotations.") work_item_id = Param.Int(-1, "specific work item id") num_work_ids = Param.Int(16, "Number of distinct work item types") work_begin_cpu_id_exit = Param.Int(-1, diff -r 3be64e1f80ed -r b7f2abdbce1a src/sim/pseudo_inst.cc --- a/src/sim/pseudo_inst.cc Fri Dec 04 00:19:05 2015 +0000 +++ b/src/sim/pseudo_inst.cc Sat Dec 05 00:26:50 2015 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2012 ARM Limited + * Copyright (c) 2010-2012, 2015 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -616,14 +616,19 @@ workbegin(ThreadContext *tc, uint64_t workid, uint64_t threadid) { DPRINTF(PseudoInst, "PseudoInst::workbegin(%i, %i)\n", workid, threadid); - tc->getCpuPtr()->workItemBegin(); System *sys = tc->getSystemPtr(); const System::Params *params = sys->params(); + + if (params->exit_on_work_items) { + exitSimLoop("workbegin", static_cast(workid)); + return; + } + + DPRINTF(WorkItems, "Work Begin workid: %d, threadid %d\n", workid, + threadid); + tc->getCpuPtr()->workItemBegin(); sys->workItemBegin(threadid, workid); - DPRINTF(WorkItems, "Work Begin workid: %d, threadid %d\n", workid, - threadid); - // // If specified, determine if this is the specific work item the user // identified @@ -674,12 +679,17 @@ workend(ThreadContext *tc, uint64_t workid, uint64_t threadid) { DPRINTF(PseudoInst, "PseudoInst::workend(%i, %i)\n", workid, threadid); - tc->getCpuPtr()->workItemEnd(); System *sys = tc->getSystemPtr(); const System::Params *params = sys->params(); - sys->workItemEnd(threadid, workid); + + if (params->exit_on_work_items) { + exitSimLoop("workend", static_cast(workid)); + return; + } DPRINTF(WorkItems, "Work End workid: %d, threadid %d\n", workid, threadid); + tc->getCpuPtr()->workItemEnd(); + sys->workItemEnd(threadid, workid); // // If specified, determine if this is the specific work item the user