diff options
Diffstat (limited to 'kernel/modules.pl')
-rw-r--r-- | kernel/modules.pl | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/kernel/modules.pl b/kernel/modules.pl new file mode 100644 index 000000000..a47b272f9 --- /dev/null +++ b/kernel/modules.pl @@ -0,0 +1,155 @@ +use strict; + + +BEGIN { + #- for testing purpose + (my $f = __FILE__) =~ s|/[^/]*$||; + push @INC, $f; +} + +use MDK::Common; +use list_modules; + + +sub flatten_and_check { + my ($h) = @_; + map { + my $category = $_; + my @l = @{$h->{$category}}; + if (my @bad = difference2(\@l, [ category2modules($category) ])) { + foreach (@bad) { + if (my $cat = module2category($_)) { + warn "ERROR in modules.pl: module $_ is in category $cat, not in $category\n"; + } else { + warn "ERROR in modules.pl: unknown module $_\n"; + } + } + exit 1; + } + @l; + } keys %$h; +} + +my $images_cat = 'fs/* disk/* bus/* network/* input/* various/*'; #- ie everything except multimedia + +my $verbose = $ARGV[0] eq '-v' && shift; +my ($f, @para) = @ARGV; +$::{$f}->(@para); + +sub modules() { + my @nls_modules = ('nls_cp437', 'nls_iso8859_1'); + @nls_modules, map { category2modules($_) } split(' ', $images_cat); +} + +sub get_firmwares() { + my ($kern_ver) = @_; + + foreach (all("all.kernels/$kern_ver/modules")) { + foreach(`/sbin/modinfo -Ffirmware "all.kernels/$kern_ver/modules/$_"`) { + mkdir_p(dirname("all.kernels/$kern_ver/firmware/$_")); + eval { cp_af("/lib/firmware/$_", "all.kernels/$kern_ver/firmware/$_"); }; + } + } +} + +sub remove_unneeded_modules { + my ($kern_ver) = @_; + + load_dependencies("all.kernels/$kern_ver/modules.dep"); + + my @all = modules(); + my @all_with_deps = map { dependencies_closure($_) } @all; + my %wanted_modules = map { (list_modules::modname2filename($_) . ".ko.gz" => 1) } @all_with_deps; + foreach (all("all.kernels/$kern_ver/modules")) { + $wanted_modules{$_} or unlink "all.kernels/$kern_ver/modules/$_"; + } +} + +sub make_modules_per_image { + my ($kern_ver) = @_; + + my $dir = "all.kernels/$kern_ver/modules"; + + system("cd $dir ; tar cf ../all_modules.tar *.ko.gz") == 0 or die "tar failed\n"; +} + +sub get_main_modules() { + my $base = dirname($0); + my $main = chomp_(cat_("$base/RPMS/.main")); + chomp_(`tar tf $base/all.kernels/$main/all_modules.tar`); +} + +sub pci_modules4stage1 { + my ($category) = @_; + my @modules = difference2([ category2modules($category) ]); + print "$_\n" foreach uniq(map { dependencies_closure($_) } @modules); +} + +sub check() { + my $error; + my %listed; + while (my ($t1, $l) = each %list_modules::l) { + while (my ($t2, $l) = each %$l) { + ref $l or die "bad $l in $t1/$t2"; + foreach (@$l) { + $listed{$_} = "$t1/$t2"; + } + } + } + + my %module2category; + my %deprecated_modules = %listed; + my $not_listed = sub { + my ($msg, $verbose, @l) = @_; + my %not_listed; + foreach (@l) { + my ($mod) = m|([^/]*)\.k?o(\.gz)?$| or next; + delete $deprecated_modules{$mod}; + next if $listed{$mod}; + s|.*?mdk/||; + s|kernel/||; s|drivers/||; s|3rdparty/||; + $_ = dirname $_; + $_ = dirname $_ if $mod eq basename($_); + $module2category{$mod} = $_; + push @{$not_listed{$_}}, $mod; + } + if ($verbose) { + print "$msg $_: ", join(" ", @{$not_listed{$_}}), "\n" foreach sort keys %not_listed; + } + }; + $not_listed->('NOT LISTED', 1, get_main_modules()); + $not_listed->('not listed', $verbose, chomp_(`rpm -qpl RPMS/kernel-*2.6*`)); + if (%deprecated_modules) { + my %per_cat; + push @{$per_cat{$listed{$_}}}, $_ foreach keys %deprecated_modules; + foreach my $cat (sort keys %per_cat) { + print "bad/old modules ($cat) : ", join(" ", sort @{$per_cat{$cat}}), "\n"; + } + } + + { + require '/usr/bin/merge2pcitable.pl'; + my $pcitable = read_pcitable("/usr/share/ldetect-lst/pcitable"); + my $usbtable = read_pcitable("/usr/share/ldetect-lst/usbtable"); + + my @l1 = uniq grep { !/:/ && $_ ne 'unknown' } map { $_->[0] } values %$pcitable; + if (my @l = difference2(\@l1, [ keys %listed ])) { + my %not_listed; + push @{$not_listed{$module2category{$_}}}, $_ foreach @l; + if (my $l = delete $not_listed{''}) { + print "bad/old pcitable modules : ", join(" ", @$l), "\n"; + } + print STDERR "PCITABLE MODULES NOT LISTED $_: ", join(" ", sort @{$not_listed{$_}}), "\n" foreach sort keys %not_listed; + #$error = 1; + } + + my @l2 = uniq grep { !/:/ && $_ ne 'unknown' } map { $_->[0] } values %$usbtable; + if (my @l = difference2(\@l2, [ keys %listed ])) { + my %not_listed; + push @{$not_listed{$module2category{$_}}}, $_ foreach @l; + print STDERR "usbtable modules not listed $_: ", join(" ", sort @{$not_listed{$_}}), "\n" foreach sort keys %not_listed; + } + } + + exit $error; +} |