Get X86 to load an elf and start a process for it.
[gem5.git] / src / base / traceflags.py
1 #!/usr/bin/env python
2
3 # Copyright (c) 2004-2005 The Regents of The University of Michigan
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions are
8 # met: redistributions of source code must retain the above copyright
9 # notice, this list of conditions and the following disclaimer;
10 # redistributions in binary form must reproduce the above copyright
11 # notice, this list of conditions and the following disclaimer in the
12 # documentation and/or other materials provided with the distribution;
13 # neither the name of the copyright holders nor the names of its
14 # contributors may be used to endorse or promote products derived from
15 # this software without specific prior written permission.
16 #
17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #
29 # Authors: Nathan Binkert
30 # Steve Reinhardt
31
32 __all__ = [ 'allFlags', 'baseFlags', 'compoundFlagsMap', 'compoundFlags' ]
33
34 #
35 # The list of trace flags that can be used to condition DPRINTFs etc.
36 # To define a new flag, simply add it to this list.
37 #
38 baseFlags = [
39 'Activity',
40 'AlphaConsole',
41 'Annotate',
42 'BADADDR',
43 'BE',
44 'BPredRAS',
45 'Bus',
46 'BusAddrRanges',
47 'BusBridge',
48 'Cache',
49 'CachePort',
50 'Chains',
51 'Checker',
52 'Clock',
53 'Commit',
54 'CommitRate',
55 'Config',
56 'Console',
57 'ConsolePoll',
58 'ConsoleVerbose',
59 'Context',
60 'Cycle',
61 'DMA',
62 'DMAReadVerbose',
63 'DMAWriteVerbose',
64 'DebugPrintf',
65 'Decode',
66 'DiskImage',
67 'DiskImageRead',
68 'DiskImageWrite',
69 'DynInst',
70 'Ethernet',
71 'EthernetCksum',
72 'EthernetDMA',
73 'EthernetData',
74 'EthernetDesc',
75 'EthernetEEPROM',
76 'EthernetIntr',
77 'EthernetPIO',
78 'EthernetSM',
79 'Event',
80 'ExecEnable',
81 'ExecCPSeq',
82 'ExecEffAddr',
83 'ExecFetchSeq',
84 'ExecIntRegs',
85 'ExecIntel',
86 'ExecLegion',
87 'ExecOpClass',
88 'ExecRegDelta',
89 'ExecResult',
90 'ExecSpeculative',
91 'ExecSymbol',
92 'ExecThread',
93 'ExecTicks',
94 'FE',
95 'Fault',
96 'Fetch',
97 'Flow',
98 'FreeList',
99 'FullCPU',
100 'FunctionalAccess',
101 'GDBAcc',
102 'GDBExtra',
103 'GDBMisc',
104 'GDBRead',
105 'GDBRecv',
106 'GDBSend',
107 'GDBWrite',
108 'HWPrefetch',
109 'IBE',
110 'IEW',
111 'IIC',
112 'IICMore',
113 'IPI',
114 'IPR',
115 'IQ',
116 'ISP',
117 'IdeCtrl',
118 'IdeDisk',
119 'Interrupt',
120 'LLSC',
121 'LSQ',
122 'LSQUnit',
123 'Loader',
124 'MC146818',
125 'MMU',
126 'MSHR',
127 'Mbox',
128 'MemDepUnit',
129 'MemoryAccess',
130 'O3CPU',
131 'OzoneCPU',
132 'OzoneLSQ',
133 'PCEvent',
134 'PCIA',
135 'PCIDEV',
136 'PciConfigAll',
137 'Pipeline',
138 'Printf',
139 'Quiesce',
140 'ROB',
141 'Regs',
142 'Rename',
143 'RenameMap',
144 'SQL',
145 'Sampler',
146 'Scoreboard',
147 'ScsiCtrl',
148 'ScsiDisk',
149 'ScsiNone',
150 'Serialize',
151 'SimpleCPU',
152 'SimpleDisk',
153 'SimpleDiskData',
154 'Sparc',
155 'Split',
156 'Stack',
157 'StatEvents',
158 'Stats',
159 'StoreSet',
160 'Syscall',
161 'SyscallVerbose',
162 'TCPIP',
163 'TLB',
164 'Thread',
165 'Timer',
166 'Tsunami',
167 'Uart',
168 'VtoPhys',
169 'WriteBarrier',
170 'Writeback',
171 'X86',
172 ]
173
174 #
175 # "Compound" flags correspond to a set of base flags. These exist
176 # solely for convenience in setting them via the command line: if a
177 # compound flag is specified, all of the corresponding base flags are
178 # set. Compound flags cannot be used directly in DPRINTFs etc.
179 # To define a new compound flag, add a new entry to this hash
180 # following the existing examples.
181 #
182 compoundFlagMap = {
183 'All' : baseFlags,
184 'DiskImageAll' : [ 'DiskImage', 'DiskImageRead', 'DiskImageWrite' ],
185 'EthernetAll' : [ 'Ethernet', 'EthernetPIO', 'EthernetDMA',
186 'EthernetData' , 'EthernetDesc', 'EthernetIntr',
187 'EthernetSM', 'EthernetCksum' ],
188 'EthernetNoData' : [ 'Ethernet', 'EthernetPIO', 'EthernetDesc',
189 'EthernetIntr', 'EthernetSM', 'EthernetCksum' ],
190 'Exec' : [ 'ExecEnable', 'ExecTicks', 'ExecOpClass',
191 'ExecThread', 'ExecEffAddr', 'ExecResult',
192 'ExecSymbol' ],
193 'GDBAll' : [ 'GDBMisc', 'GDBAcc', 'GDBRead', 'GDBWrite', 'GDBSend',
194 'GDBRecv', 'GDBExtra' ],
195 'IdeAll' : [ 'IdeCtrl', 'IdeDisk' ],
196 'O3CPUAll' : [ 'Fetch', 'Decode', 'Rename', 'IEW', 'Commit', 'IQ',
197 'ROB', 'FreeList', 'RenameMap', 'LSQ', 'LSQUnit',
198 'StoreSet', 'MemDepUnit', 'DynInst', 'FullCPU',
199 'O3CPU', 'Activity','Scoreboard','Writeback' ],
200 'OzoneCPUAll' : [ 'BE', 'FE', 'IBE', 'OzoneLSQ', 'OzoneCPU' ],
201 'ScsiAll' : [ 'ScsiDisk', 'ScsiCtrl', 'ScsiNone' ]
202 }
203
204 # extract just the compound flag names into a list
205 compoundFlags = []
206 compoundFlags.extend(compoundFlagMap.keys())
207 compoundFlags.sort()
208
209 allFlags = frozenset(baseFlags + compoundFlags)
210
211 #############################################################
212 #
213 # Everything below this point generates the appropriate C++
214 # declarations and definitions for the trace flags. If you are simply
215 # adding or modifying flag definitions, you should not have to change
216 # anything below.
217 #
218 def gen_hh(filename):
219 #
220 # First generate the header file. This defines the Flag enum
221 # and some extern declarations for the .cc file.
222 #
223 try:
224 hhfile = file(filename, 'w')
225 except IOError, e:
226 sys.exit("can't open %s: %s" % (hhfilename, e))
227
228 # file header boilerplate
229 print >>hhfile, '''
230 /*
231 * DO NOT EDIT THIS FILE!
232 *
233 * Automatically generated from traceflags.py
234 */
235
236 #ifndef __BASE_TRACE_FLAGS_HH__
237 #define __BASE_TRACE_FLAGS_HH__
238
239 namespace Trace {
240
241 enum Flags {
242 ''',
243
244 # Generate the enum. Base flags come first, then compound flags.
245 idx = 0
246 for flag in baseFlags:
247 print >>hhfile, ' %s = %d,' % (flag, idx)
248 idx += 1
249
250 numBaseFlags = idx
251 print >>hhfile, ' NumFlags = %d,' % idx
252
253 # put a comment in here to separate base from compound flags
254 print >>hhfile, '''
255 // The remaining enum values are *not* valid indices for Trace::flags.
256 // They are "compound" flags, which correspond to sets of base
257 // flags, and are used by changeFlag.
258 ''',
259
260 for flag in compoundFlags:
261 print >>hhfile, ' %s = %d,' % (flag, idx)
262 idx += 1
263
264 numCompoundFlags = idx - numBaseFlags
265 print >>hhfile, ' NumCompoundFlags = %d' % numCompoundFlags
266
267 # trailer boilerplate
268 print >>hhfile, '''\
269 }; // enum Flags
270
271 // Array of strings for SimpleEnumParam
272 extern const char *flagStrings[];
273 extern const int numFlagStrings;
274
275 // Array of arraay pointers: for each compound flag, gives the list of
276 // base flags to set. Inidividual flag arrays are terminated by -1.
277 extern const Flags *compoundFlags[];
278
279 /* namespace Trace */ }
280
281 #endif // __BASE_TRACE_FLAGS_HH__
282 \n''',
283
284 hhfile.close()
285
286 def gen_cc(filename):
287 '''Print out .cc file with array definitions.'''
288
289 try:
290 ccfile = file(filename, 'w')
291 except OSError, e:
292 sys.exit("can't open %s: %s" % (ccfilename, e))
293
294 # file header
295 print >>ccfile, '''
296 /*
297 * DO NOT EDIT THIS FILE!
298 *
299 * Automatically generated from traceflags.pl.
300 */
301
302 #include "base/traceflags.hh"
303
304 using namespace Trace;
305
306 const char *Trace::flagStrings[] =
307 {
308 ''',
309
310 # The string array is used by SimpleEnumParam to map the strings
311 # provided by the user to enum values.
312 for flag in baseFlags:
313 print >>ccfile, ' "%s",' % flag
314
315 for flag in compoundFlags:
316 print >>ccfile, ' "%s",' % flag
317
318 print >>ccfile, '};\n'
319
320 numFlagStrings = len(baseFlags) + len(compoundFlags);
321
322 print >>ccfile, 'const int Trace::numFlagStrings = %d;' % numFlagStrings
323 print >>ccfile
324
325 #
326 # Now define the individual compound flag arrays. There is an array
327 # for each compound flag listing the component base flags.
328 #
329
330 for flag in compoundFlags:
331 flags = compoundFlagMap[flag]
332 flags.append('(Flags)-1')
333 print >>ccfile, 'static const Flags %sMap[] =' % flag
334 print >>ccfile, '{ %s };' % (', '.join(flags))
335 print >>ccfile
336
337 #
338 # Finally the compoundFlags[] array maps the compound flags
339 # to their individual arrays/
340 #
341 print >>ccfile, 'const Flags *Trace::compoundFlags[] ='
342 print >>ccfile, '{'
343
344 for flag in compoundFlags:
345 print >>ccfile, ' %sMap,' % flag
346
347 # file trailer
348 print >>ccfile, '};'
349
350 ccfile.close()
351
352 if __name__ == '__main__':
353 # This file generates the header and source files for the flags
354 # that control the tracing facility.
355
356 import sys
357
358 if len(sys.argv) != 2:
359 print "%s: Need argument (basename of cc/hh files)" % sys.argv[0]
360 sys.exit(1)
361
362 gen_hh(sys.argv[1] + '.hh')
363 gen_cc(sys.argv[1] + '.cc')