diff options
Diffstat (limited to 'qemu/roms/ipxe/src/util')
32 files changed, 0 insertions, 8132 deletions
diff --git a/qemu/roms/ipxe/src/util/.gitignore b/qemu/roms/ipxe/src/util/.gitignore deleted file mode 100644 index 33bedefd0..000000000 --- a/qemu/roms/ipxe/src/util/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -nrv2b -zbin -hijack -prototester -elf2efi32 -elf2efi64 -efirom -efifatbin -iccfix -einfo diff --git a/qemu/roms/ipxe/src/util/Makefile b/qemu/roms/ipxe/src/util/Makefile deleted file mode 100644 index 4a6a7c7c6..000000000 --- a/qemu/roms/ipxe/src/util/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -BLIB = ../bin/blib.a -CFLAGS = -Os - -all : hijack mucurses_test - -hijack : hijack.c - $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -Wall -lpcap -o $@ $< - -mucurses_test.o : mucurses_test.c - $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -Wall -o $@ -c $< - -mucurses_test : mucurses_test.o $(BLIB) - $(CC) -o $@ $< -lc $(BLIB) - -clean : - rm -f hijack mucurses_test *.o diff --git a/qemu/roms/ipxe/src/util/Option/ROM.pm b/qemu/roms/ipxe/src/util/Option/ROM.pm deleted file mode 100644 index 232cf16b8..000000000 --- a/qemu/roms/ipxe/src/util/Option/ROM.pm +++ /dev/null @@ -1,747 +0,0 @@ -package Option::ROM; - -# Copyright (C) 2008 Michael Brown <mbrown@fensystems.co.uk>. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. - -=head1 NAME - -Option::ROM - Option ROM manipulation - -=head1 SYNOPSIS - - use Option::ROM; - - # Load a ROM image - my $rom = new Option::ROM; - $rom->load ( "rtl8139.rom" ); - - # Modify the PCI device ID - $rom->pci_header->{device_id} = 0x1234; - $rom->fix_checksum(); - - # Write ROM image out to a new file - $rom->save ( "rtl8139-modified.rom" ); - -=head1 DESCRIPTION - -C<Option::ROM> provides a mechanism for manipulating Option ROM -images. - -=head1 METHODS - -=cut - -############################################################################## -# -# Option::ROM::Fields -# -############################################################################## - -package Option::ROM::Fields; - -use strict; -use warnings; -use Carp; -use bytes; - -sub TIEHASH { - my $class = shift; - my $self = shift; - - bless $self, $class; - return $self; -} - -sub FETCH { - my $self = shift; - my $key = shift; - - return undef unless $self->EXISTS ( $key ); - my $raw = substr ( ${$self->{data}}, - ( $self->{offset} + $self->{fields}->{$key}->{offset} ), - $self->{fields}->{$key}->{length} ); - my $unpack = ( ref $self->{fields}->{$key}->{unpack} ? - $self->{fields}->{$key}->{unpack} : - sub { unpack ( $self->{fields}->{$key}->{pack}, shift ); } ); - return &$unpack ( $raw ); -} - -sub STORE { - my $self = shift; - my $key = shift; - my $value = shift; - - croak "Nonexistent field \"$key\"" unless $self->EXISTS ( $key ); - my $pack = ( ref $self->{fields}->{$key}->{pack} ? - $self->{fields}->{$key}->{pack} : - sub { pack ( $self->{fields}->{$key}->{pack}, shift ); } ); - my $raw = &$pack ( $value ); - substr ( ${$self->{data}}, - ( $self->{offset} + $self->{fields}->{$key}->{offset} ), - $self->{fields}->{$key}->{length} ) = $raw; -} - -sub DELETE { - my $self = shift; - my $key = shift; - - $self->STORE ( $key, 0 ); -} - -sub CLEAR { - my $self = shift; - - foreach my $key ( keys %{$self->{fields}} ) { - $self->DELETE ( $key ); - } -} - -sub EXISTS { - my $self = shift; - my $key = shift; - - return ( exists $self->{fields}->{$key} && - ( ( $self->{fields}->{$key}->{offset} + - $self->{fields}->{$key}->{length} ) <= $self->{length} ) ); -} - -sub FIRSTKEY { - my $self = shift; - - keys %{$self->{fields}}; - return each %{$self->{fields}}; -} - -sub NEXTKEY { - my $self = shift; - my $lastkey = shift; - - return each %{$self->{fields}}; -} - -sub SCALAR { - my $self = shift; - - return 1; -} - -sub UNTIE { - my $self = shift; -} - -sub DESTROY { - my $self = shift; -} - -sub checksum { - my $self = shift; - - my $raw = substr ( ${$self->{data}}, $self->{offset}, $self->{length} ); - return unpack ( "%8C*", $raw ); -} - -############################################################################## -# -# Option::ROM -# -############################################################################## - -package Option::ROM; - -use strict; -use warnings; -use Carp; -use bytes; -use Exporter 'import'; - -use constant ROM_SIGNATURE => 0xaa55; -use constant PCI_SIGNATURE => 'PCIR'; -use constant PCI_LAST_IMAGE => 0x80; -use constant PNP_SIGNATURE => '$PnP'; -use constant IPXE_SIGNATURE => 'iPXE'; - -our @EXPORT_OK = qw ( ROM_SIGNATURE PCI_SIGNATURE PCI_LAST_IMAGE - PNP_SIGNATURE IPXE_SIGNATURE ); -our %EXPORT_TAGS = ( all => [ @EXPORT_OK ] ); - -use constant JMP_SHORT => 0xeb; -use constant JMP_NEAR => 0xe9; -use constant CALL_NEAR => 0xe8; - -sub pack_init { - my $dest = shift; - - # Always create a near jump; it's simpler - if ( $dest ) { - return pack ( "CS", JMP_NEAR, ( $dest - 6 ) ); - } else { - return pack ( "CS", 0, 0 ); - } -} - -sub unpack_init { - my $instr = shift; - - # Accept both short and near jumps - my $jump = unpack ( "C", $instr ); - if ( $jump == JMP_SHORT ) { - my $offset = unpack ( "xC", $instr ); - return ( $offset + 5 ); - } elsif ( $jump == JMP_NEAR ) { - my $offset = unpack ( "xS", $instr ); - return ( $offset + 6 ); - } elsif ( $jump == CALL_NEAR ) { - my $offset = unpack ( "xS", $instr ); - return ( $offset + 6 ); - } elsif ( $jump == 0 ) { - return 0; - } else { - croak "Unrecognised jump instruction in init vector\n"; - } -} - -=pod - -=item C<< new () >> - -Construct a new C<Option::ROM> object. - -=cut - -sub new { - my $class = shift; - - my $hash = {}; - tie %$hash, "Option::ROM::Fields", { - data => undef, - offset => 0x00, - length => 0x20, - fields => { - signature => { offset => 0x00, length => 0x02, pack => "S" }, - length => { offset => 0x02, length => 0x01, pack => "C" }, - # "init" is part of a jump instruction - init => { offset => 0x03, length => 0x03, - pack => \&pack_init, unpack => \&unpack_init }, - checksum => { offset => 0x06, length => 0x01, pack => "C" }, - ipxe_header => { offset => 0x10, length => 0x02, pack => "S" }, - bofm_header => { offset => 0x14, length => 0x02, pack => "S" }, - undi_header => { offset => 0x16, length => 0x02, pack => "S" }, - pci_header => { offset => 0x18, length => 0x02, pack => "S" }, - pnp_header => { offset => 0x1a, length => 0x02, pack => "S" }, - }, - }; - bless $hash, $class; - return $hash; -} - -=pod - -=item C<< set ( $data ) >> - -Set option ROM contents. - -=cut - -sub set { - my $hash = shift; - my $self = tied(%$hash); - my $data = shift; - - # Store data - $self->{data} = \$data; - - # Split out any data belonging to the next image - delete $self->{next_image}; - my $pci_header = $hash->pci_header(); - if ( ( defined $pci_header ) && - ( ! ( $pci_header->{last_image} & PCI_LAST_IMAGE ) ) ) { - my $length = ( $pci_header->{image_length} * 512 ); - my $remainder = substr ( $data, $length ); - $data = substr ( $data, 0, $length ); - $self->{next_image} = new Option::ROM; - $self->{next_image}->set ( $remainder ); - } -} - -=pod - -=item C<< get () >> - -Get option ROM contents. - -=cut - -sub get { - my $hash = shift; - my $self = tied(%$hash); - - my $data = ${$self->{data}}; - $data .= $self->{next_image}->get() if $self->{next_image}; - return $data; -} - -=pod - -=item C<< load ( $filename ) >> - -Load option ROM contents from the file C<$filename>. - -=cut - -sub load { - my $hash = shift; - my $self = tied(%$hash); - my $filename = shift; - - $self->{filename} = $filename; - - open my $fh, "<$filename" - or croak "Cannot open $filename for reading: $!"; - read $fh, my $data, -s $fh; - $hash->set ( $data ); - close $fh; -} - -=pod - -=item C<< save ( [ $filename ] ) >> - -Write the ROM data back out to the file C<$filename>. If C<$filename> -is omitted, the file used in the call to C<load()> will be used. - -=cut - -sub save { - my $hash = shift; - my $self = tied(%$hash); - my $filename = shift; - - $filename ||= $self->{filename}; - - open my $fh, ">$filename" - or croak "Cannot open $filename for writing: $!"; - my $data = $hash->get(); - print $fh $data; - close $fh; -} - -=pod - -=item C<< length () >> - -Length of option ROM data. This is the length of the file, not the -length from the ROM header length field. - -=cut - -sub length { - my $hash = shift; - my $self = tied(%$hash); - - return length ${$self->{data}}; -} - -=pod - -=item C<< pci_header () >> - -Return a C<Option::ROM::PCI> object representing the ROM's PCI header, -if present. - -=cut - -sub pci_header { - my $hash = shift; - my $self = tied(%$hash); - - my $offset = $hash->{pci_header}; - return undef unless $offset != 0; - - return Option::ROM::PCI->new ( $self->{data}, $offset ); -} - -=pod - -=item C<< pnp_header () >> - -Return a C<Option::ROM::PnP> object representing the ROM's PnP header, -if present. - -=cut - -sub pnp_header { - my $hash = shift; - my $self = tied(%$hash); - - my $offset = $hash->{pnp_header}; - return undef unless $offset != 0; - - return Option::ROM::PnP->new ( $self->{data}, $offset ); -} - -=pod - -=item C<< undi_header () >> - -Return a C<Option::ROM::UNDI> object representing the ROM's UNDI header, -if present. - -=cut - -sub undi_header { - my $hash = shift; - my $self = tied(%$hash); - - my $offset = $hash->{undi_header}; - return undef unless $offset != 0; - - return Option::ROM::UNDI->new ( $self->{data}, $offset ); -} - -=pod - -=item C<< ipxe_header () >> - -Return a C<Option::ROM::iPXE> object representing the ROM's iPXE -header, if present. - -=cut - -sub ipxe_header { - my $hash = shift; - my $self = tied(%$hash); - - my $offset = $hash->{ipxe_header}; - return undef unless $offset != 0; - - return Option::ROM::iPXE->new ( $self->{data}, $offset ); -} - -=pod - -=item C<< next_image () >> - -Return a C<Option::ROM> object representing the next image within the -ROM, if present. - -=cut - -sub next_image { - my $hash = shift; - my $self = tied(%$hash); - - return $self->{next_image}; -} - -=pod - -=item C<< checksum () >> - -Calculate the byte checksum of the ROM. - -=cut - -sub checksum { - my $hash = shift; - my $self = tied(%$hash); - - my $raw = substr ( ${$self->{data}}, 0, ( $hash->{length} * 512 ) ); - return unpack ( "%8C*", $raw ); -} - -=pod - -=item C<< fix_checksum () >> - -Fix the byte checksum of the ROM. - -=cut - -sub fix_checksum { - my $hash = shift; - my $self = tied(%$hash); - - $hash->{checksum} = ( ( $hash->{checksum} - $hash->checksum() ) & 0xff ); -} - -############################################################################## -# -# Option::ROM::PCI -# -############################################################################## - -package Option::ROM::PCI; - -use strict; -use warnings; -use Carp; -use bytes; - -sub new { - my $class = shift; - my $data = shift; - my $offset = shift; - - my $hash = {}; - tie %$hash, "Option::ROM::Fields", { - data => $data, - offset => $offset, - length => 0x0c, - fields => { - signature => { offset => 0x00, length => 0x04, pack => "a4" }, - vendor_id => { offset => 0x04, length => 0x02, pack => "S" }, - device_id => { offset => 0x06, length => 0x02, pack => "S" }, - device_list => { offset => 0x08, length => 0x02, pack => "S" }, - struct_length => { offset => 0x0a, length => 0x02, pack => "S" }, - struct_revision =>{ offset => 0x0c, length => 0x01, pack => "C" }, - base_class => { offset => 0x0d, length => 0x01, pack => "C" }, - sub_class => { offset => 0x0e, length => 0x01, pack => "C" }, - prog_intf => { offset => 0x0f, length => 0x01, pack => "C" }, - image_length => { offset => 0x10, length => 0x02, pack => "S" }, - revision => { offset => 0x12, length => 0x02, pack => "S" }, - code_type => { offset => 0x14, length => 0x01, pack => "C" }, - last_image => { offset => 0x15, length => 0x01, pack => "C" }, - runtime_length => { offset => 0x16, length => 0x02, pack => "S" }, - conf_header => { offset => 0x18, length => 0x02, pack => "S" }, - clp_entry => { offset => 0x1a, length => 0x02, pack => "S" }, - }, - }; - bless $hash, $class; - - # Retrieve true length of structure - my $self = tied ( %$hash ); - $self->{length} = $hash->{struct_length}; - - return $hash; -} - -sub device_list { - my $hash = shift; - my $self = tied(%$hash); - - my $device_list = $hash->{device_list}; - return undef unless $device_list; - - my @ids; - my $offset = ( $self->{offset} + $device_list ); - while ( 1 ) { - my $raw = substr ( ${$self->{data}}, $offset, 2 ); - my $id = unpack ( "S", $raw ); - last unless $id; - push @ids, $id; - $offset += 2; - } - - return @ids; -} - -############################################################################## -# -# Option::ROM::PnP -# -############################################################################## - -package Option::ROM::PnP; - -use strict; -use warnings; -use Carp; -use bytes; - -sub new { - my $class = shift; - my $data = shift; - my $offset = shift; - - my $hash = {}; - tie %$hash, "Option::ROM::Fields", { - data => $data, - offset => $offset, - length => 0x06, - fields => { - signature => { offset => 0x00, length => 0x04, pack => "a4" }, - struct_revision =>{ offset => 0x04, length => 0x01, pack => "C" }, - struct_length => { offset => 0x05, length => 0x01, pack => "C" }, - checksum => { offset => 0x09, length => 0x01, pack => "C" }, - manufacturer => { offset => 0x0e, length => 0x02, pack => "S" }, - product => { offset => 0x10, length => 0x02, pack => "S" }, - bcv => { offset => 0x16, length => 0x02, pack => "S" }, - bdv => { offset => 0x18, length => 0x02, pack => "S" }, - bev => { offset => 0x1a, length => 0x02, pack => "S" }, - }, - }; - bless $hash, $class; - - # Retrieve true length of structure - my $self = tied ( %$hash ); - $self->{length} = ( $hash->{struct_length} * 16 ); - - return $hash; -} - -sub checksum { - my $hash = shift; - my $self = tied(%$hash); - - return $self->checksum(); -} - -sub fix_checksum { - my $hash = shift; - my $self = tied(%$hash); - - $hash->{checksum} = ( ( $hash->{checksum} - $hash->checksum() ) & 0xff ); -} - -sub manufacturer { - my $hash = shift; - my $self = tied(%$hash); - - my $manufacturer = $hash->{manufacturer}; - return undef unless $manufacturer; - - my $raw = substr ( ${$self->{data}}, $manufacturer ); - return unpack ( "Z*", $raw ); -} - -sub product { - my $hash = shift; - my $self = tied(%$hash); - - my $product = $hash->{product}; - return undef unless $product; - - my $raw = substr ( ${$self->{data}}, $product ); - return unpack ( "Z*", $raw ); -} - -############################################################################## -# -# Option::ROM::UNDI -# -############################################################################## - -package Option::ROM::UNDI; - -use strict; -use warnings; -use Carp; -use bytes; - -sub new { - my $class = shift; - my $data = shift; - my $offset = shift; - - my $hash = {}; - tie %$hash, "Option::ROM::Fields", { - data => $data, - offset => $offset, - length => 0x16, - fields => { - signature => { offset => 0x00, length => 0x04, pack => "a4" }, - struct_length => { offset => 0x04, length => 0x01, pack => "C" }, - checksum => { offset => 0x05, length => 0x01, pack => "C" }, - struct_revision =>{ offset => 0x06, length => 0x01, pack => "C" }, - version_revision =>{ offset => 0x07, length => 0x01, pack => "C" }, - version_minor => { offset => 0x08, length => 0x01, pack => "C" }, - version_major => { offset => 0x09, length => 0x01, pack => "C" }, - loader_entry => { offset => 0x0a, length => 0x02, pack => "S" }, - stack_size => { offset => 0x0c, length => 0x02, pack => "S" }, - data_size => { offset => 0x0e, length => 0x02, pack => "S" }, - code_size => { offset => 0x10, length => 0x02, pack => "S" }, - bus_type => { offset => 0x12, length => 0x04, pack => "a4" }, - }, - }; - bless $hash, $class; - - # Retrieve true length of structure - my $self = tied ( %$hash ); - $self->{length} = $hash->{struct_length}; - - return $hash; -} - -sub checksum { - my $hash = shift; - my $self = tied(%$hash); - - return $self->checksum(); -} - -sub fix_checksum { - my $hash = shift; - my $self = tied(%$hash); - - $hash->{checksum} = ( ( $hash->{checksum} - $hash->checksum() ) & 0xff ); -} - -############################################################################## -# -# Option::ROM::iPXE -# -############################################################################## - -package Option::ROM::iPXE; - -use strict; -use warnings; -use Carp; -use bytes; - -sub new { - my $class = shift; - my $data = shift; - my $offset = shift; - - my $hash = {}; - tie %$hash, "Option::ROM::Fields", { - data => $data, - offset => $offset, - length => 0x06, - fields => { - signature => { offset => 0x00, length => 0x04, pack => "a4" }, - struct_length => { offset => 0x04, length => 0x01, pack => "C" }, - checksum => { offset => 0x05, length => 0x01, pack => "C" }, - shrunk_length => { offset => 0x06, length => 0x01, pack => "C" }, - build_id => { offset => 0x08, length => 0x04, pack => "L" }, - }, - }; - bless $hash, $class; - - # Retrieve true length of structure - my $self = tied ( %$hash ); - $self->{length} = $hash->{struct_length}; - - return $hash; -} - -sub checksum { - my $hash = shift; - my $self = tied(%$hash); - - return $self->checksum(); -} - -sub fix_checksum { - my $hash = shift; - my $self = tied(%$hash); - - $hash->{checksum} = ( ( $hash->{checksum} - $hash->checksum() ) & 0xff ); -} - -1; diff --git a/qemu/roms/ipxe/src/util/catrom.pl b/qemu/roms/ipxe/src/util/catrom.pl deleted file mode 100755 index da99d7b97..000000000 --- a/qemu/roms/ipxe/src/util/catrom.pl +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/perl -w - -use warnings; -use strict; - -use FindBin; -use lib "$FindBin::Bin"; -use Option::ROM qw ( :all ); - -my @romfiles = @ARGV - or die "Usage: $0 rom-file-1 rom-file-2 ... > multi-rom-file\n"; - -while ( my $romfile = shift @romfiles ) { - - # Read ROM file - my $rom = new Option::ROM; - $rom->load ( $romfile ); - - # Tag final image as non-final in all except the final ROM - if ( @romfiles ) { - my $image = $rom; - $image = $image->next_image() while $image->next_image(); - $image->pci_header->{last_image} &= ~PCI_LAST_IMAGE; - $image->fix_checksum(); - } - - # Write ROM file to STDOUT - $rom->save ( "-" ); -} diff --git a/qemu/roms/ipxe/src/util/diffsize.pl b/qemu/roms/ipxe/src/util/diffsize.pl deleted file mode 100755 index ced07862d..000000000 --- a/qemu/roms/ipxe/src/util/diffsize.pl +++ /dev/null @@ -1,101 +0,0 @@ -#!/usr/bin/perl -w -# usage: -# [somebody@somewhere ~/ipxe/src]$ ./util/diffsize.pl [<old rev> [<new rev>]] -# by default <old rev> is HEAD and <new rev> is the working tree - -use strict; - --d "bin" or die "Please run me in the iPXE src directory\n"; -mkdir ".sizes"; - -my($oldrev, $newrev); -my($oldname, $newname); - -if (@ARGV) { - $oldname = shift; -} else { - $oldname = "HEAD"; -} - -if (@ARGV) { - $newname = shift; -} else { - $newrev = "tree" . time(); -} - -$oldrev = `git rev-parse $oldname`; -chomp $oldrev; - -unless (defined $newrev) { - $newrev = `git rev-parse $newname`; - chomp $newrev; -} - -sub calc_sizes($$) { - my($name, $rev) = @_; - my $output; - my $lastrev; - my $stashed = 0; - my $res = 0; - - return if -e ".sizes/$rev.sizes"; - - if (defined $name) { - $output = `git stash`; - $stashed = 1 unless $output =~ /No local changes to save/; - $lastrev = `git name-rev --name-only HEAD`; - system("git checkout $name >/dev/null"); $res ||= $?; - } - - system("make -j4 bin/ipxe.lkrn >/dev/null"); $res ||= $?; - system("make bin/ipxe.lkrn.sizes > .sizes/$rev.sizes"); $res ||= $?; - - if (defined $name) { - system("git checkout $lastrev >/dev/null"); $res ||= $?; - system("git stash pop >/dev/null") if $stashed; $res ||= $?; - } - - if ($res) { - unlink(".sizes/$rev.sizes"); - die "Error making sizes file\n"; - } -} - -our %Sizes; - -sub save_sizes($$) { - my($id, $rev) = @_; - my $file = ".sizes/$rev.sizes"; - - open SIZES, $file or die "opening $file: $!\n"; - while (<SIZES>) { - my($text, $data, $bss, $total, $hex, $name) = split; - $name =~ s|bin/||; $name =~ s|\.o$||; - - # Skip the header and totals lines - next if $total =~ /[a-z]/ or $name =~ /TOTALS/; - - # Skip files named with dash, due to old Makefile bug - next if $name =~ /-/; - - $Sizes{$name} = {old => 0, new => 0} unless exists $Sizes{$name}; - $Sizes{$name}{$id} = $total; - } -} - -calc_sizes($oldname, $oldrev); -calc_sizes($newname, $newrev); - -save_sizes('old', $oldrev); -save_sizes('new', $newrev); - -my $total = 0; - -for (sort keys %Sizes) { - my $diff = $Sizes{$_}{new} - $Sizes{$_}{old}; - if (abs($diff) >= 16) { - printf "%12s %+d\n", substr($_, 0, 12), $Sizes{$_}{new} - $Sizes{$_}{old}; - } - $total += $diff; -} -printf " TOTAL: %+d\n", $total; diff --git a/qemu/roms/ipxe/src/util/disrom.pl b/qemu/roms/ipxe/src/util/disrom.pl deleted file mode 100755 index 920a86b24..000000000 --- a/qemu/roms/ipxe/src/util/disrom.pl +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright (C) 2008 Michael Brown <mbrown@fensystems.co.uk>. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. - -use strict; -use warnings; - -use FindBin; -use lib "$FindBin::Bin"; -use Option::ROM qw ( :all ); - -my $romfile = shift || "-"; -my $rom = new Option::ROM; -$rom->load ( $romfile ); - -do { - - die "Not an option ROM image\n" - unless $rom->{signature} == ROM_SIGNATURE; - - my $romlength = ( $rom->{length} * 512 ); - my $filelength = $rom->length; - die "ROM image truncated (is $filelength, should be $romlength)\n" - if $filelength < $romlength; - - printf "ROM header:\n\n"; - printf " %-16s 0x%02x (%d)\n", "Length:", - $rom->{length}, ( $rom->{length} * 512 ); - printf " %-16s 0x%02x (%s0x%02x)\n", "Checksum:", $rom->{checksum}, - ( ( $rom->checksum == 0 ) ? "" : "INCORRECT: " ), $rom->checksum; - printf " %-16s 0x%04x\n", "Init:", $rom->{init}; - printf " %-16s 0x%04x\n", "UNDI header:", $rom->{undi_header}; - printf " %-16s 0x%04x\n", "PCI header:", $rom->{pci_header}; - printf " %-16s 0x%04x\n", "PnP header:", $rom->{pnp_header}; - printf "\n"; - - my $pci = $rom->pci_header(); - if ( $pci ) { - printf "PCI header:\n\n"; - printf " %-16s %s\n", "Signature:", $pci->{signature}; - printf " %-16s 0x%04x\n", "Vendor ID:", $pci->{vendor_id}; - printf " %-16s 0x%04x\n", "Device ID:", $pci->{device_id}; - if ( $pci->{device_list} ) { - printf " %-16s %s\n", "Device list:", - ( join ( ", ", map { sprintf "0x%04x", $_ } $pci->device_list ) ); - } - printf " %-16s 0x%02x%02x%02x\n", "Device class:", - $pci->{base_class}, $pci->{sub_class}, $pci->{prog_intf}; - printf " %-16s 0x%04x (%d)\n", "Image length:", - $pci->{image_length}, ( $pci->{image_length} * 512 ); - printf " %-16s 0x%04x (%d)\n", "Runtime length:", - $pci->{runtime_length}, ( $pci->{runtime_length} * 512 ); - printf " %-16s 0x%02x\n", "Code type:", $pci->{code_type}; - if ( exists $pci->{conf_header} ) { - printf " %-16s 0x%04x\n", "Config header:", $pci->{conf_header}; - printf " %-16s 0x%04x\n", "CLP entry:", $pci->{clp_entry}; - } - printf "\n"; - } - - my $pnp = $rom->pnp_header(); - if ( $pnp ) { - printf "PnP header:\n\n"; - printf " %-16s %s\n", "Signature:", $pnp->{signature}; - printf " %-16s 0x%02x (%s0x%02x)\n", "Checksum:", $pnp->{checksum}, - ( ( $pnp->checksum == 0 ) ? "" : "INCORRECT: " ), $pnp->checksum; - printf " %-16s 0x%04x \"%s\"\n", "Manufacturer:", - $pnp->{manufacturer}, $pnp->manufacturer; - printf " %-16s 0x%04x \"%s\"\n", "Product:", - $pnp->{product}, $pnp->product; - printf " %-16s 0x%04x\n", "BCV:", $pnp->{bcv}; - printf " %-16s 0x%04x\n", "BDV:", $pnp->{bdv}; - printf " %-16s 0x%04x\n", "BEV:", $pnp->{bev}; - printf "\n"; - } - - my $undi = $rom->undi_header(); - if ( $undi ) { - printf "UNDI header:\n\n"; - printf " %-16s %s\n", "Signature:", $undi->{signature}; - printf " %-16s 0x%02x (%s0x%02x)\n", "Checksum:", $undi->{checksum}, - ( ( $undi->checksum == 0 ) ? "" : "INCORRECT: " ), $undi->checksum; - printf " %-16s %d.%d.%d\n", "UNDI version:", $undi->{version_major}, - $undi->{version_minor}, $undi->{version_revision}; - printf " %-16s 0x%04x\n", "Loader entry:", $undi->{loader_entry}; - printf " %-16s 0x%04x\n", "Stack size:", $undi->{stack_size}; - printf " %-16s 0x%04x\n", "Data size:", $undi->{data_size}; - printf " %-16s 0x%04x\n", "Code size:", $undi->{code_size}; - printf " %-16s %s\n", "Bus type:", $undi->{bus_type}; - printf "\n"; - } - - my $ipxe = $rom->ipxe_header(); - if ( $ipxe ) { - printf "iPXE header:\n\n"; - printf " %-16s 0x%02x (%s0x%02x)\n", "Checksum:", $ipxe->{checksum}, - ( ( $ipxe->checksum == 0 ) ? "" : "INCORRECT: " ), $ipxe->checksum; - printf " %-16s 0x%02x (%d)\n", "Shrunk length:", - $ipxe->{shrunk_length}, ( $ipxe->{shrunk_length} * 512 ); - printf " %-16s 0x%08x\n", "Build ID:", $ipxe->{build_id}; - printf "\n"; - } - -} while ( $rom = $rom->next_image ); diff --git a/qemu/roms/ipxe/src/util/efifatbin.c b/qemu/roms/ipxe/src/util/efifatbin.c deleted file mode 100644 index c02f750b6..000000000 --- a/qemu/roms/ipxe/src/util/efifatbin.c +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Copyright (C) 2014 Michael Brown <mbrown@fensystems.co.uk>. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -#include <stdint.h> -#include <stddef.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <sys/stat.h> -#include <unistd.h> -#include <errno.h> -#include <assert.h> -#include <getopt.h> -#include <ipxe/efi/efi.h> -#include <ipxe/efi/IndustryStandard/PeImage.h> - -#define eprintf(...) fprintf ( stderr, __VA_ARGS__ ) - -/** Command-line options */ -struct options { -}; - -/** EFI fat binary file header */ -struct efifatbin_file_header { - /** Signature */ - uint32_t signature; - /** Count */ - uint32_t count; -} __attribute__ (( packed )); - -/** EFI fat binary signature */ -#define EFIFATBIN_SIGNATURE 0x0ef1fab9 - -/** EFI fat binary image header */ -struct efifatbin_image_header { - /** Flags */ - uint64_t flags; - /** Offset */ - uint32_t offset; - /** Length */ - uint32_t len; - /** Padding */ - uint32_t pad; -} __attribute__ (( packed )); - -/** EFI fat binary default flags */ -#define EFIFATBIN_FLAGS 0x0000000300000007ULL - -/** EFI fat binary 64-bit flag */ -#define EFIFATBIN_64BIT 0x0000000001000000ULL - -/** - * Allocate memory - * - * @v len Length of memory to allocate - * @ret ptr Pointer to allocated memory - */ -static void * xmalloc ( size_t len ) { - void *ptr; - - ptr = malloc ( len ); - if ( ! ptr ) { - eprintf ( "Could not allocate %zd bytes\n", len ); - exit ( 1 ); - } - - return ptr; -} - -/** - * Generate EFI fat binary - * - * @v count Number of input files - * @v infile_names Input filenames - * @v outfile_name Output filename - */ -static void make_efifatbin ( unsigned int count, char **infile_names, - const char *outfile_name ) { - FILE *infile[count]; - FILE *outfile; - struct stat stat[count]; - void *buf[count]; - struct efifatbin_file_header file_header; - struct efifatbin_image_header header[count]; - size_t offset; - EFI_IMAGE_DOS_HEADER *dos; - union { - EFI_IMAGE_NT_HEADERS32 nt32; - EFI_IMAGE_NT_HEADERS64 nt64; - } *nt; - unsigned int i; - - /* Generate file header */ - file_header.signature = EFIFATBIN_SIGNATURE; - file_header.count = count; - offset = ( sizeof ( file_header ) + sizeof ( header ) ); - - /* Process input files */ - for ( i = 0 ; i < count ; i++ ) { - - /* Open input file */ - infile[i] = fopen ( infile_names[i], "r" ); - if ( ! infile[i] ) { - eprintf ( "Could not open %s for reading: %s\n", - infile_names[i], strerror ( errno ) ); - exit ( 1 ); - } - - /* Determine PE file size */ - if ( fstat ( fileno ( infile[i] ), &stat[i] ) != 0 ) { - eprintf ( "Could not stat %s: %s\n", - infile_names[i], strerror ( errno ) ); - exit ( 1 ); - } - - /* Allocate buffer and read in PE file */ - buf[i] = xmalloc ( stat[i].st_size ); - if ( fread ( buf[i], stat[i].st_size, 1, infile[i] ) != 1 ) { - eprintf ( "Could not read %s: %s\n", - infile_names[i], strerror ( errno ) ); - exit ( 1 ); - } - - /* Close input file */ - fclose ( infile[i] ); - - /* Generate image header */ - header[i].flags = EFIFATBIN_FLAGS; - header[i].offset = offset; - header[i].len = stat[i].st_size; - header[i].pad = 0; - - /* Determine architecture */ - dos = buf[i]; - nt = ( buf[i] + dos->e_lfanew ); - if ( nt->nt32.FileHeader.Machine == EFI_IMAGE_MACHINE_X64 ) - header[i].flags |= EFIFATBIN_64BIT; - - /* Allow space for this image */ - offset += stat[i].st_size; - } - - /* Open output file */ - outfile = fopen ( outfile_name, "w" ); - if ( ! outfile ) { - eprintf ( "Could not open %s for writing: %s\n", - outfile_name, strerror ( errno ) ); - exit ( 1 ); - } - - /* Write fat binary header */ - if ( fwrite ( &file_header, sizeof ( file_header ), 1, outfile ) != 1 ){ - eprintf ( "Could not write %s: %s\n", - outfile_name, strerror ( errno ) ); - exit ( 1 ); - } - for ( i = 0 ; i < count ; i++ ) { - if ( fwrite ( &header[i], sizeof ( header[i] ), 1, - outfile ) != 1 ) { - eprintf ( "Could not write %s: %s\n", - outfile_name, strerror ( errno ) ); - exit ( 1 ); - } - } - - /* Write images */ - for ( i = 0 ; i < count ; i++ ) { - if ( fwrite ( buf[i], stat[i].st_size, 1, outfile ) != 1 ) { - eprintf ( "Could not write %s: %s\n", - outfile_name, strerror ( errno ) ); - exit ( 1 ); - } - } - - /* Close output file */ - fclose ( outfile ); -} - -/** - * Print help - * - * @v program_name Program name - */ -static void print_help ( const char *program_name ) { - eprintf ( "Syntax: %s infile [infile...] outfile\n", program_name ); -} - -/** - * Parse command-line options - * - * @v argc Argument count - * @v argv Argument list - * @v opts Options structure to populate - */ -static int parse_options ( const int argc, char **argv, - struct options *opts __attribute__ (( unused )) ) { - int c; - - while (1) { - int option_index = 0; - static struct option long_options[] = { - { "help", 0, NULL, 'h' }, - { 0, 0, 0, 0 } - }; - - if ( ( c = getopt_long ( argc, argv, "h", - long_options, - &option_index ) ) == -1 ) { - break; - } - - switch ( c ) { - case 'h': - print_help ( argv[0] ); - exit ( 0 ); - case '?': - default: - exit ( 2 ); - } - } - return optind; -} - -int main ( int argc, char **argv ) { - struct options opts; - int infile_index; - int outfile_index; - int count; - - /* Parse command-line arguments */ - memset ( &opts, 0, sizeof ( opts ) ); - infile_index = parse_options ( argc, argv, &opts ); - outfile_index = ( argc - 1 ); - count = ( outfile_index - infile_index ); - if ( count <= 0 ) { - print_help ( argv[0] ); - exit ( 2 ); - } - - /* Generate fat binary */ - make_efifatbin ( count, &argv[infile_index], argv[outfile_index] ); - - return 0; -} diff --git a/qemu/roms/ipxe/src/util/efirom.c b/qemu/roms/ipxe/src/util/efirom.c deleted file mode 100644 index abee496dd..000000000 --- a/qemu/roms/ipxe/src/util/efirom.c +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Copyright (C) 2009 Michael Brown <mbrown@fensystems.co.uk>. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -#include <stdint.h> -#include <stddef.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <sys/stat.h> -#include <unistd.h> -#include <errno.h> -#include <assert.h> -#include <getopt.h> -#include <ipxe/efi/efi.h> -#include <ipxe/efi/IndustryStandard/PeImage.h> -#include <ipxe/efi/IndustryStandard/Pci22.h> - -#define eprintf(...) fprintf ( stderr, __VA_ARGS__ ) - -/** Command-line options */ -struct options { - uint16_t vendor; - uint16_t device; -}; - -/** - * Allocate memory - * - * @v len Length of memory to allocate - * @ret ptr Pointer to allocated memory - */ -static void * xmalloc ( size_t len ) { - void *ptr; - - ptr = malloc ( len ); - if ( ! ptr ) { - eprintf ( "Could not allocate %zd bytes\n", len ); - exit ( 1 ); - } - - return ptr; -} - -/** - * Read information from PE headers - * - * @v pe PE file - * @ret machine Machine type - * @ret subsystem EFI subsystem - */ -static void read_pe_info ( void *pe, uint16_t *machine, - uint16_t *subsystem ) { - EFI_IMAGE_DOS_HEADER *dos; - union { - EFI_IMAGE_NT_HEADERS32 nt32; - EFI_IMAGE_NT_HEADERS64 nt64; - } *nt; - - /* Locate NT header */ - dos = pe; - nt = ( pe + dos->e_lfanew ); - - /* Parse out PE information */ - *machine = nt->nt32.FileHeader.Machine; - switch ( *machine ) { - case EFI_IMAGE_MACHINE_IA32: - *subsystem = nt->nt32.OptionalHeader.Subsystem; - break; - case EFI_IMAGE_MACHINE_X64: - *subsystem = nt->nt64.OptionalHeader.Subsystem; - break; - default: - eprintf ( "Unrecognised machine type %04x\n", *machine ); - exit ( 1 ); - } -} - -/** - * Convert EFI image to ROM image - * - * @v pe EFI file - * @v rom ROM file - */ -static void make_efi_rom ( FILE *pe, FILE *rom, struct options *opts ) { - struct { - EFI_PCI_EXPANSION_ROM_HEADER rom; - PCI_DATA_STRUCTURE pci __attribute__ (( aligned ( 4 ) )); - uint8_t checksum; - } *headers; - struct stat pe_stat; - size_t pe_size; - size_t rom_size; - void *buf; - void *payload; - unsigned int i; - uint8_t checksum; - - /* Determine PE file size */ - if ( fstat ( fileno ( pe ), &pe_stat ) != 0 ) { - eprintf ( "Could not stat PE file: %s\n", - strerror ( errno ) ); - exit ( 1 ); - } - pe_size = pe_stat.st_size; - - /* Determine ROM file size */ - rom_size = ( ( pe_size + sizeof ( *headers ) + 511 ) & ~511 ); - - /* Allocate ROM buffer and read in PE file */ - buf = xmalloc ( rom_size ); - memset ( buf, 0, rom_size ); - headers = buf; - payload = ( buf + sizeof ( *headers ) ); - if ( fread ( payload, pe_size, 1, pe ) != 1 ) { - eprintf ( "Could not read PE file: %s\n", - strerror ( errno ) ); - exit ( 1 ); - } - - /* Construct ROM header */ - headers->rom.Signature = PCI_EXPANSION_ROM_HEADER_SIGNATURE; - headers->rom.InitializationSize = ( rom_size / 512 ); - headers->rom.EfiSignature = EFI_PCI_EXPANSION_ROM_HEADER_EFISIGNATURE; - read_pe_info ( payload, &headers->rom.EfiMachineType, - &headers->rom.EfiSubsystem ); - headers->rom.EfiImageHeaderOffset = sizeof ( *headers ); - headers->rom.PcirOffset = - offsetof ( typeof ( *headers ), pci ); - headers->pci.Signature = PCI_DATA_STRUCTURE_SIGNATURE; - headers->pci.VendorId = opts->vendor; - headers->pci.DeviceId = opts->device; - headers->pci.Length = sizeof ( headers->pci ); - headers->pci.ClassCode[0] = PCI_CLASS_NETWORK; - headers->pci.ImageLength = ( rom_size / 512 ); - headers->pci.CodeType = 0x03; /* No constant in EFI headers? */ - headers->pci.Indicator = 0x80; /* No constant in EFI headers? */ - - /* Fix image checksum */ - for ( i = 0, checksum = 0 ; i < rom_size ; i++ ) - checksum += *( ( uint8_t * ) buf + i ); - headers->checksum -= checksum; - - /* Write out ROM */ - if ( fwrite ( buf, rom_size, 1, rom ) != 1 ) { - eprintf ( "Could not write ROM file: %s\n", - strerror ( errno ) ); - exit ( 1 ); - } -} - -/** - * Print help - * - * @v program_name Program name - */ -static void print_help ( const char *program_name ) { - eprintf ( "Syntax: %s [--vendor=VVVV] [--device=DDDD] " - "infile outfile\n", program_name ); -} - -/** - * Parse command-line options - * - * @v argc Argument count - * @v argv Argument list - * @v opts Options structure to populate - */ -static int parse_options ( const int argc, char **argv, - struct options *opts ) { - char *end; - int c; - - while (1) { - int option_index = 0; - static struct option long_options[] = { - { "vendor", required_argument, NULL, 'v' }, - { "device", required_argument, NULL, 'd' }, - { "help", 0, NULL, 'h' }, - { 0, 0, 0, 0 } - }; - - if ( ( c = getopt_long ( argc, argv, "v:d:h", - long_options, - &option_index ) ) == -1 ) { - break; - } - - switch ( c ) { - case 'v': - opts->vendor = strtoul ( optarg, &end, 16 ); - if ( *end ) { - eprintf ( "Invalid vendor \"%s\"\n", optarg ); - exit ( 2 ); - } - break; - case 'd': - opts->device = strtoul ( optarg, &end, 16 ); - if ( *end ) { - eprintf ( "Invalid device \"%s\"\n", optarg ); - exit ( 2 ); - } - break; - case 'h': - print_help ( argv[0] ); - exit ( 0 ); - case '?': - default: - exit ( 2 ); - } - } - return optind; -} - -int main ( int argc, char **argv ) { - struct options opts; - int infile_index; - const char *infile_name; - const char *outfile_name; - FILE *infile; - FILE *outfile; - - /* Parse command-line arguments */ - memset ( &opts, 0, sizeof ( opts ) ); - infile_index = parse_options ( argc, argv, &opts ); - if ( argc != ( infile_index + 2 ) ) { - print_help ( argv[0] ); - exit ( 2 ); - } - infile_name = argv[infile_index]; - outfile_name = argv[infile_index + 1]; - - /* Open input and output files */ - infile = fopen ( infile_name, "r" ); - if ( ! infile ) { - eprintf ( "Could not open %s for reading: %s\n", - infile_name, strerror ( errno ) ); - exit ( 1 ); - } - outfile = fopen ( outfile_name, "w" ); - if ( ! outfile ) { - eprintf ( "Could not open %s for writing: %s\n", - outfile_name, strerror ( errno ) ); - exit ( 1 ); - } - - /* Convert file */ - make_efi_rom ( infile, outfile, &opts ); - - fclose ( outfile ); - fclose ( infile ); - - return 0; -} diff --git a/qemu/roms/ipxe/src/util/einfo.c b/qemu/roms/ipxe/src/util/einfo.c deleted file mode 100644 index d21558980..000000000 --- a/qemu/roms/ipxe/src/util/einfo.c +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright (C) 2010 Michael Brown <mbrown@fensystems.co.uk>. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -#include <stddef.h> -#include <stdint.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <errno.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/mman.h> -#include <unistd.h> -#include <fcntl.h> -#include <getopt.h> - -#define eprintf(...) fprintf ( stderr, __VA_ARGS__ ) - -/** Command-line options */ -struct options { -}; - -/** Error usage information */ -struct einfo { - /** Size of error information record */ - uint32_t size; - /** Error number */ - uint32_t error; - /** Offset to error description (NUL-terminated) */ - uint32_t desc; - /** Offset to file name (NUL-terminated) */ - uint32_t file; - /** Line number */ - uint32_t line; -} __attribute__ (( packed )); - -/** - * Process einfo file - * - * @v infile Filename - * @v opts Command-line options - */ -static void einfo ( const char *infile, - struct options *opts __attribute__ (( unused )) ) { - int fd; - struct stat stat; - size_t len; - void *start; - struct einfo *einfo; - - /* Open einfo file */ - if ( ( fd = open ( infile, O_RDONLY ) ) < 0 ) { - eprintf ( "Cannot open \"%s\": %s\n", - infile, strerror ( errno ) ); - exit ( 1 ); - } - - /* Get file size */ - if ( fstat ( fd, &stat ) < 0 ) { - eprintf ( "Cannot stat \"%s\": %s\n", - infile, strerror ( errno ) ); - exit ( 1 ); - } - len = stat.st_size; - - if ( len ) { - - /* Map file */ - if ( ( start = mmap ( NULL, len, PROT_READ, MAP_SHARED, - fd, 0 ) ) == MAP_FAILED ) { - eprintf ( "Cannot mmap \"%s\": %s\n", - infile, strerror ( errno ) ); - exit ( 1 ); - } - - /* Iterate over einfo records */ - for ( einfo = start ; ( ( void * ) einfo ) < ( start + len ) ; - einfo = ( ( ( void * ) einfo ) + einfo->size ) ) { - printf ( "%08x\t%s\t%d\t%s\n", einfo->error, - ( ( ( char * ) einfo ) + einfo->file ), - einfo->line, - ( ( ( char * ) einfo ) + einfo->desc ) ); - } - - /* Unmap file */ - munmap ( start, len ); - } - - /* Close file */ - close ( fd ); -} - -/** - * Print help - * - * @v program_name Program name - */ -static void print_help ( const char *program_name ) { - eprintf ( "Syntax: %s file1.einfo [file2.einfo...]\n", - program_name ); -} - -/** - * Parse command-line options - * - * @v argc Argument count - * @v argv Argument list - * @v opts Options structure to populate - */ -static int parse_options ( const int argc, char **argv, - struct options *opts __attribute__ (( unused )) ) { - int c; - - while (1) { - int option_index = 0; - static struct option long_options[] = { - { "help", 0, NULL, 'h' }, - { 0, 0, 0, 0 } - }; - - if ( ( c = getopt_long ( argc, argv, "s:h", - long_options, - &option_index ) ) == -1 ) { - break; - } - - switch ( c ) { - case 'h': - print_help ( argv[0] ); - exit ( 0 ); - case '?': - default: - exit ( 2 ); - } - } - return optind; -} - -int main ( int argc, char **argv ) { - struct options opts = { - }; - int infile_index; - const char *infile; - - /* Parse command-line arguments */ - infile_index = parse_options ( argc, argv, &opts ); - if ( argc <= infile_index ) { - print_help ( argv[0] ); - exit ( 2 ); - } - - /* Process each einfo file */ - for ( ; infile_index < argc ; infile_index++ ) { - infile = argv[infile_index]; - einfo ( infile, &opts ); - } - - return 0; -} diff --git a/qemu/roms/ipxe/src/util/elf2efi.c b/qemu/roms/ipxe/src/util/elf2efi.c deleted file mode 100644 index e68fa5d14..000000000 --- a/qemu/roms/ipxe/src/util/elf2efi.c +++ /dev/null @@ -1,822 +0,0 @@ -/* - * Copyright (C) 2009 Michael Brown <mbrown@fensystems.co.uk>. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -#define _GNU_SOURCE -#define PACKAGE "elf2efi" -#define PACKAGE_VERSION "1" -#include <stdint.h> -#include <stddef.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> -#include <assert.h> -#include <getopt.h> -#include <bfd.h> -#include <ipxe/efi/efi.h> -#include <ipxe/efi/IndustryStandard/PeImage.h> -#include <libgen.h> - -#define eprintf(...) fprintf ( stderr, __VA_ARGS__ ) - -#define EFI_FILE_ALIGN 0x20 - -struct pe_section { - struct pe_section *next; - EFI_IMAGE_SECTION_HEADER hdr; - uint8_t contents[0]; -}; - -struct pe_relocs { - struct pe_relocs *next; - unsigned long start_rva; - unsigned int used_relocs; - unsigned int total_relocs; - uint16_t *relocs; -}; - -struct pe_header { - EFI_IMAGE_DOS_HEADER dos; - uint8_t padding[128]; -#if defined(EFI_TARGET_IA32) - EFI_IMAGE_NT_HEADERS32 nt; -#elif defined(EFI_TARGET_X64) - EFI_IMAGE_NT_HEADERS64 nt; -#endif -}; - -static struct pe_header efi_pe_header = { - .dos = { - .e_magic = EFI_IMAGE_DOS_SIGNATURE, - .e_lfanew = offsetof ( typeof ( efi_pe_header ), nt ), - }, - .nt = { - .Signature = EFI_IMAGE_NT_SIGNATURE, - .FileHeader = { -#if defined(EFI_TARGET_IA32) - .Machine = EFI_IMAGE_MACHINE_IA32, -#elif defined(EFI_TARGET_X64) - .Machine = EFI_IMAGE_MACHINE_X64, -#endif - .TimeDateStamp = 0x10d1a884, - .SizeOfOptionalHeader = - sizeof ( efi_pe_header.nt.OptionalHeader ), - .Characteristics = ( EFI_IMAGE_FILE_DLL | -#if defined(EFI_TARGET_IA32) - EFI_IMAGE_FILE_32BIT_MACHINE | -#endif - EFI_IMAGE_FILE_EXECUTABLE_IMAGE ), - }, - .OptionalHeader = { -#if defined(EFI_TARGET_IA32) - .Magic = EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC, -#elif defined(EFI_TARGET_X64) - .Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC, -#endif - .SectionAlignment = EFI_FILE_ALIGN, - .FileAlignment = EFI_FILE_ALIGN, - .SizeOfImage = sizeof ( efi_pe_header ), - .SizeOfHeaders = sizeof ( efi_pe_header ), - .NumberOfRvaAndSizes = - EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES, - }, - }, -}; - -/** Command-line options */ -struct options { - unsigned int subsystem; -}; - -/** - * Allocate memory - * - * @v len Length of memory to allocate - * @ret ptr Pointer to allocated memory - */ -static void * xmalloc ( size_t len ) { - void *ptr; - - ptr = malloc ( len ); - if ( ! ptr ) { - eprintf ( "Could not allocate %zd bytes\n", len ); - exit ( 1 ); - } - - return ptr; -} - -/** - * Align section within PE file - * - * @v offset Unaligned offset - * @ret aligned_offset Aligned offset - */ -static unsigned long efi_file_align ( unsigned long offset ) { - return ( ( offset + EFI_FILE_ALIGN - 1 ) & ~( EFI_FILE_ALIGN - 1 ) ); -} - -/** - * Generate entry in PE relocation table - * - * @v pe_reltab PE relocation table - * @v rva RVA - * @v size Size of relocation entry - */ -static void generate_pe_reloc ( struct pe_relocs **pe_reltab, - unsigned long rva, size_t size ) { - unsigned long start_rva; - uint16_t reloc; - struct pe_relocs *pe_rel; - uint16_t *relocs; - - /* Construct */ - start_rva = ( rva & ~0xfff ); - reloc = ( rva & 0xfff ); - switch ( size ) { - case 8: - reloc |= 0xa000; - break; - case 4: - reloc |= 0x3000; - break; - case 2: - reloc |= 0x2000; - break; - default: - eprintf ( "Unsupported relocation size %zd\n", size ); - exit ( 1 ); - } - - /* Locate or create PE relocation table */ - for ( pe_rel = *pe_reltab ; pe_rel ; pe_rel = pe_rel->next ) { - if ( pe_rel->start_rva == start_rva ) - break; - } - if ( ! pe_rel ) { - pe_rel = xmalloc ( sizeof ( *pe_rel ) ); - memset ( pe_rel, 0, sizeof ( *pe_rel ) ); - pe_rel->next = *pe_reltab; - *pe_reltab = pe_rel; - pe_rel->start_rva = start_rva; - } - - /* Expand relocation list if necessary */ - if ( pe_rel->used_relocs < pe_rel->total_relocs ) { - relocs = pe_rel->relocs; - } else { - pe_rel->total_relocs = ( pe_rel->total_relocs ? - ( pe_rel->total_relocs * 2 ) : 256 ); - relocs = xmalloc ( pe_rel->total_relocs * - sizeof ( pe_rel->relocs[0] ) ); - memset ( relocs, 0, - pe_rel->total_relocs * sizeof ( pe_rel->relocs[0] ) ); - memcpy ( relocs, pe_rel->relocs, - pe_rel->used_relocs * sizeof ( pe_rel->relocs[0] ) ); - free ( pe_rel->relocs ); - pe_rel->relocs = relocs; - } - - /* Store relocation */ - pe_rel->relocs[ pe_rel->used_relocs++ ] = reloc; -} - -/** - * Calculate size of binary PE relocation table - * - * @v pe_reltab PE relocation table - * @v buffer Buffer to contain binary table, or NULL - * @ret size Size of binary table - */ -static size_t output_pe_reltab ( struct pe_relocs *pe_reltab, - void *buffer ) { - struct pe_relocs *pe_rel; - unsigned int num_relocs; - size_t size; - size_t total_size = 0; - - for ( pe_rel = pe_reltab ; pe_rel ; pe_rel = pe_rel->next ) { - num_relocs = ( ( pe_rel->used_relocs + 1 ) & ~1 ); - size = ( sizeof ( uint32_t ) /* VirtualAddress */ + - sizeof ( uint32_t ) /* SizeOfBlock */ + - ( num_relocs * sizeof ( uint16_t ) ) ); - if ( buffer ) { - *( (uint32_t *) ( buffer + total_size + 0 ) ) - = pe_rel->start_rva; - *( (uint32_t *) ( buffer + total_size + 4 ) ) = size; - memcpy ( ( buffer + total_size + 8 ), pe_rel->relocs, - ( num_relocs * sizeof ( uint16_t ) ) ); - } - total_size += size; - } - - return total_size; -} - -/** - * Open input BFD file - * - * @v filename File name - * @ret ibfd BFD file - */ -static bfd * open_input_bfd ( const char *filename ) { - bfd *bfd; - - /* Open the file */ - bfd = bfd_openr ( filename, NULL ); - if ( ! bfd ) { - eprintf ( "Cannot open %s: ", filename ); - bfd_perror ( NULL ); - exit ( 1 ); - } - - /* The call to bfd_check_format() must be present, otherwise - * we get a segfault from later BFD calls. - */ - if ( ! bfd_check_format ( bfd, bfd_object ) ) { - eprintf ( "%s is not an object file: ", filename ); - bfd_perror ( NULL ); - exit ( 1 ); - } - - return bfd; -} - -/** - * Read symbol table - * - * @v bfd BFD file - */ -static asymbol ** read_symtab ( bfd *bfd ) { - long symtab_size; - asymbol **symtab; - long symcount; - - /* Get symbol table size */ - symtab_size = bfd_get_symtab_upper_bound ( bfd ); - if ( symtab_size < 0 ) { - bfd_perror ( "Could not get symbol table upper bound" ); - exit ( 1 ); - } - - /* Allocate and read symbol table */ - symtab = xmalloc ( symtab_size ); - symcount = bfd_canonicalize_symtab ( bfd, symtab ); - if ( symcount < 0 ) { - bfd_perror ( "Cannot read symbol table" ); - exit ( 1 ); - } - - return symtab; -} - -/** - * Read relocation table - * - * @v bfd BFD file - * @v symtab Symbol table - * @v section Section - * @v symtab Symbol table - * @ret reltab Relocation table - */ -static arelent ** read_reltab ( bfd *bfd, asymbol **symtab, - asection *section ) { - long reltab_size; - arelent **reltab; - long numrels; - - /* Get relocation table size */ - reltab_size = bfd_get_reloc_upper_bound ( bfd, section ); - if ( reltab_size < 0 ) { - bfd_perror ( "Could not get relocation table upper bound" ); - exit ( 1 ); - } - - /* Allocate and read relocation table */ - reltab = xmalloc ( reltab_size ); - numrels = bfd_canonicalize_reloc ( bfd, section, reltab, symtab ); - if ( numrels < 0 ) { - bfd_perror ( "Cannot read relocation table" ); - exit ( 1 ); - } - - return reltab; -} - -/** - * Process section - * - * @v bfd BFD file - * @v pe_header PE file header - * @v section Section - * @ret new New PE section - */ -static struct pe_section * process_section ( bfd *bfd, - struct pe_header *pe_header, - asection *section ) { - struct pe_section *new; - size_t section_memsz; - size_t section_filesz; - unsigned long flags = bfd_get_section_flags ( bfd, section ); - unsigned long code_start; - unsigned long code_end; - unsigned long data_start; - unsigned long data_mid; - unsigned long data_end; - unsigned long start; - unsigned long end; - unsigned long *applicable_start; - unsigned long *applicable_end; - - /* Extract current RVA limits from file header */ - code_start = pe_header->nt.OptionalHeader.BaseOfCode; - code_end = ( code_start + pe_header->nt.OptionalHeader.SizeOfCode ); -#if defined(EFI_TARGET_IA32) - data_start = pe_header->nt.OptionalHeader.BaseOfData; -#elif defined(EFI_TARGET_X64) - data_start = code_end; -#endif - data_mid = ( data_start + - pe_header->nt.OptionalHeader.SizeOfInitializedData ); - data_end = ( data_mid + - pe_header->nt.OptionalHeader.SizeOfUninitializedData ); - - /* Allocate PE section */ - section_memsz = bfd_section_size ( bfd, section ); - section_filesz = ( ( flags & SEC_LOAD ) ? - efi_file_align ( section_memsz ) : 0 ); - new = xmalloc ( sizeof ( *new ) + section_filesz ); - memset ( new, 0, sizeof ( *new ) + section_filesz ); - - /* Fill in section header details */ - strncpy ( ( char * ) new->hdr.Name, section->name, - sizeof ( new->hdr.Name ) ); - new->hdr.Misc.VirtualSize = section_memsz; - new->hdr.VirtualAddress = bfd_get_section_vma ( bfd, section ); - new->hdr.SizeOfRawData = section_filesz; - - /* Fill in section characteristics and update RVA limits */ - if ( flags & SEC_CODE ) { - /* .text-type section */ - new->hdr.Characteristics = - ( EFI_IMAGE_SCN_CNT_CODE | - EFI_IMAGE_SCN_MEM_NOT_PAGED | - EFI_IMAGE_SCN_MEM_EXECUTE | - EFI_IMAGE_SCN_MEM_READ ); - applicable_start = &code_start; - applicable_end = &code_end; - } else if ( flags & SEC_DATA ) { - /* .data-type section */ - new->hdr.Characteristics = - ( EFI_IMAGE_SCN_CNT_INITIALIZED_DATA | - EFI_IMAGE_SCN_MEM_NOT_PAGED | - EFI_IMAGE_SCN_MEM_READ | - EFI_IMAGE_SCN_MEM_WRITE ); - applicable_start = &data_start; - applicable_end = &data_mid; - } else if ( flags & SEC_READONLY ) { - /* .rodata-type section */ - new->hdr.Characteristics = - ( EFI_IMAGE_SCN_CNT_INITIALIZED_DATA | - EFI_IMAGE_SCN_MEM_NOT_PAGED | - EFI_IMAGE_SCN_MEM_READ ); - applicable_start = &data_start; - applicable_end = &data_mid; - } else if ( ! ( flags & SEC_LOAD ) ) { - /* .bss-type section */ - new->hdr.Characteristics = - ( EFI_IMAGE_SCN_CNT_UNINITIALIZED_DATA | - EFI_IMAGE_SCN_MEM_NOT_PAGED | - EFI_IMAGE_SCN_MEM_READ | - EFI_IMAGE_SCN_MEM_WRITE ); - applicable_start = &data_mid; - applicable_end = &data_end; - } else { - eprintf ( "Unrecognised characteristics %#lx for section %s\n", - flags, section->name ); - exit ( 1 ); - } - - /* Copy in section contents */ - if ( flags & SEC_LOAD ) { - if ( ! bfd_get_section_contents ( bfd, section, new->contents, - 0, section_memsz ) ) { - eprintf ( "Cannot read section %s: ", section->name ); - bfd_perror ( NULL ); - exit ( 1 ); - } - } - - /* Update RVA limits */ - start = new->hdr.VirtualAddress; - end = ( start + new->hdr.Misc.VirtualSize ); - if ( ( ! *applicable_start ) || ( *applicable_start >= start ) ) - *applicable_start = start; - if ( *applicable_end < end ) - *applicable_end = end; - if ( data_start < code_end ) - data_start = code_end; - if ( data_mid < data_start ) - data_mid = data_start; - if ( data_end < data_mid ) - data_end = data_mid; - - /* Write RVA limits back to file header */ - pe_header->nt.OptionalHeader.BaseOfCode = code_start; - pe_header->nt.OptionalHeader.SizeOfCode = ( code_end - code_start ); -#if defined(EFI_TARGET_IA32) - pe_header->nt.OptionalHeader.BaseOfData = data_start; -#endif - pe_header->nt.OptionalHeader.SizeOfInitializedData = - ( data_mid - data_start ); - pe_header->nt.OptionalHeader.SizeOfUninitializedData = - ( data_end - data_mid ); - - /* Update remaining file header fields */ - pe_header->nt.FileHeader.NumberOfSections++; - pe_header->nt.OptionalHeader.SizeOfHeaders += sizeof ( new->hdr ); - pe_header->nt.OptionalHeader.SizeOfImage = - efi_file_align ( data_end ); - - return new; -} - -/** - * Process relocation record - * - * @v bfd BFD file - * @v section Section - * @v rel Relocation entry - * @v pe_reltab PE relocation table to fill in - */ -static void process_reloc ( bfd *bfd __attribute__ (( unused )), - asection *section, arelent *rel, - struct pe_relocs **pe_reltab ) { - reloc_howto_type *howto = rel->howto; - asymbol *sym = *(rel->sym_ptr_ptr); - unsigned long offset = ( bfd_get_section_vma ( bfd, section ) + - rel->address ); - - if ( bfd_is_abs_section ( sym->section ) ) { - /* Skip absolute symbols; the symbol value won't - * change when the object is loaded. - */ - } else if ( ( strcmp ( howto->name, "R_386_NONE" ) == 0 ) || - ( strcmp ( howto->name, "R_X86_64_NONE" ) == 0 ) ) { - /* Ignore dummy relocations used by REQUIRE_SYMBOL() */ - } else if ( strcmp ( howto->name, "R_X86_64_64" ) == 0 ) { - /* Generate an 8-byte PE relocation */ - generate_pe_reloc ( pe_reltab, offset, 8 ); - } else if ( strcmp ( howto->name, "R_386_32" ) == 0 ) { - /* Generate a 4-byte PE relocation */ - generate_pe_reloc ( pe_reltab, offset, 4 ); - } else if ( strcmp ( howto->name, "R_386_16" ) == 0 ) { - /* Generate a 2-byte PE relocation */ - generate_pe_reloc ( pe_reltab, offset, 2 ); - } else if ( ( strcmp ( howto->name, "R_386_PC32" ) == 0 ) || - ( strcmp ( howto->name, "R_X86_64_PC32" ) == 0 ) ) { - /* Skip PC-relative relocations; all relative offsets - * remain unaltered when the object is loaded. - */ - } else { - eprintf ( "Unrecognised relocation type %s\n", howto->name ); - exit ( 1 ); - } -} - -/** - * Create relocations section - * - * @v pe_header PE file header - * @v pe_reltab PE relocation table - * @ret section Relocation section - */ -static struct pe_section * -create_reloc_section ( struct pe_header *pe_header, - struct pe_relocs *pe_reltab ) { - struct pe_section *reloc; - size_t section_memsz; - size_t section_filesz; - EFI_IMAGE_DATA_DIRECTORY *relocdir; - - /* Allocate PE section */ - section_memsz = output_pe_reltab ( pe_reltab, NULL ); - section_filesz = efi_file_align ( section_memsz ); - reloc = xmalloc ( sizeof ( *reloc ) + section_filesz ); - memset ( reloc, 0, sizeof ( *reloc ) + section_filesz ); - - /* Fill in section header details */ - strncpy ( ( char * ) reloc->hdr.Name, ".reloc", - sizeof ( reloc->hdr.Name ) ); - reloc->hdr.Misc.VirtualSize = section_memsz; - reloc->hdr.VirtualAddress = pe_header->nt.OptionalHeader.SizeOfImage; - reloc->hdr.SizeOfRawData = section_filesz; - reloc->hdr.Characteristics = ( EFI_IMAGE_SCN_CNT_INITIALIZED_DATA | - EFI_IMAGE_SCN_MEM_NOT_PAGED | - EFI_IMAGE_SCN_MEM_READ ); - - /* Copy in section contents */ - output_pe_reltab ( pe_reltab, reloc->contents ); - - /* Update file header details */ - pe_header->nt.FileHeader.NumberOfSections++; - pe_header->nt.OptionalHeader.SizeOfHeaders += sizeof ( reloc->hdr ); - pe_header->nt.OptionalHeader.SizeOfImage += section_filesz; - relocdir = &(pe_header->nt.OptionalHeader.DataDirectory - [EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC]); - relocdir->VirtualAddress = reloc->hdr.VirtualAddress; - relocdir->Size = reloc->hdr.Misc.VirtualSize; - - return reloc; -} - -/** - * Create debug section - * - * @v pe_header PE file header - * @ret section Debug section - */ -static struct pe_section * -create_debug_section ( struct pe_header *pe_header, const char *filename ) { - struct pe_section *debug; - size_t section_memsz; - size_t section_filesz; - EFI_IMAGE_DATA_DIRECTORY *debugdir; - struct { - EFI_IMAGE_DEBUG_DIRECTORY_ENTRY debug; - EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY rsds; - char name[ strlen ( filename ) + 1 ]; - } *contents; - - /* Allocate PE section */ - section_memsz = sizeof ( *contents ); - section_filesz = efi_file_align ( section_memsz ); - debug = xmalloc ( sizeof ( *debug ) + section_filesz ); - memset ( debug, 0, sizeof ( *debug ) + section_filesz ); - contents = ( void * ) debug->contents; - - /* Fill in section header details */ - strncpy ( ( char * ) debug->hdr.Name, ".debug", - sizeof ( debug->hdr.Name ) ); - debug->hdr.Misc.VirtualSize = section_memsz; - debug->hdr.VirtualAddress = pe_header->nt.OptionalHeader.SizeOfImage; - debug->hdr.SizeOfRawData = section_filesz; - debug->hdr.Characteristics = ( EFI_IMAGE_SCN_CNT_INITIALIZED_DATA | - EFI_IMAGE_SCN_MEM_NOT_PAGED | - EFI_IMAGE_SCN_MEM_READ ); - - /* Create section contents */ - contents->debug.TimeDateStamp = 0x10d1a884; - contents->debug.Type = EFI_IMAGE_DEBUG_TYPE_CODEVIEW; - contents->debug.SizeOfData = - ( sizeof ( *contents ) - sizeof ( contents->debug ) ); - contents->debug.RVA = ( debug->hdr.VirtualAddress + - offsetof ( typeof ( *contents ), rsds ) ); - contents->rsds.Signature = CODEVIEW_SIGNATURE_RSDS; - snprintf ( contents->name, sizeof ( contents->name ), "%s", - filename ); - - /* Update file header details */ - pe_header->nt.FileHeader.NumberOfSections++; - pe_header->nt.OptionalHeader.SizeOfHeaders += sizeof ( debug->hdr ); - pe_header->nt.OptionalHeader.SizeOfImage += section_filesz; - debugdir = &(pe_header->nt.OptionalHeader.DataDirectory - [EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]); - debugdir->VirtualAddress = debug->hdr.VirtualAddress; - debugdir->Size = debug->hdr.Misc.VirtualSize; - - return debug; -} - -/** - * Write out PE file - * - * @v pe_header PE file header - * @v pe_sections List of PE sections - * @v pe Output file - */ -static void write_pe_file ( struct pe_header *pe_header, - struct pe_section *pe_sections, - FILE *pe ) { - struct pe_section *section; - unsigned long fpos = 0; - - /* Align length of headers */ - fpos = pe_header->nt.OptionalHeader.SizeOfHeaders = - efi_file_align ( pe_header->nt.OptionalHeader.SizeOfHeaders ); - - /* Assign raw data pointers */ - for ( section = pe_sections ; section ; section = section->next ) { - if ( section->hdr.SizeOfRawData ) { - section->hdr.PointerToRawData = fpos; - fpos += section->hdr.SizeOfRawData; - fpos = efi_file_align ( fpos ); - } - } - - /* Write file header */ - if ( fwrite ( pe_header, sizeof ( *pe_header ), 1, pe ) != 1 ) { - perror ( "Could not write PE header" ); - exit ( 1 ); - } - - /* Write section headers */ - for ( section = pe_sections ; section ; section = section->next ) { - if ( fwrite ( §ion->hdr, sizeof ( section->hdr ), - 1, pe ) != 1 ) { - perror ( "Could not write section header" ); - exit ( 1 ); - } - } - - /* Write sections */ - for ( section = pe_sections ; section ; section = section->next ) { - if ( fseek ( pe, section->hdr.PointerToRawData, - SEEK_SET ) != 0 ) { - eprintf ( "Could not seek to %x: %s\n", - section->hdr.PointerToRawData, - strerror ( errno ) ); - exit ( 1 ); - } - if ( section->hdr.SizeOfRawData && - ( fwrite ( section->contents, section->hdr.SizeOfRawData, - 1, pe ) != 1 ) ) { - eprintf ( "Could not write section %.8s: %s\n", - section->hdr.Name, strerror ( errno ) ); - exit ( 1 ); - } - } -} - -/** - * Convert ELF to PE - * - * @v elf_name ELF file name - * @v pe_name PE file name - */ -static void elf2pe ( const char *elf_name, const char *pe_name, - struct options *opts ) { - char pe_name_tmp[ strlen ( pe_name ) + 1 ]; - bfd *bfd; - asymbol **symtab; - asection *section; - arelent **reltab; - arelent **rel; - struct pe_relocs *pe_reltab = NULL; - struct pe_section *pe_sections = NULL; - struct pe_section **next_pe_section = &pe_sections; - struct pe_header pe_header; - FILE *pe; - - /* Create a modifiable copy of the PE name */ - memcpy ( pe_name_tmp, pe_name, sizeof ( pe_name_tmp ) ); - - /* Open the file */ - bfd = open_input_bfd ( elf_name ); - symtab = read_symtab ( bfd ); - - /* Initialise the PE header */ - memcpy ( &pe_header, &efi_pe_header, sizeof ( pe_header ) ); - pe_header.nt.OptionalHeader.AddressOfEntryPoint = - bfd_get_start_address ( bfd ); - pe_header.nt.OptionalHeader.Subsystem = opts->subsystem; - - /* For each input section, build an output section and create - * the appropriate relocation records - */ - for ( section = bfd->sections ; section ; section = section->next ) { - /* Discard non-allocatable sections */ - if ( ! ( bfd_get_section_flags ( bfd, section ) & SEC_ALLOC ) ) - continue; - /* Create output section */ - *(next_pe_section) = process_section ( bfd, &pe_header, - section ); - next_pe_section = &(*next_pe_section)->next; - /* Add relocations from this section */ - reltab = read_reltab ( bfd, symtab, section ); - for ( rel = reltab ; *rel ; rel++ ) - process_reloc ( bfd, section, *rel, &pe_reltab ); - free ( reltab ); - } - - /* Create the .reloc section */ - *(next_pe_section) = create_reloc_section ( &pe_header, pe_reltab ); - next_pe_section = &(*next_pe_section)->next; - - /* Create the .reloc section */ - *(next_pe_section) = create_debug_section ( &pe_header, - basename ( pe_name_tmp ) ); - next_pe_section = &(*next_pe_section)->next; - - /* Write out PE file */ - pe = fopen ( pe_name, "w" ); - if ( ! pe ) { - eprintf ( "Could not open %s for writing: %s\n", - pe_name, strerror ( errno ) ); - exit ( 1 ); - } - write_pe_file ( &pe_header, pe_sections, pe ); - fclose ( pe ); - - /* Close BFD file */ - bfd_close ( bfd ); -} - -/** - * Print help - * - * @v program_name Program name - */ -static void print_help ( const char *program_name ) { - eprintf ( "Syntax: %s [--subsystem=<number>] infile outfile\n", - program_name ); -} - -/** - * Parse command-line options - * - * @v argc Argument count - * @v argv Argument list - * @v opts Options structure to populate - */ -static int parse_options ( const int argc, char **argv, - struct options *opts ) { - char *end; - int c; - - while (1) { - int option_index = 0; - static struct option long_options[] = { - { "subsystem", required_argument, NULL, 's' }, - { "help", 0, NULL, 'h' }, - { 0, 0, 0, 0 } - }; - - if ( ( c = getopt_long ( argc, argv, "s:h", - long_options, - &option_index ) ) == -1 ) { - break; - } - - switch ( c ) { - case 's': - opts->subsystem = strtoul ( optarg, &end, 0 ); - if ( *end ) { - eprintf ( "Invalid subsytem \"%s\"\n", - optarg ); - exit ( 2 ); - } - break; - case 'h': - print_help ( argv[0] ); - exit ( 0 ); - case '?': - default: - exit ( 2 ); - } - } - return optind; -} - -int main ( int argc, char **argv ) { - struct options opts = { - .subsystem = EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION, - }; - int infile_index; - const char *infile; - const char *outfile; - - /* Initialise libbfd */ - bfd_init(); - - /* Parse command-line arguments */ - infile_index = parse_options ( argc, argv, &opts ); - if ( argc != ( infile_index + 2 ) ) { - print_help ( argv[0] ); - exit ( 2 ); - } - infile = argv[infile_index]; - outfile = argv[infile_index + 1]; - - /* Convert file */ - elf2pe ( infile, outfile, &opts ); - - return 0; -} diff --git a/qemu/roms/ipxe/src/util/fixrom.pl b/qemu/roms/ipxe/src/util/fixrom.pl deleted file mode 100755 index dcc38fe4b..000000000 --- a/qemu/roms/ipxe/src/util/fixrom.pl +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright (C) 2010 Michael Brown <mbrown@fensystems.co.uk>. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. - -use strict; -use warnings; - -use FindBin; -use lib "$FindBin::Bin"; -use Option::ROM qw ( :all ); - -my @romfiles = @ARGV; - -foreach my $romfile ( @romfiles ) { - my $rom = new Option::ROM; - $rom->load ( $romfile ); - my $image = $rom; - while ( $image ) { - $image->pnp_header->fix_checksum() if $image->pnp_header; - $image->undi_header->fix_checksum() if $image->undi_header; - $image->ipxe_header->fix_checksum() if $image->ipxe_header; - $image->fix_checksum(); - $image = $image->next_image(); - } - $rom->save ( $romfile ); -} diff --git a/qemu/roms/ipxe/src/util/fnrec.pl b/qemu/roms/ipxe/src/util/fnrec.pl deleted file mode 100755 index cc7312b61..000000000 --- a/qemu/roms/ipxe/src/util/fnrec.pl +++ /dev/null @@ -1,146 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright (C) 2010 Michael Brown <mbrown@fensystems.co.uk>. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. - -=head1 NAME - -fnrec.pl - -=head1 SYNOPSIS - -fnrec.pl [options] bin/image.xxx < logfile - -Decode a function trace produced by building with FNREC=1 - -Options: - - -m,--max-depth=N Set maximum displayed function depth - -=cut - -use IPC::Open2; -use Getopt::Long; -use Pod::Usage; -use strict; -use warnings; - -use constant MAX_OPEN_BRACE => 10; -use constant MAX_COMMON_BRACE => 3; -use constant MAX_CLOSE_BRACE => 10; - -# Parse command-line options -my $max_depth = 16; -Getopt::Long::Configure ( 'bundling', 'auto_abbrev' ); -GetOptions ( - 'help|h' => sub { pod2usage ( 1 ); }, - 'max-depth|m=i' => sub { shift; $max_depth = shift; }, -) or die "Could not parse command-line options\n"; -pod2usage ( 1 ) unless @ARGV == 1; -my $image = shift; -my $elf = $image.".tmp"; -die "ELF file ".$elf." not found\n" unless -e $elf; - -# Start up addr2line -my $addr2line_pid = open2 ( my $addr2line_out, my $addr2line_in, - "addr2line", "-f", "-e", $elf ) - or die "Could not start addr2line: $!\n"; - -# Translate address using addr2line -sub addr2line { - my $address = shift; - - print $addr2line_in $address."\n"; - chomp ( my $name = <$addr2line_out> ); - chomp ( my $file_line = <$addr2line_out> ); - ( my $file, my $line ) = ( $file_line =~ /^(.*):(\d+)$/ ); - $file =~ s/^.*\/src\///; - my $location = ( $line ? $file.":".$line." = ".$address : $address ); - return ( $name, $location ); -} - -# Parse logfile -my $depth = 0; -my $depths = []; -while ( my $line = <> ) { - chomp $line; - $line =~ s/\r//g; - ( my $called_fn, my $call_site, my $entry_count, my $exit_count ) = - ( $line =~ /^(0x[0-9a-f]+)\s+(0x[0-9a-f]+)\s+([0-9]+)\s+([0-9]+)$/ ) - or print $line."\n" and next; - - ( my $called_fn_name, undef ) = addr2line ( $called_fn ); - ( undef, my $call_site_location ) = addr2line ( $call_site ); - $entry_count = ( $entry_count + 0 ); - $exit_count = ( $exit_count + 0 ); - - if ( $entry_count >= $exit_count ) { - # - # Function entry - # - my $text = ""; - $text .= $called_fn_name." (from ".$call_site_location.")"; - if ( $exit_count <= MAX_COMMON_BRACE ) { - $text .= " { }" x $exit_count; - } else { - $text .= " { } x ".$exit_count; - } - $entry_count -= $exit_count; - if ( $entry_count <= MAX_OPEN_BRACE ) { - $text .= " {" x $entry_count; - } else { - $text .= " { x ".$entry_count; - } - my $indent = " " x $depth; - print $indent.$text."\n"; - $depth += $entry_count; - $depth = $max_depth if ( $depth > $max_depth ); - push @$depths, ( { called_fn => $called_fn, call_site => $call_site } ) x - ( $depth - @$depths ); - } else { - # - # Function exit - # - my $text = ""; - if ( $entry_count <= MAX_COMMON_BRACE ) { - $text .= " { }" x $entry_count; - } else { - $text .= " { } x ".$entry_count; - } - $exit_count -= $entry_count; - if ( $exit_count <= MAX_CLOSE_BRACE ) { - $text .= " }" x $exit_count; - } else { - $text .= " } x ".$exit_count; - } - $depth -= $exit_count; - $depth = 0 if ( $depth < 0 ); - if ( ( @$depths == 0 ) || - ( $depths->[$depth]->{called_fn} ne $called_fn ) || - ( $depths->[$depth]->{call_site} ne $call_site ) ) { - $text .= " (from ".$called_fn_name." to ".$call_site_location.")"; - } - splice ( @$depths, $depth ); - my $indent = " " x $depth; - print substr ( $indent.$text, 1 )."\n"; - } -} - -# Clean up addr2line -close $addr2line_in; -close $addr2line_out; -waitpid ( $addr2line_pid, 0 ); diff --git a/qemu/roms/ipxe/src/util/geniso b/qemu/roms/ipxe/src/util/geniso deleted file mode 100755 index 521c929e1..000000000 --- a/qemu/roms/ipxe/src/util/geniso +++ /dev/null @@ -1,142 +0,0 @@ -#!/bin/bash -# -# Generate a isolinux ISO boot image - -function help() { - echo "usage: ${0} [OPTIONS] foo.lkrn [bar.lkrn,...]" - echo - echo "where OPTIONS are:" - echo " -h show this help" - echo " -l build legacy image with floppy emulation" - echo " -o FILE save iso image to file" -} - -LEGACY=0 -FIRST="" - -while getopts "hlo:" opt; do - case ${opt} in - h) - help - exit 0 - ;; - l) - LEGACY=1 - ;; - o) - OUT="${OPTARG}" - ;; - esac -done - -shift $((OPTIND - 1)) - -if [ -z "${OUT}" ]; then - echo "${0}: no output file given" >&2 - help - exit 1 -fi - -# There should either be mkisofs or the compatible genisoimage program -for command in genisoimage mkisofs; do - if ${command} --version >/dev/null 2>/dev/null; then - mkisofs=(${command}) - break - fi -done - -if [ -z "${mkisofs}" ]; then - echo "${0}: mkisofs or genisoimage not found, please install or set PATH" >&2 - exit 1 -fi - -dir=$(mktemp -d bin/iso.dir.XXXXXX) -cfg=${dir}/isolinux.cfg - -mkisofs+=(-quiet -l -volid "iPXE" -preparer "iPXE build system" - -appid "iPXE ${VERSION} - Open Source Network Boot Firmware" - -publisher "http://ipxe.org/" -c boot.cat) - -# generate the config -cat > ${cfg} <<EOF -# These default options can be changed in the geniso script -SAY iPXE ISO boot image -TIMEOUT 30 -EOF -for f; do - if [ ! -r ${f} ]; then - echo "${f} does not exist, skipping" >&2 - continue - fi - b=$(basename ${f}) - g=${b%.lkrn} - g=${g//[^a-z0-9]} - g=${g:0:8}.krn - case "${FIRST}" in - "") - echo "DEFAULT ${b}" - FIRST=${g} - ;; - esac - echo "LABEL ${b}" - echo " KERNEL ${g}" - cp ${f} ${dir}/${g} -done >> ${cfg} - -case "${LEGACY}" in - 1) - # check for mtools - case "$(mtools -V)" in - Mtools\ version\ 3.9.9*|Mtools\ version\ 3.9.1[0-9]*|[mM]tools\ *\ [4-9].*) - ;; - *) - echo "Mtools version 3.9.9 or later is required" >&2 - exit 1 - ;; - esac - - # generate floppy image - img=${dir}/boot.img - mformat -f 1440 -C -i ${img} :: - - # copy lkrn file to floppy image - for f in ${dir}/*.krn; do - mcopy -m -i ${img} ${f} ::$(basename ${g}) - rm -f ${f} - done - - # copy config file to floppy image - mcopy -i ${img} ${cfg} ::syslinux.cfg - rm -f ${cfg} - - # write syslinux bootloader to floppy image - if ! syslinux ${img}; then - echo "${0}: failed writing syslinux to floppy image ${img}" >&2 - exit 1 - fi - - # generate the iso image - "${mkisofs[@]}" -b boot.img -output ${OUT} ${dir} - ;; - 0) - # copy isolinux bootloader - cp ${ISOLINUX_BIN} ${dir} - - # syslinux 6.x needs a file called ldlinux.c32 - LDLINUX_C32=$(dirname ${ISOLINUX_BIN})/ldlinux.c32 - if [ -s ${LDLINUX_C32} ]; then - cp ${LDLINUX_C32} ${dir} - fi - - # generate the iso image - "${mkisofs[@]}" -b isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -output ${OUT} ${dir} - - # isohybrid will be used if available - if isohybrid --version >/dev/null 2>/dev/null; then - isohybrid ${OUT} >/dev/null - fi - ;; -esac - -# clean up temporary dir -rm -fr ${dir} diff --git a/qemu/roms/ipxe/src/util/genkeymap.pl b/qemu/roms/ipxe/src/util/genkeymap.pl deleted file mode 100755 index 7a5024bf8..000000000 --- a/qemu/roms/ipxe/src/util/genkeymap.pl +++ /dev/null @@ -1,238 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright (C) 2011 Michael Brown <mbrown@fensystems.co.uk>. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. - -=head1 NAME - -genkeymap.pl - -=head1 SYNOPSIS - -genkeymap.pl [options] <keymap name> - -Options: - - -f,--from=<name> Set BIOS keymap name (default "us") - -h,--help Display brief help message - -v,--verbose Increase verbosity - -q,--quiet Decrease verbosity - -=cut - -# With reference to: -# -# http://gunnarwrobel.de/wiki/Linux-and-the-keyboard.html - -use Getopt::Long; -use Pod::Usage; -use strict; -use warnings; - -use constant BIOS_KEYMAP => "us"; -use constant BKEYMAP_MAGIC => "bkeymap"; -use constant MAX_NR_KEYMAPS => 256; -use constant NR_KEYS => 128; -use constant KG_SHIFT => 0; -use constant KG_ALTGR => 1; -use constant KG_CTRL => 2; -use constant KG_ALT => 3; -use constant KG_SHIFTL => 4; -use constant KG_KANASHIFT => 4; -use constant KG_SHIFTR => 5; -use constant KG_CTRLL => 6; -use constant KG_CTRLR => 7; -use constant KG_CAPSSHIFT => 8; -use constant KT_LATIN => 0; -use constant KT_FN => 1; -use constant KT_SPEC => 2; -use constant KT_PAD => 3; -use constant KT_DEAD => 4; -use constant KT_CONS => 5; -use constant KT_CUR => 6; -use constant KT_SHIFT => 7; -use constant KT_META => 8; -use constant KT_ASCII => 9; -use constant KT_LOCK => 10; -use constant KT_LETTER => 11; -use constant KT_SLOCK => 12; -use constant KT_SPKUP => 14; - -my $verbosity = 1; -my $from_name = BIOS_KEYMAP; - -# Read named keymaps using "loadkeys -b" -# -sub read_keymaps { - my $name = shift; - my $keymaps = []; - - # Generate binary keymap - open my $pipe, "-|", "loadkeys", "-b", $name - or die "Could not load keymap \"".$name."\": $!\n"; - - # Check magic - read $pipe, my $magic, length BKEYMAP_MAGIC - or die "Could not read from \"".$name."\": $!\n"; - die "Bad magic value from \"".$name."\"\n" - unless $magic eq BKEYMAP_MAGIC; - - # Read list of included keymaps - read $pipe, my $included, MAX_NR_KEYMAPS - or die "Could not read from \"".$name."\": $!\n"; - my @included = unpack ( "C*", $included ); - die "Missing or truncated keymap list from \"".$name."\"\n" - unless @included == MAX_NR_KEYMAPS; - - # Read each keymap in turn - for ( my $keymap = 0 ; $keymap < MAX_NR_KEYMAPS ; $keymap++ ) { - if ( $included[$keymap] ) { - read $pipe, my $keysyms, ( NR_KEYS * 2 ) - or die "Could not read from \"".$name."\": $!\n"; - my @keysyms = unpack ( "S*", $keysyms ); - die "Missing or truncated keymap ".$keymap." from \"".$name."\"\n" - unless @keysyms == NR_KEYS; - push @$keymaps, \@keysyms; - } else { - push @$keymaps, undef; - } - } - - close $pipe; - return $keymaps; -} - -# Translate keysym value to ASCII -# -sub keysym_to_ascii { - my $keysym = shift; - - # Non-existent keysyms have no ASCII equivalent - return unless $keysym; - - # Sanity check - if ( $keysym & 0xf000 ) { - warn "Unexpected keysym ".sprintf ( "0x%04x", $keysym )."\n"; - return; - } - - # Extract type and value - my $type = ( $keysym >> 8 ); - my $value = ( $keysym & 0xff ); - - # Non-simple types have no ASCII equivalent - return unless ( ( $type == KT_LATIN ) || ( $type == KT_ASCII ) || - ( $type == KT_LETTER ) ); - - # High-bit-set characters cannot be generated on a US keyboard - return if $value & 0x80; - - return $value; -} - -# Translate ASCII to descriptive name -# -sub ascii_to_name { - my $ascii = shift; - - if ( $ascii == 0x5c ) { - return "'\\\\'"; - } elsif ( $ascii == 0x27 ) { - return "'\\\''"; - } elsif ( ( $ascii >= 0x20 ) && ( $ascii <= 0x7e ) ) { - return sprintf ( "'%c'", $ascii ); - } elsif ( $ascii <= 0x1a ) { - return sprintf ( "Ctrl-%c", ( 0x40 + $ascii ) ); - } else { - return sprintf ( "0x%02x", $ascii ); - } -} - -# Produce translation table between two keymaps -# -sub translate_keymaps { - my $from = shift; - my $to = shift; - my $map = {}; - - foreach my $keymap ( 0, 1 << KG_SHIFT, 1 << KG_CTRL ) { - for ( my $keycode = 0 ; $keycode < NR_KEYS ; $keycode++ ) { - my $from_ascii = keysym_to_ascii ( $from->[$keymap]->[$keycode] ) - or next; - my $to_ascii = keysym_to_ascii ( $to->[$keymap]->[$keycode] ) - or next; - my $new_map = ( ! exists $map->{$from_ascii} ); - my $update_map = - ( $new_map || ( $keycode < $map->{$from_ascii}->{keycode} ) ); - if ( ( $verbosity > 1 ) && - ( ( $from_ascii != $to_ascii ) || - ( $update_map && ! $new_map ) ) ) { - printf STDERR "In keymap %d: %s => %s%s\n", $keymap, - ascii_to_name ( $from_ascii ), ascii_to_name ( $to_ascii ), - ( $update_map ? ( $new_map ? "" : " (override)" ) - : " (ignored)" ); - } - if ( $update_map ) { - $map->{$from_ascii} = { - to_ascii => $to_ascii, - keycode => $keycode, - }; - } - } - } - return { map { $_ => $map->{$_}->{to_ascii} } keys %$map }; -} - -# Parse command-line options -Getopt::Long::Configure ( 'bundling', 'auto_abbrev' ); -GetOptions ( - 'verbose|v+' => sub { $verbosity++; }, - 'quiet|q+' => sub { $verbosity--; }, - 'from|f=s' => sub { shift; $from_name = shift; }, - 'help|h' => sub { pod2usage ( 1 ); }, -) or die "Could not parse command-line options\n"; -pod2usage ( 1 ) unless @ARGV == 1; -my $to_name = shift; - -# Read and translate keymaps -my $from = read_keymaps ( $from_name ); -my $to = read_keymaps ( $to_name ); -my $map = translate_keymaps ( $from, $to ); - -# Generate output -( my $to_name_c = $to_name ) =~ s/\W/_/g; -printf "/** \@file\n"; -printf " *\n"; -printf " * \"".$to_name."\" keyboard mapping\n"; -printf " *\n"; -printf " * This file is automatically generated; do not edit\n"; -printf " *\n"; -printf " */\n"; -printf "\n"; -printf "FILE_LICENCE ( PUBLIC_DOMAIN );\n"; -printf "\n"; -printf "#include <ipxe/keymap.h>\n"; -printf "\n"; -printf "/** \"".$to_name."\" keyboard mapping */\n"; -printf "struct key_mapping ".$to_name_c."_mapping[] __keymap = {\n"; -foreach my $from_sym ( sort { $a <=> $b } keys %$map ) { - my $to_sym = $map->{$from_sym}; - next if $from_sym == $to_sym; - printf "\t{ 0x%02x, 0x%02x },\t/* %s => %s */\n", $from_sym, $to_sym, - ascii_to_name ( $from_sym ), ascii_to_name ( $to_sym ); -} -printf "};\n"; diff --git a/qemu/roms/ipxe/src/util/gensdsk b/qemu/roms/ipxe/src/util/gensdsk deleted file mode 100755 index 9e8361d49..000000000 --- a/qemu/roms/ipxe/src/util/gensdsk +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/bash -# -# Generate a syslinux floppy that loads a iPXE image -# -# gensdsk foo.sdsk foo.lkrn -# -# the floppy image is the first argument -# followed by list of .lkrn images -# - -case $# in -0|1) - echo Usage: $0 foo.sdsk foo.lkrn ... - exit 1 - ;; -esac -case "`mtools -V`" in -Mtools\ version\ 3.9.9*|Mtools\ version\ 3.9.1[0-9]*|[mM]tools\ *\ [4-9].*) - ;; -*) - echo Mtools version 3.9.9 or later is required - exit 1 - ;; -esac -img=$1 -shift -dir=`mktemp -d bin/sdsk.dir.XXXXXX` - -mformat -f 1440 -C -i $img :: -cfg=$dir/syslinux.cfg -cat > $cfg <<EOF - -# These default options can be changed in the gensdsk script -TIMEOUT 30 -EOF -first= -for f -do - if [ ! -r $f ] - then - echo $f does not exist, skipping 1>&2 - continue - fi - # shorten name for 8.3 filesystem - b=$(basename $f) - g=${b%.lkrn} - g=${g//[^a-z0-9]} - g=${g:0:8}.krn - case "$first" in - "") - echo DEFAULT $g - ;; - esac - first=$g - echo LABEL $b - echo "" KERNEL $g - mcopy -m -i $img $f ::$g -done >> $cfg -mcopy -i $img $cfg ::syslinux.cfg -if ! syslinux $img -then - exit 1 -fi - -rm -fr $dir diff --git a/qemu/roms/ipxe/src/util/get-pci-ids b/qemu/roms/ipxe/src/util/get-pci-ids deleted file mode 100755 index 424662212..000000000 --- a/qemu/roms/ipxe/src/util/get-pci-ids +++ /dev/null @@ -1,136 +0,0 @@ -#! /usr/bin/perl -w - -# get-pci-ids: extract pci vendor/device ids from linux net drivers - -# Copyright (C) 2003 Georg Baum <gbaum@users.sf.net> - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. - - -# Known bugs/limitations: -# - Does not recognize all drivers because some require special cflags. -# Fails also on some drivers that do belong to other architectures -# than the one of the machine this script is running on. -# This is currently not so important because all drivers that have an -# Etherboot counterpart are recognized. - - -use strict; -use File::Basename "dirname"; -use POSIX "uname"; - -# Where to find the kernel sources -my $kernel_src = "/usr/src/linux"; - -if($#ARGV >= 0) { - $kernel_src = shift; -} - -# Sanity checks -if($#ARGV >= 0) { - print STDERR "Too many arguments.\n"; - print STDERR "Usage: get-pci-ids [path to kernel sources]\n"; - print STDERR " /usr/src/linux is assumed if no path is given.\n"; - exit 1; -} - -unless(-f "$kernel_src/include/linux/version.h") { - print STDERR "Could not find $kernel_src/include/linux/version.h.\n"; - print STDERR "$kernel_src is probably no Linux kernel source tree.\n"; - exit 1; -} - -# Flags that are needed to preprocess the drivers. -# Some drivers need optimization -my $cflags="-D__KERNEL__ -I$kernel_src/include -I$kernel_src/net/inet -O2"; - -# The C preprocessor. It needs to spit out the preprocessed source on stdout. -my $cpp="gcc -E"; - -# List of drivers. We parse every .c file. It does not harm if it does not contain a driver. -my @drivers = split /\s+/, `find $kernel_src/drivers/net -name '*.c' | sort`; - -# Kernel version -my $version = `grep UTS_RELEASE $kernel_src/include/linux/version.h`; -chomp $version; -$version =~ s/\s*#define\s+UTS_RELEASE\s+"(\S+)".*$/$1/g; - -# Architecture -my @uname = uname(); - - -# Print header -print "# PCI vendor/device ids extracted from Linux $version on $uname[4] at " . gmtime() . "\n"; - -my $driver; - -# Process the drivers -foreach $driver (@drivers) { - - # Preprocess to expand macros - my $command = "$cpp $cflags -I" . dirname($driver) . " $driver"; - open DRIVER, "$command |" or die "Could not execute\n\"$command\".\n"; - - # Extract the pci_device_id structure - my $found = 0; - my $line = ""; - my @lines; - while(<DRIVER>) { - if(/^\s*static\s+struct\s+pci_device_id/) { - # This file contains a driver. Print the name. - $driver =~ s!$kernel_src/drivers/net/!!g; - print "\n$driver\n"; - $found = 1; - next; - } - if($found == 1){ - if(/\};/ or /{\s*0\s*,?\s*}/) { - # End of struct - $found = 0; - } else { - chomp; - if(/\}\s*,?\s*\n?$/) { - # This line contains a full entry or the last part of it. - $_ = $line . $_; - $line = ""; - s/[,\{\};\(\)]//g; # Strip punctuation - s/^\s+//g; # Eat whitespace at beginning of line - tr[A-Z][a-z]; # Convert to lowercase - # Push the vendor and device id to @lines if this line is not empty. - # We ignore everything else that might be there - my ($vendor_id, $device_id, $remainder) = split /\W+/, $_, 3; - push @lines, "$vendor_id $device_id\n" if($vendor_id && $device_id); - } else { - # This line does contain a partial entry. Remember it. - $line .= "$_ "; - } - } - } - } - close DRIVER; # No "or die", because $cpp fails on some files - - # Now print out the sorted values - @lines = sort @lines; - my $lastline = ""; - foreach(@lines) { - # Print each vendor/device id combination only once. - # Some drivers (e.g. e100) do contain subfamilies - print if($_ ne $lastline); - $lastline = $_; - } -} - - diff --git a/qemu/roms/ipxe/src/util/hijack.c b/qemu/roms/ipxe/src/util/hijack.c deleted file mode 100644 index ed89592b1..000000000 --- a/qemu/roms/ipxe/src/util/hijack.c +++ /dev/null @@ -1,628 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <stdarg.h> -#include <errno.h> -#include <fcntl.h> -#include <libgen.h> -#include <signal.h> -#include <net/if.h> -#include <net/ethernet.h> -#include <sys/select.h> -#include <sys/socket.h> -#include <sys/stat.h> -#include <sys/un.h> -#include <syslog.h> -#include <getopt.h> -#include <pcap.h> - -#define SNAPLEN 1600 - -/* - * FIXME: is there a way to detect the version of the libpcap library? - * Version 0.9 has pcap_inject; version 0.8 doesn't, but both report - * their version number as 2.4. - */ -#define HAVE_PCAP_INJECT 0 - -struct hijack { - pcap_t *pcap; - int fd; - int datalink; - int filtered; - unsigned long rx_count; - unsigned long tx_count; -}; - -struct hijack_listener { - struct sockaddr_un sun; - int fd; -}; - -struct hijack_options { - char interface[IF_NAMESIZE]; - int daemonise; -}; - -static int daemonised = 0; - -static int signalled = 0; - -static void flag_signalled ( int signal __attribute__ (( unused )) ) { - signalled = 1; -} - -#if ! HAVE_PCAP_INJECT -/** - * Substitute for pcap_inject(), if this version of libpcap doesn't - * have it. Will almost certainly only work under Linux. - * - */ -int pcap_inject ( pcap_t *pcap, const void *data, size_t len ) { - int fd; - char *errbuf = pcap_geterr ( pcap ); - - fd = pcap_get_selectable_fd ( pcap ); - if ( fd < 0 ) { - snprintf ( errbuf, PCAP_ERRBUF_SIZE, - "could not get file descriptor" ); - return -1; - } - if ( write ( fd, data, len ) != len ) { - snprintf ( errbuf, PCAP_ERRBUF_SIZE, - "could not write data: %s", strerror ( errno ) ); - return -1; - } - return len; -} -#endif /* ! HAVE_PCAP_INJECT */ - -/** - * Log error message - * - */ -static __attribute__ (( format ( printf, 2, 3 ) )) void -logmsg ( int level, const char *format, ... ) { - va_list ap; - - va_start ( ap, format ); - if ( daemonised ) { - vsyslog ( ( LOG_DAEMON | level ), format, ap ); - } else { - vfprintf ( stderr, format, ap ); - } - va_end ( ap ); -} - -/** - * Open pcap device - * - */ -static int hijack_open ( const char *interface, struct hijack *hijack ) { - char errbuf[PCAP_ERRBUF_SIZE]; - - /* Open interface via pcap */ - errbuf[0] = '\0'; - hijack->pcap = pcap_open_live ( interface, SNAPLEN, 1, 0, errbuf ); - if ( ! hijack->pcap ) { - logmsg ( LOG_ERR, "Failed to open %s: %s\n", - interface, errbuf ); - goto err; - } - if ( errbuf[0] ) - logmsg ( LOG_WARNING, "Warning: %s\n", errbuf ); - - /* Set capture interface to non-blocking mode */ - if ( pcap_setnonblock ( hijack->pcap, 1, errbuf ) < 0 ) { - logmsg ( LOG_ERR, "Could not make %s non-blocking: %s\n", - interface, errbuf ); - goto err; - } - - /* Get file descriptor for select() */ - hijack->fd = pcap_get_selectable_fd ( hijack->pcap ); - if ( hijack->fd < 0 ) { - logmsg ( LOG_ERR, "Cannot get selectable file descriptor " - "for %s\n", interface ); - goto err; - } - - /* Get link layer type */ - hijack->datalink = pcap_datalink ( hijack->pcap ); - - return 0; - - err: - if ( hijack->pcap ) - pcap_close ( hijack->pcap ); - return -1; -} - -/** - * Close pcap device - * - */ -static void hijack_close ( struct hijack *hijack ) { - pcap_close ( hijack->pcap ); -} - -/** - * Install filter for hijacked connection - * - */ -static int hijack_install_filter ( struct hijack *hijack, - char *filter ) { - struct bpf_program program; - - /* Compile filter */ - if ( pcap_compile ( hijack->pcap, &program, filter, 1, 0 ) < 0 ) { - logmsg ( LOG_ERR, "could not compile filter \"%s\": %s\n", - filter, pcap_geterr ( hijack->pcap ) ); - goto err_nofree; - } - - /* Install filter */ - if ( pcap_setfilter ( hijack->pcap, &program ) < 0 ) { - logmsg ( LOG_ERR, "could not install filter \"%s\": %s\n", - filter, pcap_geterr ( hijack->pcap ) ); - goto err; - } - - logmsg ( LOG_INFO, "using filter \"%s\"\n", filter ); - - pcap_freecode ( &program ); - return 0; - - err: - pcap_freecode ( &program ); - err_nofree: - return -1; -} - -/** - * Set up filter for hijacked ethernet connection - * - */ -static int hijack_filter_ethernet ( struct hijack *hijack, const char *buf, - size_t len ) { - char filter[55]; /* see format string */ - struct ether_header *ether_header = ( struct ether_header * ) buf; - unsigned char *hwaddr = ether_header->ether_shost; - - if ( len < sizeof ( *ether_header ) ) - return -1; - - snprintf ( filter, sizeof ( filter ), "broadcast or multicast or " - "ether host %02x:%02x:%02x:%02x:%02x:%02x", hwaddr[0], - hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5] ); - - return hijack_install_filter ( hijack, filter ); -} - -/** - * Set up filter for hijacked connection - * - */ -static int hijack_filter ( struct hijack *hijack, const char *buf, - size_t len ) { - switch ( hijack->datalink ) { - case DLT_EN10MB: - return hijack_filter_ethernet ( hijack, buf, len ); - default: - logmsg ( LOG_ERR, "unsupported protocol %s: cannot filter\n", - ( pcap_datalink_val_to_name ( hijack->datalink ) ? - pcap_datalink_val_to_name ( hijack->datalink ) : - "UNKNOWN" ) ); - /* Return success so we don't get called again */ - return 0; - } -} - -/** - * Forward data from hijacker - * - */ -static ssize_t forward_from_hijacker ( struct hijack *hijack, int fd ) { - char buf[SNAPLEN]; - ssize_t len; - - /* Read packet from hijacker */ - len = read ( fd, buf, sizeof ( buf ) ); - if ( len < 0 ) { - logmsg ( LOG_ERR, "read from hijacker failed: %s\n", - strerror ( errno ) ); - return -1; - } - if ( len == 0 ) - return 0; - - /* Set up filter if not already in place */ - if ( ! hijack->filtered ) { - if ( hijack_filter ( hijack, buf, len ) == 0 ) - hijack->filtered = 1; - } - - /* Transmit packet to network */ - if ( pcap_inject ( hijack->pcap, buf, len ) != len ) { - logmsg ( LOG_ERR, "write to hijacked port failed: %s\n", - pcap_geterr ( hijack->pcap ) ); - return -1; - } - - hijack->tx_count++; - return len; -}; - -/** - * Forward data to hijacker - * - */ -static ssize_t forward_to_hijacker ( int fd, struct hijack *hijack ) { - struct pcap_pkthdr *pkt_header; - const unsigned char *pkt_data; - ssize_t len; - - /* Receive packet from network */ - if ( pcap_next_ex ( hijack->pcap, &pkt_header, &pkt_data ) < 0 ) { - logmsg ( LOG_ERR, "read from hijacked port failed: %s\n", - pcap_geterr ( hijack->pcap ) ); - return -1; - } - if ( pkt_header->caplen != pkt_header->len ) { - logmsg ( LOG_ERR, "read partial packet (%d of %d bytes)\n", - pkt_header->caplen, pkt_header->len ); - return -1; - } - if ( pkt_header->caplen == 0 ) - return 0; - len = pkt_header->caplen; - - /* Write packet to hijacker */ - if ( write ( fd, pkt_data, len ) != len ) { - logmsg ( LOG_ERR, "write to hijacker failed: %s\n", - strerror ( errno ) ); - return -1; - } - - hijack->rx_count++; - return len; -}; - - -/** - * Run hijacker - * - */ -static int run_hijacker ( const char *interface, int fd ) { - struct hijack hijack; - fd_set fdset; - int max_fd; - ssize_t len; - - logmsg ( LOG_INFO, "new connection for %s\n", interface ); - - /* Open connection to network */ - memset ( &hijack, 0, sizeof ( hijack ) ); - if ( hijack_open ( interface, &hijack ) < 0 ) - goto err; - - /* Do the forwarding */ - max_fd = ( ( fd > hijack.fd ) ? fd : hijack.fd ); - while ( 1 ) { - /* Wait for available data */ - FD_ZERO ( &fdset ); - FD_SET ( fd, &fdset ); - FD_SET ( hijack.fd, &fdset ); - if ( select ( ( max_fd + 1 ), &fdset, NULL, NULL, 0 ) < 0 ) { - logmsg ( LOG_ERR, "select failed: %s\n", - strerror ( errno ) ); - goto err; - } - if ( FD_ISSET ( fd, &fdset ) ) { - len = forward_from_hijacker ( &hijack, fd ); - if ( len < 0 ) - goto err; - if ( len == 0 ) - break; - } - if ( FD_ISSET ( hijack.fd, &fdset ) ) { - len = forward_to_hijacker ( fd, &hijack ); - if ( len < 0 ) - goto err; - if ( len == 0 ) - break; - } - } - - hijack_close ( &hijack ); - logmsg ( LOG_INFO, "closed connection for %s\n", interface ); - logmsg ( LOG_INFO, "received %ld packets, sent %ld packets\n", - hijack.rx_count, hijack.tx_count ); - - return 0; - - err: - if ( hijack.pcap ) - hijack_close ( &hijack ); - return -1; -} - -/** - * Open listener socket - * - */ -static int open_listener ( const char *interface, - struct hijack_listener *listener ) { - - /* Create socket */ - listener->fd = socket ( PF_UNIX, SOCK_SEQPACKET, 0 ); - if ( listener->fd < 0 ) { - logmsg ( LOG_ERR, "Could not create socket: %s\n", - strerror ( errno ) ); - goto err; - } - - /* Bind to local filename */ - listener->sun.sun_family = AF_UNIX, - snprintf ( listener->sun.sun_path, sizeof ( listener->sun.sun_path ), - "/var/run/hijack-%s", interface ); - if ( bind ( listener->fd, ( struct sockaddr * ) &listener->sun, - sizeof ( listener->sun ) ) < 0 ) { - logmsg ( LOG_ERR, "Could not bind socket to %s: %s\n", - listener->sun.sun_path, strerror ( errno ) ); - goto err; - } - - /* Set as a listening socket */ - if ( listen ( listener->fd, 0 ) < 0 ) { - logmsg ( LOG_ERR, "Could not listen to %s: %s\n", - listener->sun.sun_path, strerror ( errno ) ); - goto err; - } - - return 0; - - err: - if ( listener->fd >= 0 ) - close ( listener->fd ); - return -1; -} - -/** - * Listen on listener socket - * - */ -static int listen_for_hijackers ( struct hijack_listener *listener, - const char *interface ) { - int fd; - pid_t child; - int rc; - - logmsg ( LOG_INFO, "Listening on %s\n", listener->sun.sun_path ); - - while ( ! signalled ) { - /* Accept new connection, interruptibly */ - siginterrupt ( SIGINT, 1 ); - siginterrupt ( SIGHUP, 1 ); - fd = accept ( listener->fd, NULL, 0 ); - siginterrupt ( SIGINT, 0 ); - siginterrupt ( SIGHUP, 0 ); - if ( fd < 0 ) { - if ( errno == EINTR ) { - continue; - } else { - logmsg ( LOG_ERR, "accept failed: %s\n", - strerror ( errno ) ); - goto err; - } - } - - /* Fork child process */ - child = fork(); - if ( child < 0 ) { - logmsg ( LOG_ERR, "fork failed: %s\n", - strerror ( errno ) ); - goto err; - } - if ( child == 0 ) { - /* I am the child; run the hijacker */ - rc = run_hijacker ( interface, fd ); - close ( fd ); - exit ( rc ); - } - - close ( fd ); - } - - logmsg ( LOG_INFO, "Stopped listening on %s\n", - listener->sun.sun_path ); - return 0; - - err: - if ( fd >= 0 ) - close ( fd ); - return -1; -} - -/** - * Close listener socket - * - */ -static void close_listener ( struct hijack_listener *listener ) { - close ( listener->fd ); - unlink ( listener->sun.sun_path ); -} - -/** - * Print usage - * - */ -static void usage ( char **argv ) { - logmsg ( LOG_ERR, - "Usage: %s [options]\n" - "\n" - "Options:\n" - " -h|--help Print this help message\n" - " -i|--interface intf Use specified network interface\n" - " -n|--nodaemon Run in foreground\n", - argv[0] ); -} - -/** - * Parse command-line options - * - */ -static int parse_options ( int argc, char **argv, - struct hijack_options *options ) { - static struct option long_options[] = { - { "interface", 1, NULL, 'i' }, - { "nodaemon", 0, NULL, 'n' }, - { "help", 0, NULL, 'h' }, - { }, - }; - int c; - - /* Set default options */ - memset ( options, 0, sizeof ( *options ) ); - strncpy ( options->interface, "eth0", sizeof ( options->interface ) ); - options->daemonise = 1; - - /* Parse command-line options */ - while ( 1 ) { - int option_index = 0; - - c = getopt_long ( argc, argv, "i:hn", long_options, - &option_index ); - if ( c < 0 ) - break; - - switch ( c ) { - case 'i': - strncpy ( options->interface, optarg, - sizeof ( options->interface ) ); - break; - case 'n': - options->daemonise = 0; - break; - case 'h': - usage( argv ); - return -1; - case '?': - /* Unrecognised option */ - return -1; - default: - logmsg ( LOG_ERR, "Unrecognised option '-%c'\n", c ); - return -1; - } - } - - /* Check there's nothing left over on the command line */ - if ( optind != argc ) { - usage ( argv ); - return -1; - } - - return 0; -} - -/** - * Daemonise - * - */ -static int daemonise ( const char *interface ) { - char pidfile[16 + IF_NAMESIZE + 4]; /* "/var/run/hijack-<intf>.pid" */ - char pid[16]; - int pidlen; - int fd = -1; - - /* Daemonise */ - if ( daemon ( 0, 0 ) < 0 ) { - logmsg ( LOG_ERR, "Could not daemonise: %s\n", - strerror ( errno ) ); - goto err; - } - daemonised = 1; /* Direct messages to syslog now */ - - /* Open pid file */ - snprintf ( pidfile, sizeof ( pidfile ), "/var/run/hijack-%s.pid", - interface ); - fd = open ( pidfile, ( O_WRONLY | O_CREAT | O_TRUNC ), - ( S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH ) ); - if ( fd < 0 ) { - logmsg ( LOG_ERR, "Could not open %s for writing: %s\n", - pidfile, strerror ( errno ) ); - goto err; - } - - /* Write pid to file */ - pidlen = snprintf ( pid, sizeof ( pid ), "%d\n", getpid() ); - if ( write ( fd, pid, pidlen ) != pidlen ) { - logmsg ( LOG_ERR, "Could not write %s: %s\n", - pidfile, strerror ( errno ) ); - goto err; - } - - close ( fd ); - return 0; - - err: - if ( fd >= 0 ) - close ( fd ); - return -1; -} - -int main ( int argc, char **argv ) { - struct hijack_options options; - struct hijack_listener listener; - struct sigaction sa; - - /* Parse command-line options */ - if ( parse_options ( argc, argv, &options ) < 0 ) - exit ( 1 ); - - /* Set up syslog connection */ - openlog ( basename ( argv[0] ), LOG_PID, LOG_DAEMON ); - - /* Set up listening socket */ - if ( open_listener ( options.interface, &listener ) < 0 ) - exit ( 1 ); - - /* Daemonise on demand */ - if ( options.daemonise ) { - if ( daemonise ( options.interface ) < 0 ) - exit ( 1 ); - } - - /* Avoid creating zombies */ - memset ( &sa, 0, sizeof ( sa ) ); - sa.sa_handler = SIG_IGN; - sa.sa_flags = SA_RESTART | SA_NOCLDWAIT; - if ( sigaction ( SIGCHLD, &sa, NULL ) < 0 ) { - logmsg ( LOG_ERR, "Could not set SIGCHLD handler: %s", - strerror ( errno ) ); - exit ( 1 ); - } - - /* Set 'signalled' flag on SIGINT or SIGHUP */ - sa.sa_handler = flag_signalled; - sa.sa_flags = SA_RESTART | SA_RESETHAND; - if ( sigaction ( SIGINT, &sa, NULL ) < 0 ) { - logmsg ( LOG_ERR, "Could not set SIGINT handler: %s", - strerror ( errno ) ); - exit ( 1 ); - } - if ( sigaction ( SIGHUP, &sa, NULL ) < 0 ) { - logmsg ( LOG_ERR, "Could not set SIGHUP handler: %s", - strerror ( errno ) ); - exit ( 1 ); - } - - /* Listen for hijackers */ - if ( listen_for_hijackers ( &listener, options.interface ) < 0 ) - exit ( 1 ); - - close_listener ( &listener ); - - return 0; -} diff --git a/qemu/roms/ipxe/src/util/iccfix.c b/qemu/roms/ipxe/src/util/iccfix.c deleted file mode 100644 index 528bf4b26..000000000 --- a/qemu/roms/ipxe/src/util/iccfix.c +++ /dev/null @@ -1,157 +0,0 @@ -#include <stdint.h> -#include <stddef.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <fcntl.h> -#include <errno.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/mman.h> -#include <elf.h> -#include <ipxe/tables.h> - -#define DEBUG 0 - -#define eprintf(...) fprintf ( stderr, __VA_ARGS__ ) - -#define dprintf(...) do { \ - if ( DEBUG ) \ - fprintf ( stderr, __VA_ARGS__ ); \ - } while ( 0 ) - -#ifdef SELF_INCLUDED - -/** - * Fix up ICC alignments - * - * @v elf ELF header - * @ret rc Return status code - * - * See comments in tables.h for an explanation of why this monstrosity - * is necessary. - */ -static int ICCFIX ( void *elf ) { - ELF_EHDR *ehdr = elf; - ELF_SHDR *shdr = ( elf + ehdr->e_shoff ); - size_t shentsize = ehdr->e_shentsize; - unsigned int shnum = ehdr->e_shnum; - ELF_SHDR *strtab = ( ( ( void * ) shdr ) + - ( ehdr->e_shstrndx * shentsize ) ); - char *strings = ( elf + strtab->sh_offset ); - - for ( ; shnum-- ; shdr = ( ( ( void * ) shdr ) + shentsize ) ) { - char *name = ( strings + shdr->sh_name ); - unsigned long align = shdr->sh_addralign; - unsigned long new_align; - - if ( ( strncmp ( name, ".tbl.", 5 ) == 0 ) && - ( align >= ICC_ALIGN_HACK_FACTOR ) ) { - new_align = ( align / ICC_ALIGN_HACK_FACTOR ); - shdr->sh_addralign = new_align; - dprintf ( "Section \"%s\": alignment %ld->%ld\n", - name, align, new_align ); - } - } - return 0; -} - -#else /* SELF_INCLUDED */ - -#define SELF_INCLUDED - -/* Include iccfix32() function */ -#define ELF_EHDR Elf32_Ehdr -#define ELF_SHDR Elf32_Shdr -#define ICCFIX iccfix32 -#include "iccfix.c" -#undef ELF_EHDR -#undef ELF_SHDR -#undef ICCFIX - -/* Include iccfix64() function */ -#define ELF_EHDR Elf64_Ehdr -#define ELF_SHDR Elf64_Shdr -#define ICCFIX iccfix64 -#include "iccfix.c" -#undef ELF_EHDR -#undef ELF_SHDR -#undef ICCFIX - -static int iccfix ( const char *filename ) { - int fd; - struct stat stat; - void *elf; - unsigned char *eident; - int rc; - - /* Open and mmap file */ - fd = open ( filename, O_RDWR ); - if ( fd < 0 ) { - eprintf ( "Could not open %s: %s\n", - filename, strerror ( errno ) ); - rc = -1; - goto err_open; - } - if ( fstat ( fd, &stat ) < 0 ) { - eprintf ( "Could not determine size of %s: %s\n", - filename, strerror ( errno ) ); - rc = -1; - goto err_fstat; - } - elf = mmap ( NULL, stat.st_size, ( PROT_READ | PROT_WRITE ), - MAP_SHARED, fd, 0 ); - if ( elf == MAP_FAILED ) { - eprintf ( "Could not map %s: %s\n", - filename, strerror ( errno ) ); - rc = -1; - goto err_mmap; - } - - /* Perform fixups */ - eident = elf; - switch ( eident[EI_CLASS] ) { - case ELFCLASS32: - rc = iccfix32 ( elf ); - break; - case ELFCLASS64: - rc = iccfix64 ( elf ); - break; - default: - eprintf ( "Unknown ELF class %d in %s\n", - eident[EI_CLASS], filename ); - rc = -1; - break; - } - - munmap ( elf, stat.st_size ); - err_mmap: - err_fstat: - close ( fd ); - err_open: - return rc; -} - -int main ( int argc, char **argv ) { - int i; - int rc; - - /* Parse command line */ - if ( argc < 2 ) { - eprintf ( "Syntax: %s <object_file>...\n", argv[0] ); - exit ( 1 ); - } - - /* Process each object in turn */ - for ( i = 1 ; i < argc ; i++ ) { - if ( ( rc = iccfix ( argv[i] ) ) != 0 ) { - eprintf ( "Could not fix up %s\n", argv[i] ); - exit ( 1 ); - } - } - - return 0; -} - -#endif /* SELF_INCLUDED */ diff --git a/qemu/roms/ipxe/src/util/licence.pl b/qemu/roms/ipxe/src/util/licence.pl deleted file mode 100755 index 79e70fd65..000000000 --- a/qemu/roms/ipxe/src/util/licence.pl +++ /dev/null @@ -1,163 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright (C) 2008 Michael Brown <mbrown@fensystems.co.uk>. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. - -use strict; -use warnings; -use Getopt::Long; - -# List of licences we can handle -my $known_licences = { - gpl_any => { - desc => "GPL (any version)", - can_subsume => { - public_domain => 1, - bsd3 => 1, - bsd2 => 1, - mit => 1, - isc => 1, - }, - }, - gpl2_or_later => { - desc => "GPL version 2 (or, at your option, any later version)", - can_subsume => { - gpl_any => 1, - gpl2_or_later_or_ubdl => 1, - public_domain => 1, - bsd3 => 1, - bsd2 => 1, - mit => 1, - isc => 1, - }, - }, - gpl2_only => { - desc => "GPL version 2 only", - can_subsume => { - gpl_any => 1, - gpl2_or_later => 1, - gpl2_or_later_or_ubdl => 1, - public_domain => 1, - bsd3 => 1, - bsd2 => 1, - mit => 1, - isc => 1, - }, - }, - gpl2_or_later_or_ubdl => { - desc => ( "GPL version 2 (or, at your option, any later version) or ". - "Unmodified Binary Distribution Licence" ), - can_subsume => { - public_domain => 1, - bsd3 => 1, - bsd2 => 1, - mit => 1, - isc => 1, - }, - }, - public_domain => { - desc => "Public Domain", - can_subsume => {}, - }, - bsd4 => { - desc => "BSD Licence (with advertising clause)", - can_subsume => { - public_domain => 1, - bsd3 => 1, - bsd2 => 1, - mit => 1, - isc => 1, - }, - }, - bsd3 => { - desc => "BSD Licence (without advertising clause)", - can_subsume => { - public_domain => 1, - bsd2 => 1, - mit => 1, - isc => 1, - }, - }, - bsd2 => { - desc => "BSD Licence (without advertising or endorsement clauses)", - can_subsume => { - public_domain => 1, - mit => 1, - isc => 1, - }, - }, - mit => { - desc => "MIT/X11/Xorg Licence", - can_subsume => { - public_domain => 1, - isc => 1, - }, - }, - isc => { - desc => "ISC Licence", - can_subsume => { - public_domain => 1, - }, - }, -}; - -# Parse command-line options -my $verbosity = 1; -Getopt::Long::Configure ( 'bundling', 'auto_abbrev' ); -GetOptions ( - 'verbose|v+' => sub { $verbosity++; }, - 'quiet|q+' => sub { $verbosity--; }, -) or die "Could not parse command-line options\n"; - -# Parse licence list from command line -my $licences = {}; -foreach my $licence ( @ARGV ) { - die "Unknown licence \"$licence\"\n" - unless exists $known_licences->{$licence}; - $licences->{$licence} = $known_licences->{$licence}; -} -die "No licences specified\n" unless %$licences; - -# Dump licence list -if ( $verbosity >= 1 ) { - print "The following licences appear within this file:\n"; - foreach my $licence ( keys %$licences ) { - print " ".$licences->{$licence}->{desc}."\n" - } -} - -# Apply licence compatibilities to reduce to a single resulting licence -foreach my $licence ( keys %$licences ) { - # Skip already-deleted licences - next unless exists $licences->{$licence}; - # Subsume any subsumable licences - foreach my $can_subsume ( keys %{$licences->{$licence}->{can_subsume}} ) { - if ( exists $licences->{$can_subsume} ) { - print $licences->{$licence}->{desc}." subsumes ". - $licences->{$can_subsume}->{desc}."\n" - if $verbosity >= 1; - delete $licences->{$can_subsume}; - } - } -} - -# Print resulting licence -die "Cannot reduce to a single resulting licence!\n" - if ( keys %$licences ) != 1; -( my $licence ) = keys %$licences; -print "The overall licence for this file is:\n " if $verbosity >= 1; -print $licences->{$licence}->{desc}."\n"; diff --git a/qemu/roms/ipxe/src/util/mergerom.pl b/qemu/roms/ipxe/src/util/mergerom.pl deleted file mode 100755 index f5c1632b0..000000000 --- a/qemu/roms/ipxe/src/util/mergerom.pl +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright (C) 2008 Michael Brown <mbrown@fensystems.co.uk>. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of the -# License, or any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301, USA. - -use strict; -use warnings; - -use FindBin; -use lib "$FindBin::Bin"; -use Option::ROM qw ( :all ); - -sub merge_entry_points { - my $baserom_entry = \shift; - my $rom_entry = \shift; - my $offset = shift; - - if ( $$rom_entry ) { - my $old_entry = $$baserom_entry; - $$baserom_entry = ( $offset + $$rom_entry ); - $$rom_entry = $old_entry; - } -} - -my @romfiles = @ARGV; -my @roms = map { my $rom = new Option::ROM; $rom->load($_); $rom } @romfiles; - -my $baserom = shift @roms; -my $offset = $baserom->length; - -foreach my $rom ( @roms ) { - - # Merge initialisation entry point - merge_entry_points ( $baserom->{init}, $rom->{init}, $offset ); - - # Merge BOFM header - merge_entry_points ( $baserom->{bofm_header}, $rom->{bofm_header}, $offset ); - - # Update PCI header, if present in both - my $baserom_pci = $baserom->pci_header; - my $rom_pci = $rom->pci_header; - if ( $baserom_pci && $rom_pci ) { - - # Update PCI lengths - $baserom_pci->{image_length} += $rom_pci->{image_length}; - if ( exists $baserom_pci->{runtime_length} ) { - if ( exists $rom_pci->{runtime_length} ) { - $baserom_pci->{runtime_length} += $rom_pci->{runtime_length}; - } else { - $baserom_pci->{runtime_length} += $rom_pci->{image_length}; - } - } - - # Merge CLP entry point - if ( exists ( $baserom_pci->{clp_entry} ) && - exists ( $rom_pci->{clp_entry} ) ) { - merge_entry_points ( $baserom_pci->{clp_entry}, $rom_pci->{clp_entry}, - $offset ); - } - } - - # Update PnP header, if present in both - my $baserom_pnp = $baserom->pnp_header; - my $rom_pnp = $rom->pnp_header; - if ( $baserom_pnp && $rom_pnp ) { - merge_entry_points ( $baserom_pnp->{bcv}, $rom_pnp->{bcv}, $offset ); - merge_entry_points ( $baserom_pnp->{bdv}, $rom_pnp->{bdv}, $offset ); - merge_entry_points ( $baserom_pnp->{bev}, $rom_pnp->{bev}, $offset ); - } - - # Update iPXE header, if present - my $baserom_ipxe = $baserom->ipxe_header; - my $rom_ipxe = $rom->ipxe_header; - if ( $baserom_ipxe ) { - - # Update shrunk length - $baserom_ipxe->{shrunk_length} = ( $baserom->{length} + - ( $rom_ipxe ? - $rom_ipxe->{shrunk_length} : - $rom->{length} ) ); - - # Fix checksum - $baserom_ipxe->fix_checksum(); - } - - # Update base length - $baserom->{length} += $rom->{length}; - - # Fix checksum for this ROM segment - $rom->fix_checksum(); - - # Add this ROM to base ROM - my $data = substr ( $baserom->get(), 0, $baserom->length() ); - $data .= $rom->get(); - $data .= $baserom->next_image()->get() if $baserom->next_image(); - $baserom->set ( $data ); - - $offset += $rom->length; -} - -$baserom->pnp_header->fix_checksum() if $baserom->pnp_header; -$baserom->fix_checksum(); -$baserom->save ( "-" ); diff --git a/qemu/roms/ipxe/src/util/modrom.pl b/qemu/roms/ipxe/src/util/modrom.pl deleted file mode 100755 index cdac0b97e..000000000 --- a/qemu/roms/ipxe/src/util/modrom.pl +++ /dev/null @@ -1,226 +0,0 @@ -#!/usr/bin/perl -w - -use Getopt::Std; - -use constant MINROMSIZE => 8192; -use constant MAXROMSIZE => 262144; - -use constant PCI_PTR_LOC => 0x18; # from beginning of ROM -use constant PCI_HDR_SIZE => 0x18; -use constant PNP_PTR_LOC => 0x1a; # from beginning of ROM -use constant PNP_HDR_SIZE => 0x20; -use constant PNP_CHKSUM_OFF => 0x9; # bytes from beginning of PnP header -use constant PNP_DEVICE_OFF => 0x10; # bytes from beginning of PnP header -use constant PCI_VEND_ID_OFF => 0x4; # bytes from beginning of PCI header -use constant PCI_DEV_ID_OFF => 0x6; # bytes from beginning of PCI header -use constant PCI_SIZE_OFF => 0x10; # bytes from beginning of PCI header - -use constant UNDI_PTR_LOC => 0x16; # from beginning of ROM -use constant UNDI_HDR_SIZE => 0x16; -use constant UNDI_CHKSUM_OFF => 0x05; - -use strict; - -use vars qw(%opts); - -use bytes; - -sub getromsize ($) { - my ($romref) = @_; - my $i; - - print STDERR "BIOS extension ROM Image did not start with 0x55 0xAA\n" - if (substr($$romref, 0, 2) ne "\x55\xaa"); - my $size = ord(substr($$romref, 2, 1)) * 512; - for ($i = MINROMSIZE; $i < MAXROMSIZE and $i < $size; $i *= 2) { } - print STDERR "$size is a strange size for a boot ROM\n" - if ($size > 0 and $i > $size); - return ($size); -} - -sub addident ($) { - my ($romref) = @_; - - return (0) unless (my $s = $opts{'i'}); - # include the terminating NUL byte too - $s .= "\x00"; - my $len = length($s); - # Put the identifier in only if the space is blank - my $pos = length($$romref) - $len - 2; - return (0) if (substr($$romref, $pos, $len) ne ("\xFF" x $len)); - substr($$romref, $pos, $len) = $s; - return ($pos); -} - -sub pcipnpheaders ($$) { - my ($romref, $identoffset) = @_; - my ($pci_hdr_offset, $pnp_hdr_offset); - - $pci_hdr_offset = unpack('v', substr($$romref, PCI_PTR_LOC, 2)); - $pnp_hdr_offset = unpack('v', substr($$romref, PNP_PTR_LOC, 2)); - # Sanity checks - if ($pci_hdr_offset < PCI_PTR_LOC + 2 - or $pci_hdr_offset > length($$romref) - PCI_HDR_SIZE - or $pnp_hdr_offset < PNP_PTR_LOC + 2 - or $pnp_hdr_offset > length($$romref) - PNP_HDR_SIZE - or substr($$romref, $pci_hdr_offset, 4) ne 'PCIR' - or substr($$romref, $pnp_hdr_offset, 4) ne '$PnP') { - $pci_hdr_offset = $pnp_hdr_offset = 0; - } else { - printf "PCI header at %#x and PnP header at %#x\n", - $pci_hdr_offset, $pnp_hdr_offset; - } - if ($pci_hdr_offset > 0) { - my ($pci_vendor_id, $pci_device_id); - # if no -p option, just report what's there - if (!defined($opts{'p'})) { - $pci_vendor_id = unpack('v', substr($$romref, $pci_hdr_offset+PCI_VEND_ID_OFF, 2)); - $pci_device_id = unpack('v', substr($$romref, $pci_hdr_offset+PCI_DEV_ID_OFF, 2)); - printf "PCI Vendor ID %#x Device ID %#x\n", - $pci_vendor_id, $pci_device_id; - } else { - substr($$romref, $pci_hdr_offset + PCI_SIZE_OFF, 2) - = pack('v', length($$romref) / 512); - ($pci_vendor_id, $pci_device_id) = split(/,/, $opts{'p'}); - substr($$romref, $pci_hdr_offset+PCI_VEND_ID_OFF, 2) - = pack('v', oct($pci_vendor_id)) if ($pci_vendor_id); - substr($$romref, $pci_hdr_offset+PCI_DEV_ID_OFF, 2) - = pack('v', oct($pci_device_id)) if ($pci_device_id); - } - } - if ($pnp_hdr_offset > 0 and defined($identoffset)) { - # Point to device id string at end of ROM image - substr($$romref, $pnp_hdr_offset+PNP_DEVICE_OFF, 2) - = pack('v', $identoffset); - substr($$romref, $pnp_hdr_offset+PNP_CHKSUM_OFF, 1) = "\x00"; - my $sum = unpack('%8C*', substr($$romref, $pnp_hdr_offset, - PNP_HDR_SIZE)); - substr($$romref, $pnp_hdr_offset+PNP_CHKSUM_OFF, 1) = chr(256 - $sum); - } -} - -sub undiheaders ($) { - my ($romref) = @_; - my ($undi_hdr_offset); - - $undi_hdr_offset = unpack('v', substr($$romref, UNDI_PTR_LOC, 2)); - # Sanity checks - if ($undi_hdr_offset < UNDI_PTR_LOC + 2 - or $undi_hdr_offset > length($$romref) - UNDI_HDR_SIZE - or substr($$romref, $undi_hdr_offset, 4) ne 'UNDI') { - $undi_hdr_offset = 0; - } else { - printf "UNDI header at %#x\n", $undi_hdr_offset; - } - if ($undi_hdr_offset > 0) { - substr($$romref, $undi_hdr_offset+UNDI_CHKSUM_OFF, 1) = "\x00"; - my $sum = unpack('%8C*', substr($$romref, $undi_hdr_offset, - UNDI_HDR_SIZE)); - substr($$romref, $undi_hdr_offset+UNDI_CHKSUM_OFF, 1) = chr(256 - $sum); - } -} - -sub writerom ($$) { - my ($filename, $romref) = @_; - - open(R, ">$filename") or die "$filename: $!\n"; - print R $$romref; - close(R); -} - -sub checksum ($) { - my ($romref) = @_; - - substr($$romref, 6, 1) = "\x00"; - my $sum = unpack('%8C*', $$romref); - substr($$romref, 6, 1) = chr(256 - $sum); - # Double check - $sum = unpack('%8C*', $$romref); - if ($sum != 0) { - print "Checksum fails\n" - } elsif ($opts{'v'}) { - print "Checksum ok\n"; - } -} - -sub makerom () { - my ($rom, $romsize); - - getopts('3xi:p:s:v', \%opts); - $ARGV[0] or die "Usage: $0 [-s romsize] [-i ident] [-p vendorid,deviceid] [-x] [-3] rom-file\n"; - open(R, $ARGV[0]) or die "$ARGV[0]: $!\n"; - # Read in the whole ROM in one gulp - my $filesize = read(R, $rom, MAXROMSIZE+1); - close(R); - defined($filesize) and $filesize >= 3 or die "Cannot get first 3 bytes of file\n"; - print "$filesize bytes read\n" if $opts{'v'}; - # If PXE image, just fill the length field and write it out - if ($opts{'x'}) { - substr($rom, 2, 1) = chr((length($rom) + 511) / 512); - &writerom($ARGV[0], \$rom); - return; - } - # Size specified with -s overrides value in 3rd byte in image - # -s 0 means round up to next 512 byte block - if (defined($opts{'s'})) { - if (($romsize = oct($opts{'s'})) <= 0) { - # NB: This roundup trick only works on powers of 2 - $romsize = ($filesize + 511) & ~511 - } - } else { - $romsize = &getromsize(\$rom); - # 0 put there by *loader.S means makerom should pick the size - if ($romsize == 0) { - # Shrink romsize down to the smallest power of two that will do - for ($romsize = MAXROMSIZE; - $romsize > MINROMSIZE and $romsize >= 2*$filesize; - $romsize /= 2) { } - } - } - if ($filesize > $romsize) { - print STDERR "ROM size of $romsize not big enough for data, "; - # NB: This roundup trick only works on powers of 2 - $romsize = ($filesize + 511) & ~511; - print "will use $romsize instead\n" - } - # Pad with 0xFF to $romsize - $rom .= "\xFF" x ($romsize - length($rom)); - if ($romsize >= 128 * 1024) { - print "Warning: ROM size exceeds extension BIOS limit\n"; - } - substr($rom, 2, 1) = chr(($romsize / 512) % 256); - print "ROM size is $romsize\n" if $opts{'v'}; - my $identoffset = &addident(\$rom); - &pcipnpheaders(\$rom, $identoffset); - &undiheaders(\$rom); - # 3c503 requires last two bytes to be 0x80 - substr($rom, MINROMSIZE-2, 2) = "\x80\x80" - if ($opts{'3'} and $romsize == MINROMSIZE); - &checksum(\$rom); - &writerom($ARGV[0], \$rom); -} - -sub modrom () { - my ($rom); - - getopts('p:v', \%opts); - $ARGV[0] or die "Usage: $0 [-p vendorid,deviceid] rom-file\n"; - open(R, $ARGV[0]) or die "$ARGV[0]: $!\n"; - # Read in the whole ROM in one gulp - my $filesize = read(R, $rom, MAXROMSIZE+1); - close(R); - defined($filesize) and $filesize >= 3 or die "Cannot get first 3 bytes of file\n"; - print "$filesize bytes read\n" if $opts{'v'}; - &pcipnpheaders(\$rom); - &undiheaders(\$rom); - &checksum(\$rom); - &writerom($ARGV[0], \$rom); -} - -# Main routine. See how we were called and behave accordingly -if ($0 =~ m:modrom(\.pl)?$:) { - &modrom(); -} else { - &makerom(); -} -exit(0); diff --git a/qemu/roms/ipxe/src/util/mucurses_test.c b/qemu/roms/ipxe/src/util/mucurses_test.c deleted file mode 100644 index 586562df5..000000000 --- a/qemu/roms/ipxe/src/util/mucurses_test.c +++ /dev/null @@ -1,63 +0,0 @@ -#include "../include/curses.h" -#include <string.h> -#include <unistd.h> -#include <stdlib.h> - -void get_iscsi_chap_secret( char * ); -void mdelay( int msecs ); - -int main ( void ) { - char secret[16]; - initscr(); - echo(); - werase(stdscr); - box( stdscr, '|', '-' ); - get_iscsi_chap_secret(secret); - - mvwprintw( stdscr, 3, 5, "password is \"%s\"", secret ); - mdelay(2500); - - stdscr->scr->exit(stdscr->scr); - - return 0; -} - -void get_iscsi_chap_secret( char *sec ) { - char *title = "Set new iSCSI CHAP secret", - *msg = "Configure the iSCSI access secret", - pw1[17], pw2[17]; - WINDOW *secret; - - secret = newwin( stdscr->height / 2, - stdscr->width / 2, - stdscr->height / 4, - stdscr->width / 4 ); - - wborder( secret, '|', '|', '-', '-', '+', '+', '+', '+' ); - mvwprintw( secret, 1, 2, "%s", title ); - mvwhline( secret, 2, 1, '-' | secret->attrs, secret->width - 2 ); - mvwprintw( secret, 4, 2, "%s", msg ); - mvwprintw( secret, 6, 3, "secret" ); - mvwprintw( secret, 8, 3, "confirm" ); - start: - mvwhline( secret, 6, 12, '_' | secret->attrs, 16 ); - mvwhline( secret, 8, 12, '_' | secret->attrs, 16 ); - - wmove( secret, 6, 12 ); - wgetnstr( secret, pw1, 16 ); - wmove( secret, 8, 12 ); - wgetnstr( secret, pw2, 16 ); - - if ( strcmp( pw1, pw2 ) == 0 ) { - strcpy( sec, pw1 ); - werase( secret ); - } - else { - mvwprintw( secret, 10, 3, "Passwords do not match" ); - goto start; - } -} - -void mdelay ( int msecs ) { - usleep( msecs * 1000 ); -} diff --git a/qemu/roms/ipxe/src/util/niclist.pl b/qemu/roms/ipxe/src/util/niclist.pl deleted file mode 100755 index 0600c8232..000000000 --- a/qemu/roms/ipxe/src/util/niclist.pl +++ /dev/null @@ -1,588 +0,0 @@ -#!/usr/bin/env perl -# -# Generates list of supported NICs with PCI vendor/device IDs, driver name -# and other useful things. -# -# Initial version by Robin Smidsrød <robin@smidsrod.no> -# - -use strict; -use warnings; -use autodie; -use v5.10; - -use File::stat; -use File::Basename qw(basename); -use File::Find (); -use Getopt::Long qw(GetOptions); - -GetOptions( - 'help' => \( my $help = 0 ), - 'format=s' => \( my $format = 'text' ), - 'sort=s' => \( my $sort = 'bus,ipxe_driver,ipxe_name' ), - 'columns=s' => \( my $columns = 'bus,vendor_id,device_id,' - . 'vendor_name,device_name,ipxe_driver,' - . 'ipxe_name,ipxe_description,file,legacy_api' - ), - 'pci-url=s' => \( my $pci_url = 'http://pciids.sourceforge.net/v2.2/pci.ids' ), - 'pci-file=s' => \( my $pci_file = '/tmp/pci.ids' ), - 'output=s' => \( my $output = '' ), -); - -die(<<"EOM") if $help; -Usage: $0 [options] [<directory>] - -Options: - --help This page - --format Set output format - --sort Set output sort order (comma-separated) - --columns Set output columns (comma-separated) - --pci-url URL to pci.ids file - --pci-file Cache file for downloaded pci.ids - --output Output file (not specified is STDOUT) - -Output formats: - text, csv, json, html, dokuwiki - -Column names (default order): - bus, vendor_id, device_id, vendor_name, device_name, - ipxe_driver, ipxe_name, ipxe_description, file, legacy_api -EOM - -# Only load runtime requirements if actually in use -given($format) { - when( /csv/ ) { - eval { require Text::CSV; }; - die("Please install Text::CSV CPAN module to use this feature.\n") - if $@; - } - when( /json/ ) { - eval { require JSON; }; - die("Please install JSON CPAN module to use this feature.\n") - if $@; - } - when( /html/ ) { - eval { require HTML::Entities; }; - die("Please install HTML::Entities CPAN module to use this feature.\n") - if $@; - } - default { } -} - -# Scan source dir and build NIC list -my $ipxe_src_dir = shift || '.'; # Default to current directory -my $ipxe_nic_list = build_ipxe_nic_list( $ipxe_src_dir ); - -# Download pci.ids file and parse it -fetch_pci_ids_file($pci_url, $pci_file); -my $pci_id_map = build_pci_id_map($pci_file); - -# Merge 'official' vendor/device names and sort list -update_ipxe_nic_names($ipxe_nic_list, $pci_id_map); -my $sorted_list = sort_ipxe_nic_list($ipxe_nic_list, $sort); - -# Run specified formatter -my $column_names = parse_columns_param($columns); -say STDERR "Formatting NIC list in format '$format' with columns: " - . join(", ", @$column_names); -my $formatter = \&{ "format_nic_list_$format" }; -my $report = $formatter->( $sorted_list, $column_names ); - -# Print final report -if ( $output and $output ne '-' ) { - say STDERR "Printing report to '$output'..."; - open( my $out_fh, ">", $output ); - print $out_fh $report; - close($out_fh); -} -else { - print STDOUT $report; -} - -exit; - -# fetch URL into specified filename -sub fetch_pci_ids_file { - my ($url, $filename) = @_; - my @cmd = ( "wget", "--quiet", "-O", $filename, $url ); - my @touch = ( "touch", $filename ); - if ( -r $filename ) { - my $age = time - stat($filename)->mtime; - # Refresh if older than 1 day - if ( $age > 86400 ) { - say STDERR "Refreshing $filename from $url..."; - system(@cmd); - system(@touch); - } - } - else { - say STDERR "Fetching $url into $filename..."; - system(@cmd); - system(@touch); - } - return $filename; -} - -sub build_pci_id_map { - my ($filename) = @_; - say STDERR "Building PCI ID map..."; - - my $devices = {}; - my $classes = {}; - my $pci_id = qr/[[:xdigit:]]{4}/; - my $c_id = qr/[[:xdigit:]]{2}/; - my $non_space = qr/[^\s]/; - - # open pci.ids file specified - open( my $fh, "<", $filename ); - - # For devices - my $vendor_id = ""; - my $vendor_name = ""; - my $device_id = ""; - my $device_name = ""; - - # For classes - my $class_id = ""; - my $class_name = ""; - my $subclass_id = ""; - my $subclass_name = ""; - - while(<$fh>) { - # skip # and blank lines - next if m/^$/; - next if m/^\s*#/; - - # Vendors, devices and subsystems. Please keep sorted. - # Syntax: - # vendor vendor_name - # device device_name <-- single tab - # subvendor subdevice subsystem_name <-- two tabs - if ( m/^ ($pci_id) \s+ ( $non_space .* ) /x ) { - $vendor_id = lc $1; - $vendor_name = $2; - $devices->{$vendor_id} = { name => $vendor_name }; - next; - } - - if ( $vendor_id and m/^ \t ($pci_id) \s+ ( $non_space .* ) /x ) { - $device_id = lc $1; - $device_name = $2; - $devices->{$vendor_id}->{'devices'} //= {}; - $devices->{$vendor_id}->{'devices'}->{$device_id} = { name => $device_name }; - next; - } - - if ( $vendor_id and $device_id and m/^ \t{2} ($pci_id) \s+ ($pci_id) \s+ ( $non_space .* ) /x ) { - my $subvendor_id = lc $1; - my $subdevice_id = lc $2; - my $subsystem_name = $3; - $devices->{$vendor_id}->{'devices'}->{$device_id}->{'subvendor'} //= {}; - $devices->{$vendor_id}->{'devices'}->{$device_id}->{'subvendor'}->{$subvendor_id} //= {}; - $devices->{$vendor_id}->{'devices'}->{$device_id}->{'subvendor'}->{$subvendor_id}->{'devices'} //= {}; - $devices->{$vendor_id}->{'devices'}->{$device_id}->{'subvendor'}->{$subvendor_id}->{'devices'}->{$subdevice_id} = { name => $subsystem_name }; - next; - } - - # List of known device classes, subclasses and programming interfaces - # Syntax: - # C class class_name - # subclass subclass_name <-- single tab - # prog-if prog-if_name <-- two tabs - if ( m/^C \s+ ($c_id) \s+ ( $non_space .* ) /x ) { - $class_id = lc $1; - $class_name = $2; - $classes->{$class_id} = { name => $class_name }; - next; - } - - if ( $class_id and m/^ \t ($c_id) \s+ ( $non_space .* ) /x ) { - $subclass_id = lc $1; - $subclass_name = $2; - $classes->{$class_id}->{'subclasses'} //= {}; - $classes->{$class_id}->{'subclasses'}->{$subclass_id} = { name => $subclass_name }; - next; - } - - if ( $class_id and $subclass_id and m/^ \t{2} ($c_id) \s+ ( $non_space .* ) /x ) { - my $prog_if_id = lc $1; - my $prog_if_name = $2; - $classes->{$class_id}->{'subclasses'}->{$subclass_id}->{'programming_interfaces'} //= {}; - $classes->{$class_id}->{'subclasses'}->{$subclass_id}->{'programming_interfaces'}->{$prog_if_id} = { name => $prog_if_name }; - next; - } - } - - close($fh); - - # Populate subvendor names - foreach my $vendor_id ( keys %$devices ) { - my $device_map = $devices->{$vendor_id}->{'devices'}; - foreach my $device_id ( keys %$device_map ) { - my $subvendor_map = $device_map->{$device_id}->{'subvendor'}; - foreach my $subvendor_id ( keys %$subvendor_map ) { - $subvendor_map->{$subvendor_id}->{'name'} = $devices->{$subvendor_id}->{'name'} || ""; - } - } - } - - return { - 'devices' => $devices, - 'classes' => $classes, - }; -} - -# Scan through C code and parse ISA_ROM and PCI_ROM lines -sub build_ipxe_nic_list { - my ($dir) = @_; - say STDERR "Building iPXE NIC list from " . ( $dir eq '.' ? 'current directory' : $dir ) . "..."; - - # recursively iterate through dir and find .c files - my @c_files; - File::Find::find(sub { - # only process files - return if -d $_; - # skip unreadable files - return unless -r $_; - # skip all but files with .c extension - return unless /\.c$/; - push @c_files, $File::Find::name; - }, $dir); - - # Look for ISA_ROM or PCI_ROM lines - my $ipxe_nic_list = []; - my $hex_id = qr/0 x [[:xdigit:]]{4} /x; - my $quote = qr/ ['"] /x; - my $non_space = qr/ [^\s] /x; - my $rom_line_counter = 0; - foreach my $c_path ( sort @c_files ) { - my $legacy = 0; - open( my $fh, "<", $c_path ); - my $c_file = $c_path; - $c_file =~ s{^\Q$dir\E/?}{} if -d $dir; # Strip directory from reported filename - my $ipxe_driver = basename($c_file, '.c'); - while(<$fh>) { - # Most likely EtherBoot legacy API - $legacy = 1 if m/struct \s* nic \s*/x; - - # parse ISA|PCI_ROM lines into hashref and append to $ipxe_nic_list - next unless m/^ \s* (?:ISA|PCI)_ROM /x; - $rom_line_counter++; - chomp; - #say; # for debugging regexp - if ( m/^ \s* ISA_ROM \s* \( \s* $quote ( .*? ) $quote \s* , \s* $quote ( .*? ) $quote \s* \) /x ) { - my $image = $1; - my $name = $2; - push @$ipxe_nic_list, { - file => $c_file, - bus => 'isa', - ipxe_driver => $ipxe_driver, - ipxe_name => $image, - ipxe_description => $name, - legacy_api => ( $legacy ? 'yes' : 'no' ), - }; - next; - } - if ( m/^ \s* PCI_ROM \s* \( \s* ($hex_id) \s* , \s* ($hex_id) \s* , \s* $quote (.*?) $quote \s* , \s* $quote (.*?) $quote /x ) { - my $vendor_id = lc $1; - my $device_id = lc $2; - my $name = $3; - my $desc = $4; - push @$ipxe_nic_list, { - file => $c_file, - bus => 'pci', - vendor_id => substr($vendor_id, 2), # strip 0x - device_id => substr($device_id, 2), # strip 0x - ipxe_driver => $ipxe_driver, - ipxe_name => $name, - ipxe_description => $desc, - legacy_api => ( $legacy ? 'yes' : 'no' ), - }; - next; - } - } - close($fh); - } - - # Verify all ROM lines where parsed properly - my @isa_roms = grep { $_->{'bus'} eq 'isa' } @$ipxe_nic_list; - my @pci_roms = grep { $_->{'bus'} eq 'pci' } @$ipxe_nic_list; - if ( $rom_line_counter != ( @isa_roms + @pci_roms ) ) { - say STDERR "Found ROM lines: $rom_line_counter"; - say STDERR "Extracted ISA_ROM lines: " . scalar @isa_roms; - say STDERR "Extracted PCI_ROM lines: " . scalar @pci_roms; - die("Mismatch between number of ISA_ROM/PCI_ROM lines and extracted entries. Verify regular expressions.\n"); - } - - return $ipxe_nic_list; -} - -# merge vendor/product name from $pci_id_map into $ipxe_nic_list -sub update_ipxe_nic_names { - my ($ipxe_nic_list, $pci_id_map) = @_; - say STDERR "Merging 'official' vendor/device names..."; - - foreach my $nic ( @$ipxe_nic_list ) { - next unless $nic->{'bus'} eq 'pci'; - $nic->{'vendor_name'} = $pci_id_map->{'devices'}->{ $nic->{'vendor_id'} }->{'name'} || ""; - $nic->{'device_name'} = $pci_id_map->{'devices'}->{ $nic->{'vendor_id'} }->{'devices'}->{ $nic->{'device_id'} }->{'name'} || ""; - } - return $ipxe_nic_list; # Redundant, as we're mutating the input list, useful for chaining calls -} - -# Sort entries in NIC list according to sort criteria -sub sort_ipxe_nic_list { - my ($ipxe_nic_list, $sort_column_names) = @_; - my @sort_column_names = @{ parse_columns_param($sort_column_names) }; - say STDERR "Sorting NIC list by: " . join(", ", @sort_column_names ); - # Start at the end of the list and resort until list is exhausted - my @sorted_list = @{ $ipxe_nic_list }; - while(@sort_column_names) { - my $column_name = pop @sort_column_names; - @sorted_list = sort { ( $a->{$column_name} || "" ) cmp ( $b->{$column_name} || "" ) } - @sorted_list; - } - return \@sorted_list; -} - -# Parse comma-separated values into array -sub parse_columns_param { - my ($columns) = @_; - return [ - grep { is_valid_column($_) } # only include valid entries - map { s/\s//g; $_; } # filter whitespace - split( /,/, $columns ) # split on comma - ]; -} - -# Return true if the input column name is valid -sub is_valid_column { - my ($name) = @_; - my $valid_column_map = { - map { $_ => 1 } - qw( - bus file legacy_api - ipxe_driver ipxe_name ipxe_description - vendor_id device_id vendor_name device_name - ) - }; - return unless $name; - return unless $valid_column_map->{$name}; - return 1; -} - -# Output NIC list in plain text -sub format_nic_list_text { - my ($nic_list, $column_names) = @_; - return join("\n", - map { format_nic_text($_, $column_names) } - @$nic_list - ); -} - -# Format one ipxe_nic_list entry for display -# Column order not supported by text format -sub format_nic_text { - my ($nic, $column_names) = @_; - my $labels = { - bus => 'Bus: ', - ipxe_driver => 'iPXE driver: ', - ipxe_name => 'iPXE name: ', - ipxe_description => 'iPXE description:', - file => 'Source file: ', - legacy_api => 'Using legacy API:', - vendor_id => 'PCI vendor ID: ', - device_id => 'PCI device ID: ', - vendor_name => 'Vendor name: ', - device_name => 'Device name: ', - }; - my $pci_only = { - vendor_id => 1, - device_id => 1, - vendor_name => 1, - device_name => 1, - }; - my $output = ""; - foreach my $column ( @$column_names ) { - next if $nic->{'bus'} eq 'isa' and $pci_only->{$column}; - $output .= $labels->{$column} - . " " - . ( $nic->{$column} || "" ) - . "\n"; - } - return $output; -} - -# Output NIC list in JSON -sub format_nic_list_json { - my ($nic_list, $column_names) = @_; - - # Filter columns not mentioned - my @nics; - foreach my $nic ( @$nic_list ) { - my $filtered_nic = {}; - foreach my $key ( @$column_names ) { - $filtered_nic->{$key} = $nic->{$key}; - } - push @nics, $filtered_nic; - } - - return JSON->new->pretty->utf8->encode(\@nics); -} - -# Output NIC list in CSV -sub format_nic_list_csv { - my ($nic_list, $column_names) = @_; - my @output; - - # Output CSV header - my $csv = Text::CSV->new(); - if ( $csv->combine( @$column_names ) ) { - push @output, $csv->string(); - } - - # Output CSV lines - foreach my $nic ( @$nic_list ) { - my @columns = @{ $nic }{ @$column_names }; - if ( $csv->combine( @columns ) ) { - push @output, $csv->string(); - } - } - return join("\n", @output) . "\n"; -} - -# Output NIC list in HTML -sub format_nic_list_html { - my ($nic_list, $column_names) = @_; - my @output; - - push @output, <<'EOM'; -<!DOCTYPE html> -<html> -<head> -<meta charset="utf-8"> -<title>Network cards supported by iPXE</title> -<style> -table.tablesorter { - border: thin solid black; -} - -table.tablesorter thead { - background-color: #EEE; -} - -table.tablesorter thead th { - font-weight: bold; -} - -table.tablesorter tbody td { - vertical-align: top; - padding-left: 0.25em; - padding-right: 0.25em; - padding-bottom: 0.125em; - white-space: nowrap; -} - -table.tablesorter tbody tr.even { - background-color: #eee; -} - -table.tablesorter tbody tr.odd { - background-color: #fff; -} -</style> -</head> -<body> -<h1>Network cards supported by iPXE</h1> -<table class="tablesorter"> -<thead> -EOM - - # Output HTML header - push @output, "<tr>" - . join("", - map { "<th>" . HTML::Entities::encode($_) . "</th>" } - @$column_names - ) - . "</tr>"; - - push @output, <<"EOM"; -</thead> -<tbody> -EOM - # Output HTML lines - my $counter = 0; - foreach my $nic ( @$nic_list ) { - my @columns = @{ $nic }{ @$column_names }; # array slice from hashref, see perldoc perldata if confusing - push @output, q!<tr class="! . ( $counter % 2 ? 'even' : 'odd' ) . q!">! - . join("", - map { "<td>" . HTML::Entities::encode( $_ || "" ) . "</td>" } - @columns - ) - . "</tr>"; - $counter++; - } - - push @output, <<'EOM'; -</tbody> -</table> -<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> -<script> -/* - * - * TableSorter 2.0 - Client-side table sorting with ease! - * Version 2.0.5b - * @requires jQuery v1.2.3 - * From http://tablesorter.com/ - * - * Copyright (c) 2007 Christian Bach - * Examples and docs at: http://tablesorter.com - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - * - */ -(function($){$.extend({tablesorter:new -function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",cssChildRow:"expand-child",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,sortLocaleCompare:true,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:'/\.|\,/g',onRenderHeader:null,selectorHeaders:'thead th',debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms");}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s);}else{alert(s);}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug="";}if(table.tBodies.length==0)return;var rows=table.tBodies[0].rows;if(rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i<l;i++){var p=false;if($.metadata&&($($headers[i]).metadata()&&$($headers[i]).metadata().sorter)){p=getParserById($($headers[i]).metadata().sorter);}else if((table.config.headers[i]&&table.config.headers[i].sorter)){p=getParserById(table.config.headers[i].sorter);}if(!p){p=detectParserForColumn(table,rows,-1,i);}if(table.config.debug){parsersDebug+="column:"+i+" parser:"+p.id+"\n";}list.push(p);}}if(table.config.debug){log(parsersDebug);}return list;};function detectParserForColumn(table,rows,rowIndex,cellIndex){var l=parsers.length,node=false,nodeValue=false,keepLooking=true;while(nodeValue==''&&keepLooking){rowIndex++;if(rows[rowIndex]){node=getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex);nodeValue=trimAndGetNodeText(table.config,node);if(table.config.debug){log('Checking if value was empty on row:'+rowIndex);}}else{keepLooking=false;}}for(var i=1;i<l;i++){if(parsers[i].is(nodeValue,table,node)){return parsers[i];}}return parsers[0];}function getNodeFromRowAndCellIndex(rows,rowIndex,cellIndex){return rows[rowIndex].cells[cellIndex];}function trimAndGetNodeText(config,node){return $.trim(getElementText(config,node));}function getParserById(name){var l=parsers.length;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==name.toLowerCase()){return parsers[i];}}return false;}function buildCache(table){if(table.config.debug){var cacheTime=new Date();}var totalRows=(table.tBodies[0]&&table.tBodies[0].rows.length)||0,totalCells=(table.tBodies[0].rows[0]&&table.tBodies[0].rows[0].cells.length)||0,parsers=table.config.parsers,cache={row:[],normalized:[]};for(var i=0;i<totalRows;++i){var c=$(table.tBodies[0].rows[i]),cols=[];if(c.hasClass(table.config.cssChildRow)){cache.row[cache.row.length-1]=cache.row[cache.row.length-1].add(c);continue;}cache.row.push(c);for(var j=0;j<totalCells;++j){cols.push(parsers[j].format(getElementText(table.config,c[0].cells[j]),table,c[0].cells[j]));}cols.push(cache.normalized.length);cache.normalized.push(cols);cols=null;};if(table.config.debug){benchmark("Building cache for "+totalRows+" rows:",cacheTime);}return cache;};function getElementText(config,node){var text="";if(!node)return"";if(!config.supportsTextContent)config.supportsTextContent=node.textContent||false;if(config.textExtraction=="simple"){if(config.supportsTextContent){text=node.textContent;}else{if(node.childNodes[0]&&node.childNodes[0].hasChildNodes()){text=node.childNodes[0].innerHTML;}else{text=node.innerHTML;}}}else{if(typeof(config.textExtraction)=="function"){text=config.textExtraction(node);}else{text=$(node).text();}}return text;}function appendToTable(table,cache){if(table.config.debug){var appendTime=new Date()}var c=cache,r=c.row,n=c.normalized,totalRows=n.length,checkCell=(n[0].length-1),tableBody=$(table.tBodies[0]),rows=[];for(var i=0;i<totalRows;i++){var pos=n[i][checkCell];rows.push(r[pos]);if(!table.config.appender){var l=r[pos].length;for(var j=0;j<l;j++){tableBody[0].appendChild(r[pos][j]);}}}if(table.config.appender){table.config.appender(table,rows);}rows=null;if(table.config.debug){benchmark("Rebuilt table:",appendTime);}applyWidget(table);setTimeout(function(){$(table).trigger("sortEnd");},0);};function buildHeaders(table){if(table.config.debug){var time=new Date();}var meta=($.metadata)?true:false;var header_index=computeTableHeaderCellIndexes(table);$tableHeaders=$(table.config.selectorHeaders,table).each(function(index){this.column=header_index[this.parentNode.rowIndex+"-"+this.cellIndex];this.order=formatSortingOrder(table.config.sortInitialOrder);this.count=this.order;if(checkHeaderMetadata(this)||checkHeaderOptions(table,index))this.sortDisabled=true;if(checkHeaderOptionsSortingLocked(table,index))this.order=this.lockedOrder=checkHeaderOptionsSortingLocked(table,index);if(!this.sortDisabled){var $th=$(this).addClass(table.config.cssHeader);if(table.config.onRenderHeader)table.config.onRenderHeader.apply($th);}table.config.headerList[index]=this;});if(table.config.debug){benchmark("Built headers:",time);log($tableHeaders);}return $tableHeaders;};function computeTableHeaderCellIndexes(t){var matrix=[];var lookup={};var thead=t.getElementsByTagName('THEAD')[0];var trs=thead.getElementsByTagName('TR');for(var i=0;i<trs.length;i++){var cells=trs[i].cells;for(var j=0;j<cells.length;j++){var c=cells[j];var rowIndex=c.parentNode.rowIndex;var cellId=rowIndex+"-"+c.cellIndex;var rowSpan=c.rowSpan||1;var colSpan=c.colSpan||1 -var firstAvailCol;if(typeof(matrix[rowIndex])=="undefined"){matrix[rowIndex]=[];}for(var k=0;k<matrix[rowIndex].length+1;k++){if(typeof(matrix[rowIndex][k])=="undefined"){firstAvailCol=k;break;}}lookup[cellId]=firstAvailCol;for(var k=rowIndex;k<rowIndex+rowSpan;k++){if(typeof(matrix[k])=="undefined"){matrix[k]=[];}var matrixrow=matrix[k];for(var l=firstAvailCol;l<firstAvailCol+colSpan;l++){matrixrow[l]="x";}}}}return lookup;}function checkCellColSpan(table,rows,row){var arr=[],r=table.tHead.rows,c=r[row].cells;for(var i=0;i<c.length;i++){var cell=c[i];if(cell.colSpan>1){arr=arr.concat(checkCellColSpan(table,headerArr,row++));}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell);}}}return arr;};function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true;};return false;}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true;};return false;}function checkHeaderOptionsSortingLocked(table,i){if((table.config.headers[i])&&(table.config.headers[i].lockedOrder))return table.config.headers[i].lockedOrder;return false;}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i<l;i++){getWidgetById(c[i]).format(table);}}function getWidgetById(name){var l=widgets.length;for(var i=0;i<l;i++){if(widgets[i].id.toLowerCase()==name.toLowerCase()){return widgets[i];}}};function formatSortingOrder(v){if(typeof(v)!="Number"){return(v.toLowerCase()=="desc")?1:0;}else{return(v==1)?1:0;}}function isValueInArray(v,a){var l=a.length;for(var i=0;i<l;i++){if(a[i][0]==v){return true;}}return false;}function setHeadersCss(table,$headers,list,css){$headers.removeClass(css[0]).removeClass(css[1]);var h=[];$headers.each(function(offset){if(!this.sortDisabled){h[this.column]=$(this);}});var l=list.length;for(var i=0;i<l;i++){h[list[i][0]].addClass(css[list[i][1]]);}}function fixColumnWidth(table,$headers){var c=table.config;if(c.widthFixed){var colgroup=$('<colgroup>');$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($('<col>').css('width',$(this).width()));});$(table).prepend(colgroup);};}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i<l;i++){var s=sortList[i],o=c.headerList[s[0]];o.count=s[1];o.count++;}}function multisort(table,sortList,cache){if(table.config.debug){var sortTime=new Date();}var dynamicExp="var sortWrapper = function(a,b) {",l=sortList.length;for(var i=0;i<l;i++){var c=sortList[i][0];var order=sortList[i][1];var s=(table.config.parsers[c].type=="text")?((order==0)?makeSortFunction("text","asc",c):makeSortFunction("text","desc",c)):((order==0)?makeSortFunction("numeric","asc",c):makeSortFunction("numeric","desc",c));var e="e"+i;dynamicExp+="var "+e+" = "+s;dynamicExp+="if("+e+") { return "+e+"; } ";dynamicExp+="else { ";}var orgOrderCol=cache.normalized[0].length-1;dynamicExp+="return a["+orgOrderCol+"]-b["+orgOrderCol+"];";for(var i=0;i<l;i++){dynamicExp+="}; ";}dynamicExp+="return 0; ";dynamicExp+="}; ";if(table.config.debug){benchmark("Evaling expression:"+dynamicExp,new Date());}eval(dynamicExp);cache.normalized.sort(sortWrapper);if(table.config.debug){benchmark("Sorting on "+sortList.toString()+" and dir "+order+" time:",sortTime);}return cache;};function makeSortFunction(type,direction,index){var a="a["+index+"]",b="b["+index+"]";if(type=='text'&&direction=='asc'){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+a+" < "+b+") ? -1 : 1 )));";}else if(type=='text'&&direction=='desc'){return"("+a+" == "+b+" ? 0 : ("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : ("+b+" < "+a+") ? -1 : 1 )));";}else if(type=='numeric'&&direction=='asc'){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+a+" - "+b+"));";}else if(type=='numeric'&&direction=='desc'){return"("+a+" === null && "+b+" === null) ? 0 :("+a+" === null ? Number.POSITIVE_INFINITY : ("+b+" === null ? Number.NEGATIVE_INFINITY : "+b+" - "+a+"));";}};function makeSortText(i){return"((a["+i+"] < b["+i+"]) ? -1 : ((a["+i+"] > b["+i+"]) ? 1 : 0));";};function makeSortTextDesc(i){return"((b["+i+"] < a["+i+"]) ? -1 : ((b["+i+"] > a["+i+"]) ? 1 : 0));";};function makeSortNumeric(i){return"a["+i+"]-b["+i+"];";};function makeSortNumericDesc(i){return"b["+i+"]-a["+i+"];";};function sortText(a,b){if(table.config.sortLocaleCompare)return a.localeCompare(b);return((a<b)?-1:((a>b)?1:0));};function sortTextDesc(a,b){if(table.config.sortLocaleCompare)return b.localeCompare(a);return((b<a)?-1:((b>a)?1:0));};function sortNumeric(a,b){return a-b;};function sortNumericDesc(a,b){return b-a;};function getCachedSortType(parsers,i){return parsers[i].type;};this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies)return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$.data(this,"tablesorter",config);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){$this.trigger("sortStart");var $cell=$(this);var i=this.column;this.order=this.count++%2;if(this.lockedOrder)this.order=this.lockedOrder;if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j<a.length;j++){if(a[j][0]!=i){config.sortList.push(a[j]);}}}config.sortList.push([i,this.order]);}else{if(isValueInArray(i,config.sortList)){for(var j=0;j<config.sortList.length;j++){var s=config.sortList[j],o=config.headerList[s[0]];if(s[0]==i){o.count=s[1];o.count++;s[1]=o.count%2;}}}else{config.sortList.push([i,this.order]);}};setTimeout(function(){setHeadersCss($this[0],$headers,config.sortList,sortCSS);appendToTable($this[0],multisort($this[0],config.sortList,cache));},1);return false;}}).mousedown(function(){if(config.cancelSelection){this.onselectstart=function(){return false};return false;}});$this.bind("update",function(){var me=this;setTimeout(function(){me.config.parsers=buildParserCache(me,$headers);cache=buildCache(me);},1);}).bind("updateCell",function(e,cell){var config=this.config;var pos=[(cell.parentNode.rowIndex-1),cell.cellIndex];cache.normalized[pos[0]][pos[1]]=config.parsers[pos[1]].format(getElementText(config,cell),cell);}).bind("sorton",function(e,list){$(this).trigger("sortStart");config.sortList=list;var sortList=config.sortList;updateHeaderSortCount(this,sortList);setHeadersCss(this,$headers,sortList,sortCSS);appendToTable(this,multisort(this,sortList,cache));}).bind("appendCache",function(){appendToTable(this,cache);}).bind("applyWidgetId",function(e,id){getWidgetById(id).format(this);}).bind("applyWidgets",function(){applyWidget(this);});if($.metadata&&($(this).metadata()&&$(this).metadata().sortlist)){config.sortList=$(this).metadata().sortlist;}if(config.sortList.length>0){$this.trigger("sorton",[config.sortList]);}applyWidget(this);});};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i<l;i++){if(parsers[i].id.toLowerCase()==parser.id.toLowerCase()){a=false;}}if(a){parsers.push(parser);};};this.addWidget=function(widget){widgets.push(widget);};this.formatFloat=function(s){var i=parseFloat(s);return(isNaN(i))?0:i;};this.formatInt=function(s){var i=parseInt(s);return(isNaN(i))?0:i;};this.isDigit=function(s,config){return/^[-+]?\d*$/.test($.trim(s.replace(/[,.']/g,'')));};this.clearTableBody=function(table){if($.browser.msie){function empty(){while(this.firstChild)this.removeChild(this.firstChild);}empty.apply(table.tBodies[0]);}else{table.tBodies[0].innerHTML="";}};}});$.fn.extend({tablesorter:$.tablesorter.construct});var ts=$.tablesorter;ts.addParser({id:"text",is:function(s){return true;},format:function(s){return $.trim(s.toLocaleLowerCase());},type:"text"});ts.addParser({id:"digit",is:function(s,table){var c=table.config;return $.tablesorter.isDigit(s,c);},format:function(s){return $.tablesorter.formatFloat(s);},type:"numeric"});ts.addParser({id:"currency",is:function(s){return/^[£$€?.]/.test(s);},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$€]/g),""));},type:"numeric"});ts.addParser({id:"ipAddress",is:function(s){return/^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s);},format:function(s){var a=s.split("."),r="",l=a.length;for(var i=0;i<l;i++){var item=a[i];if(item.length==2){r+="0"+item;}else{r+=item;}}return $.tablesorter.formatFloat(r);},type:"numeric"});ts.addParser({id:"url",is:function(s){return/^(https?|ftp|file):\/\/$/.test(s);},format:function(s){return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),''));},type:"text"});ts.addParser({id:"isoDate",is:function(s){return/^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s);},format:function(s){return $.tablesorter.formatFloat((s!="")?new Date(s.replace(new RegExp(/-/g),"/")).getTime():"0");},type:"numeric"});ts.addParser({id:"percent",is:function(s){return/\%$/.test($.trim(s));},format:function(s){return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),""));},type:"numeric"});ts.addParser({id:"usLongDate",is:function(s){return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/));},format:function(s){return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"shortDate",is:function(s){return/\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s);},format:function(s,table){var c=table.config;s=s.replace(/\-/g,"/");if(c.dateFormat=="us"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$1/$2");}else if(c.dateFormat=="uk"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/,"$3/$2/$1");}else if(c.dateFormat=="dd/mm/yy"||c.dateFormat=="dd-mm-yy"){s=s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/,"$1/$2/$3");}return $.tablesorter.formatFloat(new Date(s).getTime());},type:"numeric"});ts.addParser({id:"time",is:function(s){return/^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s);},format:function(s){return $.tablesorter.formatFloat(new Date("2000/01/01 "+s).getTime());},type:"numeric"});ts.addParser({id:"metadata",is:function(s){return false;},format:function(s,table,cell){var c=table.config,p=(!c.parserMetadataName)?'sortValue':c.parserMetadataName;return $(cell).metadata()[p];},type:"numeric"});ts.addWidget({id:"zebra",format:function(table){if(table.config.debug){var time=new Date();}var $tr,row=-1,odd;$("tr:visible",table.tBodies[0]).each(function(i){$tr=$(this);if(!$tr.hasClass(table.config.cssChildRow))row++;odd=(row%2==0);$tr.removeClass(table.config.widgetZebra.css[odd?0:1]).addClass(table.config.widgetZebra.css[odd?1:0])});if(table.config.debug){$.tablesorter.benchmark("Applying Zebra widget",time);}}});})(jQuery); -</script> -<script type="text/javascript"> -$(document).ready(function() { - $("table.tablesorter").tablesorter(); -}); -</script> -</body> -</html> -EOM - return join("\n", @output); -} - -# Output NIC list in DokuWiki format (for http://ipxe.org) -sub format_nic_list_dokuwiki { - my ($nic_list, $column_names) = @_; - my @output; - - push @output, <<'EOM'; -EOM - - # Output DokuWiki table header - push @output, "^" - . join("^", - map { $_ || "" } - @$column_names - ) - . "^"; - - # Output DokuWiki table entries - foreach my $nic ( @$nic_list ) { - my @columns = @{ $nic }{ @$column_names }; # array slice from hashref, see perldoc perldata if confusing - push @output, '|' - . join('|', - map { $_ || "" } - @columns - ) - . '|'; - } - - return join("\n", @output); -} diff --git a/qemu/roms/ipxe/src/util/nrv2b.c b/qemu/roms/ipxe/src/util/nrv2b.c deleted file mode 100644 index 031f5d9cb..000000000 --- a/qemu/roms/ipxe/src/util/nrv2b.c +++ /dev/null @@ -1,1500 +0,0 @@ -/************************************************************** - Form adapted from lzhuf.c - written by Haruyasu Yoshizaki 11/20/1988 - some minor changes 4/6/1989 - comments translated by Haruhiko Okumura 4/7/1989 - - minor beautifications and adjustments for compiling under Linux - by Markus Gutschke <gutschk@math.uni-muenster.de> - 1997-01-27 - - Modifications to allow use as a filter by Ken Yap - <ken_yap@users.sourceforge.net>. - - 1997-07-01 - - Small mod to cope with running on big-endian machines - by Jim Hague <jim.hague@acm.org) - 1998-02-06 - - Make compression statistics report shorter - by Ken Yap <ken_yap@users.sourceforge.net>. - 2001-04-25 - - Replaced algorithm with nrv2b from ucl the compression - library from upx. That code is: - Copyright (C) 1996-2002 Markus Franz Xaver Johannes Oberhumer - And is distributed under the terms of the GPL. - The conversion was performed - by Eric Biederman <ebiederman@lnxi.com>. - 20 August 2002 - -**************************************************************/ -#define UCLPACK_COMPAT 0 -#define NDEBUG 1 -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <errno.h> -#ifdef __FreeBSD__ -#include <inttypes.h> -#else -#include <stdint.h> -#endif -#include <limits.h> -#include <assert.h> -#if UCLPACK_COMPAT -#include <netinet/in.h> -#endif - -#ifndef VERBOSE -#define Fprintf(x) -#define wterr 0 -#else -#define Fprintf(x) fprintf x -#endif - -#ifndef MAIN -extern -#endif -FILE *infile, *outfile; - -#if defined(ENCODE) || defined(DECODE) - -#ifndef ENDIAN -#define ENDIAN 0 -#endif -#ifndef BITSIZE -#define BITSIZE 32 -#endif - -static __inline__ void Error(char *message) -{ - Fprintf((stderr, "\n%s\n", message)); - exit(EXIT_FAILURE); -} - -/* These will be a complete waste of time on a lo-endian */ -/* system, but it only gets done once so WTF. */ -static unsigned long __attribute__ (( unused )) i86ul_to_host(unsigned long ul) -{ - unsigned long res = 0; - int i; - union - { - unsigned char c[4]; - unsigned long ul; - } u; - - u.ul = ul; - for (i = 3; i >= 0; i--) - res = (res << 8) + u.c[i]; - return res; -} - -static unsigned long host_to_i86ul(unsigned long ul) -{ - int i; - union - { - unsigned char c[4]; - unsigned long ul; - } u; - - for (i = 0; i < 4; i++) - { - u.c[i] = ul & 0xff; - ul >>= 8; - } - return u.ul; -} -#endif - - - -#if UCLPACK_COMPAT -/* magic file header for compressed files */ -static const unsigned char magic[8] = -{ 0x00, 0xe9, 0x55, 0x43, 0x4c, 0xff, 0x01, 0x1a }; - -#endif - -#ifdef ENCODE -/********** NRV2B_99 compression **********/ - -/* Note by limiting the ring buffer I have limited the maximum - * offset to 64K. Since etherboot rarely gets that big it - * is not a problem and it gives me a firm guarantee - * that I will never get a 3 byte string match that is encodes - * to more than 9/8 it's original size. - * That guaranteee is important to for the inplace decompressor. - * There are better ways to do this if a larger offset and buffer - * would give better compression. - */ -#define N (65536ul) /* size of ring buffer */ -#define THRESHOLD 1 /* lower limit for match length */ -#define F 2048 /* upper limit for match length */ -#define M2_MAX_OFFSET 0xd00 - -/* note: to use default values pass -1, i.e. initialize - * this struct by a memset(x,0xff,sizeof(x)) */ -struct ucl_compress_config -{ - int bb_endian; - int bb_size; - unsigned int max_offset; - unsigned int max_match; - int s_level; - int h_level; - int p_level; - int c_flags; - unsigned int m_size; -}; - -struct ucl_compress -{ - int init; - - unsigned int look; /* bytes in lookahead buffer */ - - unsigned int m_len; - unsigned int m_off; - - unsigned int last_m_len; - unsigned int last_m_off; - - const unsigned char *bp; - const unsigned char *ip; - const unsigned char *in; - const unsigned char *in_end; - unsigned char *out; - - uint64_t bb_b; - unsigned bb_k; - unsigned bb_c_endian; - unsigned bb_c_s; - unsigned bb_c_s8; - unsigned char *bb_p; - unsigned char *bb_op; - - struct ucl_compress_config conf; - unsigned int *result; - - unsigned int textsize; /* text size counter */ - unsigned int codesize; /* code size counter */ - unsigned int printcount; /* counter for reporting progress every 1K - bytes */ - - - /* some stats */ - unsigned long lit_bytes; - unsigned long match_bytes; - unsigned long rep_bytes; - unsigned long lazy; -}; - - - -#define getbyte(c) ((c).ip < (c).in_end ? *((c).ip)++ : (-1)) - -#define UCL_E_OK 0 -#define UCL_E_INVALID_ARGUMENT 1 -#define UCL_E_OUT_OF_MEMORY 2 -#define UCL_E_ERROR 3 - -/*********************************************************************** -// -************************************************************************/ - -#define SWD_HSIZE 16384 -#define SWD_MAX_CHAIN 2048 -#undef SWD_BEST_OFF - -#define HEAD3(b,p) \ - (((0x9f5f*(((((uint32_t)b[p]<<5)^b[p+1])<<5)^b[p+2]))>>5) & (SWD_HSIZE-1)) - -#define HEAD2(b,p) (b[p] ^ ((unsigned)b[p+1]<<8)) -#define NIL2 UINT_MAX - -struct ucl_swd -{ -/* public - "built-in" */ - unsigned int n; - unsigned int f; - unsigned int threshold; - -/* public - configuration */ - unsigned int max_chain; - unsigned int nice_length; - int use_best_off; - unsigned int lazy_insert; - -/* public - output */ - unsigned int m_len; - unsigned int m_off; - unsigned int look; - int b_char; -#if defined(SWD_BEST_OFF) - unsigned int best_off[ SWD_BEST_OFF ]; -#endif - -/* semi public */ - struct ucl_compress *c; - unsigned int m_pos; -#if defined(SWD_BEST_OFF) - unsigned int best_pos[ SWD_BEST_OFF ]; -#endif - -/* private */ - const uint8_t *dict; - const uint8_t *dict_end; - unsigned int dict_len; - -/* private */ - unsigned int ip; /* input pointer (lookahead) */ - unsigned int bp; /* buffer pointer */ - unsigned int rp; /* remove pointer */ - unsigned int b_size; - - unsigned char *b_wrap; - - unsigned int node_count; - unsigned int first_rp; - - unsigned char b [ N + F + F ]; - unsigned int head3 [ SWD_HSIZE ]; - unsigned int succ3 [ N + F ]; - unsigned int best3 [ N + F ]; - unsigned int llen3 [ SWD_HSIZE ]; - unsigned int head2 [ 65536U ]; -}; - -#define s_head3(s,key) s->head3[key] - - -#if !defined( NDEBUG) -static void assert_match(const struct ucl_swd * swd, unsigned int m_len, - unsigned int m_off ) - -{ - const struct ucl_compress *c = swd->c; - unsigned int d_off; - - assert(m_len >= 2); - if (m_off <= (unsigned int) (c->bp - c->in)) - { - assert(c->bp - m_off + m_len < c->ip); - assert(memcmp(c->bp, c->bp - m_off, m_len) == 0); - } - else - { - assert(swd->dict != NULL); - d_off = m_off - (unsigned int) (c->bp - c->in); - assert(d_off <= swd->dict_len); - if (m_len > d_off) - { - assert(memcmp(c->bp, swd->dict_end - d_off, d_off) == - 0); - - assert(c->in + m_len - d_off < c->ip); - assert(memcmp(c->bp + d_off, c->in, m_len - d_off) == - 0); - - } - else - { - assert(memcmp(c->bp, swd->dict_end - d_off, m_len) == - 0); - - } - } -} -#else -# define assert_match(a,b,c) ((void)0) -#endif - -/*********************************************************************** -// -************************************************************************/ - - -static -void swd_initdict(struct ucl_swd *s, const uint8_t *dict, unsigned int dict_len) - -{ - s->dict = s->dict_end = NULL; - s->dict_len = 0; - - if (!dict || dict_len <= 0) - return; - if (dict_len > s->n) - { - dict += dict_len - s->n; - dict_len = s->n; - } - - s->dict = dict; - s->dict_len = dict_len; - s->dict_end = dict + dict_len; - memcpy(s->b,dict,dict_len); - s->ip = dict_len; -} - - -static -void swd_insertdict(struct ucl_swd *s, unsigned int node, unsigned int len) -{ - unsigned int key; - - s->node_count = s->n - len; - s->first_rp = node; - - while (len-- > 0) - { - key = HEAD3(s->b,node); - s->succ3[node] = s_head3(s,key); - s->head3[key] = (unsigned int)(node); - s->best3[node] = (unsigned int)(s->f + 1); - s->llen3[key]++; - assert(s->llen3[key] <= s->n); - - key = HEAD2(s->b,node); - s->head2[key] = (unsigned int)(node); - - node++; - } -} - -/*********************************************************************** -// -************************************************************************/ - - -static -int swd_init(struct ucl_swd *s, const uint8_t *dict, unsigned int dict_len) -{ - unsigned int i = 0; - - if (s->n == 0) - s->n = N; - if (s->f == 0) - s->f = F; - s->threshold = THRESHOLD; - if (s->n > N || s->f > F) - return UCL_E_INVALID_ARGUMENT; - - /* defaults */ - s->max_chain = SWD_MAX_CHAIN; - s->nice_length = s->f; - s->use_best_off = 0; - s->lazy_insert = 0; - - s->b_size = s->n + s->f; - if (s->b_size + s->f >= UINT_MAX) - return UCL_E_ERROR; - s->b_wrap = s->b + s->b_size; - s->node_count = s->n; - - memset(s->llen3, 0, sizeof(s->llen3[0]) * SWD_HSIZE); - for (i = 0; i < 65536U; i++) - s->head2[i] = NIL2; - - s->ip = 0; - swd_initdict(s,dict,dict_len); - s->bp = s->ip; - s->first_rp = s->ip; - - assert(s->ip + s->f <= s->b_size); - - s->look = (unsigned int) (s->c->in_end - s->c->ip); - if (s->look > 0) - { - if (s->look > s->f) - s->look = s->f; - memcpy(&s->b[s->ip],s->c->ip,s->look); - s->c->ip += s->look; - s->ip += s->look; - } - if (s->ip == s->b_size) - s->ip = 0; - - if (s->look >= 2 && s->dict_len > 0) - swd_insertdict(s,0,s->dict_len); - - s->rp = s->first_rp; - if (s->rp >= s->node_count) - s->rp -= s->node_count; - else - s->rp += s->b_size - s->node_count; - - /* unused i */ - /* unused c */ - return UCL_E_OK; -} - - -static -void swd_exit(struct ucl_swd *s) -{ - /* unused s */ - ( void ) s; -} - -#define swd_pos2off(s,pos) \ - (s->bp > (pos) ? s->bp - (pos) : s->b_size - ((pos) - s->bp)) - -/*********************************************************************** -// -************************************************************************/ - -static __inline__ -void swd_getbyte(struct ucl_swd *s) -{ - int c; - - if ((c = getbyte(*(s->c))) < 0) - { - if (s->look > 0) - --s->look; - } - else - { - s->b[s->ip] = (uint8_t)(c); - if (s->ip < s->f) - s->b_wrap[s->ip] = (uint8_t)(c); - } - if (++s->ip == s->b_size) - s->ip = 0; - if (++s->bp == s->b_size) - s->bp = 0; - if (++s->rp == s->b_size) - s->rp = 0; -} -/*********************************************************************** -// remove node from lists -************************************************************************/ - -static __inline__ -void swd_remove_node(struct ucl_swd *s, unsigned int node) -{ - if (s->node_count == 0) - { - unsigned int key; - -#ifdef UCL_DEBUG - if (s->first_rp != UINT_MAX) - { - if (node != s->first_rp) - printf("Remove %5d: %5d %5d %5d %5d %6d %6d\n", - - node, s->rp, s->ip, s->bp, s->first_rp, - s->ip - node, s->ip - s->bp); - assert(node == s->first_rp); - s->first_rp = UINT_MAX; - } -#endif - - key = HEAD3(s->b,node); - assert(s->llen3[key] > 0); - --s->llen3[key]; - - key = HEAD2(s->b,node); - assert(s->head2[key] != NIL2); - if ((unsigned int) s->head2[key] == node) - s->head2[key] = NIL2; - } - else - --s->node_count; -} - - -/*********************************************************************** -// -************************************************************************/ - - -static -void swd_accept(struct ucl_swd *s, unsigned int n) -{ - assert(n <= s->look); - - if (n > 0) do - { - unsigned int key; - - swd_remove_node(s,s->rp); - - /* add bp into HEAD3 */ - key = HEAD3(s->b,s->bp); - s->succ3[s->bp] = s_head3(s,key); - s->head3[key] = (unsigned int)(s->bp); - s->best3[s->bp] = (unsigned int)(s->f + 1); - s->llen3[key]++; - assert(s->llen3[key] <= s->n); - - /* add bp into HEAD2 */ - key = HEAD2(s->b,s->bp); - s->head2[key] = (unsigned int)(s->bp); - - swd_getbyte(s); - } while (--n > 0); -} - -/*********************************************************************** -// -************************************************************************/ - -static -void swd_search(struct ucl_swd *s, unsigned int node, unsigned int cnt) -{ - const unsigned char *p1; - const unsigned char *p2; - const unsigned char *px; - - unsigned int m_len = s->m_len; - const unsigned char * b = s->b; - const unsigned char * bp = s->b + s->bp; - const unsigned char * bx = s->b + s->bp + s->look; - unsigned char scan_end1; - - assert(s->m_len > 0); - - scan_end1 = bp[m_len - 1]; - for ( ; cnt-- > 0; node = s->succ3[node]) - { - p1 = bp; - p2 = b + node; - px = bx; - - assert(m_len < s->look); - - if ( - p2[m_len - 1] == scan_end1 && - p2[m_len] == p1[m_len] && - p2[0] == p1[0] && - p2[1] == p1[1]) - { - unsigned int i; - assert(memcmp(bp,&b[node],3) == 0); - - p1 += 2; p2 += 2; - do {} while (++p1 < px && *p1 == *++p2); - i = p1 - bp; - -#ifdef UCL_DEBUG - if (memcmp(bp,&b[node],i) != 0) - printf("%5ld %5ld %02x%02x %02x%02x\n", - (long)s->bp, (long) node, - bp[0], bp[1], b[node], b[node+1]); -#endif - assert(memcmp(bp,&b[node],i) == 0); - -#if defined(SWD_BEST_OFF) - if (i < SWD_BEST_OFF) - { - if (s->best_pos[i] == 0) - s->best_pos[i] = node + 1; - } -#endif - if (i > m_len) - { - s->m_len = m_len = i; - s->m_pos = node; - if (m_len == s->look) - return; - if (m_len >= s->nice_length) - return; - if (m_len > (unsigned int) s->best3[node]) - return; - scan_end1 = bp[m_len - 1]; - } - } - } -} - -static int swd_search2(struct ucl_swd *s) -{ - unsigned int key; - - assert(s->look >= 2); - assert(s->m_len > 0); - - key = s->head2[ HEAD2(s->b,s->bp) ]; - if (key == NIL2) - return 0; -#ifdef UCL_DEBUG - if (memcmp(&s->b[s->bp],&s->b[key],2) != 0) - printf("%5ld %5ld %02x%02x %02x%02x\n", (long)s->bp, (long)key, - s->b[s->bp], s->b[s->bp+1], s->b[key], s->b[key+1]); -#endif - assert(memcmp(&s->b[s->bp],&s->b[key],2) == 0); -#if defined(SWD_BEST_OFF) - if (s->best_pos[2] == 0) - s->best_pos[2] = key + 1; -#endif - - if (s->m_len < 2) - { - s->m_len = 2; - s->m_pos = key; - } - return 1; -} - -/*********************************************************************** -// -************************************************************************/ - -static -void swd_findbest(struct ucl_swd *s) -{ - unsigned int key; - unsigned int cnt, node; - unsigned int len; - - assert(s->m_len > 0); - - /* get current head, add bp into HEAD3 */ - key = HEAD3(s->b,s->bp); - node = s->succ3[s->bp] = s_head3(s,key); - cnt = s->llen3[key]++; - assert(s->llen3[key] <= s->n + s->f); - if (cnt > s->max_chain && s->max_chain > 0) - cnt = s->max_chain; - s->head3[key] = (unsigned int)(s->bp); - - s->b_char = s->b[s->bp]; - len = s->m_len; - if (s->m_len >= s->look) - { - if (s->look == 0) - s->b_char = -1; - s->m_off = 0; - s->best3[s->bp] = (unsigned int)(s->f + 1); - } - else - { - if (swd_search2(s)) - if (s->look >= 3) - swd_search(s,node,cnt); - if (s->m_len > len) - s->m_off = swd_pos2off(s,s->m_pos); - s->best3[s->bp] = (unsigned int)(s->m_len); - -#if defined(SWD_BEST_OFF) - if (s->use_best_off) - { - int i; - for (i = 2; i < SWD_BEST_OFF; i++) - if (s->best_pos[i] > 0) - s->best_off[i] = - swd_pos2off(s,s->best_pos[i]-1); - - else - s->best_off[i] = 0; - } -#endif - } - - swd_remove_node(s,s->rp); - - /* add bp into HEAD2 */ - key = HEAD2(s->b,s->bp); - s->head2[key] = (unsigned int)(s->bp); -} - - -/*********************************************************************** -// -************************************************************************/ - -static int -init_match ( struct ucl_compress *c, struct ucl_swd *s, - const uint8_t *dict, unsigned int dict_len, - uint32_t flags ) -{ - int r; - - assert(!c->init); - c->init = 1; - - s->c = c; - - c->last_m_len = c->last_m_off = 0; - - c->textsize = c->codesize = c->printcount = 0; - c->lit_bytes = c->match_bytes = c->rep_bytes = 0; - c->lazy = 0; - - r = swd_init(s,dict,dict_len); - if (r != UCL_E_OK) - { - swd_exit(s); - return r; - } - - s->use_best_off = (flags & 1) ? 1 : 0; - return UCL_E_OK; -} - -static int -find_match ( struct ucl_compress *c, struct ucl_swd *s, - unsigned int this_len, unsigned int skip ) -{ - assert(c->init); - - if (skip > 0) - { - assert(this_len >= skip); - swd_accept(s, this_len - skip); - c->textsize += this_len - skip + 1; - } - else - { - assert(this_len <= 1); - c->textsize += this_len - skip; - } - - s->m_len = THRESHOLD; -#ifdef SWD_BEST_OFF - if (s->use_best_off) - memset(s->best_pos,0,sizeof(s->best_pos)); -#endif - swd_findbest(s); - c->m_len = s->m_len; - c->m_off = s->m_off; - - swd_getbyte(s); - - if (s->b_char < 0) - { - c->look = 0; - c->m_len = 0; - swd_exit(s); - } - else - { - c->look = s->look + 1; - } - c->bp = c->ip - c->look; - -#if 0 - /* brute force match search */ - if (c->m_len > THRESHOLD && c->m_len + 1 <= c->look) - { - const uint8_t *ip = c->bp; - const uint8_t *m = c->bp - c->m_off; - const uint8_t *in = c->in; - - if (ip - in > N) - in = ip - N; - for (;;) - { - while (*in != *ip) - in++; - if (in == ip) - break; - if (in != m) - if (memcmp(in,ip,c->m_len+1) == 0) - printf("%p %p %p %5d\n",in,ip,m,c->m_len); - - in++; - } - } -#endif - - return UCL_E_OK; -} - - -static int bbConfig(struct ucl_compress *c, int endian, int bitsize) -{ - if (endian != -1) - { - if (endian != 0) - return UCL_E_ERROR; - c->bb_c_endian = endian; - } - if (bitsize != -1) - { - if (bitsize != 8 && bitsize != 16 && bitsize != 32 && bitsize != 64) - return UCL_E_ERROR; - c->bb_c_s = bitsize; - c->bb_c_s8 = bitsize / 8; - } - c->bb_b = 0; c->bb_k = 0; - c->bb_p = NULL; - c->bb_op = NULL; - return UCL_E_OK; -} - -static void bbWriteBits(struct ucl_compress *c) -{ - uint8_t *p = c->bb_p; - uint64_t b = c->bb_b; - - p[0] = (uint8_t)(b >> 0); - if (c->bb_c_s >= 16) - { - p[1] = (uint8_t)(b >> 8); - if (c->bb_c_s >= 32) - { - p[2] = (uint8_t)(b >> 16); - p[3] = (uint8_t)(b >> 24); - if (c->bb_c_s == 64) - { - p[4] = (uint8_t)(b >> 32); - p[5] = (uint8_t)(b >> 40); - p[6] = (uint8_t)(b >> 48); - p[7] = (uint8_t)(b >> 56); - } - } - } -} - - -static void bbPutBit(struct ucl_compress *c, unsigned bit) -{ - assert(bit == 0 || bit == 1); - assert(c->bb_k <= c->bb_c_s); - - if (c->bb_k < c->bb_c_s) - { - if (c->bb_k == 0) - { - assert(c->bb_p == NULL); - c->bb_p = c->bb_op; - c->bb_op += c->bb_c_s8; - } - assert(c->bb_p != NULL); - assert(c->bb_p + c->bb_c_s8 <= c->bb_op); - - c->bb_b = (c->bb_b << 1) + bit; - c->bb_k++; - } - else - { - assert(c->bb_p != NULL); - assert(c->bb_p + c->bb_c_s8 <= c->bb_op); - - bbWriteBits(c); - c->bb_p = c->bb_op; - c->bb_op += c->bb_c_s8; - c->bb_b = bit; - c->bb_k = 1; - } -} - - -static void bbPutByte(struct ucl_compress *c, unsigned b) -{ - /**printf("putbyte %p %p %x (%d)\n", op, bb_p, x, bb_k);*/ - assert(c->bb_p == NULL || c->bb_p + c->bb_c_s8 <= c->bb_op); - *c->bb_op++ = (uint8_t)(b); -} - -static void bbFlushBits(struct ucl_compress *c, unsigned filler_bit) -{ - if (c->bb_k > 0) - { - assert(c->bb_k <= c->bb_c_s); - while (c->bb_k != c->bb_c_s) - bbPutBit(c, filler_bit); - bbWriteBits(c); - c->bb_k = 0; - } - c->bb_p = NULL; -} - - - -/*********************************************************************** -// -************************************************************************/ - - -static void code_prefix_ss11(struct ucl_compress *c, uint32_t i) -{ - if (i >= 2) - { - uint32_t t = 4; - i += 2; - do { - t <<= 1; - } while (i >= t); - t >>= 1; - do { - t >>= 1; - bbPutBit(c, (i & t) ? 1 : 0); - bbPutBit(c, 0); - } while (t > 2); - } - bbPutBit(c, (unsigned)i & 1); - bbPutBit(c, 1); -} - -static void -code_match(struct ucl_compress *c, unsigned int m_len, const unsigned int m_off) - -{ - while (m_len > c->conf.max_match) - { - code_match(c, c->conf.max_match - 3, m_off); - m_len -= c->conf.max_match - 3; - } - - c->match_bytes += m_len; - if (m_len > c->result[3]) - c->result[3] = m_len; - if (m_off > c->result[1]) - c->result[1] = m_off; - - bbPutBit(c, 0); - - if (m_off == c->last_m_off) - { - bbPutBit(c, 0); - bbPutBit(c, 1); - } - else - { - code_prefix_ss11(c, 1 + ((m_off - 1) >> 8)); - bbPutByte(c, (unsigned)m_off - 1); - } - m_len = m_len - 1 - (m_off > M2_MAX_OFFSET); - if (m_len >= 4) - { - bbPutBit(c,0); - bbPutBit(c,0); - code_prefix_ss11(c, m_len - 4); - } - else - { - bbPutBit(c, m_len > 1); - bbPutBit(c, (unsigned)m_len & 1); - } - - c->last_m_off = m_off; -} - -static void -code_run(struct ucl_compress *c, const uint8_t *ii, unsigned int lit) -{ - if (lit == 0) - return; - c->lit_bytes += lit; - if (lit > c->result[5]) - c->result[5] = lit; - do { - bbPutBit(c, 1); - bbPutByte(c, *ii++); - } while (--lit > 0); -} - -/*********************************************************************** -// -************************************************************************/ - -static int -len_of_coded_match(struct ucl_compress *c, unsigned int m_len, unsigned int - m_off) - -{ - int b; - if (m_len < 2 || (m_len == 2 && (m_off > M2_MAX_OFFSET)) - || m_off > c->conf.max_offset) - return -1; - assert(m_off > 0); - - m_len = m_len - 2 - (m_off > M2_MAX_OFFSET); - - if (m_off == c->last_m_off) - b = 1 + 2; - else - { - b = 1 + 10; - m_off = (m_off - 1) >> 8; - while (m_off > 0) - { - b += 2; - m_off >>= 1; - } - } - - b += 2; - if (m_len < 3) - return b; - m_len -= 3; - - do { - b += 2; - m_len >>= 1; - } while (m_len > 0); - - return b; -} - -int ucl_nrv2b_99_compress( - const uint8_t *in, unsigned long in_len, - uint8_t *out, unsigned long *out_len, - unsigned int *result) -{ - const uint8_t *ii; - unsigned int lit; - unsigned int m_len, m_off; - struct ucl_compress c_buffer; - struct ucl_compress * const c = &c_buffer; - struct ucl_swd *swd; - unsigned int result_buffer[16]; - int r; - -/* max compression */ -#define SC_TRY_LAZY 2 -#define SC_GOOD_LENGTH F -#define SC_MAX_LAZY F -#define SC_NICE_LENGTH F -#define SC_MAX_CHAIN 4096 -#define SC_FLAGS 1 -#define SC_MAX_OFFSET N - - memset(c, 0, sizeof(*c)); - c->ip = c->in = in; - c->in_end = in + in_len; - c->out = out; - c->result = result ? result : result_buffer; - memset(c->result, 0, 16*sizeof(*c->result)); - c->result[0] = c->result[2] = c->result[4] = UINT_MAX; - result = NULL; - memset(&c->conf, 0xff, sizeof(c->conf)); - r = bbConfig(c, ENDIAN, BITSIZE); - if (r == 0) - r = bbConfig(c, c->conf.bb_endian, c->conf.bb_size); - if (r != 0) - return UCL_E_INVALID_ARGUMENT; - c->bb_op = out; - - ii = c->ip; /* point to start of literal run */ - lit = 0; - - - swd = (struct ucl_swd *) malloc(sizeof(*swd)); - if (!swd) - return UCL_E_OUT_OF_MEMORY; - - swd->f = F; - swd->n = N; - if (in_len >= 256 && in_len < swd->n) - swd->n = in_len; - if (swd->f < 8 || swd->n < 256) - return UCL_E_INVALID_ARGUMENT; - - r = init_match(c,swd,NULL,0, SC_FLAGS); - if (r != UCL_E_OK) - { - free(swd); - return r; - } - if (SC_MAX_CHAIN > 0) - swd->max_chain = SC_MAX_CHAIN; - if (SC_NICE_LENGTH > 0) - swd->nice_length = SC_NICE_LENGTH; - if (c->conf.max_match < swd->nice_length) - swd->nice_length = c->conf.max_match; - - c->last_m_off = 1; - r = find_match(c,swd,0,0); - if (r != UCL_E_OK) - return r; - while (c->look > 0) - { - unsigned int ahead; - unsigned int max_ahead; - int l1, l2; - - c->codesize = c->bb_op - out; - - m_len = c->m_len; - m_off = c->m_off; - - assert(c->bp == c->ip - c->look); - assert(c->bp >= in); - if (lit == 0) - ii = c->bp; - assert(ii + lit == c->bp); - assert(swd->b_char == *(c->bp)); - - if (m_len < 2 || (m_len == 2 && (m_off > M2_MAX_OFFSET)) - || m_off > c->conf.max_offset) - { - /* a literal */ - lit++; - swd->max_chain = SC_MAX_CHAIN; - r = find_match(c,swd,1,0); - assert(r == 0); - continue; - } - - /* a match */ - assert_match(swd,m_len,m_off); - - /* shall we try a lazy match ? */ - ahead = 0; - if (SC_TRY_LAZY <= 0 || m_len >= SC_MAX_LAZY || m_off == - c->last_m_off) - - { - /* no */ - l1 = 0; - max_ahead = 0; - } - else - { - /* yes, try a lazy match */ - l1 = len_of_coded_match(c,m_len,m_off); - assert(l1 > 0); - max_ahead = SC_TRY_LAZY; - if ((m_len - 1) < max_ahead) { - max_ahead = m_len -1; - } - } - - while (ahead < max_ahead && c->look > m_len) - { - if (m_len >= SC_GOOD_LENGTH) - swd->max_chain = SC_MAX_CHAIN >> 2; - else - swd->max_chain = SC_MAX_CHAIN; - r = find_match(c,swd,1,0); - ahead++; - - assert(r == 0); - assert(c->look > 0); - assert(ii + lit + ahead == c->bp); - - if (c->m_len < 2) - continue; - l2 = len_of_coded_match(c,c->m_len,c->m_off); - if (l2 < 0) - continue; - if (l1 + (int)(ahead + c->m_len - m_len) * 5 > l2 + - (int)(ahead) * 9) - { - c->lazy++; - assert_match(swd,c->m_len,c->m_off); - lit += ahead; - assert(ii + lit == c->bp); - goto lazy_match_done; - } - } - - assert(ii + lit + ahead == c->bp); - - /* 1 - code run */ - code_run(c,ii,lit); - lit = 0; - - /* 2 - code match */ - code_match(c,m_len,m_off); - swd->max_chain = SC_MAX_CHAIN; - r = find_match(c,swd,m_len,1+ahead); - assert(r == 0); - - lazy_match_done: ; - } - - /* store final run */ - code_run(c,ii,lit); - - /* EOF */ - bbPutBit(c, 0); - code_prefix_ss11(c, 0x1000000U); - bbPutByte(c, 0xff); - - bbFlushBits(c, 0); - - assert(c->textsize == in_len); - c->codesize = c->bb_op - out; - *out_len = c->bb_op - out; - -#if 0 - printf("%7ld %7ld -> %7ld %7ld %7ld %ld (max: %d %d %d)\n", - (long) c->textsize, (long) in_len, (long) c->codesize, - c->match_bytes, c->lit_bytes, c->lazy, - c->result[1], c->result[3], c->result[5]); -#endif - assert(c->lit_bytes + c->match_bytes == in_len); - - swd_exit(swd); - free(swd); - - return UCL_E_OK; -} - - -void Encode(void) /* compression */ -{ - uint8_t *in, *out; - unsigned long in_len, out_len; - uint32_t tw; - int r; - fseek(infile, 0, SEEK_END); - in_len = ftell(infile); -#ifdef VERBOSE - if ((signed long)in_len < 0) - Fprintf((stderr, "Errno: %d", errno)); -#endif -#if UCLPACK_COMPAT - { - uint8_t byte; - if (fwrite(magic, sizeof(magic), 1, outfile) != 1) - Error("Can't write."); - tw = htonl(0); /* flags */ - if (fwrite(&tw, sizeof(tw), 1, outfile) != 1) - Error("Can't write."); - byte = 0x2b; /* method */ - if (fwrite(&byte, sizeof(byte), 1, outfile) != 1) - Error("Can't write."); - byte = 10; /* level */ - if (fwrite(&byte, sizeof(byte), 1, outfile) != 1) - Error("Can't write."); - tw = htonl(256*1024); /* block_size */ - if (fwrite(&tw, sizeof(tw), 1, outfile) != 1) - Error("Can't write."); - tw = htonl(in_len); - if (fwrite(&tw, sizeof(tw), 1, outfile) != 1) - Error("Can't write."); /* output size of text */ - } -#else - tw = host_to_i86ul(in_len); - if (fwrite(&tw, sizeof(tw), 1, outfile) != 1) - Error("Can't write."); /* output size of text */ -#endif - if (in_len == 0) - return; - rewind(infile); - - in = malloc(in_len); - out_len = in_len + (in_len/8) + 256; - out = malloc(out_len); - if (!in || !out) { - Error("Can't malloc"); - } - if (fread(in, in_len, 1, infile) != 1) { - Error("Can't read"); - } - r = ucl_nrv2b_99_compress(in, in_len, out, &out_len, 0 ); - if (r != UCL_E_OK) - Error("Compression failure\n"); -#if UCLPACK_COMPAT - tw = htonl(out_len); - if (fwrite(&tw, sizeof(tw), 1, outfile) != 1) - Error("Can't write."); /* file size of text */ - -#endif - if (fwrite(out, out_len, 1, outfile) != 1) { - Error("Write error\n"); - } -#if UCLPACK_COMPAT - tw = htonl(0); /* EOF marker */ - if (fwrite(&tw, sizeof(tw), 1, outfile) != 1) - Error("Can't write."); - -#endif - -#ifdef LONG_REPORT - Fprintf((stdout, "input size %ld bytes\n", in_len)); - Fprintf((stdout, "output size %ld bytes\n", out_len)); - Fprintf((stdout, "input/output %.3f\n", (double)in_len / out_len)); -#else - Fprintf((stdout, "input/output = %ld/%ld = %.3f\n", in_len, out_len, - (double)in_len / out_len)); -#endif - -} - -#endif - -#ifdef DECODE - -#define GETBIT_8(bb, src, ilen) \ - (((bb = bb & 0x7f ? bb*2 : ((unsigned)src[ilen++]*2+1)) >> 8) & 1) - -#define GETBIT_LE16(bb, src, ilen) \ - (bb*=2,bb&0xffff ? (bb>>16)&1 : (ilen+=2,((bb=(src[ilen-2]+src[ilen-1]*256u)*2+1)>>16)&1)) - -#define GETBIT_LE32(bb, src, ilen) \ - (bc > 0 ? ((bb>>--bc)&1) : (bc=31,\ - bb=*(const uint32_t *)((src)+ilen),ilen+=4,(bb>>31)&1)) - -#define GETBIT_LE64(bb, src, ilen) \ - (bc > 0 ? ((bb>>--bc)&1) : (bc=63, \ - bb=*(const uint64_t *)((src)+ilen),ilen+=8,(bb>>63)&1)) - -#if ENDIAN == 0 && BITSIZE == 8 -#define GETBIT(bb, src, ilen) GETBIT_8(bb, src, ilen) -#endif -#if ENDIAN == 0 && BITSIZE == 16 -#define GETBIT(bb, src, ilen) GETBIT_LE16(bb, src, ilen) -#endif -#if ENDIAN == 0 && BITSIZE == 32 -#define GETBIT(bb, src, ilen) GETBIT_LE32(bb, src, ilen) -#endif -#if ENDIAN == 0 && BITSIZE == 64 -#define GETBIT(bb, src, ilen) GETBIT_LE64(bb, src, ilen) -#endif -#ifndef GETBIT -#error "Bad Combination of ENDIAN and BITSIZE values specified" -#endif - -#undef SAFE - -#ifdef SAFE -#define FAIL(x,r) if (x) { Error(r); } -#else -#define FAIL(x,r) -#endif - -void Decode(void) /* recover */ -{ - uint32_t tw; - uint8_t *src, *dst; - unsigned long max_src_len, src_len, dst_len; - unsigned long ilen = 0, olen = 0, last_m_off = 1; -#if BITSIZE <= 32 - uint32_t bb = 0; -#elif BITSIZE == 64 - uint64_t bb = 0; -#endif - unsigned bc = 0; -#if UCLPACK_COMPAT - if (fseek(infile, sizeof(magic) + sizeof(tw) + 1 + 1 + sizeof(tw), - SEEK_SET) != 0) - - Error("Seek Error"); - if (fread(&tw, sizeof(tw), 1, infile) < 1) - Error("Can't read"); /* read size of text */ - dst_len = ntohl(tw); - if (fread(&tw, sizeof(tw), 1, infile) < 1) - Error("Can't read"); /* read size of file */ - max_src_len = ntohl(tw); -#else - if (fread(&tw, sizeof(tw), 1, infile) < 1) - Error("Can't read"); /* read size of text */ - dst_len = i86ul_to_host(tw); - max_src_len = dst_len + (dst_len/8) + 256; -#endif - if (dst_len == 0) - return; - dst = malloc(dst_len); - if (!dst) - Error("Can't malloc"); - src = malloc(max_src_len); - if (!src) - Error("Can't malloc"); - src_len = fread(src, 1, max_src_len, infile); - if (src_len <= 0) - Error("Can't read"); - - for(;;) { - unsigned int m_off, m_len; - while(GETBIT(bb, src, ilen)) { - FAIL(ilen >= src_len, "input overrun"); - FAIL(olen >= dst_len, "output overrun"); - dst[olen++] = src[ilen++]; - } - m_off = 1; - do { - m_off = m_off*2 + GETBIT(bb, src, ilen); - FAIL(ilen >= src_len, "input overrun"); - FAIL(m_off > 0xffffffU +3, "lookbehind overrun"); - } while (!GETBIT(bb, src, ilen)); - if (m_off == 2) - { - m_off = last_m_off; - } - else - { - FAIL(ilen >= src_len, "input overrun"); - m_off = (m_off - 3)*256 + src[ilen++]; - if (m_off == 0xffffffffU) - break; - last_m_off = ++m_off; - } - m_len = GETBIT(bb, src, ilen); - m_len = m_len*2 + GETBIT(bb, src, ilen); - if (m_len == 0) - { - m_len++; - do { - m_len = m_len*2 + GETBIT(bb, src, ilen); - FAIL(ilen >= src_len, "input overrun"); - FAIL(m_len >= dst_len, "output overrun"); - } while(!GETBIT(bb, src, ilen)); - m_len += 2; - } - m_len += (m_off > 0xd00); - FAIL(olen + m_len > dst_len, "output overrun"); - FAIL(m_off > olen, "lookbeind overrun"); - { - const uint8_t *m_pos; - m_pos = dst + olen - m_off; - dst[olen++] = *m_pos++; - do { - dst[olen++] = *m_pos++; - } while(--m_len > 0); - } - } - FAIL(ilen < src_len, "input not consumed"); - FAIL(ilen > src_len, "input overrun"); - assert(ilen == src_len); - Fprintf((stderr, "%12ld\n", olen)); - if (dst_len != olen) { - fprintf(stderr, "length != expected length\n"); - } - if (fwrite(dst, olen, 1, outfile) != 1) - Error("Write error\n"); - free(src); - free(dst); -} -#endif - -#ifdef MAIN -int main(int argc, char *argv[]) -{ - char *s; - FILE *f; - int c; - - if (argc == 2) { - outfile = stdout; - if ((f = tmpfile()) == NULL) { - perror("tmpfile"); - return EXIT_FAILURE; - } - while ((c = getchar()) != EOF) - fputc(c, f); - rewind(infile = f); - } - else if (argc != 4) { - Fprintf((stderr, "'nrv2b e file1 file2' encodes file1 into file2.\n" - "'nrv2b d file2 file1' decodes file2 into file1.\n")); - return EXIT_FAILURE; - } - if (argc == 4) { - if ((s = argv[1], s[1] || strpbrk(s, "DEde") == NULL) - || (s = argv[2], (infile = fopen(s, "rb")) == NULL) - || (s = argv[3], (outfile = fopen(s, "wb")) == NULL)) { - Fprintf((stderr, "??? %s\n", s)); - return EXIT_FAILURE; - } - } - if (toupper(*argv[1]) == 'E') - Encode(); - else - Decode(); - fclose(infile); - fclose(outfile); - return EXIT_SUCCESS; -} -#endif diff --git a/qemu/roms/ipxe/src/util/padimg.pl b/qemu/roms/ipxe/src/util/padimg.pl deleted file mode 100755 index 4421aaf4b..000000000 --- a/qemu/roms/ipxe/src/util/padimg.pl +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/perl -w - -use strict; -use warnings; -use Getopt::Long; -use Fcntl; - -my $verbosity = 0; -my $blksize = 512; -my $byte = 0; - -my %opts = ( - 'verbose|v+' => sub { $verbosity++; }, - 'quiet|q+' => sub { $verbosity--; }, - 'blksize|s=o' => sub { $blksize = $_[1]; }, - 'byte|b=o' => sub { $byte = $_[1]; }, -); - -Getopt::Long::Configure ( 'bundling', 'auto_abbrev' ); -GetOptions ( %opts ) or die "Could not parse command-line options\n"; - -while ( my $filename = shift ) { - die "$filename is not a file\n" unless -f $filename; - my $oldsize = -s $filename; - my $padsize = ( ( -$oldsize ) % $blksize ); - my $newsize = ( $oldsize + $padsize ); - next unless $padsize; - if ( $verbosity >= 1 ) { - printf "Padding %s from %d to %d bytes with %d x 0x%02x\n", - $filename, $oldsize, $newsize, $padsize, $byte; - } - if ( $byte ) { - sysopen ( my $fh, $filename, ( O_WRONLY | O_APPEND ) ) - or die "Could not open $filename for appending: $!\n"; - syswrite $fh, ( chr ( $byte ) x $padsize ) - or die "Could not append to $filename: $!\n"; - close ( $fh ); - } else { - truncate $filename, $newsize - or die "Could not resize $filename: $!\n"; - } - die "Failed to pad $filename\n" - unless ( ( ( -s $filename ) % $blksize ) == 0 ); -} diff --git a/qemu/roms/ipxe/src/util/parserom.pl b/qemu/roms/ipxe/src/util/parserom.pl deleted file mode 100755 index 28df60652..000000000 --- a/qemu/roms/ipxe/src/util/parserom.pl +++ /dev/null @@ -1,260 +0,0 @@ -#!/usr/bin/env perl -# -# Parse PCI_ROM and ISA_ROM entries from source file(s) specified as -# arguments and output the relevant Makefile rules to STDOUT. -# -# Originally based on portions of Ken Yap's genrules.pl. Completely -# rewritten by Robin Smidsrød to be more maintainable. - -use strict; -use warnings; -use Getopt::Long; - -# Parse command-line options -my @exclude_driver_classes = (); -my @exclude_drivers = (); -my $debug = 0; -my $help = 0; -GetOptions( - "exclude-driver-class=s" => \@exclude_driver_classes, - "exclude-driver=s" => \@exclude_drivers, - "debug" => \$debug, - "help" => \$help, -); - -# Convert exclution arrays to lookup tables -my $exclude_driver_class_map = { map { $_ => 1 } @exclude_driver_classes }; -my $exclude_driver_map = { map { $_ => 1 } @exclude_drivers }; - -# Ensure STDOUT and STDERR are synchronized if debugging -if ( $debug ) { - STDOUT->autoflush(1); - STDERR->autoflush(1); -} - -# Compile regular expressions here for slight performance boost -my %RE = ( - 'parse_driver_class' => qr{ drivers/ (\w+?) / }x, - 'parse_family' => qr{^ (?:\./)? (.*) \..+? $}x, - 'find_rom_line' => qr/^ \s* ( (PCI|ISA)_ROM \s* \( \s* (.*?) ) $/x, - 'extract_pci_id' => qr/^ \s* 0x([0-9A-Fa-f]{4}) \s* ,? \s* (.*) $/x, - 'extract_quoted_string' => qr/^ \s* \" ([^\"]*?) \" \s* ,? \s* (.*) $/x, -); - -# Show help if required arguments are missing or help was requested -show_usage_and_exit() if $help or @ARGV < 1; - -# Process each source file specified -process_source_file($_) for @ARGV; - -exit; - -sub show_usage_and_exit { - print STDERR <<"EOM"; -Syntax: $0 [<options>] <source-file> [<source-file>] -Options: - --exclude-driver-class Exclude specified driver classes - --exclude-driver Exclude specified drivers - --debug Output debug information on STDERR - --help This help information -EOM - exit 1; -} - -# Figure out if source file is a driver and look for ROM declarations -sub process_source_file { - my ($source_file) = @_; - return unless defined $source_file; - return unless length $source_file; - my $state = { 'source_file' => $source_file }; - log_debug("SOURCE_FILE", $state->{source_file}); - # Skip source files that aren't drivers - parse_driver_class( $state ); - unless ( $state->{'driver_class'} ) { - log_debug("SKIP_NOT_DRIVER", $state->{source_file} ); - return; - } - # Skip source files with driver classes that are explicitly excluded - if ( $exclude_driver_class_map->{ $state->{'driver_class'} } ) { - log_debug("SKIP_EXCL_CLASS", $state->{'driver_class'} ); - return; - } - # Skip source files without driver information - parse_family( $state ); - parse_driver_name( $state ); - unless ( $state->{'family'} and $state->{'driver_name'} ) { - log_debug("SKIP_NO_DRV_INFO", $state->{source_file} ); - return; - } - # Skip source files with drivers that are explicitly excluded - if ( $exclude_driver_map->{ $state->{'driver_name'} } ) { - log_debug("SKIP_EXCL_DRV", $state->{'driver_name'} ); - return; - } - # Iterate through lines in source files looking for ROM declarations - # and # output Makefile rules - open( my $fh, "<", $state->{'source_file'} ) - or die "Couldn't open $state->{source_file}: $!\n"; - while (<$fh>) { - process_rom_decl($state, $1, $2, $3) if m/$RE{find_rom_line}/; - } - close($fh) or die "Couldn't close $source_file: $!\n"; - return 1; -} - -# Verify that the found ROM declaration is sane and dispatch to the right -# handler depending on type -sub process_rom_decl { - my ($state, $rom_line, $rom_type, $rom_decl) = @_; - return unless defined $rom_line; - return unless length $rom_line; - log_debug("ROM_LINE", $rom_line); - return unless defined $rom_type; - return unless length $rom_type; - log_debug("ROM_TYPE", $rom_type); - $state->{'type'} = lc $rom_type; - return process_pci_rom($state, $rom_decl) if $rom_type eq "PCI"; - return process_isa_rom($state, $rom_decl) if $rom_type eq "ISA"; - return; -} - -# Extract values from PCI_ROM declaration lines and dispatch to -# Makefile rule generator -sub process_pci_rom { - my ($state, $decl) = @_; - return unless defined $decl; - return unless length $decl; - (my $vendor, $decl) = extract_pci_id($decl, 'PCI_VENDOR'); - (my $device, $decl) = extract_pci_id($decl, 'PCI_DEVICE'); - (my $image, $decl) = extract_quoted_string($decl, 'IMAGE'); - (my $desc, $decl) = extract_quoted_string($decl, 'DESCRIPTION'); - if ( $vendor and $device and $image and $desc ) { - print_make_rules( $state, "${vendor}${device}", $desc, $vendor, $device ); - print_make_rules( $state, $image, $desc, $vendor, $device, 1 ); - } - else { - log_debug("WARNING", "Malformed PCI_ROM macro on line $. of $state->{source_file}"); - } - return 1; -} - -# Extract values from ISA_ROM declaration lines and dispatch to -# Makefile rule generator -sub process_isa_rom { - my ($state, $decl) = @_; - return unless defined $decl; - return unless length $decl; - (my $image, $decl) = extract_quoted_string($decl, 'IMAGE'); - (my $desc, $decl) = extract_quoted_string($decl, 'DESCRIPTION'); - if ( $image and $desc ) { - print_make_rules( $state, $image, $desc ); - } - else { - log_debug("WARNING", "Malformed ISA_ROM macro on line $. of $state->{source_file}"); - } - return 1; -} - -# Output Makefile rules for the specified ROM declarations -sub print_make_rules { - my ( $state, my $image, my $desc, my $vendor, my $device, my $dup ) = @_; - unless ( $state->{'is_header_printed'} ) { - print "# NIC\t\n"; - print "# NIC\tfamily\t$state->{family}\n"; - print "DRIVERS_$state->{driver_class} += $state->{driver_name}\n"; - print "DRIVERS += $state->{driver_name}\n"; - print "\n"; - $state->{'is_header_printed'} = 1; - } - return if $vendor and ( $vendor eq "ffff" or $device eq "ffff" ); - my $ids = $vendor ? "$vendor,$device" : "-"; - print "# NIC\t$image\t$ids\t$desc\n"; - print "DRIVER_$image = $state->{driver_name}\n"; - print "ROM_TYPE_$image = $state->{type}\n"; - print "ROM_DESCRIPTION_$image = \"$desc\"\n"; - print "PCI_VENDOR_$image = 0x$vendor\n" if $vendor; - print "PCI_DEVICE_$image = 0x$device\n" if $device; - print "ROMS += $image\n" unless $dup; - print "ROMS_$state->{driver_name} += $image\n" unless $dup; - print "\n"; - return 1; -} - -# Driver class is whatever comes after the "drivers" part of the filename (relative path) -sub parse_driver_class { - my ($state) = @_; - my $filename = $state->{'source_file'}; - return unless defined $filename; - return unless length $filename; - if ( $filename =~ m/$RE{parse_driver_class}/ ) { - log_debug("DRIVER_CLASS", $1); - $state->{'driver_class'} = $1; - } - return; -} - -# Family name is filename (relative path) without extension -sub parse_family { - my ($state) = @_; - my $filename = $state->{'source_file'}; - return unless defined $filename; - return unless length $filename; - if ( $filename =~ m/$RE{parse_family}/ ) { - log_debug("FAMILY", $1); - $state->{'family'} = $1; - } - return; -} - -# Driver name is last part of family name -sub parse_driver_name { - my ($state) = @_; - my $family = $state->{'family'}; - return unless defined $family; - return unless length $family; - my @parts = split "/", $family; - $state->{'driver_name'} = $parts[-1]; - log_debug("DRIVER", $state->{'driver_name'}); - return; -} - -# Extract a PCI vendor/device ID e.g. 0x8086, possibly followed by a comma -# Should always be 4-digit lower-case hex number -sub extract_pci_id { - my ($str, $label) = @_; - return "", $str unless defined $str; - return "", $str unless length $str; - if ( $str =~ m/$RE{extract_pci_id}/ ) { - my $id = lc $1; - log_debug($label, $id); - return $id, $2; - } - return "", $str; -} - -# Extract a double-quoted string, possibly followed by a comma -sub extract_quoted_string { - my ($str, $label) = @_; - return "", $str unless defined $str; - return "", $str unless length $str; - if ( $str =~ m/$RE{extract_quoted_string}/ ) { - log_debug($label, $1); - return $1, $2; - } - return "", $str; -} - -# Output debug info to STDERR (off by default) -sub log_debug { - my ($label, $str) = @_; - return unless $debug; - return unless defined $str; - print STDERR "\n" if $label eq 'SOURCE_FILE'; - print STDERR "="; - if ( defined $label ) { - my $pad_count = 16 - length $label; - print STDERR $label . ":" . ( " " x $pad_count ); - } - print STDERR $str . "\n"; - return; -} diff --git a/qemu/roms/ipxe/src/util/relicense.pl b/qemu/roms/ipxe/src/util/relicense.pl deleted file mode 100755 index 41954c1b3..000000000 --- a/qemu/roms/ipxe/src/util/relicense.pl +++ /dev/null @@ -1,169 +0,0 @@ -#!/usr/bin/perl -w - -=head1 NAME - -relicense.pl - -=head1 SYNOPSIS - -relicense.pl [options] -p <permissions file> <file> [<file>...] - -Option: - - -p,--permitted=FILE Specify file of emails with relicensing permission - -f,--force Manually force relicensing - -h,--help Display brief help message - -v,--verbose Increase verbosity - -q,--quiet Decrease verbosity - -=cut - -use File::Slurp; -use IPC::Run qw ( run ); -use Getopt::Long; -use Pod::Usage; -use strict; -use warnings; - -# Parse command-line options -my $verbosity = 0; -my $permfile; -my $force; -Getopt::Long::Configure ( "bundling", "auto_abbrev" ); -GetOptions ( - 'permitted|p=s' => \$permfile, - 'force|f' => \$force, - 'verbose|v+' => sub { $verbosity++; }, - 'quiet|q+' => sub { $verbosity--; }, - 'help|h' => sub { pod2usage ( 1 ); }, -) or die "Could not parse command-line options"; -pod2usage ( 1 ) unless @ARGV; - -# Read permitted emails file -my @emails = ( $permfile ? read_file ( $permfile ) : () ); -chomp @emails; -my $permitted = { map { /^.*<(\S+)>$/; ( $1 || $_ ) => 1 } @emails }; - -# Define list of relicensable licences -my $relicensable = { - GPL2_OR_LATER => 1, -}; - -# Define blurb to be added to copyright notice -my $blurb = ' - * - * You can also choose to distribute this program under the terms of - * the Unmodified Binary Distribution Licence (as given in the file - * COPYING.UBDL), provided that you have satisfied its requirements.'; - -# Process files -my @succeeded; -my @failed; -while ( my $filename = shift @ARGV ) { - - # Read file to determine existing licence - my $file = read_file ( $filename ); - my @licences = ( $file =~ /^\s*FILE_LICENCE\s*\(\s*(\S+)\s*\)\s*;?$/mg ); - die "No licence declaration in $filename\n" unless @licences; - die "Multiple licence declarations in $filename\n" if @licences > 1; - my $licence = $licences[0]; - - # Skip if file is already UBDL-licensed - next if $licence =~ /_OR_UBDL$/; - - # Fail immediately if file is not a candidate for relicensing - if ( ! exists $relicensable->{$licence} ) { - print "Non-relicensable licence $licence in $filename\n"; - push @failed, $filename; - next; - } - - # Run git-blame - my $stdout; - my $stderr; - run [ "git", "blame", "-M", "-C", "-p", "-w", $filename ], - \undef, \$stdout, \$stderr - or die "git-blame $filename: $?"; - die $stderr if $stderr; - - # Process output - my @stdout = split ( /\n/, $stdout ); - chomp @stdout; - my $details = {}; - my $failures = 0; - while ( @stdout ) { - - # Parse output - my $commit_line = shift @stdout; - ( my $commit, undef, my $lineno, undef, my $count ) = - ( $commit_line =~ - /^([0-9a-f]{40})\s+([0-9]+)\s+([0-9]+)(\s+([0-9]+))?$/ ) - or die "Malformed commit line \"$commit_line\"\n"; - if ( $count ) { - $details->{$commit} ||= {}; - while ( ! ( $stdout[0] =~ /^\t/ ) ) { - my $detail_line = shift @stdout; - ( my $key, undef, my $value ) = - ( $detail_line =~ /^([a-z-]+)(\s+(.+))?$/ ) - or die "Malformed detail line \"$detail_line\" for $commit_line\n"; - $details->{$commit}->{$key} = $value; - } - } - die "Missing commit details for $commit_line\n" - unless %{$details->{$commit}}; - my $code_line = shift @stdout; - ( my $line ) = ( $code_line =~ /^\t(.*)$/ ) - or die "Malformed code line \"$code_line\" for $commit_line\n"; - - # Skip trivial lines and lines so common that they are likely to - # be misattributed by git-blame - next if $line =~ /^\s*$/; # Empty lines - next if $line =~ /^\s*\/\*/; # Start of comments - next if $line =~ /^\s*\*/; # Middle (or end) of comments - next if $line =~ /^\s*\{\s*$/; # Standalone opening braces - next if $line =~ /^\s*\};?\s*$/; # Standalone closing braces - next if $line =~ /^\#include/; # Header inclusions - next if $line =~ /^\s*return\s+0;/; # return 0; - next if $line =~ /^\s*return\s+rc;/; # return rc; - next if $line =~ /^\s*PCI_ROM\s*\(.*\)\s*,\s*$/; # PCI IDs - next if $line =~ /^\s*FILE_LICENCE\s*\(.*\)\s*;$/; # Licence declarations - - # Identify author - my $author_mail = $details->{$commit}->{"author-mail"} - or die "Missing author email for $commit_line\n"; - ( my $email ) = ( $author_mail =~ /^<(\S+)>$/ ) - or die "Malformed author email \"$author_mail\" for $commit_line\n"; - undef $email if exists $details->{$commit}->{boundary}; - - # Check for relicensing permission - next if defined $email && exists $permitted->{$email}; - - # Print out lines lacking permission - printf $filename."\n" unless $failures; - printf "%4d %-30s %s\n", $lineno, ( $email || "<root>" ), $line; - $failures++; - } - - # Fail if there are any non-trivial lines lacking relicensing permission - if ( $failures && ! $force ) { - push @failed, $filename; - next; - } - - # Modify FILE_LICENCE() line - $file =~ s/(^\s*FILE_LICENCE\s*\(\s*${licence})(\s*\)\s*;?$)/$1_OR_UBDL$2/m - or die "Could not modify FILE_LICENCE() in $filename\n"; - - # Modify copyright notice, if present - if ( $file =~ /GNU General Public License/i ) { - $file =~ s/(02110-1301, USA.$)/$1${blurb}/m - or die "Could not modify copyright notice in $filename\n"; - } - - # Write out modified file - write_file ( $filename, { atomic => 1 }, $file ); - push @succeeded, $filename; -} - -print "Relicensed: ".join ( " ", @succeeded )."\n" if @succeeded; -die "Cannot relicense: ".join ( " ", @failed )."\n" if @failed; diff --git a/qemu/roms/ipxe/src/util/romcheck.pl b/qemu/roms/ipxe/src/util/romcheck.pl deleted file mode 100755 index f47bb07e8..000000000 --- a/qemu/roms/ipxe/src/util/romcheck.pl +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/perl -w - -use strict; -use warnings; - -use constant DEVICES => "/proc/bus/pci/devices"; - -open my $fh, DEVICES - or die "Could not open ".DEVICES.": $!"; - -while ( ( my $line = <$fh> ) ) { - - # Parse line from /proc/bus/pci/devices - chomp $line; - ( my $bus, my $devfn, my $vendor, my $device, my $irq, my $bars, my $lengths, - my $driver ) - = ( $line =~ /^ ([0-9a-f]{2}) ([0-9a-f]{2}) \s+ - ([0-9a-f]{4}) ([0-9a-f]{4}) \s+ ([0-9a-f]+) \s+ - ((?:[0-9a-f]+\s+){7}) ((?:[0-9a-f]+\s+){7}) - (.+)?$/x ) - or die "Invalid line \"".$line."\"\n"; - ( $bus, $devfn, $vendor, $device, $irq ) = - map { hex ( $_ ) } ( $bus, $devfn, $vendor, $device, $irq ); - my $dev = ( $devfn >> 3 ); - my $fn = ( $devfn & 0x7 ); - $bars = [ map { hex ( $_ ) } split ( /\s+/, $bars ) ]; - $lengths = [ map { hex ( $_ ) } split ( /\s+/, $lengths ) ]; - - # Calculate expansion ROM BAR presence and length - my $rom_length = $lengths->[6]; - - # Look for a BAR that could support a .mrom - my $mrom_ok; - if ( $rom_length ) { - for ( my $bar = 0 ; $bar < 7 ; $bar++ ) { - # Skip I/O BARs - next if $bars->[$bar] & 0x01; - # Skip low half of 64-bit BARs - $bar++ if $bars->[$bar] & 0x04; - # Skip 64-bit BARs with high dword set - next if $bars->[$bar] >> 32; - # Skip BARs smaller than the expansion ROM BAR - next if $lengths->[$bar] < $rom_length; - # This BAR is usable! - $mrom_ok = 1; - last; - } - } - - printf "%02x:%02x.%x (%04x:%04x)", $bus, $dev, $fn, $vendor, $device; - printf " supports a %dkB .rom", ( $rom_length / 1024 ) if $rom_length; - printf " or .mrom" if $mrom_ok; - printf "\n"; -} diff --git a/qemu/roms/ipxe/src/util/sortobjdump.pl b/qemu/roms/ipxe/src/util/sortobjdump.pl deleted file mode 100755 index 1373a7ffd..000000000 --- a/qemu/roms/ipxe/src/util/sortobjdump.pl +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/perl -w - -use strict; -use warnings; - -# Sort the symbol table portion of the output of objdump -ht by -# section, then by symbol value, then by size. Used to enhance the -# linker maps produced by "make bin/%.map" by also showing the values -# of all non-global symbols. - -my %section_idx = ( "*ABS*" => ".", "*UND*" => "_" ); -my %lines; -while ( <> ) { - if ( /^\s+(\d+)\s+([\.\*]\S+)\s+[0-9a-fA-F]+\s+[0-9a-fA-F]/ ) { - # It's a header line containing a section definition; extract the - # section index and store it. Also print the header line. - print; - ( my $index, my $section ) = ( $1, $2 ); - $section_idx{$section} = sprintf ( "%02d", $index ); - } elsif ( /^([0-9a-fA-F]+)\s.*?\s([\.\*]\S+)\s+([0-9a-fA-F]+)\s+(\S+)/ ) { - # It's a symbol line - store it in the hash, indexed by - # "<section_index>:<value>:<size>:<end_tag>". <end_tag> is "0" if - # the symbol name is of the form xxx_end, "1" otherwise; this is - # done so that table end markers show up before any other symbols - # with the same value. - ( my $value, my $section, my $size, my $name ) = ( $1, $2, $3, $4 ); - die "Unrecognised section \"$section\"\n" - unless exists $section_idx{$section}; - my $section_idx = $section_idx{$section}; - my $end = ( $name =~ /_end$/ ) ? "0" : "1"; - my $key = $section_idx.":".$value.":".$size.":".$end; - $lines{$key} ||= ''; - $lines{$key} .= $_; - } else { - # It's a generic header line: just print it. - print; - } -} - -print $lines{$_} foreach sort keys %lines; diff --git a/qemu/roms/ipxe/src/util/swapdevids.pl b/qemu/roms/ipxe/src/util/swapdevids.pl deleted file mode 100755 index c6255ae73..000000000 --- a/qemu/roms/ipxe/src/util/swapdevids.pl +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/perl -w -# -# Program to reverse the device identifier IDs in the PCIR and PnP -# structures in a ROM for old non-compliant BIOSes -# -# GPL, Ken Yap 2001 -# - -use bytes; - -use IO::Seekable; - -sub swaplocs ($$$) -{ - my ($dataref, $loc1, $loc2) = @_; - my ($t); - - $t = substr($$dataref, $loc1, 1); - substr($$dataref, $loc1, 1) = substr($$dataref, $loc2, 1); - substr($$dataref, $loc2, 1) = $t; -} - -sub printdevids ($$) -{ - my ($dataref, $loc) = @_; - - return (sprintf "%02x %02x %02x", unpack('C3', substr($$dataref, $loc, 3))); -} - -$#ARGV >= 0 or die "Usage: $0 romimage\n"; -$file = $ARGV[0]; -open(F, "+<$file") or die "$file: $!\n"; -binmode(F); -# Handle up to 64kB ROM images -$len = read(F, $data, 64*1024); -defined($len) or die "$file: $!\n"; -substr($data, 0, 2) eq "\x55\xAA" or die "$file: Not a boot ROM image\n"; -($pci, $pnp) = unpack('v2', substr($data, 0x18, 4)); -($pci < $len and $pnp < $len) or die "$file: Not a PCI PnP ROM image\n"; -(substr($data, $pci, 4) eq 'PCIR' and substr($data, $pnp, 4) eq '$PnP') - or die "$file: No PCI and PNP structures, not a PCI PNP ROM image\n"; -&swaplocs(\$data, $pci+13, $pci+15); -&swaplocs(\$data, $pnp+18, $pnp+20); -seek(F, 0, SEEK_SET) or die "$file: Cannot seek to beginning\n"; -print F $data; -close(F); -print "PCI devids now: ", &printdevids(\$data, $pci+13), "\n"; -print "PnP devids now: ", &printdevids(\$data, $pnp+18), "\n"; -exit(0); diff --git a/qemu/roms/ipxe/src/util/symcheck.pl b/qemu/roms/ipxe/src/util/symcheck.pl deleted file mode 100755 index 8925ca623..000000000 --- a/qemu/roms/ipxe/src/util/symcheck.pl +++ /dev/null @@ -1,191 +0,0 @@ -#!/usr/bin/perl -w - -use strict; -use warnings; - -use constant WARNING_SIZE => 512; - -my $symtab = {}; - -# Scan output of "objdump -w -t bin/blib.a" and build up symbol table -# -my $object; -while ( <> ) { - chomp; - if ( /^In archive/ ) { - # Do nothing - } elsif ( /^$/ ) { - # Do nothing - } elsif ( /^(\S+\.o):\s+file format/ ) { - $object = $1; - } elsif ( /^SYMBOL TABLE:/ ) { - # Do nothing - } elsif ( /^([0-9a-fA-F]+)\s(l|g|\s)......\s(\S+)\s+([0-9a-fA-F]+)\s+(\S+)$/ ) { - my $value = $1; - my $scope = $2; - my $section = $3; - my $size = $4; - my $symbol = $5; - $symtab->{$object}->{$symbol} = { - global => ( $scope ne "l" ), - section => ( $section eq "*UND*" ? undef : $section ), - value => ( $value ? hex ( $value ) : 0 ), - size => ( $size ? hex ( $size ) : 0 ), - }; - } else { - die "Unrecognized line \"$_\""; - } -} - -# Add symbols that we know will be generated or required by the linker -# -foreach my $object ( keys %$symtab ) { - my $obj_symbol = "obj_$object"; - $obj_symbol =~ s/\.o$//; - $obj_symbol =~ s/\W/_/g; - $symtab->{LINKER}->{$obj_symbol} = { - global => 1, - section => undef, - value => 0, - size => 0, - }; -} -foreach my $link_sym qw ( __prefix _prefix _prefix_load_offset - _prefix_size _prefix_progbits_size _prefix_size_pgh - __text16 _text16 _text16_load_offset - _text16_size _text16_progbits_size _text16_size_pgh - __data16 _data16 _data16_load_offset - _data16_size _data16_progbits_size _data16_size_pgh - __text _text __data _data _textdata_load_offset - _textdata_size _textdata_progbits_size - __rodata __bss _end - _payload_offset _max_align - _load_size _load_size_pgh _load_size_sect - pci_vendor_id pci_device_id ) { - $symtab->{LINKER}->{$link_sym} = { - global => 1, - section => '*ABS*', - value => 0, - size => 0, - }; -} - -# Add symbols that we know will be used by the debug system -# -foreach my $debug_sym qw ( dbg_autocolourise dbg_decolourise - dbg_hex_dump_da ) { - $symtab->{DEBUG}->{$debug_sym} = { - global => 1, - section => undef, - value => 0, - size => 0, - }; -} - -# Build up requires, provides and shares symbol tables for global -# symbols -# -my $globals = {}; -while ( ( my $object, my $symbols ) = each %$symtab ) { - while ( ( my $symbol, my $info ) = each %$symbols ) { - if ( $info->{global} ) { - my $category; - if ( ! defined $info->{section} ) { - $category = "requires"; - } elsif ( $info->{section} eq "*COM*" ) { - $category = "shares"; - } else { - $category = "provides"; - } - $globals->{$symbol}->{$category}->{$object} = 1; - } - } -} - -# Check for multiply defined, never-defined and unused global symbols -# -my $problems = {}; -while ( ( my $symbol, my $info ) = each %$globals ) { - my @provides = keys %{$info->{provides}}; - my @requires = keys %{$info->{requires}}; - my @shares = keys %{$info->{shares}}; - - if ( ( @provides == 0 ) && ( @shares == 1 ) ) { - # A symbol "shared" by just a single file is actually being - # provided by that file; it just doesn't have an initialiser. - @provides = @shares; - @shares = (); - } - - if ( ( @requires > 0 ) && ( @provides == 0 ) && ( @shares == 0 ) ) { - # No object provides this symbol, but some objects require it. - $problems->{$_}->{nonexistent}->{$symbol} = 1 foreach @requires; - } - - if ( ( @requires == 0 ) && ( @provides > 0 ) ) { - # No object requires this symbol, but some objects provide it. - foreach my $provide ( @provides ) { - if ( $provide eq "LINKER" ) { - # Linker-provided symbols are exempt from this check. - } elsif ( $symtab->{$provide}->{$symbol}->{section} =~ /^\.tbl\./ ) { - # Linker tables are exempt from this check. - } else { - $problems->{$provide}->{unused}->{$symbol} = 1; - } - } - } - - if ( ( @shares > 0 ) && ( @provides > 0 ) ) { - # A shared symbol is being initialised by an object - $problems->{$_}->{shared}->{$symbol} = 1 foreach @provides; - } - - if ( @provides > 1 ) { - # A non-shared symbol is defined in multiple objects - $problems->{$_}->{multiples}->{$symbol} = 1 foreach @provides; - } -} - -# Check for excessively large local symbols. Text and rodata symbols -# are exempt from this check -# -while ( ( my $object, my $symbols ) = each %$symtab ) { - while ( ( my $symbol, my $info ) = each %$symbols ) { - if ( ( ! $info->{global} ) && - ( ( defined $info->{section} ) && - ! ( $info->{section} =~ /^(\.text|\.rodata)/ ) ) && - ( $info->{size} >= WARNING_SIZE ) ) { - $problems->{$object}->{large}->{$symbol} = 1; - } - } -} - -# Print out error messages -# -my $errors = 0; -my $warnings = 0; -foreach my $object ( sort keys %$problems ) { - my @nonexistent = sort keys %{$problems->{$object}->{nonexistent}}; - my @multiples = sort keys %{$problems->{$object}->{multiples}}; - my @unused = sort keys %{$problems->{$object}->{unused}}; - my @shared = sort keys %{$problems->{$object}->{shared}}; - my @large = sort keys %{$problems->{$object}->{large}}; - - print "WARN $object provides unused symbol $_\n" foreach @unused; - $warnings += @unused; - print "WARN $object has large static symbol $_\n" foreach @large; - $warnings += @large; - print "ERR $object requires non-existent symbol $_\n" foreach @nonexistent; - $errors += @nonexistent; - foreach my $symbol ( @multiples ) { - my @other_objects = sort grep { $_ ne $object } - keys %{$globals->{$symbol}->{provides}}; - print "ERR $object provides symbol $symbol" - ." (also provided by @other_objects)\n"; - } - $errors += @multiples; - print "ERR $object misuses shared symbol $_\n" foreach @shared; -} - -print "$errors error(s), $warnings warning(s)\n"; -exit ( $errors ? 1 : 0 ); diff --git a/qemu/roms/ipxe/src/util/zbin.c b/qemu/roms/ipxe/src/util/zbin.c deleted file mode 100644 index 1862a3827..000000000 --- a/qemu/roms/ipxe/src/util/zbin.c +++ /dev/null @@ -1,567 +0,0 @@ -#include <stdint.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <sys/stat.h> -#include <lzma.h> - -#define DEBUG 0 - -/* LZMA filter choices. Must match those used by unlzma.S */ -#define LZMA_LC 2 -#define LZMA_LP 0 -#define LZMA_PB 0 - -/* LZMA preset choice. This is a policy decision */ -#define LZMA_PRESET ( LZMA_PRESET_DEFAULT | LZMA_PRESET_EXTREME ) - -struct input_file { - void *buf; - size_t len; -}; - -struct output_file { - void *buf; - size_t len; - size_t hdr_len; - size_t max_len; -}; - -struct zinfo_common { - char type[4]; - char pad[12]; -}; - -struct zinfo_copy { - char type[4]; - uint32_t offset; - uint32_t len; - uint32_t align; -}; - -struct zinfo_pack { - char type[4]; - uint32_t offset; - uint32_t len; - uint32_t align; -}; - -struct zinfo_payload { - char type[4]; - uint32_t pad1; - uint32_t pad2; - uint32_t align; -}; - -struct zinfo_add { - char type[4]; - uint32_t offset; - uint32_t divisor; - uint32_t pad; -}; - -union zinfo_record { - struct zinfo_common common; - struct zinfo_copy copy; - struct zinfo_pack pack; - struct zinfo_payload payload; - struct zinfo_add add; -}; - -struct zinfo_file { - union zinfo_record *zinfo; - unsigned int num_entries; -}; - -static unsigned long align ( unsigned long value, unsigned long align ) { - return ( ( value + align - 1 ) & ~( align - 1 ) ); -} - -static int read_file ( const char *filename, void **buf, size_t *len ) { - FILE *file; - struct stat stat; - - file = fopen ( filename, "r" ); - if ( ! file ) { - fprintf ( stderr, "Could not open %s: %s\n", filename, - strerror ( errno ) ); - goto err; - } - - if ( fstat ( fileno ( file ), &stat ) < 0 ) { - fprintf ( stderr, "Could not stat %s: %s\n", filename, - strerror ( errno ) ); - goto err; - } - - *len = stat.st_size; - *buf = malloc ( *len ); - if ( ! *buf ) { - fprintf ( stderr, "Could not malloc() %zd bytes for %s: %s\n", - *len, filename, strerror ( errno ) ); - goto err; - } - - if ( fread ( *buf, 1, *len, file ) != *len ) { - fprintf ( stderr, "Could not read %zd bytes from %s: %s\n", - *len, filename, strerror ( errno ) ); - goto err; - } - - fclose ( file ); - return 0; - - err: - if ( file ) - fclose ( file ); - return -1; -} - -static int read_input_file ( const char *filename, - struct input_file *input ) { - return read_file ( filename, &input->buf, &input->len ); -} - -static int read_zinfo_file ( const char *filename, - struct zinfo_file *zinfo ) { - void *buf; - size_t len; - - if ( read_file ( filename, &buf, &len ) < 0 ) - return -1; - - if ( ( len % sizeof ( *(zinfo->zinfo) ) ) != 0 ) { - fprintf ( stderr, ".zinfo file %s has invalid length %zd\n", - filename, len ); - return -1; - } - - zinfo->zinfo = buf; - zinfo->num_entries = ( len / sizeof ( *(zinfo->zinfo) ) ); - return 0; -} - -static int alloc_output_file ( size_t max_len, struct output_file *output ) { - output->len = 0; - output->max_len = ( max_len ); - output->buf = malloc ( max_len ); - if ( ! output->buf ) { - fprintf ( stderr, "Could not allocate %zd bytes for output\n", - max_len ); - return -1; - } - memset ( output->buf, 0xff, max_len ); - return 0; -} - -static int process_zinfo_copy ( struct input_file *input, - struct output_file *output, - union zinfo_record *zinfo ) { - struct zinfo_copy *copy = &zinfo->copy; - size_t offset = copy->offset; - size_t len = copy->len; - - if ( ( offset + len ) > input->len ) { - fprintf ( stderr, "Input buffer overrun on copy\n" ); - return -1; - } - - output->len = align ( output->len, copy->align ); - if ( ( output->len + len ) > output->max_len ) { - fprintf ( stderr, "Output buffer overrun on copy\n" ); - return -1; - } - - if ( DEBUG ) { - fprintf ( stderr, "COPY [%#zx,%#zx) to [%#zx,%#zx)\n", - offset, ( offset + len ), output->len, - ( output->len + len ) ); - } - - memcpy ( ( output->buf + output->len ), - ( input->buf + offset ), len ); - output->len += len; - return 0; -} - -#define OPCODE_CALL 0xe8 -#define OPCODE_JMP 0xe9 - -static void bcj_filter ( void *data, size_t len ) { - struct { - uint8_t opcode; - int32_t target; - } __attribute__ (( packed )) *jump; - ssize_t limit = ( len - sizeof ( *jump ) ); - ssize_t offset; - - /* liblzma does include an x86 BCJ filter, but it's hideously - * convoluted and undocumented. This BCJ filter is - * substantially simpler and achieves the same compression (at - * the cost of requiring the decompressor to know the size of - * the decompressed data, which we already have in iPXE). - */ - for ( offset = 0 ; offset <= limit ; offset++ ) { - jump = ( data + offset ); - - /* Skip instructions that are not followed by a rel32 address */ - if ( ( jump->opcode != OPCODE_CALL ) && - ( jump->opcode != OPCODE_JMP ) ) - continue; - - /* Convert rel32 address to an absolute address. To - * avoid false positives (which damage the compression - * ratio), we should check that the jump target is - * within the range [0,limit). - * - * Some output values would then end up being mapped - * from two distinct input values, making the - * transformation irreversible. To solve this, we - * transform such values back into the part of the - * range which would otherwise correspond to no input - * values. - */ - if ( ( jump->target >= -offset ) && - ( jump->target < ( limit - offset ) ) ) { - /* Convert relative addresses in the range - * [-offset,limit-offset) to absolute - * addresses in the range [0,limit). - */ - jump->target += offset; - } else if ( ( jump->target >= ( limit - offset ) ) && - ( jump->target < limit ) ) { - /* Convert positive numbers in the range - * [limit-offset,limit) to negative numbers in - * the range [-offset,0). - */ - jump->target -= limit; - } - offset += sizeof ( jump->target ); - }; -} - -static int process_zinfo_pack ( struct input_file *input, - struct output_file *output, - union zinfo_record *zinfo ) { - struct zinfo_pack *pack = &zinfo->pack; - size_t offset = pack->offset; - size_t len = pack->len; - size_t packed_len = 0; - size_t remaining = ( output->max_len - output->len ); - lzma_options_lzma options; - const lzma_filter filters[] = { - { .id = LZMA_FILTER_LZMA1, .options = &options }, - { .id = LZMA_VLI_UNKNOWN } - }; - - if ( ( offset + len ) > input->len ) { - fprintf ( stderr, "Input buffer overrun on pack\n" ); - return -1; - } - - output->len = align ( output->len, pack->align ); - if ( output->len > output->max_len ) { - fprintf ( stderr, "Output buffer overrun on pack\n" ); - return -1; - } - - bcj_filter ( ( input->buf + offset ), len ); - - lzma_lzma_preset ( &options, LZMA_PRESET ); - options.lc = LZMA_LC; - options.lp = LZMA_LP; - options.pb = LZMA_PB; - if ( lzma_raw_buffer_encode ( filters, NULL, ( input->buf + offset ), - len, ( output->buf + output->len ), - &packed_len, remaining ) != LZMA_OK ) { - fprintf ( stderr, "Compression failure\n" ); - return -1; - } - - if ( DEBUG ) { - fprintf ( stderr, "PACK [%#zx,%#zx) to [%#zx,%#zx)\n", - offset, ( offset + len ), output->len, - ( output->len + packed_len ) ); - } - - output->len += packed_len; - if ( output->len > output->max_len ) { - fprintf ( stderr, "Output buffer overrun on pack\n" ); - return -1; - } - - return 0; -} - -static int process_zinfo_payl ( struct input_file *input - __attribute__ (( unused )), - struct output_file *output, - union zinfo_record *zinfo ) { - struct zinfo_payload *payload = &zinfo->payload; - - output->len = align ( output->len, payload->align ); - output->hdr_len = output->len; - - if ( DEBUG ) { - fprintf ( stderr, "PAYL at %#zx\n", output->hdr_len ); - } - return 0; -} - -static int process_zinfo_add ( struct input_file *input - __attribute__ (( unused )), - struct output_file *output, - size_t len, - struct zinfo_add *add, size_t offset, - size_t datasize ) { - void *target; - signed long addend; - unsigned long size; - signed long val; - unsigned long mask; - - offset += add->offset; - if ( ( offset + datasize ) > output->len ) { - fprintf ( stderr, "Add at %#zx outside output buffer\n", - offset ); - return -1; - } - - target = ( output->buf + offset ); - size = ( align ( len, add->divisor ) / add->divisor ); - - switch ( datasize ) { - case 1: - addend = *( ( int8_t * ) target ); - break; - case 2: - addend = *( ( int16_t * ) target ); - break; - case 4: - addend = *( ( int32_t * ) target ); - break; - default: - fprintf ( stderr, "Unsupported add datasize %zd\n", - datasize ); - return -1; - } - - val = size + addend; - - /* The result of 1UL << ( 8 * sizeof(unsigned long) ) is undefined */ - mask = ( ( datasize < sizeof ( mask ) ) ? - ( ( 1UL << ( 8 * datasize ) ) - 1 ) : ~0UL ); - - if ( val < 0 ) { - fprintf ( stderr, "Add %s%#x+%#lx at %#zx %sflows field\n", - ( ( addend < 0 ) ? "-" : "" ), abs ( addend ), size, - offset, ( ( addend < 0 ) ? "under" : "over" ) ); - return -1; - } - - if ( val & ~mask ) { - fprintf ( stderr, "Add %s%#x+%#lx at %#zx overflows %zd-byte " - "field (%d bytes too big)\n", - ( ( addend < 0 ) ? "-" : "" ), abs ( addend ), size, - offset, datasize, - ( int )( ( val - mask - 1 ) * add->divisor ) ); - return -1; - } - - switch ( datasize ) { - case 1: - *( ( uint8_t * ) target ) = val; - break; - case 2: - *( ( uint16_t * ) target ) = val; - break; - case 4: - *( ( uint32_t * ) target ) = val; - break; - } - - if ( DEBUG ) { - fprintf ( stderr, "ADDx [%#zx,%#zx) (%s%#x+(%#zx/%#x)) = " - "%#lx\n", offset, ( offset + datasize ), - ( ( addend < 0 ) ? "-" : "" ), abs ( addend ), - len, add->divisor, val ); - } - - return 0; -} - -static int process_zinfo_addb ( struct input_file *input, - struct output_file *output, - union zinfo_record *zinfo ) { - return process_zinfo_add ( input, output, output->len, - &zinfo->add, 0, 1 ); -} - -static int process_zinfo_addw ( struct input_file *input, - struct output_file *output, - union zinfo_record *zinfo ) { - return process_zinfo_add ( input, output, output->len, - &zinfo->add, 0, 2 ); -} - -static int process_zinfo_addl ( struct input_file *input, - struct output_file *output, - union zinfo_record *zinfo ) { - return process_zinfo_add ( input, output, output->len, - &zinfo->add, 0, 4 ); -} - -static int process_zinfo_adhb ( struct input_file *input, - struct output_file *output, - union zinfo_record *zinfo ) { - return process_zinfo_add ( input, output, output->hdr_len, - &zinfo->add, 0, 1 ); -} - -static int process_zinfo_adhw ( struct input_file *input, - struct output_file *output, - union zinfo_record *zinfo ) { - return process_zinfo_add ( input, output, output->hdr_len, - &zinfo->add, 0, 2 ); -} - -static int process_zinfo_adhl ( struct input_file *input, - struct output_file *output, - union zinfo_record *zinfo ) { - return process_zinfo_add ( input, output, output->hdr_len, - &zinfo->add, 0, 4 ); -} - -static int process_zinfo_adpb ( struct input_file *input, - struct output_file *output, - union zinfo_record *zinfo ) { - return process_zinfo_add ( input, output, - ( output->len - output->hdr_len ), - &zinfo->add, 0, 1 ); -} - -static int process_zinfo_adpw ( struct input_file *input, - struct output_file *output, - union zinfo_record *zinfo ) { - return process_zinfo_add ( input, output, - ( output->len - output->hdr_len ), - &zinfo->add, 0, 2 ); -} - -static int process_zinfo_adpl ( struct input_file *input, - struct output_file *output, - union zinfo_record *zinfo ) { - return process_zinfo_add ( input, output, - ( output->len - output->hdr_len ), - &zinfo->add, 0, 4 ); -} - -static int process_zinfo_appb ( struct input_file *input, - struct output_file *output, - union zinfo_record *zinfo ) { - return process_zinfo_add ( input, output, - ( output->len - output->hdr_len ), - &zinfo->add, output->hdr_len, 1 ); -} - -static int process_zinfo_appw ( struct input_file *input, - struct output_file *output, - union zinfo_record *zinfo ) { - return process_zinfo_add ( input, output, - ( output->len - output->hdr_len ), - &zinfo->add, output->hdr_len, 2 ); -} - -static int process_zinfo_appl ( struct input_file *input, - struct output_file *output, - union zinfo_record *zinfo ) { - return process_zinfo_add ( input, output, - ( output->len - output->hdr_len ), - &zinfo->add, output->hdr_len, 4 ); -} - -struct zinfo_processor { - char *type; - int ( * process ) ( struct input_file *input, - struct output_file *output, - union zinfo_record *zinfo ); -}; - -static struct zinfo_processor zinfo_processors[] = { - { "COPY", process_zinfo_copy }, - { "PACK", process_zinfo_pack }, - { "PAYL", process_zinfo_payl }, - { "ADDB", process_zinfo_addb }, - { "ADDW", process_zinfo_addw }, - { "ADDL", process_zinfo_addl }, - { "ADHB", process_zinfo_adhb }, - { "ADHW", process_zinfo_adhw }, - { "ADHL", process_zinfo_adhl }, - { "ADPB", process_zinfo_adpb }, - { "ADPW", process_zinfo_adpw }, - { "ADPL", process_zinfo_adpl }, - { "APPB", process_zinfo_appb }, - { "APPW", process_zinfo_appw }, - { "APPL", process_zinfo_appl }, -}; - -static int process_zinfo ( struct input_file *input, - struct output_file *output, - union zinfo_record *zinfo ) { - struct zinfo_common *common = &zinfo->common; - struct zinfo_processor *processor; - char type[ sizeof ( common->type ) + 1 ] = ""; - unsigned int i; - - strncat ( type, common->type, sizeof ( type ) - 1 ); - for ( i = 0 ; i < ( sizeof ( zinfo_processors ) / - sizeof ( zinfo_processors[0] ) ) ; i++ ) { - processor = &zinfo_processors[i]; - if ( strcmp ( processor->type, type ) == 0 ) - return processor->process ( input, output, zinfo ); - } - - fprintf ( stderr, "Unknown zinfo record type \"%s\"\n", &type[0] ); - return -1; -} - -static int write_output_file ( struct output_file *output ) { - if ( fwrite ( output->buf, 1, output->len, stdout ) != output->len ) { - fprintf ( stderr, "Could not write %zd bytes of output: %s\n", - output->len, strerror ( errno ) ); - return -1; - } - return 0; -} - -int main ( int argc, char **argv ) { - struct input_file input; - struct output_file output; - struct zinfo_file zinfo; - unsigned int i; - - if ( argc != 3 ) { - fprintf ( stderr, "Syntax: %s file.bin file.zinfo " - "> file.zbin\n", argv[0] ); - exit ( 1 ); - } - - if ( read_input_file ( argv[1], &input ) < 0 ) - exit ( 1 ); - if ( read_zinfo_file ( argv[2], &zinfo ) < 0 ) - exit ( 1 ); - if ( alloc_output_file ( ( input.len * 4 ), &output ) < 0 ) - exit ( 1 ); - - for ( i = 0 ; i < zinfo.num_entries ; i++ ) { - if ( process_zinfo ( &input, &output, - &zinfo.zinfo[i] ) < 0 ) - exit ( 1 ); - } - - if ( write_output_file ( &output ) < 0 ) - exit ( 1 ); - - return 0; -} |