diff --git a/man/systemctl.xml b/man/systemctl.xml
index 4651e89510..1882cd756c 100644
--- a/man/systemctl.xml
+++ b/man/systemctl.xml
@@ -2607,9 +2607,10 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
- When used with the reboot command, indicate to the system's firmware to
- reboot into the firmware setup interface. Note that this functionality is not available on all
- systems.
+ When used with the reboot, poweroff, or
+ halt command, indicate to the system's firmware to reboot into the firmware
+ setup interface for the next boot. Note that this functionality is not available on all systems.
+
@@ -2619,10 +2620,11 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
- When used with the reboot command, indicate to the system's boot loader to
- show the boot loader menu on the following boot. Takes a time value as parameter — indicating the
- menu timeout. Pass zero in order to disable the menu timeout. Note that not all boot loaders
- support this functionality.
+ When used with the reboot, poweroff, or
+ halt command, indicate to the system's boot loader to show the boot loader menu
+ on the following boot. Takes a time value as parameter — indicating the menu timeout. Pass zero
+ in order to disable the menu timeout. Note that not all boot loaders support this functionality.
+
@@ -2632,10 +2634,11 @@ Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output err
- When used with the reboot command, indicate to the system's boot loader to
- boot into a specific boot loader entry on the following boot. Takes a boot loader entry identifier
- as argument, or help in order to list available entries. Note that not all boot
- loaders support this functionality.
+ When used with the reboot, poweroff, or
+ halt command, indicate to the system's boot loader to boot into a specific
+ boot loader entry on the following boot. Takes a boot loader entry identifier as argument,
+ or help in order to list available entries. Note that not all boot loaders
+ support this functionality.
diff --git a/src/systemctl/systemctl-start-special.c b/src/systemctl/systemctl-start-special.c
index 2cf746c5a6..d486b406da 100644
--- a/src/systemctl/systemctl-start-special.c
+++ b/src/systemctl/systemctl-start-special.c
@@ -121,8 +121,7 @@ static int set_exit_code(uint8_t code) {
}
int verb_start_special(int argc, char *argv[], void *userdata) {
- bool termination_action; /* An action that terminates the manager, can be performed also by
- * signal. */
+ bool termination_action; /* An action that terminates the system, can be performed also by signal. */
enum action a;
int r;
@@ -140,17 +139,21 @@ int verb_start_special(int argc, char *argv[], void *userdata) {
return r;
}
- r = prepare_firmware_setup();
- if (r < 0)
- return r;
+ termination_action = IN_SET(a, ACTION_HALT, ACTION_POWEROFF, ACTION_REBOOT);
- r = prepare_boot_loader_menu();
- if (r < 0)
- return r;
+ if (termination_action) {
+ r = prepare_firmware_setup();
+ if (r < 0)
+ return r;
- r = prepare_boot_loader_entry();
- if (r < 0)
- return r;
+ r = prepare_boot_loader_menu();
+ if (r < 0)
+ return r;
+
+ r = prepare_boot_loader_entry();
+ if (r < 0)
+ return r;
+ }
if (a == ACTION_REBOOT) {
if (arg_reboot_argument) {
@@ -181,10 +184,6 @@ int verb_start_special(int argc, char *argv[], void *userdata) {
return r;
}
- termination_action = IN_SET(a,
- ACTION_HALT,
- ACTION_POWEROFF,
- ACTION_REBOOT);
if (termination_action && arg_force >= 2)
return halt_now(a);