1aa5d9151SArjan van de Ven#!/usr/bin/perl 2aa5d9151SArjan van de Ven 3aa5d9151SArjan van de Ven# Copyright 2008, Intel Corporation 4aa5d9151SArjan van de Ven# 5aa5d9151SArjan van de Ven# This file is part of the Linux kernel 6aa5d9151SArjan van de Ven# 7aa5d9151SArjan van de Ven# This program file is free software; you can redistribute it and/or modify it 8aa5d9151SArjan van de Ven# under the terms of the GNU General Public License as published by the 9aa5d9151SArjan van de Ven# Free Software Foundation; version 2 of the License. 10aa5d9151SArjan van de Ven# 11aa5d9151SArjan van de Ven# This program is distributed in the hope that it will be useful, but WITHOUT 12aa5d9151SArjan van de Ven# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13aa5d9151SArjan van de Ven# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14aa5d9151SArjan van de Ven# for more details. 15aa5d9151SArjan van de Ven# 16aa5d9151SArjan van de Ven# You should have received a copy of the GNU General Public License 17aa5d9151SArjan van de Ven# along with this program in a file named COPYING; if not, write to the 18aa5d9151SArjan van de Ven# Free Software Foundation, Inc., 19aa5d9151SArjan van de Ven# 51 Franklin Street, Fifth Floor, 20aa5d9151SArjan van de Ven# Boston, MA 02110-1301 USA 21aa5d9151SArjan van de Ven# 22aa5d9151SArjan van de Ven# Authors: 23aa5d9151SArjan van de Ven# Arjan van de Ven <arjan@linux.intel.com> 24aa5d9151SArjan van de Ven 25aa5d9151SArjan van de Ven 26aa5d9151SArjan van de Ven# 27aa5d9151SArjan van de Ven# This script turns a dmesg output into a SVG graphic that shows which 28aa5d9151SArjan van de Ven# functions take how much time. You can view SVG graphics with various 29aa5d9151SArjan van de Ven# programs, including Inkscape, The Gimp and Firefox. 30aa5d9151SArjan van de Ven# 31aa5d9151SArjan van de Ven# 32aa5d9151SArjan van de Ven# For this script to work, the kernel needs to be compiled with the 33aa5d9151SArjan van de Ven# CONFIG_PRINTK_TIME configuration option enabled, and with 34aa5d9151SArjan van de Ven# "initcall_debug" passed on the kernel command line. 35aa5d9151SArjan van de Ven# 36aa5d9151SArjan van de Ven# usage: 37aa5d9151SArjan van de Ven# dmesg | perl scripts/bootgraph.pl > output.svg 38aa5d9151SArjan van de Ven# 39aa5d9151SArjan van de Ven 40*ddc7a01aSFrederic Weisbeckermy %start, %end; 41aa5d9151SArjan van de Venmy $done = 0; 42aa5d9151SArjan van de Venmy $maxtime = 0; 43aa5d9151SArjan van de Venmy $count = 0; 44*ddc7a01aSFrederic Weisbeckermy %pids; 45*ddc7a01aSFrederic Weisbecker 46aa5d9151SArjan van de Venwhile (<>) { 47aa5d9151SArjan van de Ven my $line = $_; 48aa5d9151SArjan van de Ven if ($line =~ /([0-9\.]+)\] calling ([a-zA-Z\_]+)\+/) { 49aa5d9151SArjan van de Ven my $func = $2; 50aa5d9151SArjan van de Ven if ($done == 0) { 51aa5d9151SArjan van de Ven $start{$func} = $1; 52aa5d9151SArjan van de Ven } 53aa5d9151SArjan van de Ven if ($line =~ /\@ ([0-9]+)/) { 54*ddc7a01aSFrederic Weisbecker $pids{$func} = $1; 55aa5d9151SArjan van de Ven } 56aa5d9151SArjan van de Ven $count = $count + 1; 57aa5d9151SArjan van de Ven } 58aa5d9151SArjan van de Ven 59aa5d9151SArjan van de Ven if ($line =~ /([0-9\.]+)\] initcall ([a-zA-Z\_]+)\+.*returned/) { 60aa5d9151SArjan van de Ven if ($done == 0) { 61aa5d9151SArjan van de Ven $end{$2} = $1; 62aa5d9151SArjan van de Ven $maxtime = $1; 63aa5d9151SArjan van de Ven } 64aa5d9151SArjan van de Ven } 65aa5d9151SArjan van de Ven if ($line =~ /Write protecting the/) { 66aa5d9151SArjan van de Ven $done = 1; 67aa5d9151SArjan van de Ven } 68aa5d9151SArjan van de Ven} 69aa5d9151SArjan van de Ven 70aa5d9151SArjan van de Venif ($count == 0) { 71aa5d9151SArjan van de Ven print "No data found in the dmesg. Make sure CONFIG_PRINTK_TIME is enabled and\n"; 72aa5d9151SArjan van de Ven print "that initcall_debug is passed on the kernel command line.\n\n"; 73aa5d9151SArjan van de Ven print "Usage: \n"; 74aa5d9151SArjan van de Ven print " dmesg | perl scripts/bootgraph.pl > output.svg\n\n"; 75aa5d9151SArjan van de Ven exit; 76aa5d9151SArjan van de Ven} 77aa5d9151SArjan van de Ven 78aa5d9151SArjan van de Venprint "<?xml version=\"1.0\" standalone=\"no\"?> \n"; 79aa5d9151SArjan van de Venprint "<svg width=\"1000\" height=\"100%\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n"; 80aa5d9151SArjan van de Ven 81aa5d9151SArjan van de Venmy @styles; 82aa5d9151SArjan van de Ven 83aa5d9151SArjan van de Ven$styles[0] = "fill:rgb(0,0,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 84aa5d9151SArjan van de Ven$styles[1] = "fill:rgb(0,255,0);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 85aa5d9151SArjan van de Ven$styles[2] = "fill:rgb(255,0,20);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 86aa5d9151SArjan van de Ven$styles[3] = "fill:rgb(255,255,20);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 87aa5d9151SArjan van de Ven$styles[4] = "fill:rgb(255,0,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 88aa5d9151SArjan van de Ven$styles[5] = "fill:rgb(0,255,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 89aa5d9151SArjan van de Ven$styles[6] = "fill:rgb(0,128,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 90aa5d9151SArjan van de Ven$styles[7] = "fill:rgb(0,255,128);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 91aa5d9151SArjan van de Ven$styles[8] = "fill:rgb(255,0,128);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 92aa5d9151SArjan van de Ven$styles[9] = "fill:rgb(255,255,128);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 93aa5d9151SArjan van de Ven$styles[10] = "fill:rgb(255,128,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 94aa5d9151SArjan van de Ven$styles[11] = "fill:rgb(128,255,255);fill-opacity:0.5;stroke-width:1;stroke:rgb(0,0,0)"; 95aa5d9151SArjan van de Ven 96aa5d9151SArjan van de Venmy $mult = 950.0 / $maxtime; 97aa5d9151SArjan van de Venmy $threshold = 0.0500 / $maxtime; 98aa5d9151SArjan van de Venmy $stylecounter = 0; 99*ddc7a01aSFrederic Weisbeckermy %rows; 100*ddc7a01aSFrederic Weisbeckermy $rowscount = 1; 101aa5d9151SArjan van de Venwhile (($key,$value) = each %start) { 102aa5d9151SArjan van de Ven my $duration = $end{$key} - $start{$key}; 103aa5d9151SArjan van de Ven 104aa5d9151SArjan van de Ven if ($duration >= $threshold) { 105aa5d9151SArjan van de Ven my $s, $s2, $e, $y; 106*ddc7a01aSFrederic Weisbecker $pid = $pids{$key}; 107*ddc7a01aSFrederic Weisbecker 108*ddc7a01aSFrederic Weisbecker if (!defined($rows{$pid})) { 109*ddc7a01aSFrederic Weisbecker $rows{$pid} = $rowscount; 110*ddc7a01aSFrederic Weisbecker $rowscount = $rowscount + 1; 111*ddc7a01aSFrederic Weisbecker } 112*ddc7a01aSFrederic Weisbecker $s = ($value - $firsttime) * $mult; 113aa5d9151SArjan van de Ven $s2 = $s + 6; 114aa5d9151SArjan van de Ven $e = $end{$key} * $mult; 115aa5d9151SArjan van de Ven $w = $e - $s; 116aa5d9151SArjan van de Ven 117*ddc7a01aSFrederic Weisbecker $y = $rows{$pid} * 150; 118aa5d9151SArjan van de Ven $y2 = $y + 4; 119aa5d9151SArjan van de Ven 120aa5d9151SArjan van de Ven $style = $styles[$stylecounter]; 121aa5d9151SArjan van de Ven $stylecounter = $stylecounter + 1; 122aa5d9151SArjan van de Ven if ($stylecounter > 11) { 123aa5d9151SArjan van de Ven $stylecounter = 0; 124aa5d9151SArjan van de Ven }; 125aa5d9151SArjan van de Ven 126aa5d9151SArjan van de Ven print "<rect x=\"$s\" width=\"$w\" y=\"$y\" height=\"145\" style=\"$style\"/>\n"; 127aa5d9151SArjan van de Ven print "<text transform=\"translate($s2,$y2) rotate(90)\">$key</text>\n"; 128aa5d9151SArjan van de Ven } 129aa5d9151SArjan van de Ven} 130aa5d9151SArjan van de Ven 131aa5d9151SArjan van de Ven 132aa5d9151SArjan van de Ven# print the time line on top 133aa5d9151SArjan van de Venmy $time = 0.0; 134aa5d9151SArjan van de Venwhile ($time < $maxtime) { 135aa5d9151SArjan van de Ven my $s2 = $time * $mult; 136aa5d9151SArjan van de Ven print "<text transform=\"translate($s2,89) rotate(90)\">$time</text>\n"; 137aa5d9151SArjan van de Ven $time = $time + 0.1; 138aa5d9151SArjan van de Ven} 139aa5d9151SArjan van de Ven 140aa5d9151SArjan van de Venprint "</svg>\n"; 141