summaryrefslogtreecommitdiffstats
path: root/kernel/modules.pl
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/modules.pl')
-rw-r--r--kernel/modules.pl133
1 files changed, 85 insertions, 48 deletions
diff --git a/kernel/modules.pl b/kernel/modules.pl
index b64c92fa2..a36d1fa1e 100644
--- a/kernel/modules.pl
+++ b/kernel/modules.pl
@@ -41,42 +41,33 @@ sub modules() {
@nls_modules, map { category2modules($_) } split(' ', $images_cat);
}
-sub get_firmwares() {
+sub list_needed_modules {
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");
+ load_dependencies("/lib/modules/$kern_ver/modules.dep");
my @all = modules();
my @all_with_deps = map { dependencies_closure($_) } @all;
- my %wanted_modules = map { (list_modules::modname2filename($_) . ".ko.xz" => 1) } @all_with_deps;
- foreach (all("all.kernels/$kern_ver/modules")) {
- $wanted_modules{$_} or unlink "all.kernels/$kern_ver/modules/$_";
+ my %wanted_modules = map { (list_modules::modname2filename($_) => 1) } @all_with_deps;
+ foreach (`find /lib/modules/$kern_ver -name '*.ko.?z'`) {
+ my $modfile = basename($_);
+ $modfile =~ s/\.ko\.xz//;
+ $wanted_modules{$modfile} and print "$modfile\n";
}
}
-sub make_modules_per_image {
+sub list_fake_modules {
my ($kern_ver) = @_;
- my $dir = "all.kernels/$kern_ver/modules";
-
- system("cd $dir ; tar cf ../all_modules.tar *.ko.*") == 0 or die "tar failed\n";
-}
+ load_dependencies("/lib/modules/$kern_ver/modules.dep");
-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`);
+ my @all = map { category2modules($_) } split(' ', 'multimedia/*');
+ my %wanted_modules = map { (list_modules::modname2filename($_) => 1) } @all;
+ foreach (`find /lib/modules/$kern_ver -name '*.ko.?z'`) {
+ my $modfile = basename($_);
+ $modfile =~ s/\.ko\.xz//;
+ $wanted_modules{$modfile} and print "$modfile\n";
+ }
}
sub pci_modules4stage1 {
@@ -85,7 +76,29 @@ sub pci_modules4stage1 {
print "$_\n" foreach uniq(map { dependencies_closure($_) } @modules);
}
+sub get_kernel_modules {
+ my ($kern_ver) = @_;
+
+ my @module_list;
+ foreach (sort(cat_("/lib/modules/$kern_ver/modules.dep"))) {
+ my ($module, $discard) = split(':', $_);
+ push @module_list, $module;
+ }
+ foreach (sort(cat_("/lib/modules/$kern_ver/modules.builtin"))) {
+ my ($module, $discard) = split(':', $_);
+ push @module_list, $module;
+ }
+ @module_list;
+}
+
sub check() {
+ my ($kern_ver) = @_;
+
+ if (!$kern_ver) {
+ $kern_ver = `uname -r`;
+ chomp($kern_ver);
+ }
+
my $error;
my %listed;
while (my ($t1, $l) = each %list_modules::l) {
@@ -100,25 +113,21 @@ sub check() {
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;
- }
+ my %not_listed;
+ foreach (@_) {
+ my $path = dirname($_);
+ my $name = basename($_);
+ $name =~ s/\.ko(\.xz)?$//;
+ delete $deprecated_modules{$name};
+ next if $listed{$name};
+ $module2category{list_modules::filename2modname($name)} = $path;
+ push @{$not_listed{$path}}, $name;
+ }
+ if ($verbose) {
+ print "NOT LISTED $_: ", 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*`));
+ $not_listed->(get_kernel_modules($kern_ver));
if (%deprecated_modules) {
my %per_cat;
push @{$per_cat{$listed{$_}}}, $_ foreach keys %deprecated_modules;
@@ -132,24 +141,52 @@ sub check() {
my $pcitable = read_pcitable("/usr/share/ldetect-lst/pcitable");
my $usbtable = read_pcitable("/usr/share/ldetect-lst/usbtable");
+ my @l0 = map { list_modules::filename2modname($_) } keys %listed;
+
my @l1 = uniq grep { !/:/ && $_ ne 'unknown' } map { $_->[0] } values %$pcitable;
- if (my @l = difference2(\@l1, [ keys %listed ])) {
+ if (my @l = difference2(\@l1, \@l0)) {
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;
+ print STDERR "pcitable modules not listed in $_: ", join(" ", sort @{$not_listed{$_}}), "\n" foreach sort keys %not_listed;
+ print STDERR "note: pcitable module names need to be mapped to file names when updating list_modules.pm\n" if %not_listed;
+ $error = 1;
}
my @l2 = uniq grep { !/:/ && $_ ne 'unknown' } map { $_->[0] } values %$usbtable;
- if (my @l = difference2(\@l2, [ keys %listed ])) {
+ if (my @l = difference2(\@l2, \@l0)) {
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;
+ if (my $l = delete $not_listed{''}) {
+ print "bad/old usbtable modules : ", join(" ", @$l), "\n";
+ }
+ print STDERR "usbtable modules not listed in $_: ", join(" ", sort @{$not_listed{$_}}), "\n" foreach sort keys %not_listed;
+ print STDERR "note: usbtable module names need to be mapped to file names when updating list_modules.pm\n" if %not_listed;
+ $error = 1;
}
}
exit $error;
}
+
+sub list_additional_firmware {
+ my ($kern_ver) = @_;
+
+ # The firmware reported by 'modinfo iwlwifi' is the latest supported version of each firmware
+ # type. Sometimes the latest supported version is not available, and the driver falls back to
+ # an older version. This means dracut doesn't automatically identify and include the necessary
+ # firmware files, so we need to list them here (mga#9541).
+ foreach (map { /^firmware:\s+(.*)/ ? $1 : () } split("\n", `modinfo -k $kern_ver iwlwifi`)) {
+ next if -f "/lib/firmware/$_";
+ my ($basename, $version) = /(.*)-([0-9]+).ucode/;
+ while ($version-- > 0) {
+ my $filepath = "/lib/firmware/$basename-$version.ucode";
+ if (-f $filepath) {
+ print "$filepath\n";
+ last;
+ }
+ }
+ }
+}