def genNotifyEventId(anEvent): if pemGlobals.dialect == 'K42': print pemEvent.getEventMajorIdMacro(anEvent.getClassId()), print ",\n\t\t\t"+pemEvent.getEventSpecifierMacro(anEvent), print ", \n\t\t\t" + pemEvent.getLayerIdMacro(anEvent.getLayerId()), elif pemGlobals.dialect == 'AIX': print "TRACE_" + anEvent.getQualifiedSpecifier(), else: print "TRACE_" + anEvent.getQualifiedSpecifier(),
def genNotifyEventId(anEvent): if pemGlobals.dialect == 'K42': print pemEvent.getEventMajorIdMacro(anEvent.getClassId()), print ",\n\t\t\t" + pemEvent.getEventSpecifierMacro(anEvent), print ", \n\t\t\t" + pemEvent.getLayerIdMacro(anEvent.getLayerId()), elif pemGlobals.dialect == 'AIX': print "TRACE_" + anEvent.getQualifiedSpecifier(), else: print "TRACE_" + anEvent.getQualifiedSpecifier(),
def genLayerClassDefs(layer, allClassIds, outputDir): fd = None if pemGlobals.dummyOutput == 0: fd = open(os.path.join(outputDir, "trace" + layer + "Classes.h"), 'w') sys.stdout = fd print "#ifndef __TRACE_" + string.upper(layer) + "_CLASSES_H_" print "#define __TRACE_" + string.upper(layer) + "_CLASSES_H_" genPreamble() # another hack for the K42 hw event list if layer == 'HW': if pemGlobals.hasHWEventList > 0: print '#include "traceHWEventList.h"\n' print '#define', pemEvent.getLayerIdMacro(layer), print pemEvent.PEMLayers[layer] # generate the major_id enum if allClassIds.has_key(layer): print 'enum {' for classId, classVal in allClassIds[layer]: print "\t"+ pemEvent.getEventMajorIdMacro(classId), "=", \ classVal, "," # the most awful hack until I talk to Bob about the LAST_MAJOR_ID if layer == 'OS': print "\tTRACE_LAST_MAJOR_ID_CHECK = 26," print "\tTRACE_LAST_" + string.upper(layer) + "_MAJOR_ID_CHECK" print '};' print '\n' # generate the masks for classId, classVal in allClassIds[layer]: print "#define " + pemEvent.getEventMaskMacro(classId), print "(1 <<", pemEvent.getEventMajorIdMacro(classId) + ")" print '\n' print "#endif /* #ifndef __TRACE_" + string.upper(layer) + "_CLASSES_H_ */" if pemGlobals.dummyOutput == 0: sys.stdout = sys.__stdout__ fd.close()
def genLayerClassDefs(layer, allClassIds, outputDir): fd = None if pemGlobals.dummyOutput == 0: fd = open(os.path.join(outputDir, "trace" + layer + "Classes.h"), 'w') sys.stdout = fd print "#ifndef __TRACE_" + string.upper(layer) + "_CLASSES_H_" print "#define __TRACE_" + string.upper(layer) + "_CLASSES_H_" genPreamble() # another hack for the K42 hw event list if layer == 'HW': if pemGlobals.hasHWEventList > 0: print '#include "traceHWEventList.h"\n' print '#define', pemEvent.getLayerIdMacro(layer), print pemEvent.PEMLayers[layer] # generate the major_id enum if allClassIds.has_key(layer): print 'enum {' for classId, classVal in allClassIds[layer]: print "\t"+ pemEvent.getEventMajorIdMacro(classId), "=", \ classVal, "," # the most awful hack until I talk to Bob about the LAST_MAJOR_ID if layer == 'OS': print "\tTRACE_LAST_MAJOR_ID_CHECK = 26," print "\tTRACE_LAST_" + string.upper(layer) + "_MAJOR_ID_CHECK" print '};' print '\n' # generate the masks for classId, classVal in allClassIds[layer]: print "#define " + pemEvent.getEventMaskMacro(classId), print "(1 <<", pemEvent.getEventMajorIdMacro(classId) +")" print '\n' print "#endif /* #ifndef __TRACE_" + string.upper(layer) + "_CLASSES_H_ */" if pemGlobals.dummyOutput == 0: sys.stdout = sys.__stdout__ fd.close()
def genFiles(layer, layerEvents, outputDir): fd = None for classId in layerEvents.keys(): if pemGlobals.dummyOutput == 0: fd = open(os.path.join(outputDir, "trace" + classId + ".h"), 'w') sys.stdout = fd classIdUpper = string.upper(classId) print "#ifndef __TRACE_" + classIdUpper + "_H_" print "#define __TRACE_" + classIdUpper + "_H_" genPreamble() if pemGlobals.genTraceStubs > 0: print "#ifdef TRACE_STUBS" print "#include <stdio.h>" print "#endif" print "\n" if pemGlobals.dialect == 'AIX': print "/* following for AIX trace hooks */" # print "#include <sys/trcctl.h>" ...not sure this is necessary print "#include <sys/trcmacros.h>" print "#include <sys/trchkid.h>" print "\n" if pemGlobals.dialect != 'K42': print "#include <traceHeader.h>" print "#include <traceRecord.h>" print "#include <notify.h>" print "#include \"trace" + layer + "Classes.h\"\n" print "/* the XLC compiler does not accept inline and long long at the same time." print " * Using the _XLC_INLINE macro we can force the inline. */" print "#ifdef __GNUC__" print "#define _XLC_INLINE static inline" print "#else" print "#define _XLC_INLINE" print "#endif" print "\n" # generate the specifiers enum print 'enum {', for anEvent in layerEvents[classId]: print '\t', pemEvent.getEventSpecifierMacro(anEvent), ',' # generate the specifier for the interval events #for anEvent in layerEvents[classId]: # if anEvent.isIntervalEvent() and anEvent.getIntervalType()=='END': # print '\t', pemEvent.getEventSpecifierMacro(anEvent.transferClassName()), ',' print '\t', "TRACE_" + string.upper( layer) + "_" + classIdUpper + "_MAX" print '};\n' # generate global eventId macros if pemGlobals.dialect != 'K42': for anEvent in layerEvents[classId]: print "#define TRACE_"+anEvent.getQualifiedSpecifier()+ \ " \\\n"+ " (" +\ "(" + pemEvent.getLayerIdMacro(layer) + "<<20)|(" + \ pemEvent.getEventMajorIdMacro(classId) + "<<14)|(" + \ pemEvent.getEventSpecifierMacro(anEvent) + "))" print '\n' if pemGlobals.dialect == 'K42': genParseEventStructures(layerEvents[classId], classId) # generate the function calls if classId != 'Default': genInlineMethods(layerEvents[classId], classId) print "#endif /* #ifndef __TRACE_" + classIdUpper + "_H_ */" if pemGlobals.dummyOutput == 0: sys.stdout = sys.__stdout__ fd.close()
def genK42Wrappers(layerId, classId, layerEvents): wrappers = [] classIdUpper = string.upper(classId) print "#include <trace/trace" + classId + ".h>\n" # generate the trace event macros/inlines fName = "trace" + classId + "Enabled" wrappers.append(fName) fName = string.lower(fName) print 'inline uval' print fName + "() {" print "\treturn (kernelInfoLocal.traceInfo.mask & " + \ pemEvent.getEventMaskMacro(classId) + ");" print "}" print '\n' # generate the generic inline functions # genGenericInlines(classId) # a list of lists of data arguments dataArgs = [] for anEvent in layerEvents[classId]: args = [] for field in anEvent._fieldSeq: args.append(anEvent.getFieldType(field)) if dataArgs.count(args) == 0: dataArgs.append(args) # generate all the inlines for args in dataArgs: (words, strings) = countWordsAndStrings(args) print 'inline void' fName = getMethodName(classId, args) wrappers.append(fName) fName = string.lower(fName) print fName + "(uval16 * minorId", whichArg = 0 for arg in args: if arg == 'string': print ", "+ pemTypes.getCType(arg) + " data" + str(whichArg), print ", int len" + str(whichArg), else: print ", "+ pemTypes.getCType(arg) +" * data"+ str(whichArg), whichArg = whichArg+1 print ") {" print "\t if(unlikely(kernelInfoLocal.traceInfo.mask & " + \ pemEvent.getEventMaskMacro(classId) + ")) {" if strings == 0: print "\t\ttraceDefault" + str(len(args)), print "(TRACE_" + classIdUpper + "_MAJOR_ID, *minorId," + \ pemEvent.getLayerIdMacro(layerId), else: # add a NULL if there are string args whichArg = 0 for arg in args: if arg == 'string': print "\t\t((char *)data"+str(whichArg) + ")[len"+str(whichArg) + \ "] = '\\0';" whichArg = whichArg + 1 print "\t\ttraceDefaultGeneric (", print "TRACE_" + classIdUpper + "_MAJOR_ID, *minorId," + \ pemEvent.getLayerIdMacro(layerId) + ",", print str(words) + ", " + str(strings), whichArg = 0 for arg in args: if arg == 'string': print ", data" + str(whichArg), else: print ", *data" + str(whichArg), whichArg = whichArg + 1 print ");" print "\t}" print "}\n"
def genGenericWrappers(layerId, classId, layerEvents): print '#define uval unsigned int' print '#define uval16 unsigned short' print '#define uval32 unsigned long' print '#define uval64 unsigned long long' print "#include <trace" + classId + ".h>\n" wrappers = [] classIdUpper = string.upper(classId) # a list of lists of data arguments dataArgs = [] for anEvent in layerEvents[classId]: args = [] for field in anEvent._fieldSeq: args.append(anEvent.getFieldType(field)) if dataArgs.count(args) == 0: dataArgs.append(args) # generate all the inlines for args in dataArgs: (words, strings) = countWordsAndStrings(args) print 'inline void' fName = getMethodName(classId, args) wrappers.append(fName) fName = string.lower(fName) print fName + "(uval16 * minorId", whichArg = 0 for arg in args: if arg == 'string': print ", "+ pemTypes.getCType(arg) + " data" + str(whichArg), print ", int len" + str(whichArg), else: print ", "+ pemTypes.getCType(arg) +" * data"+ str(whichArg), whichArg = whichArg+1 print ") {" if strings == 0: print "\t\tnotifyEvent" + str(len(args)) + "(", print "(("+pemEvent.getLayerIdMacro(layerId) + "<<20)|(TRACE_"\ + classIdUpper + "_MAJOR_ID<<14)|(*minorId))", else: print "\t\tnotifyEventGeneric (", print "(("+pemEvent.getLayerIdMacro(layerId) + "<<20)|(TRACE_"\ + classIdUpper + "_MAJOR_ID<<14)|(*minorId))" + ",", print str(words) + ", " + str(strings), whichArg = 0 for arg in args: if arg == 'string': print ", data" + str(whichArg), else: print ", *data" + str(whichArg), whichArg = whichArg + 1 print ");" print "}" print "#ifdef __GNUC__" print "void "+fName+"_() __attribute__ ((weak,alias(\""+fName+"\")));" print "#endif" print '\n'
def genFiles(layer, layerEvents, outputDir): fd = None for classId in layerEvents.keys(): if pemGlobals.dummyOutput == 0: fd = open(os.path.join(outputDir, "trace" + classId + ".h"), 'w') sys.stdout = fd classIdUpper = string.upper(classId) print "#ifndef __TRACE_" + classIdUpper + "_H_" print "#define __TRACE_" + classIdUpper + "_H_" genPreamble() if pemGlobals.genTraceStubs > 0: print "#ifdef TRACE_STUBS" print "#include <stdio.h>" print "#endif" print "\n" if pemGlobals.dialect == 'AIX': print "/* following for AIX trace hooks */" # print "#include <sys/trcctl.h>" ...not sure this is necessary print "#include <sys/trcmacros.h>" print "#include <sys/trchkid.h>" print "\n" if pemGlobals.dialect != 'K42': print "#include <traceHeader.h>" print "#include <traceRecord.h>" print "#include <notify.h>" print "#include \"trace" + layer + "Classes.h\"\n" print "/* the XLC compiler does not accept inline and long long at the same time." print " * Using the _XLC_INLINE macro we can force the inline. */" print "#ifdef __GNUC__" print "#define _XLC_INLINE static inline" print "#else" print "#define _XLC_INLINE" print "#endif" print "\n" # generate the specifiers enum print 'enum {', for anEvent in layerEvents[classId]: print '\t', pemEvent.getEventSpecifierMacro(anEvent), ',' # generate the specifier for the interval events #for anEvent in layerEvents[classId]: # if anEvent.isIntervalEvent() and anEvent.getIntervalType()=='END': # print '\t', pemEvent.getEventSpecifierMacro(anEvent.transferClassName()), ',' print '\t',"TRACE_" + string.upper(layer) + "_" + classIdUpper + "_MAX" print '};\n' # generate global eventId macros if pemGlobals.dialect != 'K42': for anEvent in layerEvents[classId]: print "#define TRACE_"+anEvent.getQualifiedSpecifier()+ \ " \\\n"+ " (" +\ "(" + pemEvent.getLayerIdMacro(layer) + "<<20)|(" + \ pemEvent.getEventMajorIdMacro(classId) + "<<14)|(" + \ pemEvent.getEventSpecifierMacro(anEvent) + "))" print '\n' if pemGlobals.dialect == 'K42': genParseEventStructures(layerEvents[classId], classId) # generate the function calls if classId != 'Default': genInlineMethods(layerEvents[classId], classId) print "#endif /* #ifndef __TRACE_" + classIdUpper + "_H_ */" if pemGlobals.dummyOutput == 0: sys.stdout = sys.__stdout__ fd.close()