// Replace the string with the absolute path of the Kingfisher model executable // e.g. string model = "/home/working_dir/RTSM_VE_Cortex-A15x1-A7x1"; string model = ""; // Replace the string with the absolute path of the Virutalizer+Payload software image // e.g. string app = "/home/working_dir/bootwrapper/img.axf" string app = ""; // Replace the string with the absolute path of the wboot.bin image created in the // bootwrapper/big-little directory. This image is load in flash at 0x0 and distinguishes // between a warm and a cold reset string wboot = ""; int ctr = 0; // NOTE // // Uncomment the next 4 'string' variables and update them _only_ if the run is required // to generate trace output as described in docs/04-Cache-hit-rate-howto.txt. Also, // comment out the system() invocation on line 47 and uncomment the system() command on line 34. // Each 'trace' parameter is described below. // Add the path to the trace plugin // string trace_plugin = " --trace-plugin /GenericTrace.so"; // Parameters for selecting the trace sources to monitor outbound cache hits // string trace_sources = " --parameter TRACE.GenericTrace.trace-sources=\*sw_trace_event\*,\*read_for_3_came_from_snoop\*,\*read_for_4_came_from_snoop\* "; // Add the path to the trace file where all the output will be collected // string trace_file = " --parameter TRACE.GenericTrace.trace-file= "; // Miscellaneous parameters. The frequency at which the performance metrics of the // model appear in the trace source can be changed here (default is 0x100). // string trace_misc = " -C TRACE.GenericTrace.perf-period=0x100 -C TRACE.GenericTrace.flush=1 "; // The commented 'system' command below will launch the model and register the trace // sources selected in 'trace_sources' with the Generic Trace plugin selected using // 'trace_plugin'. Other parameters are specified in 'trace_file' & 'trace_misc'. // system(model + trace_plugin + trace_sources + trace_file + trace_misc + " -C coretile.cache_state_modelled=1" + " -a coretile.cluster0.\*=" + app + " -a coretile.cluster1.\*=" + app + " --verbose -S &"); string networking = " -C motherboard.hostbridge.userNetworking=1 -C motherboard.hostbridge.userNetPorts=\"8080=8080\" -C motherboard.smsc_91c111.enabled=1"; string console = " -C motherboard.pl011_uart0.untimed_fifos=1 -C motherboard.pl011_uart1.untimed_fifos=1 -C motherboard.pl011_uart2.untimed_fifos=1 -C motherboard.pl011_uart3.untimed_fifos=1"; // Select which cluster will come out of reset on power-on: 0x1 for for primary cluster (Cortex-A15, default); 0x2 for secondary cluster (Cortex-A7). string dualcluster = " -C coretile.dualclustersystemconfigurationblock.CFG_ACTIVECLUSTER=0x1"; // NOTE // // _Only_ if a run is needed using an optional rootfs MMC image built using the instructions in // docs/06-Optional-rootfs-build.txt, then comment out the system() invocation // below (on line 47) and uncomment the following lines taking care to update // the paths accordingly. // string mmcimage = ""; // system(model + " -C motherboard.mmc.p_mmc_file=" + mmcimage + trace_plugin + trace_sources + trace_file + trace_misc + " -C coretile.cache_state_modelled=1" + " -a coretile.cluster0.\*=" + app + " -a coretile.cluster1.\*=" + app + " --verbose -S &"); // Invoke the model. It then listens for connection requests from the model debugger // Vanilla invocation of the model. system(model + " -C motherboard.flashloader0.fname=" + wboot + " -C coretile.cache_state_modelled=1" + " -a coretile.cluster0.\*=" + app + " -a coretile.cluster1.\*=" + app + networking + console + dualcluster +" --verbose -S &"); // Wait for the model to load before connecting to it. There will be times when we // try connecting before the model has loded resulting in a "Connection refused" // error. Increasing 'ctr' or retrying should solve the problem. while(ctr < 400000000) { ctr++; } // Model listens at port 7000 connectToModel("7000"); // The following lines can be uncommented to set any breakpoints on each cluster selectTarget("coretile.cluster0.cpu0"); //bpAdd(
, "Normal"); //bpAdd(
, "Secure"); selectTarget("coretile.cluster1.cpu0"); //bpAdd(
, "Normal"); //bpAdd(
, "Secure"); // Select the primary cpu on the primary cluster and set the ball rolling selectTarget("coretile.cluster0.cpu0"); run();