linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Jörn Engel" <joern@wohnheim.fh-wedel.de>
To: Marcelo Tosatti <marcelo@conectiva.com.br>
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH] add checkstack Makefile target
Date: Mon, 3 Mar 2003 22:16:47 +0100	[thread overview]
Message-ID: <20030303211647.GA25205@wohnheim.fh-wedel.de> (raw)

On Thu, 20 February 2003 08:54:55 -0800, Linus Torvalds wrote:
> 
> A sorted list of bad stack users (more than 256 bytes) in my default build
> follows. Anybody can create their own with something like
> 
> 	objdump -d linux/vmlinux |
> 		grep 'sub.*$0x...,.*esp' |
> 		awk '{ print $9,$1 }' |
> 		sort > bigstack
> 
> and a script to look up the addresses.

Since Linus didn't give us the script, I had to try it myself. The
result is likely ugly and inefficient, but it works for i386 and ppc
(actually crosscompiling for ppc).

This patch is against vanilla 2.4.20, but should apply to -pre5 as
well. Shouldn't be too hard to port to 2.5.x either, but I don't need
it there yet.

Jörn

-- 
This above all: to thine own self be true.
-- Shakespeare


diff -Naur foo/linux-2.4.20/arch/i386/Makefile linux-2.4.20/arch/i386/Makefile
--- foo/linux-2.4.20/arch/i386/Makefile	Fri Nov 29 00:53:09 2002
+++ linux-2.4.20/arch/i386/Makefile	Mon Mar  3 21:38:36 2003
@@ -139,9 +139,18 @@
 	@$(MAKEBOOT) BOOTIMAGE=bzImage install
 
 archclean:
+	$(RM) $(TOPDIR)/scripts/checkstack_i386.pl
 	@$(MAKEBOOT) clean
 
 archmrproper:
 
 archdep:
 	@$(MAKEBOOT) dep
+
+$(TOPDIR)/scripts/checkstack_i386.pl: $(TOPDIR)/scripts/checkstack.pl
+	(cd $(TOPDIR)/scripts/ && ln -s checkstack.pl checkstack_i386.pl)
+
+checkstack: vmlinux $(TOPDIR)/scripts/checkstack_i386.pl
+	$(OBJDUMP) -d vmlinux | \
+	grep 'sub.*$0x...,.*esp' | \
+	$(TOPDIR)/scripts/checkstack_i386.pl
diff -Naur foo/linux-2.4.20/arch/ppc/Makefile linux-2.4.20/arch/ppc/Makefile
--- foo/linux-2.4.20/arch/ppc/Makefile	Fri Nov 29 00:53:11 2002
+++ linux-2.4.20/arch/ppc/Makefile	Mon Mar  3 21:38:52 2003
@@ -108,6 +108,7 @@
 	cp -f arch/ppc/configs/$(@:config=defconfig) arch/ppc/defconfig
 
 archclean:
+	$(RM) $(TOPDIR)/scripts/checkstack_ppc.pl
 	rm -f arch/ppc/kernel/{mk_defs,ppc_defs.h,find_name,checks}
 	@$(MAKEBOOT) clean
 
@@ -115,3 +116,11 @@
 
 archdep: scripts/mkdep
 	$(MAKEBOOT) fastdep
