diff options
author | marcel <marcel@FreeBSD.org> | 2001-01-28 06:39:56 +0000 |
---|---|---|
committer | marcel <marcel@FreeBSD.org> | 2001-01-28 06:39:56 +0000 |
commit | 93f1d4280850c854213076fad992efbd64768f92 (patch) | |
tree | aac9a60858072714fdd62ffc09e59415b5c44116 /sys/kern | |
parent | 4f534409b335d30a310d938fc3fef458a51b57a5 (diff) | |
download | FreeBSD-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.sh | 2 | ||||
-rw-r--r-- | sys/kern/gensetdefs.pl | 105 |
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; |