From 648a6eeb1e3c2b40af4eb34d88941ee0edeb3e9a Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Wed, 18 May 2016 09:18:54 +0100 Subject: [PATCH] Remove the knlinfo and mkknlimg tools The canonical home of the mkknlimg and knlinfo tools is now the Linux tree in the scripts directory. Different branches may contain different versions making external copies such as these likely to be inconsistent with at least one of them, so delete the the copies. See: https://github.com/raspberrypi/tools/issues/58 --- mkimage/README | 6 + mkimage/knlinfo | 169 --------------------------- mkimage/mkknlimg | 295 ----------------------------------------------- 3 files changed, 6 insertions(+), 464 deletions(-) create mode 100644 mkimage/README delete mode 100755 mkimage/knlinfo delete mode 100755 mkimage/mkknlimg diff --git a/mkimage/README b/mkimage/README new file mode 100644 index 000000000..2ec8c7a00 --- /dev/null +++ b/mkimage/README @@ -0,0 +1,6 @@ +The mkknlimg and knlinfo utilities are now found in the scripts directory +of the Linux tree, where they are covered by the kernel licence. + +Note also that the firmware shipped with 4.4 kernels now assumes the kernel +is Device Tree-capable unless there is a trailer to say otherwise, meaning +that these tools aren't needed for most situations. diff --git a/mkimage/knlinfo b/mkimage/knlinfo deleted file mode 100755 index 203f43311..000000000 --- a/mkimage/knlinfo +++ /dev/null @@ -1,169 +0,0 @@ -#!/usr/bin/env perl -# ---------------------------------------------------------------------- -# knlinfo by Phil Elwell for Raspberry Pi -# -# (c) 2014,2015 Raspberry Pi (Trading) Limited -# -# Licensed under the terms of the GNU General Public License. -# ---------------------------------------------------------------------- - -use strict; -use integer; - -use Fcntl ":seek"; - -my $trailer_magic = 'RPTL'; - -my %atom_formats = -( - 'DDTK' => \&format_bool, - 'DTOK' => \&format_bool, - 'KVer' => \&format_string, - '283x' => \&format_bool, -); - -if (@ARGV != 1) -{ - print ("Usage: knlinfo \n"); - exit(1); -} - -my $kernel_file = $ARGV[0]; - - -my ($atoms, $pos) = read_trailer($kernel_file); - -exit(1) if (!$atoms); - -printf("Kernel trailer found at %d/0x%x:\n", $pos, $pos); - -foreach my $atom (@$atoms) -{ - printf(" %s: %s\n", $atom->[0], format_atom($atom)); -} - -exit(0); - -sub read_trailer -{ - my ($kernel_file) = @_; - my $fh; - - if (!open($fh, '<', $kernel_file)) - { - print ("* Failed to open '$kernel_file'\n"); - return undef; - } - - if (!seek($fh, -12, SEEK_END)) - { - print ("* seek error in '$kernel_file'\n"); - return undef; - } - - my $last_bytes; - sysread($fh, $last_bytes, 12); - - my ($trailer_len, $data_len, $magic) = unpack('VVa4', $last_bytes); - - if (($magic ne $trailer_magic) || ($data_len != 4)) - { - print ("* no trailer\n"); - return undef; - } - if (!seek($fh, -12, SEEK_END)) - { - print ("* seek error in '$kernel_file'\n"); - return undef; - } - - $trailer_len -= 12; - - while ($trailer_len > 0) - { - if ($trailer_len < 8) - { - print ("* truncated atom header in trailer\n"); - return undef; - } - if (!seek($fh, -8, SEEK_CUR)) - { - print ("* seek error in '$kernel_file'\n"); - return undef; - } - $trailer_len -= 8; - - my $atom_hdr; - sysread($fh, $atom_hdr, 8); - my ($atom_len, $atom_type) = unpack('Va4', $atom_hdr); - - if ($trailer_len < $atom_len) - { - print ("* truncated atom data in trailer\n"); - return undef; - } - - my $rounded_len = (($atom_len + 3) & ~3); - if (!seek($fh, -(8 + $rounded_len), SEEK_CUR)) - { - print ("* seek error in '$kernel_file'\n"); - return undef; - } - $trailer_len -= $rounded_len; - - my $atom_data; - sysread($fh, $atom_data, $atom_len); - - if (!seek($fh, -$atom_len, SEEK_CUR)) - { - print ("* seek error in '$kernel_file'\n"); - return undef; - } - - push @$atoms, [ $atom_type, $atom_data ]; - } - - if (($$atoms[-1][0] eq "\x00\x00\x00\x00") && - ($$atoms[-1][1] eq "")) - { - pop @$atoms; - } - else - { - print ("* end marker missing from trailer\n"); - } - - return ($atoms, tell($fh)); -} - -sub format_atom -{ - my ($atom) = @_; - - my $format_func = $atom_formats{$atom->[0]} || \&format_hex; - return $format_func->($atom->[1]); -} - -sub format_bool -{ - my ($data) = @_; - return unpack('V', $data) ? 'y' : 'n'; -} - -sub format_int -{ - my ($data) = @_; - return unpack('V', $data); -} - -sub format_string -{ - my ($data) = @_; - return '"'.$data.'"'; -} - -sub format_hex -{ - my ($data) = @_; - return unpack('H*', $data); -} diff --git a/mkimage/mkknlimg b/mkimage/mkknlimg deleted file mode 100755 index b2bf5f9b6..000000000 --- a/mkimage/mkknlimg +++ /dev/null @@ -1,295 +0,0 @@ -#!/usr/bin/env perl -# ---------------------------------------------------------------------- -# mkknlimg by Phil Elwell for Raspberry Pi -# based on extract-ikconfig by Dick Streefland -# -# (c) 2009,2010 Dick Streefland -# (c) 2014,2015 Raspberry Pi (Trading) Limited -# -# Licensed under the terms of the GNU General Public License. -# ---------------------------------------------------------------------- - -use strict; -use warnings; -use integer; - -use constant FLAG_PI => 1; -use constant FLAG_DTOK => 2; -use constant FLAG_DDTK => 4; -use constant FLAG_283X => 8; - -my $trailer_magic = 'RPTL'; - -my $tmpfile1 = "/tmp/mkknlimg_$$.1"; -my $tmpfile2 = "/tmp/mkknlimg_$$.2"; - -my $dtok = 0; -my $ddtk = 0; -my $is_283x = 0; - -while (@ARGV && ($ARGV[0] =~ /^-/)) -{ - my $arg = shift(@ARGV); - if ($arg eq '--dtok') - { - $dtok = 1; - } - elsif ($arg eq '--ddtk') - { - $ddtk = 1; - } - elsif ($arg eq '--283x') - { - $is_283x = 1; - } - else - { - print ("* Unknown option '$arg'\n"); - usage(); - } -} - -usage() if (@ARGV != 2); - -my $kernel_file = $ARGV[0]; -my $out_file = $ARGV[1]; - -if (! -r $kernel_file) -{ - print ("* File '$kernel_file' not found\n"); - usage(); -} - -my $wanted_configs = -{ - 'CONFIG_BCM2708_DT' => FLAG_PI | FLAG_DTOK, - 'CONFIG_ARCH_BCM2835' => FLAG_PI | FLAG_DTOK | FLAG_283X, -}; - -my $wanted_strings = -{ - 'bcm2708_fb' => FLAG_PI, - 'brcm,bcm2835-mmc' => FLAG_PI, - 'brcm,bcm2835-sdhost' => FLAG_PI, - 'brcm,bcm2708-pinctrl' => FLAG_PI | FLAG_DTOK, - 'brcm,bcm2835-gpio' => FLAG_PI | FLAG_DTOK, - 'brcm,bcm2835-pm-wdt' => FLAG_PI | FLAG_DTOK | FLAG_283X, - 'of_overlay_apply' => FLAG_DTOK | FLAG_DDTK, -}; - -my $res = try_extract($kernel_file, $tmpfile1); -$res ||= try_decompress('\037\213\010', 'xy', 'gunzip', 0, - $kernel_file, $tmpfile1, $tmpfile2); -$res ||= try_decompress('\3757zXZ\000', 'abcde', 'unxz --single-stream', -1, - $kernel_file, $tmpfile1, $tmpfile2); -$res ||= try_decompress('BZh', 'xy', 'bunzip2', 0, - $kernel_file, $tmpfile1, $tmpfile2); -$res ||= try_decompress('\135\0\0\0', 'xxx', 'unlzma', 0, - $kernel_file, $tmpfile1, $tmpfile2); -$res ||= try_decompress('\211\114\132', 'xy', 'lzop -d', 0, - $kernel_file, $tmpfile1, $tmpfile2); -$res ||= try_decompress('\002\041\114\030', 'xy', 'lz4 -d', 1, - $kernel_file, $tmpfile1, $tmpfile2); - -my $append_trailer; -my $trailer; -my $kver = '?'; - -$append_trailer = $dtok; - -if ($res) -{ - $kver = $res->{'kver'} || '?'; - my $flags = $res->{'flags'}; - print("Version: $kver\n"); - - if ($flags & FLAG_PI) - { - $append_trailer = 1; - $dtok ||= ($flags & FLAG_DTOK) != 0; - $is_283x ||= ($flags & FLAG_283X) != 0; - $ddtk ||= ($flags & FLAG_DDTK) != 0; - } - else - { - print ("* This doesn't look like a Raspberry Pi kernel. In pass-through mode.\n"); - } -} -elsif (!$dtok) -{ - print ("* Is this a valid kernel? In pass-through mode.\n"); -} - -if ($append_trailer) -{ - printf("DT: %s\n", $dtok ? "y" : "n"); - printf("DDT: %s\n", $ddtk ? "y" : "n"); - printf("283x: %s\n", $is_283x ? "y" : "n"); - - my @atoms; - - push @atoms, [ $trailer_magic, pack('V', 0) ]; - push @atoms, [ 'KVer', $kver ]; - push @atoms, [ 'DTOK', pack('V', $dtok) ]; - push @atoms, [ 'DDTK', pack('V', $ddtk) ]; - push @atoms, [ '283x', pack('V', $is_283x) ]; - - $trailer = pack_trailer(\@atoms); - $atoms[0]->[1] = pack('V', length($trailer)); - - $trailer = pack_trailer(\@atoms); -} - -my $ofh; -my $total_len = 0; - -if ($out_file eq $kernel_file) -{ - die "* Failed to open '$out_file' for append\n" - if (!open($ofh, '>>', $out_file)); - $total_len = tell($ofh); -} -else -{ - die "* Failed to open '$kernel_file'\n" - if (!open(my $ifh, '<', $kernel_file)); - die "* Failed to create '$out_file'\n" - if (!open($ofh, '>', $out_file)); - - my $copybuf; - while (1) - { - my $bytes = sysread($ifh, $copybuf, 64*1024); - last if (!$bytes); - syswrite($ofh, $copybuf, $bytes); - $total_len += $bytes; - } - close($ifh); -} - -if ($trailer) -{ - # Pad to word-alignment - syswrite($ofh, "\x000\x000\x000", (-$total_len & 0x3)); - syswrite($ofh, $trailer); -} - -close($ofh); - -exit($trailer ? 0 : 1); - -END { - unlink($tmpfile1) if ($tmpfile1); - unlink($tmpfile2) if ($tmpfile2); -} - - -sub usage -{ - print ("Usage: mkknlimg [--dtok] [--283x] \n"); - exit(1); -} - -sub try_extract -{ - my ($knl, $tmp) = @_; - - my $ver = `strings "$knl" | grep -a -E "^Linux version [1-9]"`; - - return undef if (!$ver); - - chomp($ver); - - my $res = { 'kver'=>$ver }; - $res->{'flags'} = strings_to_flags($knl, $wanted_strings) | - configs_to_flags($knl, $tmp, $wanted_configs); - - return $res; -} - - -sub try_decompress -{ - my ($magic, $subst, $zcat, $idx, $knl, $tmp1, $tmp2) = @_; - - my $pos = `tr "$magic\n$subst" "\n$subst=" < "$knl" | grep -abo "^$subst"`; - if ($pos) - { - chomp($pos); - $pos = (split(/[\r\n]+/, $pos))[$idx]; - return undef if (!defined($pos)); - $pos =~ s/:.*[\r\n]*$//s; - my $cmd = "tail -c+$pos \"$knl\" | $zcat > $tmp2 2> /dev/null"; - my $err = (system($cmd) >> 8); - return undef if (($err != 0) && ($err != 2)); - - return try_extract($tmp2, $tmp1); - } - - return undef; -} - - -sub strings_to_flags -{ - my ($knl, $strings) = @_; - my $string_pattern = '^('.join('|', keys(%$strings)).')$'; - my $flags = 0; - - my @matches = `strings \"$knl\" | grep -E \"$string_pattern\"`; - foreach my $match (@matches) - { - chomp($match); - $flags |= $strings->{$match}; - } - - return $flags; -} - -sub configs_to_flags -{ - my ($knl, $tmp, $configs) = @_; - my $config_pattern = '^('.join('|', keys(%$configs)).')=(.*)$'; - my $cf1 = 'IKCFG_ST\037\213\010'; - my $cf2 = '0123456789'; - my $flags = 0; - - my $pos = `tr "$cf1\n$cf2" "\n$cf2=" < "$knl" | grep -abo "^$cf2"`; - if ($pos) - { - $pos =~ s/:.*[\r\n]*$//s; - $pos += 8; - my $err = (system("tail -c+$pos \"$knl\" | zcat > $tmp 2> /dev/null") >> 8); - if (($err == 0) || ($err == 2)) - { - if (open(my $fh, '<', $tmp)) - { - while (my $line = <$fh>) - { - chomp($line); - if (($line =~ /$config_pattern/) && - (($2 eq 'y') || ($2 eq 'm'))) - { - $flags |= $configs->{$1}; - } - } - - close($fh); - } - } - } - - return $flags; -} - -sub pack_trailer -{ - my ($atoms) = @_; - my $trailer = pack('VV', 0, 0); - for (my $i = $#$atoms; $i>=0; $i--) - { - my $atom = $atoms->[$i]; - $trailer .= pack('a*x!4Va4', $atom->[1], length($atom->[1]), $atom->[0]); - } - return $trailer; -}