fs.py revision 7586
111308Santhony.gutierrez@amd.com# Copyright (c) 2010 ARM Limited 211308Santhony.gutierrez@amd.com# All rights reserved. 311308Santhony.gutierrez@amd.com# 411308Santhony.gutierrez@amd.com# The license below extends only to copyright in the software and shall 511308Santhony.gutierrez@amd.com# not be construed as granting a license to any other intellectual 611308Santhony.gutierrez@amd.com# property including but not limited to intellectual property relating 711308Santhony.gutierrez@amd.com# to a hardware implementation of the functionality of the software 811308Santhony.gutierrez@amd.com# licensed hereunder. You may use the software subject to the license 911308Santhony.gutierrez@amd.com# terms below provided that you ensure that this notice is replicated 1011308Santhony.gutierrez@amd.com# unmodified and in its entirety in all distributions of the software, 1111308Santhony.gutierrez@amd.com# modified or unmodified, in source code or in binary form. 1211308Santhony.gutierrez@amd.com# 1311308Santhony.gutierrez@amd.com# Copyright (c) 2006-2007 The Regents of The University of Michigan 1411308Santhony.gutierrez@amd.com# All rights reserved. 1511308Santhony.gutierrez@amd.com# 1611308Santhony.gutierrez@amd.com# Redistribution and use in source and binary forms, with or without 1711308Santhony.gutierrez@amd.com# modification, are permitted provided that the following conditions are 1811308Santhony.gutierrez@amd.com# met: redistributions of source code must retain the above copyright 1911308Santhony.gutierrez@amd.com# notice, this list of conditions and the following disclaimer; 2011308Santhony.gutierrez@amd.com# redistributions in binary form must reproduce the above copyright 2111308Santhony.gutierrez@amd.com# notice, this list of conditions and the following disclaimer in the 2211308Santhony.gutierrez@amd.com# documentation and/or other materials provided with the distribution; 2311308Santhony.gutierrez@amd.com# neither the name of the copyright holders nor the names of its 2411308Santhony.gutierrez@amd.com# contributors may be used to endorse or promote products derived from 2511308Santhony.gutierrez@amd.com# this software without specific prior written permission. 2611308Santhony.gutierrez@amd.com# 2711308Santhony.gutierrez@amd.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2811308Santhony.gutierrez@amd.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2911308Santhony.gutierrez@amd.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 3011308Santhony.gutierrez@amd.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3111308Santhony.gutierrez@amd.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3211308Santhony.gutierrez@amd.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3311308Santhony.gutierrez@amd.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3411308Santhony.gutierrez@amd.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3511308Santhony.gutierrez@amd.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3611308Santhony.gutierrez@amd.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3711308Santhony.gutierrez@amd.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3811308Santhony.gutierrez@amd.com# 3911308Santhony.gutierrez@amd.com# Authors: Ali Saidi 4011308Santhony.gutierrez@amd.com 4111308Santhony.gutierrez@amd.comimport optparse 4211308Santhony.gutierrez@amd.comimport os 4311308Santhony.gutierrez@amd.comimport sys 4411308Santhony.gutierrez@amd.com 4511308Santhony.gutierrez@amd.comimport m5 4611308Santhony.gutierrez@amd.comfrom m5.defines import buildEnv 4711308Santhony.gutierrez@amd.comfrom m5.objects import * 4811308Santhony.gutierrez@amd.comfrom m5.util import addToPath, fatal 4911308Santhony.gutierrez@amd.com 5011308Santhony.gutierrez@amd.comif not buildEnv['FULL_SYSTEM']: 5111308Santhony.gutierrez@amd.com fatal("This script requires full-system mode (*_FS).") 5211308Santhony.gutierrez@amd.com 5311308Santhony.gutierrez@amd.comaddToPath('../common') 5411308Santhony.gutierrez@amd.com 5511308Santhony.gutierrez@amd.comfrom FSConfig import * 5611308Santhony.gutierrez@amd.comfrom SysPaths import * 5711308Santhony.gutierrez@amd.comfrom Benchmarks import * 5811308Santhony.gutierrez@amd.comimport Simulation 5911308Santhony.gutierrez@amd.comimport CacheConfig 6011308Santhony.gutierrez@amd.comfrom Caches import * 6111308Santhony.gutierrez@amd.com 6211308Santhony.gutierrez@amd.com# Get paths we might need. It's expected this file is in m5/configs/example. 6311308Santhony.gutierrez@amd.comconfig_path = os.path.dirname(os.path.abspath(__file__)) 6411308Santhony.gutierrez@amd.comconfig_root = os.path.dirname(config_path) 6511308Santhony.gutierrez@amd.com 6611308Santhony.gutierrez@amd.comparser = optparse.OptionParser() 6711308Santhony.gutierrez@amd.com 6811308Santhony.gutierrez@amd.com# System options 6911308Santhony.gutierrez@amd.comparser.add_option("--kernel", action="store", type="string") 7011308Santhony.gutierrez@amd.comparser.add_option("--script", action="store", type="string") 7111308Santhony.gutierrez@amd.comif buildEnv['TARGET_ISA'] == "arm": 7211308Santhony.gutierrez@amd.com parser.add_option("--bare-metal", action="store_true", 7311308Santhony.gutierrez@amd.com help="Provide the raw system without the linux specific bits") 7411308Santhony.gutierrez@amd.com parser.add_option("--machine-type", action="store", type="choice", 7511308Santhony.gutierrez@amd.com choices=ArmMachineType.map.keys(), default="RealView_PBX") 7611308Santhony.gutierrez@amd.com# Benchmark options 7711308Santhony.gutierrez@amd.comparser.add_option("--dual", action="store_true", 7811308Santhony.gutierrez@amd.com help="Simulate two systems attached with an ethernet link") 7911308Santhony.gutierrez@amd.comparser.add_option("-b", "--benchmark", action="store", type="string", 8011308Santhony.gutierrez@amd.com dest="benchmark", 8111308Santhony.gutierrez@amd.com help="Specify the benchmark to run. Available benchmarks: %s"\ 8211308Santhony.gutierrez@amd.com % DefinedBenchmarks) 8311308Santhony.gutierrez@amd.com 8411308Santhony.gutierrez@amd.com# Metafile options 8511308Santhony.gutierrez@amd.comparser.add_option("--etherdump", action="store", type="string", dest="etherdump", 8611308Santhony.gutierrez@amd.com help="Specify the filename to dump a pcap capture of the" \ 8711308Santhony.gutierrez@amd.com "ethernet traffic") 8811308Santhony.gutierrez@amd.com 8911308Santhony.gutierrez@amd.comexecfile(os.path.join(config_root, "common", "Options.py")) 9011308Santhony.gutierrez@amd.com 9111308Santhony.gutierrez@amd.com(options, args) = parser.parse_args() 9211308Santhony.gutierrez@amd.com 9311308Santhony.gutierrez@amd.comif args: 9411308Santhony.gutierrez@amd.com print "Error: script doesn't take any positional arguments" 9511308Santhony.gutierrez@amd.com sys.exit(1) 9611308Santhony.gutierrez@amd.com 9711308Santhony.gutierrez@amd.com# driver system CPU is always simple... note this is an assignment of 9811308Santhony.gutierrez@amd.com# a class, not an instance. 9911308Santhony.gutierrez@amd.comDriveCPUClass = AtomicSimpleCPU 10011308Santhony.gutierrez@amd.comdrive_mem_mode = 'atomic' 10111308Santhony.gutierrez@amd.com 10211308Santhony.gutierrez@amd.com# system under test can be any CPU 10311308Santhony.gutierrez@amd.com(TestCPUClass, test_mem_mode, FutureClass) = Simulation.setCPUClass(options) 10411308Santhony.gutierrez@amd.com 10511308Santhony.gutierrez@amd.comTestCPUClass.clock = '2GHz' 10611308Santhony.gutierrez@amd.comDriveCPUClass.clock = '2GHz' 10711308Santhony.gutierrez@amd.com 10811308Santhony.gutierrez@amd.comif options.benchmark: 10911308Santhony.gutierrez@amd.com try: 11011308Santhony.gutierrez@amd.com bm = Benchmarks[options.benchmark] 11111308Santhony.gutierrez@amd.com except KeyError: 11211308Santhony.gutierrez@amd.com print "Error benchmark %s has not been defined." % options.benchmark 11311308Santhony.gutierrez@amd.com print "Valid benchmarks are: %s" % DefinedBenchmarks 11411308Santhony.gutierrez@amd.com sys.exit(1) 11511308Santhony.gutierrez@amd.comelse: 11611308Santhony.gutierrez@amd.com if options.dual: 11711308Santhony.gutierrez@amd.com bm = [SysConfig(), SysConfig()] 11811308Santhony.gutierrez@amd.com else: 11911308Santhony.gutierrez@amd.com bm = [SysConfig()] 12011308Santhony.gutierrez@amd.com 12111308Santhony.gutierrez@amd.comnp = options.num_cpus 12211308Santhony.gutierrez@amd.com 12311308Santhony.gutierrez@amd.comif buildEnv['TARGET_ISA'] == "alpha": 12411308Santhony.gutierrez@amd.com test_sys = makeLinuxAlphaSystem(test_mem_mode, bm[0]) 12511308Santhony.gutierrez@amd.comelif buildEnv['TARGET_ISA'] == "mips": 12611308Santhony.gutierrez@amd.com test_sys = makeLinuxMipsSystem(test_mem_mode, bm[0]) 12711308Santhony.gutierrez@amd.comelif buildEnv['TARGET_ISA'] == "sparc": 12811692Santhony.gutierrez@amd.com test_sys = makeSparcSystem(test_mem_mode, bm[0]) 12911692Santhony.gutierrez@amd.comelif buildEnv['TARGET_ISA'] == "x86": 13011308Santhony.gutierrez@amd.com test_sys = makeLinuxX86System(test_mem_mode, np, bm[0]) 13111308Santhony.gutierrez@amd.comelif buildEnv['TARGET_ISA'] == "arm": 13211308Santhony.gutierrez@amd.com test_sys = makeLinuxArmSystem(test_mem_mode, bm[0], 13311308Santhony.gutierrez@amd.com bare_metal=options.bare_metal, machine_type=options.machine_type) 13411308Santhony.gutierrez@amd.comelse: 13511308Santhony.gutierrez@amd.com fatal("incapable of building non-alpha or non-sparc full system!") 13611308Santhony.gutierrez@amd.com 13711308Santhony.gutierrez@amd.comif options.kernel is not None: 13811308Santhony.gutierrez@amd.com test_sys.kernel = binary(options.kernel) 13911308Santhony.gutierrez@amd.com 14011308Santhony.gutierrez@amd.comif options.script is not None: 14111308Santhony.gutierrez@amd.com test_sys.readfile = options.script 14211308Santhony.gutierrez@amd.com 14311308Santhony.gutierrez@amd.comtest_sys.cpu = [TestCPUClass(cpu_id=i) for i in xrange(np)] 14411308Santhony.gutierrez@amd.com 14511308Santhony.gutierrez@amd.comCacheConfig.config_cache(options, test_sys) 14611308Santhony.gutierrez@amd.com 14711308Santhony.gutierrez@amd.comif options.caches or options.l2cache: 14811308Santhony.gutierrez@amd.com if bm[0]: 14911308Santhony.gutierrez@amd.com mem_size = bm[0].mem() 15011308Santhony.gutierrez@amd.com else: 15111308Santhony.gutierrez@amd.com mem_size = SysConfig().mem() 15211308Santhony.gutierrez@amd.com test_sys.bridge.filter_ranges_a=[AddrRange(0, Addr.max)] 15311308Santhony.gutierrez@amd.com test_sys.bridge.filter_ranges_b=[AddrRange(mem_size)] 15411308Santhony.gutierrez@amd.com test_sys.iocache = IOCache(addr_range=mem_size) 15511308Santhony.gutierrez@amd.com test_sys.iocache.cpu_side = test_sys.iobus.port 15611308Santhony.gutierrez@amd.com test_sys.iocache.mem_side = test_sys.membus.port 15711308Santhony.gutierrez@amd.com 15811308Santhony.gutierrez@amd.comfor i in xrange(np): 15911308Santhony.gutierrez@amd.com if options.fastmem: 16011308Santhony.gutierrez@amd.com test_sys.cpu[i].physmem_port = test_sys.physmem.port 16111308Santhony.gutierrez@amd.com 16211308Santhony.gutierrez@amd.comif buildEnv['TARGET_ISA'] == 'mips': 16311308Santhony.gutierrez@amd.com setMipsOptions(TestCPUClass) 16411308Santhony.gutierrez@amd.com 16511308Santhony.gutierrez@amd.comif len(bm) == 2: 16611308Santhony.gutierrez@amd.com if buildEnv['TARGET_ISA'] == 'alpha': 16711308Santhony.gutierrez@amd.com drive_sys = makeLinuxAlphaSystem(drive_mem_mode, bm[1]) 16811308Santhony.gutierrez@amd.com elif buildEnv['TARGET_ISA'] == 'mips': 16911308Santhony.gutierrez@amd.com drive_sys = makeLinuxMipsSystem(drive_mem_mode, bm[1]) 17011308Santhony.gutierrez@amd.com elif buildEnv['TARGET_ISA'] == 'sparc': 17111308Santhony.gutierrez@amd.com drive_sys = makeSparcSystem(drive_mem_mode, bm[1]) 17211308Santhony.gutierrez@amd.com elif buildEnv['TARGET_ISA'] == 'x86': 17311308Santhony.gutierrez@amd.com drive_sys = makeX86System(drive_mem_mode, np, bm[1]) 17411308Santhony.gutierrez@amd.com elif buildEnv['TARGET_ISA'] == 'arm': 17511308Santhony.gutierrez@amd.com drive_sys = makeLinuxArmSystem(drive_mem_mode, bm[1]) 17611308Santhony.gutierrez@amd.com drive_sys.cpu = DriveCPUClass(cpu_id=0) 17711308Santhony.gutierrez@amd.com drive_sys.cpu.connectMemPorts(drive_sys.membus) 17811308Santhony.gutierrez@amd.com if options.fastmem: 17911308Santhony.gutierrez@amd.com drive_sys.cpu.physmem_port = drive_sys.physmem.port 18011308Santhony.gutierrez@amd.com if options.kernel is not None: 18111699Santhony.gutierrez@amd.com drive_sys.kernel = binary(options.kernel) 18211699Santhony.gutierrez@amd.com 18311699Santhony.gutierrez@amd.com root = makeDualRoot(test_sys, drive_sys, options.etherdump) 18411308Santhony.gutierrez@amd.comelif len(bm) == 1: 18511308Santhony.gutierrez@amd.com root = Root(system=test_sys) 18611308Santhony.gutierrez@amd.comelse: 18711308Santhony.gutierrez@amd.com print "Error I don't know how to create more than 2 systems." 18811308Santhony.gutierrez@amd.com sys.exit(1) 18911308Santhony.gutierrez@amd.com 19011308Santhony.gutierrez@amd.comSimulation.run(options, root, test_sys, FutureClass) 19111308Santhony.gutierrez@amd.com