Magellan Linux

Annotation of /tags/mkinitrd-6_1_12/busybox/scripts/checkstack.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 939 - (hide annotations) (download)
Tue Nov 17 21:24:51 2009 UTC (14 years, 7 months ago) by niro
File MIME type: text/plain
File size: 4029 byte(s)
tagged 'mkinitrd-6_1_12'
1 niro 816 #!/usr/bin/perl
2    
3     # Stolen from Linux kernel :)
4    
5     # Check the stack usage of functions
6     #
7     # Copyright Joern Engel <joern@wh.fh-wedel.de>
8     # Inspired by Linus Torvalds
9     # Original idea maybe from Keith Owens
10     # s390 port and big speedup by Arnd Bergmann <arnd@bergmann-dalldorf.de>
11     # Mips port by Juan Quintela <quintela@mandrakesoft.com>
12     # IA64 port via Andreas Dilger
13     # Arm port by Holger Schurig
14     # sh64 port by Paul Mundt
15     # Random bits by Matt Mackall <mpm@selenic.com>
16     # M68k port by Geert Uytterhoeven and Andreas Schwab
17     #
18     # Usage:
19     # objdump -d vmlinux | checkstack.pl [arch]
20     #
21     # TODO : Port to all architectures (one regex per arch)
22    
23     # check for arch
24     #
25     # $re is used for two matches:
26     # $& (whole re) matches the complete objdump line with the stack growth
27     # $1 (first bracket) matches the size of the stack growth
28     #
29     # use anything else and feel the pain ;)
30     my (@stack, $re, $x, $xs);
31     {
32     my $arch = shift;
33     if ($arch eq "") {
34     $arch = `uname -m`;
35     }
36    
37     $x = "[0-9a-f]"; # hex character
38     $xs = "[0-9a-f ]"; # hex character or space
39     if ($arch eq 'arm') {
40     #c0008ffc: e24dd064 sub sp, sp, #100 ; 0x64
41     $re = qr/.*sub.*sp, sp, #(([0-9]{2}|[3-9])[0-9]{2})/o;
42     } elsif ($arch eq 'blackfin') {
43     # 52: 00 e8 03 00 LINK 0xc;
44     $re = qr/.*LINK (0x$x{1,5});$/o;
45     } elsif ($arch =~ /^i[3456]86$/) {
46     #c0105234: 81 ec ac 05 00 00 sub $0x5ac,%esp
47     $re = qr/^.*[as][du][db] \$(0x$x{1,8}),\%esp$/o;
48     } elsif ($arch eq 'x86_64') {
49     # 2f60: 48 81 ec e8 05 00 00 sub $0x5e8,%rsp
50     $re = qr/^.*[as][du][db] \$(0x$x{1,8}),\%rsp$/o;
51     } elsif ($arch eq 'ia64') {
52     #e0000000044011fc: 01 0f fc 8c adds r12=-384,r12
53     $re = qr/.*adds.*r12=-(([0-9]{2}|[3-9])[0-9]{2}),r12/o;
54     } elsif ($arch eq 'm68k') {
55     # 2b6c: 4e56 fb70 linkw %fp,#-1168
56     # 1df770: defc ffe4 addaw #-28,%sp
57     $re = qr/.*(?:linkw %fp,|addaw )#-([0-9]{1,4})(?:,%sp)?$/o;
58     } elsif ($arch eq 'mips64') {
59     #8800402c: 67bdfff0 daddiu sp,sp,-16
60     $re = qr/.*daddiu.*sp,sp,-(([0-9]{2}|[3-9])[0-9]{2})/o;
61     } elsif ($arch eq 'mips') {
62     #88003254: 27bdffe0 addiu sp,sp,-32
63     $re = qr/.*addiu.*sp,sp,-(([0-9]{2}|[3-9])[0-9]{2})/o;
64     } elsif ($arch eq 'ppc') {
65     #c00029f4: 94 21 ff 30 stwu r1,-208(r1)
66     $re = qr/.*stwu.*r1,-($x{1,8})\(r1\)/o;
67     } elsif ($arch eq 'ppc64') {
68     #XXX
69     $re = qr/.*stdu.*r1,-($x{1,8})\(r1\)/o;
70     } elsif ($arch eq 'powerpc') {
71     $re = qr/.*st[dw]u.*r1,-($x{1,8})\(r1\)/o;
72     } elsif ($arch =~ /^s390x?$/) {
73     # 11160: a7 fb ff 60 aghi %r15,-160
74     $re = qr/.*ag?hi.*\%r15,-(([0-9]{2}|[3-9])[0-9]{2})/o;
75     } elsif ($arch =~ /^sh64$/) {
76     #XXX: we only check for the immediate case presently,
77     # though we will want to check for the movi/sub
78     # pair for larger users. -- PFM.
79     #a00048e0: d4fc40f0 addi.l r15,-240,r15
80     $re = qr/.*addi\.l.*r15,-(([0-9]{2}|[3-9])[0-9]{2}),r15/o;
81     } else {
82     print("wrong or unknown architecture\n");
83     exit
84     }
85     }
86    
87     sub bysize($) {
88     my ($asize, $bsize);
89     ($asize = $a) =~ s/.*: *(.*)$/$1/;
90     ($bsize = $b) =~ s/.*: *(.*)$/$1/;
91     $bsize <=> $asize
92     }
93    
94     #
95     # main()
96     #
97     my $funcre = qr/^$x* <(.*)>:$/;
98     my $func;
99     my $file, $lastslash;
100    
101     while (my $line = <STDIN>) {
102     if ($line =~ m/$funcre/) {
103     $func = $1;
104     }
105     elsif ($line =~ m/(.*):\s*file format/) {
106     $file = $1;
107     $file =~ s/\.ko//;
108     $lastslash = rindex($file, "/");
109     if ($lastslash != -1) {
110     $file = substr($file, $lastslash + 1);
111     }
112     }
113     elsif ($line =~ m/$re/) {
114     my $size = $1;
115     $size = hex($size) if ($size =~ /^0x/);
116    
117     if ($size > 0xf0000000) {
118     $size = - $size;
119     $size += 0x80000000;
120     $size += 0x80000000;
121     }
122     next if ($size > 0x10000000);
123    
124     next if $line !~ m/^($xs*)/;
125     my $addr = $1;
126     $addr =~ s/ /0/g;
127     $addr = "0x$addr";
128    
129     # bbox: was: my $intro = "$addr $func [$file]:";
130     my $intro = "$func [$file]:";
131     my $padlen = 56 - length($intro);
132     while ($padlen > 0) {
133     $intro .= ' ';
134     $padlen -= 8;
135     }
136     next if ($size < 100);
137     push @stack, "$intro$size\n";
138     }
139     }
140    
141     print sort bysize @stack;