summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--perl-install/any.pm17
-rw-r--r--perl-install/bootloader.pm40
-rw-r--r--perl-install/install_steps.pm15
3 files changed, 50 insertions, 22 deletions
diff --git a/perl-install/any.pm b/perl-install/any.pm
index 235033fa9..779f8fd11 100644
--- a/perl-install/any.pm
+++ b/perl-install/any.pm
@@ -239,8 +239,8 @@ sub setupBootloader__general {
($b->{method}, my $method_choices) = bootloader::method_choices($fstab);
my $profiles = bootloader::has_profiles($b);
- my $previous_acpi_val = bootloader::get_append($b, 'acpi');
- my $force_acpi = $previous_acpi_val eq 'on';
+ my $prev_force_acpi = my $force_acpi = bootloader::get_append($b, 'acpi') ne 'off';
+ my $prev_force_noapic = my $force_noapic = bootloader::get_append($b, 'noapic');
my $memsize = bootloader::get_append($b, 'mem');
my $prev_clean_tmp = my $clean_tmp = any { $_->{mntpoint} eq '/tmp' } @{$all_hds->{special} ||= []};
my $prev_boot = $b->{boot};
@@ -261,9 +261,8 @@ sub setupBootloader__general {
{ label => N("Video mode"), val => \$b->{vga}, list => [ keys %bootloader::vga_modes ], not_edit => !$::expert, format => sub { $bootloader::vga_modes{$_[0]} }, advanced => 1 },
),
{ label => N("Delay before booting default image"), val => \$b->{timeout} },
- if_($previous_acpi_val,
{ label => N("Force ACPI"), val => \$force_acpi, type => 'bool' },
- ),
+ { label => N("Force No APIC"), val => \$force_noapic, type => 'bool' },
if_($security >= 4 || $b->{password} || $b->{restricted},
{ label => N("Password"), val => \$b->{password}, hidden => 1 },
{ label => N("Password (again)"), val => \$b->{password2}, hidden => 1 },
@@ -309,10 +308,12 @@ sub setupBootloader__general {
}
bootloader::set_profiles($b, $profiles);
- bootloader::add_append($b, "mem", $memsize);
- if ($previous_acpi_val) {
- my $s = $force_acpi ? 'on' : 'off';
- bootloader::add_append($b, acpi => $s) if $s ne $previous_acpi_val;
+ bootloader::set_append($b, "mem", $memsize);
+ if ($prev_force_acpi != $force_acpi) {
+ bootloader::set_append($b, acpi => ($force_acpi ? '' : 'off'));
+ }
+ if ($prev_force_noapic != $force_noapic) {
+ ($force_noapic ? \&bootloader::set_append : \&bootloader::remove_append_simple)->($b, 'noapic');
}
if ($prev_clean_tmp != $clean_tmp) {
diff --git a/perl-install/bootloader.pm b/perl-install/bootloader.pm
index 82677b0b0..c60e84f77 100644
--- a/perl-install/bootloader.pm
+++ b/perl-install/bootloader.pm
@@ -270,7 +270,10 @@ sub append__mem_is_memsize { $_[0] =~ /^\d+[kM]?$/i }
sub get_append {
my ($b, $key) = @_;
- my (undef, $dict) = unpack_append($b->{perImageAppend});
+ my ($simple, $dict) = unpack_append($b->{perImageAppend});
+ if (member($key, @$simple)) {
+ return 1;
+ }
my @l = map { $_->[1] } grep { $_->[0] eq $key } @$dict;
#- suppose we want the memsize
@@ -279,20 +282,41 @@ sub get_append {
log::l("more than one $key in $b->{perImageAppend}") if @l > 1;
$l[0];
}
-sub add_append {
- my ($b, $key, $val) = @_;
+sub modify_append {
+ my ($b, $f) = @_;
foreach (\$b->{perImageAppend}, map { \$_->{append} } grep { $_->{type} eq 'image' } @{$b->{entries}}) {
my ($simple, $dict) = unpack_append($$_);
- @$dict = grep { $_->[0] ne $key || $key eq 'mem' && append__mem_is_memsize($_->[1]) != append__mem_is_memsize($val) } @$dict;
- push @$dict, [ $key, $val ] if $val;
+ $f->($simple, $dict);
$$_ = pack_append($simple, $dict);
- log::l("add_append: $$_");
+ log::l("modify_append: $$_");
}
}
+sub remove_append_simple {
+ my ($b, $key) = @_;
+ modify_append($b, sub {
+ my ($simple, $_dict) = @_;
+ @$simple = grep { $_ ne $key } @$simple;
+ });
+}
+sub set_append {
+ my ($b, $key, $val) = @_;
+ my $has_val = @_ > 2;
+
+ modify_append($b, sub {
+ my ($simple, $dict) = @_;
+ if ($has_val) {
+ @$dict = grep { $_->[0] ne $key || $key eq 'mem' && append__mem_is_memsize($_->[1]) != append__mem_is_memsize($val) } @$dict;
+ push @$dict, [ $key, $val ] if $val;
+ } else {
+ @$simple = grep { $_ ne $key } @$simple;
+ push @$simple, $key;
+ }
+ });
+}
sub may_append {
my ($b, $key, $val) = @_;
- add_append($b, $key, $val) if !get_append($b, $key);
+ set_append($b, $key, $val) if !get_append($b, $key);
}
sub configure_entry {
@@ -472,7 +496,7 @@ wait %d seconds for default boot.
add2hash_($bootloader, { memsize => $1 }) if cat_("/proc/cmdline") =~ /\bmem=(\d+[KkMm]?)(?:\s.*)?$/;
if (my ($s, $port, $speed) = cat_("/proc/cmdline") =~ /console=(ttyS(\d),(\d+)\S*)/) {
log::l("serial console $s $port $speed");
- add_append($bootloader, 'console' => $s);
+ set_append($bootloader, 'console' => $s);
any::set_login_serial_console($port, $speed);
}
diff --git a/perl-install/install_steps.pm b/perl-install/install_steps.pm
index 7bb4a8101..d4c2826e6 100644
--- a/perl-install/install_steps.pm
+++ b/perl-install/install_steps.pm
@@ -823,19 +823,22 @@ sub setupBootloaderBefore {
require bootloader;
if (my @l = (grep { $_->{bus} eq 'ide' } detect_devices::burners(), detect_devices::raw_zips())) {
- bootloader::add_append($o->{bootloader}, $_->{device}, 'ide-scsi') foreach @l;
+ bootloader::set_append($o->{bootloader}, $_->{device}, 'ide-scsi') foreach @l;
}
if ($o->{miscellaneous}{HDPARM}) {
- bootloader::add_append($o->{bootloader}, $_, 'autotune') foreach grep { /ide.*/ } all("/proc/ide");
+ bootloader::set_append($o->{bootloader}, $_, 'autotune') foreach grep { /ide.*/ } all("/proc/ide");
}
if (cat_("/proc/cmdline") =~ /mem=nopentium/) {
- bootloader::add_append($o->{bootloader}, 'mem', 'nopentium');
+ bootloader::set_append($o->{bootloader}, 'mem', 'nopentium');
}
if (cat_("/proc/cmdline") =~ /\b(pci)=(\S+)/) {
- bootloader::add_append($o->{bootloader}, $1, $2);
+ bootloader::set_append($o->{bootloader}, $1, $2);
}
- if (my ($acpi) = cat_("/proc/cmdline") =~ /\bacpi=(\S+)/) {
- bootloader::add_append($o->{bootloader}, acpi => $acpi);
+ if (cat_("/proc/cmdline") =~ /\bacpi=off/) {
+ bootloader::set_append($o->{bootloader}, acpi => 'off');
+ }
+ if (cat_("/proc/cmdline") =~ /\bnoapic/) {
+ bootloader::set_append($o->{bootloader}, 'noapic');
}
if (arch() =~ /alpha/) {