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