0928482b7c704d4e89f20116c1a515358115983a
1 # Copyright (c) 2012-2013 ARM Limited
4 # The license below extends only to copyright in the software and shall
5 # not be construed as granting a license to any other intellectual
6 # property including but not limited to intellectual property relating
7 # to a hardware implementation of the functionality of the software
8 # licensed hereunder. You may use the software subject to the license
9 # terms below provided that you ensure that this notice is replicated
10 # unmodified and in its entirety in all distributions of the software,
11 # modified or unmodified, in source code or in binary form.
13 # Copyright (c) 2006-2008 The Regents of The University of Michigan
14 # All rights reserved.
16 # Redistribution and use in source and binary forms, with or without
17 # modification, are permitted provided that the following conditions are
18 # met: redistributions of source code must retain the above copyright
19 # notice, this list of conditions and the following disclaimer;
20 # redistributions in binary form must reproduce the above copyright
21 # notice, this list of conditions and the following disclaimer in the
22 # documentation and/or other materials provided with the distribution;
23 # neither the name of the copyright holders nor the names of its
24 # contributors may be used to endorse or promote products derived from
25 # this software without specific prior written permission.
27 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
31 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
32 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
33 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 # Authors: Steve Reinhardt
50 from m5
.defines
import buildEnv
51 from m5
.objects
import *
52 from m5
.util
import addToPath
, fatal
54 addToPath('../common')
65 # Check if KVM support has been enabled, we might need to do VM
66 # configuration if that's the case.
67 have_kvm_support
= 'BaseKvmCPU' in globals()
68 def is_kvm_cpu(cpu_class
):
69 return have_kvm_support
and cpu_class
!= None and \
70 issubclass(cpu_class
, BaseKvmCPU
)
72 def get_processes(options
):
73 """Interprets provided options and returns a list of processes"""
81 workloads
= options
.cmd
.split(';')
82 if options
.input != "":
83 inputs
= options
.input.split(';')
84 if options
.output
!= "":
85 outputs
= options
.output
.split(';')
86 if options
.errout
!= "":
87 errouts
= options
.errout
.split(';')
88 if options
.options
!= "":
89 pargs
= options
.options
.split(';')
92 for wrkld
in workloads
:
93 process
= LiveProcess()
94 process
.executable
= wrkld
95 process
.cwd
= os
.getcwd()
98 with
open(options
.env
, 'r') as f
:
99 process
.env
= [line
.rstrip() for line
in f
]
102 process
.cmd
= [wrkld
] + pargs
[idx
].split()
104 process
.cmd
= [wrkld
]
106 if len(inputs
) > idx
:
107 process
.input = inputs
[idx
]
108 if len(outputs
) > idx
:
109 process
.output
= outputs
[idx
]
110 if len(errouts
) > idx
:
111 process
.errout
= errouts
[idx
]
113 multiprocesses
.append(process
)
117 assert(options
.cpu_type
== "detailed")
118 return multiprocesses
, idx
120 return multiprocesses
, 1
123 parser
= optparse
.OptionParser()
124 Options
.addCommonOptions(parser
)
125 Options
.addSEOptions(parser
)
127 if '--ruby' in sys
.argv
:
128 Ruby
.define_options(parser
)
130 (options
, args
) = parser
.parse_args()
133 print "Error: script doesn't take any positional arguments"
140 apps
= options
.bench
.split("-")
141 if len(apps
) != options
.num_cpus
:
142 print "number of benchmarks not equal to set num_cpus!"
147 if buildEnv
['TARGET_ISA'] == 'alpha':
148 exec("workload = %s('alpha', 'tru64', '%s')" % (
149 app
, options
.spec_input
))
150 elif buildEnv
['TARGET_ISA'] == 'arm':
151 exec("workload = %s('arm_%s', 'linux', '%s')" % (
152 app
, options
.arm_iset
, options
.spec_input
))
154 exec("workload = %s(buildEnv['TARGET_ISA', 'linux', '%s')" % (
155 app
, options
.spec_input
))
156 multiprocesses
.append(workload
.makeLiveProcess())
158 print >>sys
.stderr
, "Unable to find workload for %s: %s" % (
159 buildEnv
['TARGET_ISA'], app
)
162 multiprocesses
, numThreads
= get_processes(options
)
164 print >> sys
.stderr
, "No workload specified. Exiting!\n"
168 (CPUClass
, test_mem_mode
, FutureClass
) = Simulation
.setCPUClass(options
)
169 CPUClass
.numThreads
= numThreads
171 # Check -- do not allow SMT with multiple CPUs
172 if options
.smt
and options
.num_cpus
> 1:
173 fatal("You cannot use SMT with multiple CPUs!")
175 np
= options
.num_cpus
176 system
= System(cpu
= [CPUClass(cpu_id
=i
) for i
in xrange(np
)],
177 mem_mode
= test_mem_mode
,
178 mem_ranges
= [AddrRange(options
.mem_size
)],
179 cache_line_size
= options
.cacheline_size
)
182 system
.multi_thread
= True
184 # Create a top-level voltage domain
185 system
.voltage_domain
= VoltageDomain(voltage
= options
.sys_voltage
)
187 # Create a source clock for the system and set the clock period
188 system
.clk_domain
= SrcClockDomain(clock
= options
.sys_clock
,
189 voltage_domain
= system
.voltage_domain
)
191 # Create a CPU voltage domain
192 system
.cpu_voltage_domain
= VoltageDomain()
194 # Create a separate clock domain for the CPUs
195 system
.cpu_clk_domain
= SrcClockDomain(clock
= options
.cpu_clock
,
197 system
.cpu_voltage_domain
)
199 # All cpus belong to a common cpu_clk_domain, therefore running at a common
201 for cpu
in system
.cpu
:
202 cpu
.clk_domain
= system
.cpu_clk_domain
204 if is_kvm_cpu(CPUClass
) or is_kvm_cpu(FutureClass
):
205 if buildEnv
['TARGET_ISA'] == 'x86':
207 for process
in multiprocesses
:
208 process
.useArchPT
= True
209 process
.kvmInSE
= True
211 fatal("KvmCPU can only be used in SE mode with x86")
215 if CPUClass
!= AtomicSimpleCPU
:
216 fatal("Fastmem can only be used with atomic CPU!")
217 if (options
.caches
or options
.l2cache
):
218 fatal("You cannot use fastmem in combination with caches!")
220 if options
.simpoint_profile
:
221 if not options
.fastmem
:
222 # Atomic CPU checked with fastmem option already
223 fatal("SimPoint generation should be done with atomic cpu and fastmem")
225 fatal("SimPoint generation not supported with more than one CPUs")
229 system
.cpu
[i
].workload
= multiprocesses
230 elif len(multiprocesses
) == 1:
231 system
.cpu
[i
].workload
= multiprocesses
[0]
233 system
.cpu
[i
].workload
= multiprocesses
[i
]
236 system
.cpu
[i
].fastmem
= True
238 if options
.simpoint_profile
:
239 system
.cpu
[i
].addSimPointProbe(options
.simpoint_interval
)
242 system
.cpu
[i
].addCheckerCpu()
244 system
.cpu
[i
].createThreads()
247 if options
.cpu_type
== "atomic" or options
.cpu_type
== "AtomicSimpleCPU":
248 print >> sys
.stderr
, "Ruby does not work with atomic cpu!!"
251 Ruby
.create_system(options
, False, system
)
252 assert(options
.num_cpus
== len(system
.ruby
._cpu
_ports
))
254 system
.ruby
.clk_domain
= SrcClockDomain(clock
= options
.ruby_clock
,
255 voltage_domain
= system
.voltage_domain
)
257 ruby_port
= system
.ruby
._cpu
_ports
[i
]
259 # Create the interrupt controller and connect its ports to Ruby
260 # Note that the interrupt controller is always present but only
261 # in x86 does it have message ports that need to be connected
262 system
.cpu
[i
].createInterruptController()
264 # Connect the cpu's cache ports to Ruby
265 system
.cpu
[i
].icache_port
= ruby_port
.slave
266 system
.cpu
[i
].dcache_port
= ruby_port
.slave
267 if buildEnv
['TARGET_ISA'] == 'x86':
268 system
.cpu
[i
].interrupts
[0].pio
= ruby_port
.master
269 system
.cpu
[i
].interrupts
[0].int_master
= ruby_port
.slave
270 system
.cpu
[i
].interrupts
[0].int_slave
= ruby_port
.master
271 system
.cpu
[i
].itb
.walker
.port
= ruby_port
.slave
272 system
.cpu
[i
].dtb
.walker
.port
= ruby_port
.slave
274 MemClass
= Simulation
.setMemClass(options
)
275 system
.membus
= SystemXBar()
276 system
.system_port
= system
.membus
.slave
277 CacheConfig
.config_cache(options
, system
)
278 MemConfig
.config_mem(options
, system
)
280 root
= Root(full_system
= False, system
= system
)
281 Simulation
.run(options
, root
, system
, FutureClass
)