summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2001-01-28 06:39:56 +0000
committermarcel <marcel@FreeBSD.org>2001-01-28 06:39:56 +0000
commit93f1d4280850c854213076fad992efbd64768f92 (patch)
treeaac9a60858072714fdd62ffc09e59415b5c44116 /sys/kern
parent4f534409b335d30a310d938fc3fef458a51b57a5 (diff)
downloadFreeBSD-src-93f1d4280850c854213076fad992efbd64768f92.zip
FreeBSD-src-93f1d4280850c854213076fad992efbd64768f92.tar.gz
Improve kernel bootstrapping:
o Use objdump instead of gensetdefs(1) to build the linker sets. o Allow overriding of nm and objdump in resp. genassym.sh and gensetdefs.pl for non-native toolchains. Reviewed by: arch Perl improvements: Jos Backus <josb@cncdsl.com>, benno
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/genassym.sh2
-rw-r--r--sys/kern/gensetdefs.pl105
2 files changed, 106 insertions, 1 deletions
diff --git a/sys/kern/genassym.sh b/sys/kern/genassym.sh
index 071ddb0..54f4330 100644
--- a/sys/kern/genassym.sh
+++ b/sys/kern/genassym.sh
@@ -22,7 +22,7 @@ case $# in
*) usage;;
esac
-nm "$1" | awk '
+${NM:='nm'} "$1" | awk '
/ C .*sign$/ {
sign = substr($1, length($1) - 3, 4)
sub("^0*", "", sign)
diff --git a/sys/kern/gensetdefs.pl b/sys/kern/gensetdefs.pl
new file mode 100644
index 0000000..ade59fa
--- /dev/null
+++ b/sys/kern/gensetdefs.pl
@@ -0,0 +1,105 @@
+#!/usr/bin/perl -w
+#
+# Copyright (c) 2001 The FreeBSD Project
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# From src/usr.bin/gensetdefs/gensetdefs.c,v 1.6 2000/09/29 13:29:43 dfr
+#
+# $FreeBSD$
+
+use strict;
+
+my %sets = ();
+my $pointersize = 0;
+my $objdump = $ENV{'OBJDUMP'} || 'objdump';
+
+# Run objdump over each object file to find all defined linker sets.
+# Linker sets are sections with names starting with `.set.'
+foreach my $objfile (@ARGV) {
+ open(SECTION, "$objdump -h $objfile |") or die;
+ while (<SECTION>) {
+ my ($index, $name, $size, $vma, $lma, $offset, $align) = split;
+
+ next unless $name;
+
+ if ($name =~ /^.set./) {
+ $name =~ s/^.set.//;
+ $sets{$name} ||= 0;
+ $sets{$name} += hex "0x$size";
+
+ # Assume the size of a pointer is equal to it's alignment
+ # and thus the alignment of the section.
+ if ($pointersize < eval $align) {
+ $pointersize = eval $align;
+ }
+ }
+ }
+ close SECTION;
+}
+
+# Generate our list of set definitions
+my @setdefs;
+while (my ($name, $size) = each %sets) {
+ my $elements = $size / $pointersize;
+ push @setdefs, "DEFINE_SET($name, $elements);\n";
+}
+
+# Create setdefs.h
+open(SETDEFS_H, "> setdefs.h") or die;
+print SETDEFS_H sort @setdefs;
+close SETDEFS_H;
+
+# Create setdef0.c
+open(SETDEF0_C, "> setdef0.c") or die;
+print SETDEF0_C <<END;
+/* This file is generated by $0, do not edit. */
+
+#define DEFINE_SET(set, count) \\
+__asm__(".section .set." #set ",\\"aw\\""); \\
+__asm__(".globl " #set); \\
+__asm__(".type " #set ",\@object"); \\
+__asm__(".p2align 3"); \\
+__asm__(#set ":"); \\
+__asm__(".quad " #count); \\
+__asm__(".previous")
+
+#include "setdefs.h"
+END
+close SETDEF0_C;
+
+# Create setdef1.c
+open(SETDEF1_C, "> setdef1.c") or die;
+print SETDEF1_C <<END;
+/* This file is generated by $0, do not edit. */
+
+#define DEFINE_SET(set, count) \\
+__asm__(".section .set." #set ",\\"aw\\""); \\
+__asm__(".quad 0"); \\
+__asm__(".previous")
+
+#include "setdefs.h"
+END
+close SETDEF1_C;
+
+exit;
OpenPOWER on IntegriCloud