1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 'use strict'; 6 7 /** 8 * @fileoverview Parses irq events in the Linux event trace format. 9 */ 10 base.require('tracing.importer.linux_perf.parser'); 11 base.exportTo('tracing.importer.linux_perf', function() { 12 13 var Parser = tracing.importer.linux_perf.Parser; 14 15 /** 16 * Parses linux irq trace events. 17 * @constructor 18 */ 19 function IrqParser(importer) { 20 Parser.call(this, importer); 21 22 importer.registerEventHandler('irq_handler_entry', 23 IrqParser.prototype.irqHandlerEntryEvent.bind(this)); 24 importer.registerEventHandler('irq_handler_exit', 25 IrqParser.prototype.irqHandlerExitEvent.bind(this)); 26 importer.registerEventHandler('softirq_raise', 27 IrqParser.prototype.softirqRaiseEvent.bind(this)); 28 importer.registerEventHandler('softirq_entry', 29 IrqParser.prototype.softirqEntryEvent.bind(this)); 30 importer.registerEventHandler('softirq_exit', 31 IrqParser.prototype.softirqExitEvent.bind(this)); 32 } 33 34 // Matches the irq_handler_entry record 35 var irqHandlerEntryRE = /irq=(\d+) name=(.+)/; 36 37 // Matches the irq_handler_exit record 38 var irqHandlerExitRE = /irq=(\d+) ret=(.+)/; 39 40 // Matches the softirq_raise record 41 var softirqRE = /vec=(\d+) \[action=(.+)\]/; 42 43 IrqParser.prototype = { 44 __proto__: Parser.prototype, 45 46 /** 47 * Parses irq events and sets up state in the importer. 48 */ 49 irqHandlerEntryEvent: function(eventName, cpuNumber, pid, ts, eventBase) { 50 var event = irqHandlerEntryRE.exec(eventBase.details); 51 if (!event) 52 return false; 53 54 var irq = parseInt(event[1]); 55 var name = event[2]; 56 57 var thread = this.importer.getOrCreatePseudoThread("irqs cpu " + cpuNumber); 58 thread.lastEntryTs = ts; 59 thread.irqName = name; 60 61 return true; 62 }, 63 64 irqHandlerExitEvent: function(eventName, cpuNumber, pid, ts, eventBase) { 65 var event = irqHandlerExitRE.exec(eventBase.details); 66 if (!event) 67 return false; 68 69 var irq = parseInt(event[1]); 70 var ret = event[2]; 71 var thread = this.importer.getOrCreatePseudoThread("irqs cpu " + cpuNumber); 72 73 if (thread.lastEntryTs !== undefined) { 74 var duration = ts - thread.lastEntryTs; 75 var slice = new tracing.trace_model.Slice( 76 '', thread.irqName, 77 tracing.getStringColorId(event[1]), 78 thread.lastEntryTs, { ret: ret }, 79 duration); 80 thread.thread.sliceGroup.pushSlice(slice); 81 } 82 thread.lastEntryTs = undefined; 83 thread.irqName = undefined; 84 return true; 85 }, 86 87 softirqRaiseEvent: function(eventName, cpuNumber, pid, ts, eventBase) {return true}, 88 89 softirqEntryEvent: function(eventName, cpuNumber, pid, ts, eventBase) { 90 var event = softirqRE.exec(eventBase.details); 91 if (!event) 92 return false; 93 94 var action = event[2]; 95 var thread = this.importer.getOrCreatePseudoThread("softirq cpu " + cpuNumber); 96 thread.lastEntryTs = ts; 97 98 return true; 99 }, 100 101 softirqExitEvent: function(eventName, cpuNumber, pid, ts, eventBase) { 102 var event = softirqRE.exec(eventBase.details); 103 if (!event) 104 return false; 105 106 var vec = parseInt(event[1]); 107 var action = event[2]; 108 var thread = this.importer.getOrCreatePseudoThread("softirq cpu " + cpuNumber); 109 110 if (thread.lastEntryTs !== undefined) { 111 var duration = ts - thread.lastEntryTs; 112 var slice = new tracing.trace_model.Slice( 113 '', action, 114 tracing.getStringColorId(event[1]), 115 thread.lastEntryTs, { vec: vec }, 116 duration); 117 thread.thread.sliceGroup.pushSlice(slice); 118 } 119 thread.lastEntryTs = undefined; 120 return true; 121 } 122 }; 123 124 Parser.registerSubtype(IrqParser); 125 126 return { 127 IrqParser: IrqParser, 128 }; 129 }); 130