+
+$(TOPDIR)/scripts/checkstack_ppc.pl: $(TOPDIR)/scripts/checkstack.pl
+	(cd $(TOPDIR)/scripts/ && ln -s checkstack.pl checkstack_ppc.pl)
+
+checkstack: vmlinux $(TOPDIR)/scripts/checkstack_ppc.pl
+	$(OBJDUMP) -d vmlinux | \
+	grep 'stwu.*r1,-.\{3,\}(r1)' | \
+	$(TOPDIR)/scripts/checkstack_ppc.pl
diff -Naur foo/linux-2.4.20/scripts/checkstack.pl linux-2.4.20/scripts/checkstack.pl
--- foo/linux-2.4.20/scripts/checkstack.pl	Thu Jan  1 01:00:00 1970
+++ linux-2.4.20/scripts/checkstack.pl	Mon Mar  3 20:46:52 2003
@@ -0,0 +1,92 @@
+#!/usr/bin/perl
+
+#	Check the stack usage of functions
+#
+#	Usage for ppc:
+#	powerpc-linux-objdump -d vmlinux | \
+#	grep 'stwu.*r1,-.\{3,\}(r1)' | \
+#	stackcheck_ppc.pl
+
+{
+	(my $arch = $0) =~ s/.*checkstack_(.+)\.pl$/\1/;
+	if ($arch =~ /^i386$/) {
+		$get_code = 'get_code_i386 "@_"';
+		$bysize = 'bysize_i386 "@_"';
+	} elsif ($arch =~ /^ppc$/) {
+		$get_code = 'get_code_ppc "@_"';
+		$bysize = 'bysize_ppc "@_"';
+	} else {
+		$get_code = "exit";
+		$bysize = "exit";
+	}
+}
+
+sub get_intro($) {
+	my $line = $_[0];
+
+	(my $addr = $line) =~ s/^([0-9a-f]{8}).*/0x\1/;
+	chomp($addr);
+
+	my $ksymoops = `ksymoops -v vmlinux -m System.map -K -L -O -A $addr | \
+			tail -2 | head -1`;
+	(my $func = $ksymoops) =~ s/^Adhoc [0-9a-f]{8} (<.*>)/\1/;
+	chomp($func);
+
+	my $intro = "$addr $func:";
+	my $padlen = 56 - length($intro);
+	while ($padlen > 0) {
+		$intro .= '	';
+		$padlen -= 8;
+	}
+	return $intro
+}
+
+sub get_code_ppc {
+	(my $code = shift) =~ s/.*(stwu.*)/\1/;
+	chomp($code);
+	return $code
+}
+
+sub bysize_ppc {
+	($asize = $a) =~ s/.*r1,-([0-9]+)\(r1\)/\1/;
+	($bsize = $b) =~ s/.*r1,-([0-9]+)\(r1\)/\1/;
+	$bsize <=> $asize 
+}
+
+sub get_code_i386 {
+	(my $code = shift) =~ s/.*(sub.*)/\1/;
+	chomp($code);
+	return $code
+}
+
+sub bysize_i386 {
+	$a cmp $b
+}
+
+sub get_code($) {
+	eval $get_code
+}
+
+sub bysize($) {
+	eval $bysize
+}
+
+#
+# main()
+#
+$i = 5;
+while (defined($line = <STDIN>)
+	&& $i-- > 0
+	) {
+
+	my $intro = get_intro($line);
+	my $code = get_code($line);
+
+	$stack[@stack] = "$intro $code";
+}
+
+@sortedstack = sort bysize @stack;
+
+foreach $i (@sortedstack) {
+	print("$i\n");
+}

             reply	other threads:[~2003-03-03 21:06 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-03-03 21:16 Jörn Engel [this message]
2003-03-04  7:03 ` [PATCH] add checkstack Makefile target Muli Ben-Yehuda
2003-03-04  7:24   ` Jörn Engel
2003-03-04 10:21     ` Jörn Engel
2003-03-04 10:57       ` Jörn Engel
2003-03-04 19:08         ` Sam Ravnborg
2003-03-05 14:51           ` Jörn Engel
2003-03-05 17:14             ` Jörn Engel
2003-03-05 19:15             ` Sam Ravnborg
2003-03-05 19:54               ` Jörn Engel
2003-03-11 15:36                 ` =?unknown-8bit?Q?J=F6rn?= Engel
2003-03-23 19:08                 ` Sam Ravnborg
2003-03-25 13:49                   ` Jörn Engel
2003-03-25 23:53                     ` Juan Quintela
     [not found] <20030305172012$3eb0@gated-at.bofh.it>
     [not found] ` <20030305172012$0dea@gated-at.bofh.it>
     [not found]   ` <20030305172012$0ad6@gated-at.bofh.it>
     [not found]     ` <20030305172012$4a05@gated-at.bofh.it>
     [not found]       ` <20030305172012$03b3@gated-at.bofh.it>
     [not found]         ` <20030305172012$525f@gated-at.bofh.it>
     [not found]           ` <20030305172012$698e@gated-at.bofh.it>
     [not found]             ` <20030305172012$38f6@gated-at.bofh.it>
2003-03-06  1:50               ` Arnd Bergmann
2003-03-06 10:51                 ` Jörn Engel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20030303211647.GA25205@wohnheim.fh-wedel.de \
    --to=joern@wohnheim.fh-wedel.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marcelo@conectiva.com.br \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).