gem5: make serial port configurable
[barrelfish] / tools / arm_gem5 / gem5script.py
1 # Simple M5 script for use with Barrelfish.  This creates a very 
2 # basic machine with a set of CPUs connected directly to the
3 # simulated memory.  
4 #
5 # (See configs/example/* in the M5 distribution for examples of
6 # fuller scripts -- caches, etc.).
7
8 # Determine script pathname
9 import inspect, os
10 import optparse
11 import os
12 import sys
13 import m5
14
15 from m5.defines import buildEnv
16 from m5.objects import *
17 from m5.util import fatal
18
19 from O3_ARM_v7a import *
20 import CacheConfig
21 from Caches import *
22
23 # Try to determine Barrelfish source directory
24 # We assume that this script remains in tools/arm_gem5
25 bfsrcdir='%s/../..' % os.path.dirname(inspect.getfile(inspect.currentframe()))
26 print "Barrelfish source-directory is assume to be %s" % bfsrcdir
27
28 class MemBus(CoherentBus):
29     badaddr_responder = BadAddr()
30     default = Self.badaddr_responder.pio
31     
32 #######################################################################
33 #
34 # Utility functions
35 def setCPUClass(options):
36
37     atomic = False
38     if options.cpu_type == "timing":
39         class TmpClass(TimingSimpleCPU): pass
40     elif options.cpu_type == "detailed" or options.cpu_type == "arm_detailed":
41         if not options.caches and not options.ruby:
42             print "O3 CPU must be used with caches"
43             sys.exit(1)
44         if options.cpu_type == "arm_detailed":
45             class TmpClass(O3_ARM_v7a_3): pass
46         else:
47             class TmpClass(DerivO3CPU): pass
48     elif options.cpu_type == "inorder":
49         if not options.caches:
50             print "InOrder CPU must be used with caches"
51             sys.exit(1)
52         class TmpClass(InOrderCPU): pass
53     else:
54         class TmpClass(AtomicSimpleCPU): pass
55         atomic = True
56
57     CPUClass = None
58     test_mem_mode = 'atomic'
59
60     if not atomic:
61             test_mem_mode = 'timing'
62
63     return (TmpClass, test_mem_mode, CPUClass)
64
65 #######################################################################
66 #
67 # Check that we are running on a full-system arm simulator
68
69 if not buildEnv['TARGET_ISA'] == "arm":
70     fatal("Expected TARGET_ISA == arm");
71     
72 #######################################################################
73 #
74 # Set up basic configuration options 
75
76 parser = optparse.OptionParser()
77 parser.add_option("--kernel", action="store", type="string")
78 parser.add_option("--ramdisk", action="store", type="string") 
79 parser.add_option("-n", "--num_cpus", type="int", default=1)
80 parser.add_option("--cpu-type", type="choice", default="atomic",
81                   choices = ["atomic", "arm_detailed"],
82                   help = "type of cpu to run with")
83 parser.add_option("--caches", action="store_true")
84 parser.add_option("--l2cache", action="store_true")
85 parser.add_option("--l1d_size", type="string", default="64kB")
86 parser.add_option("--l1i_size", type="string", default="32kB")
87 parser.add_option("--l2_size", type="string", default="2MB")
88 parser.add_option("--l3_size", type="string", default="16MB")
89 parser.add_option("--l1d_assoc", type="int", default=2)
90 parser.add_option("--l1i_assoc", type="int", default=2)
91 parser.add_option("--l2_assoc", type="int", default=8)
92 parser.add_option("--l3_assoc", type="int", default=16)
93 parser.add_option("--cacheline_size", type="int", default=64)
94 parser.add_option("--loglevel", type="int", default=4)
95 parser.add_option("--console-port", type="int", default=3456)
96 (options, args) = parser.parse_args()
97 print options
98     
99 #######################################################################
100 #
101 # Create simulated machine.
102
103
104 (CPUClass, mem_mode, FutureClass) = setCPUClass(options)
105
106 system = ArmSystem()
107
108 #kernel to boot
109 system.kernel = options.kernel
110
111
112 #memory system
113 system.iobus = NoncoherentBus()
114 system.membus = MemBus()
115 system.membus.badaddr_responder.warn_access = "warn"
116
117 system.bridge = Bridge(delay='50ns')
118 system.bridge.master = system.iobus.slave
119 system.bridge.slave = system.membus.master
120
121 system.physmem = SimpleMemory(range = AddrRange('256MB'),conf_table_reported = True)
122
123 system.mem_mode = mem_mode
124 #load ramdisk at specific location (256MB = @0x10000000)
125 #system.ramdisk = SimpleMemory(range = AddrRange(Addr('256MB'), size = '256MB'), file=options.ramdisk)
126 #system.ramdisk.port = system.membus.master
127
128 #CPU(s)
129 CPUClass.clock = "1GHz"
130 system.cpu = [CPUClass(cpu_id=i) for i in xrange(options.num_cpus)]
131
132 #machine type
133 system.realview = VExpress_EMM()
134
135 #setup bootloader
136 system.realview.nvmem = SimpleMemory(range = AddrRange(Addr('2GB'), size = '64MB'), zero = True)
137 system.realview.nvmem.port = system.membus.master
138 # System boot loader is now given relative to source directory
139 system.boot_loader = ('%s/tools/arm_gem5/boot.arm' % bfsrcdir)
140 #system.boot_loader_mem = system.realview.nvmem
141 #system.realview.setupBootLoader(system.membus, system, '../tools/arm_gem5/boot.arm')
142 system.gic_cpu_addr = system.realview.gic.cpu_addr
143 system.flags_addr = system.realview.realview_io.pio_addr + 0x30
144
145 boot_flags = 'rw loglevel=%s' % (options.loglevel)
146 system.boot_osflags = boot_flags
147
148 system.realview.attachOnChipIO(system.membus, system.bridge)
149 system.realview.attachIO(system.iobus)
150 system.intrctrl = IntrControl()
151 system.terminal = Terminal(port=options.console_port)
152 system.vncserver = VncServer()
153
154 system.physmem.port = system.membus.master
155
156
157 system.system_port = system.membus.slave
158
159 #Caches
160 if options.caches or options.l2cache:
161     system.iocache = IOCache(addr_ranges=[system.physmem.range])
162     system.iocache.cpu_side = system.iobus.master
163     system.iocache.mem_side = system.membus.slave
164 else:
165     system.iobridge = Bridge(delay='50ns',
166                                ranges = [system.physmem.range])
167     system.iobridge.slave = system.iobus.master
168     system.iobridge.master = system.membus.slave
169     
170 CacheConfig.config_cache(options, system)
171
172 #######################################################################
173 #
174 # Start simulation
175
176 root = Root(full_system=True, system=system)
177 m5.instantiate()
178
179 print '..... STARTING SIMULATION'
180
181 exit_event = m5.simulate()
182 exit_cause = exit_event.getCause()
183
184 print 'Exiting @ tick %i because %s' % (m5.curTick(), exit_cause)