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