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
This commit is contained in:
Marcel Moolenaar 2001-01-28 06:39:56 +00:00
parent 84e11fbc2e
commit 136345c019
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=71729
9 changed files with 116 additions and 62 deletions

View File

@ -177,7 +177,7 @@ setdef1.o: setdef1.c setdefs.h
${NORMAL_C}
setdef0.c setdef1.c setdefs.h: Makefile ${OBJS}
@gensetdefs ${OBJS}
@perl5 $S/kern/gensetdefs.pl ${OBJS}
# this rule stops ./assym.s in .depend from causing problems
./assym.s: assym.s

View File

@ -182,7 +182,7 @@ setdef1.o: setdef1.c setdefs.h
${NORMAL_C}
setdef0.c setdef1.c setdefs.h: Makefile ${OBJS}
@gensetdefs ${OBJS}
@perl5 $S/kern/gensetdefs.pl ${OBJS}
# this rule stops ./assym.s in .depend from causing problems
./assym.s: assym.s

View File

@ -20,8 +20,10 @@ CWARNFLAGS= -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes \
-ansi
CC= ia64-unknown-linux-gcc -D__FreeBSD__ -U__linux__
LD= ia64-unknown-linux-ld
NM= ia64-unknown-linux-nm
SIZE= ia64-unknown-linux-size
OBJCOPY= ia64-unknown-linux-objcopy
OBJDUMP= ia64-unknown-linux-objdump
MACHINE_ARCH= ia64
# Which version of config(8) is required.
@ -184,13 +186,13 @@ setdef1.o: setdef1.c setdefs.h
${NORMAL_C}
setdef0.c setdef1.c setdefs.h: Makefile ${OBJS}
@gensetdefs ${OBJS}
@OBJDUMP=${OBJDUMP} perl5 $S/kern/gensetdefs.pl ${OBJS}
# this rule stops ./assym.s in .depend from causing problems
./assym.s: assym.s
assym.s: $S/$M/$M/genassym.sh genassym.o
sh $S/$M/$M/genassym.sh genassym.o > ${.TARGET}
assym.s: $S/kern/genassym.sh genassym.o
NM=${NM} sh $S/kern/genassym.sh genassym.o > ${.TARGET}
genassym.o: $S/$M/$M/genassym.c
${CC} -c ${CFLAGS} $S/$M/$M/genassym.c

View File

@ -184,7 +184,7 @@ setdef1.o: setdef1.c setdefs.h
${NORMAL_C}
setdef0.c setdef1.c setdefs.h: Makefile ${OBJS}
@gensetdefs ${OBJS}
@perl5 $S/kern/gensetdefs.pl ${OBJS}
# this rule stops ./assym.s in .depend from causing problems
./assym.s: assym.s

View File

@ -182,7 +182,7 @@ setdef1.o: setdef1.c setdefs.h
${NORMAL_C}
setdef0.c setdef1.c setdefs.h: Makefile ${OBJS}
@gensetdefs ${OBJS}
@perl5 $S/kern/gensetdefs.pl ${OBJS}
# this rule stops ./assym.s in .depend from causing problems
./assym.s: assym.s

View File

@ -131,7 +131,7 @@ PROG= ${KMOD}.ko
${PROG}: ${KMOD}.kld
.if ${OBJFORMAT} == elf
gensetdefs ${KMOD}.kld
perl5 @/kern/gensetdefs.pl ${KMOD}.kld
${CC} ${CFLAGS} -c setdef0.c
${CC} ${CFLAGS} -c setdef1.c
${LD} -Bshareable ${LDFLAGS} -o ${.TARGET} setdef0.o ${KMOD}.kld setdef1.o

View File

@ -1,53 +0,0 @@
#!/bin/sh
# $FreeBSD$
# Grrr, this should use stdin and stdout, but is encrufted for compatibility.
usage() {
echo "usage: genassym [-o outfile] objfile"
exit 1
}
outfile=/dev/stdout
while getopts "o:" option
do
case "$option" in
o) outfile="$OPTARG";;
*) usage;;
esac
done
shift $(($OPTIND - 1))
case $# in
1) ;;
*) usage;;
esac
ia64-unknown-linux-nm "$1" | awk '
/ C .*sign$/ {
sign = substr($1, length($1) - 3, 4)
sub("^0*", "", sign)
if (sign != "")
sign = "-"
}
/ C .*w0$/ {
w0 = substr($1, length($1) - 3, 4)
}
/ C .*w1$/ {
w1 = substr($1, length($1) - 3, 4)
}
/ C .*w2$/ {
w2 = substr($1, length($1) - 3, 4)
}
/ C .*w3$/ {
w3 = substr($1, length($1) - 3, 4)
w = w3 w2 w1 w0
sub("^0*", "", w)
if (w == "")
w = "0"
sub("w3$", "", $3)
# This still has minor problems representing INT_MIN, etc. E.g.,
# with 32-bit 2''s complement ints, this prints -0x80000000, which
# has the wrong type (unsigned int).
printf("#define\t%s\t%s0x%s\n", $3, sign, w)
}
' 3>"$outfile" >&3 3>&-

View File

@ -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)

105
sys/kern/gensetdefs.pl Normal file
View File

@ -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;