| From 92edd947827baa353c18ed22d941f5e718907ca1 Mon Sep 17 00:00:00 2001 |
| From: Colin Watson <cjwatson@ubuntu.com> |
| Date: Mon, 13 Jan 2014 12:13:26 +0000 |
| Subject: [PATCH] Add configure option to reduce visual clutter at boot time |
| |
| If this option is enabled, then do all of the following: |
| |
| Don't display introductory message about line editing unless we're |
| actually offering a shell prompt. (This is believed to be a workaround |
| for a different bug. We'll go with this for now, but will drop this in |
| favour of a better fix upstream if somebody figures out what that is.) |
| |
| Don't clear the screen just before booting if we never drew the menu in |
| the first place. |
| |
| Remove verbose messages printed before reading configuration. In some |
| ways this is awkward because it makes debugging harder, but it's a |
| requirement for a smooth-looking boot process; we may be able to do |
| better in future. Upstream doesn't want this, though. |
| |
| Disable the cursor as well, for similar reasons of tidiness. |
| |
| Suppress kernel/initrd progress messages, except in recovery mode. |
| |
| Suppress "GRUB loading" message unless Shift is held down. Upstream |
| doesn't want this, as it makes debugging harder. Ubuntu wants it to |
| provide a cleaner boot experience. |
| |
| Author: Will Thompson <will@willthompson.co.uk> |
| Bug-Ubuntu: https://bugs.launchpad.net/bugs/386922 |
| Bug-Ubuntu: https://bugs.launchpad.net/bugs/861048 |
| Forwarded: (partial) http://lists.gnu.org/archive/html/grub-devel/2009-09/msg00056.html |
| Last-Update: 2021-09-24 |
| |
| Patch-Name: maybe-quiet.patch |
| --- |
| config.h.in | 2 ++ |
| configure.ac | 15 +++++++++++++++ |
| grub-core/boot/i386/pc/boot.S | 11 +++++++++++ |
| grub-core/boot/i386/pc/diskboot.S | 26 ++++++++++++++++++++++++++ |
| grub-core/kern/main.c | 17 +++++++++++++++++ |
| grub-core/kern/rescue_reader.c | 2 ++ |
| grub-core/normal/main.c | 11 +++++++++++ |
| grub-core/normal/menu.c | 17 +++++++++++++++-- |
| 8 files changed, 99 insertions(+), 2 deletions(-) |
| |
| diff --git a/config.h.in b/config.h.in |
| index 9e8f9911b..d2c4ce8e5 100644 |
| --- a/config.h.in |
| +++ b/config.h.in |
| @@ -12,6 +12,8 @@ |
| /* Define to 1 to enable disk cache statistics. */ |
| #define DISK_CACHE_STATS @DISK_CACHE_STATS@ |
| #define BOOT_TIME_STATS @BOOT_TIME_STATS@ |
| +/* Define to 1 to make GRUB quieter at boot time. */ |
| +#define QUIET_BOOT @QUIET_BOOT@ |
| |
| /* We don't need those. */ |
| #define MINILZO_CFG_SKIP_LZO_PTR 1 |
| diff --git a/configure.ac b/configure.ac |
| index 7517fc49d..fb9346f84 100644 |
| --- a/configure.ac |
| +++ b/configure.ac |
| @@ -1905,6 +1905,16 @@ AC_SUBST([LIBZFS]) |
| AC_SUBST([LIBNVPAIR]) |
| |
| LIBS="" |
| +AC_ARG_ENABLE([quiet-boot], |
| + [AS_HELP_STRING([--enable-quiet-boot], |
| + [emit fewer messages at boot time (default=no)])], |
| + [], [enable_quiet_boot=no]) |
| +if test x"$enable_quiet_boot" = xyes ; then |
| + QUIET_BOOT=1 |
| +else |
| + QUIET_BOOT=0 |
| +fi |
| +AC_SUBST([QUIET_BOOT]) |
| |
| AC_SUBST([FONT_SOURCE]) |
| AS_IF([test x$target_cpu = xi386 -a x$platform = xqemu], |
| @@ -2166,5 +2176,10 @@ echo "With stack smashing protector: Yes" |
| else |
| echo "With stack smashing protector: No" |
| fi |
| +if [ x"$enable_quiet_boot" = xyes ]; then |
| +echo With quiet boot: Yes |
| +else |
| +echo With quiet boot: No |
| +fi |
| echo "*******************************************************" |
| ] |
| diff --git a/grub-core/boot/i386/pc/boot.S b/grub-core/boot/i386/pc/boot.S |
| index 2bd0b2d28..b0c0f2225 100644 |
| --- a/grub-core/boot/i386/pc/boot.S |
| +++ b/grub-core/boot/i386/pc/boot.S |
| @@ -19,6 +19,9 @@ |
| |
| #include <grub/symbol.h> |
| #include <grub/machine/boot.h> |
| +#if QUIET_BOOT && !defined(HYBRID_BOOT) |
| +#include <grub/machine/memory.h> |
| +#endif |
| |
| /* |
| * defines for the code go here |
| @@ -249,9 +252,17 @@ real_start: |
| /* save drive reference first thing! */ |
| pushw %dx |
| |
| +#if QUIET_BOOT && !defined(HYBRID_BOOT) |
| + /* is either shift key held down? */ |
| + movw $(GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR + 0x17), %bx |
| + testb $3, (%bx) |
| + jz 2f |
| +#endif |
| + |
| /* print a notification message on the screen */ |
| MSG(notification_string) |
| |
| +2: |
| /* set %si to the disk address packet */ |
| movw $disk_address_packet, %si |
| |
| diff --git a/grub-core/boot/i386/pc/diskboot.S b/grub-core/boot/i386/pc/diskboot.S |
| index c1addc0df..9b6d7a7ed 100644 |
| --- a/grub-core/boot/i386/pc/diskboot.S |
| +++ b/grub-core/boot/i386/pc/diskboot.S |
| @@ -18,6 +18,9 @@ |
| |
| #include <grub/symbol.h> |
| #include <grub/machine/boot.h> |
| +#if QUIET_BOOT |
| +#include <grub/machine/memory.h> |
| +#endif |
| |
| /* |
| * defines for the code go here |
| @@ -25,6 +28,12 @@ |
| |
| #define MSG(x) movw $x, %si; call LOCAL(message) |
| |
| +#if QUIET_BOOT |
| +#define SILENT(x) call LOCAL(check_silent); jz LOCAL(x) |
| +#else |
| +#define SILENT(x) |
| +#endif |
| + |
| .file "diskboot.S" |
| |
| .text |
| @@ -50,11 +59,14 @@ _start: |
| /* save drive reference first thing! */ |
| pushw %dx |
| |
| + SILENT(after_notification_string) |
| + |
| /* print a notification message on the screen */ |
| pushw %si |
| MSG(notification_string) |
| popw %si |
| |
| +LOCAL(after_notification_string): |
| /* this sets up for the first run through "bootloop" */ |
| movw $LOCAL(firstlist), %di |
| |
| @@ -279,7 +291,10 @@ LOCAL(copy_buffer): |
| /* restore addressing regs and print a dot with correct DS |
| (MSG modifies SI, which is saved, and unused AX and BX) */ |
| popw %ds |
| + SILENT(after_notification_step) |
| MSG(notification_step) |
| + |
| +LOCAL(after_notification_step): |
| popa |
| |
| /* check if finished with this dataset */ |
| @@ -295,8 +310,11 @@ LOCAL(copy_buffer): |
| /* END OF MAIN LOOP */ |
| |
| LOCAL(bootit): |
| + SILENT(after_notification_done) |
| /* print a newline */ |
| MSG(notification_done) |
| + |
| +LOCAL(after_notification_done): |
| popw %dx /* this makes sure %dl is our "boot" drive */ |
| ljmp $0, $(GRUB_BOOT_MACHINE_KERNEL_ADDR + 0x200) |
| |
| @@ -320,6 +338,14 @@ LOCAL(general_error): |
| /* go here when you need to stop the machine hard after an error condition */ |
| LOCAL(stop): jmp LOCAL(stop) |
| |
| +#if QUIET_BOOT |
| +LOCAL(check_silent): |
| + /* is either shift key held down? */ |
| + movw $(GRUB_MEMORY_MACHINE_BIOS_DATA_AREA_ADDR + 0x17), %bx |
| + testb $3, (%bx) |
| + ret |
| +#endif |
| + |
| notification_string: .asciz "loading" |
| |
| notification_step: .asciz "." |
| diff --git a/grub-core/kern/main.c b/grub-core/kern/main.c |
| index 73967e2f5..2879d644a 100644 |
| --- a/grub-core/kern/main.c |
| +++ b/grub-core/kern/main.c |
| @@ -265,15 +265,25 @@ reclaim_module_space (void) |
| void __attribute__ ((noreturn)) |
| grub_main (void) |
| { |
| +#if QUIET_BOOT |
| + struct grub_term_output *term; |
| +#endif |
| + |
| /* First of all, initialize the machine. */ |
| grub_machine_init (); |
| |
| grub_boot_time ("After machine init."); |
| |
| +#if QUIET_BOOT |
| + /* Disable the cursor until we need it. */ |
| + FOR_ACTIVE_TERM_OUTPUTS(term) |
| + grub_term_setcursor (term, 0); |
| +#else |
| /* Hello. */ |
| grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT); |
| grub_printf ("Welcome to GRUB!\n\n"); |
| grub_setcolorstate (GRUB_TERM_COLOR_STANDARD); |
| +#endif |
| |
| /* Init verifiers API. */ |
| grub_verifiers_init (); |
| @@ -312,5 +322,12 @@ grub_main (void) |
| grub_boot_time ("After execution of embedded config. Attempt to go to normal mode"); |
| |
| grub_load_normal_mode (); |
| + |
| +#if QUIET_BOOT |
| + /* If we have to enter rescue mode, enable the cursor again. */ |
| + FOR_ACTIVE_TERM_OUTPUTS(term) |
| + grub_term_setcursor (term, 1); |
| +#endif |
| + |
| grub_rescue_run (); |
| } |
| diff --git a/grub-core/kern/rescue_reader.c b/grub-core/kern/rescue_reader.c |
| index dcd7d4439..a93524eab 100644 |
| --- a/grub-core/kern/rescue_reader.c |
| +++ b/grub-core/kern/rescue_reader.c |
| @@ -78,7 +78,9 @@ grub_rescue_read_line (char **line, int cont, |
| void __attribute__ ((noreturn)) |
| grub_rescue_run (void) |
| { |
| +#if QUIET_BOOT |
| grub_printf ("Entering rescue mode...\n"); |
| +#endif |
| |
| while (1) |
| { |
| diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c |
| index c4ebe9e22..a1750e09c 100644 |
| --- a/grub-core/normal/main.c |
| +++ b/grub-core/normal/main.c |
| @@ -407,6 +407,15 @@ static grub_err_t |
| grub_normal_read_line_real (char **line, int cont, int nested) |
| { |
| const char *prompt; |
| +#if QUIET_BOOT |
| + static int displayed_intro; |
| + |
| + if (! displayed_intro) |
| + { |
| + grub_normal_reader_init (nested); |
| + displayed_intro = 1; |
| + } |
| +#endif |
| |
| if (cont) |
| /* TRANSLATORS: it's command line prompt. */ |
| @@ -459,7 +468,9 @@ grub_cmdline_run (int nested, int force_auth) |
| return; |
| } |
| |
| +#if !QUIET_BOOT |
| grub_normal_reader_init (nested); |
| +#endif |
| |
| while (1) |
| { |
| diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c |
| index 8397886fa..e9d8444b5 100644 |
| --- a/grub-core/normal/menu.c |
| +++ b/grub-core/normal/menu.c |
| @@ -807,12 +807,18 @@ run_menu (grub_menu_t menu, int nested, int *auto_boot) |
| |
| /* Callback invoked immediately before a menu entry is executed. */ |
| static void |
| -notify_booting (grub_menu_entry_t entry, |
| +notify_booting (grub_menu_entry_t entry |
| +#if QUIET_BOOT |
| + __attribute__((unused)) |
| +#endif |
| + , |
| void *userdata __attribute__((unused))) |
| { |
| +#if !QUIET_BOOT |
| grub_printf (" "); |
| grub_printf_ (N_("Booting `%s'"), entry->title); |
| grub_printf ("\n\n"); |
| +#endif |
| } |
| |
| /* Callback invoked when a default menu entry executed because of a timeout |
| @@ -860,6 +866,9 @@ show_menu (grub_menu_t menu, int nested, int autobooted) |
| int boot_entry; |
| grub_menu_entry_t e; |
| int auto_boot; |
| +#if QUIET_BOOT |
| + int initial_timeout = grub_menu_get_timeout (); |
| +#endif |
| |
| boot_entry = run_menu (menu, nested, &auto_boot); |
| if (boot_entry < 0) |
| @@ -869,7 +878,11 @@ show_menu (grub_menu_t menu, int nested, int autobooted) |
| if (! e) |
| continue; /* Menu is empty. */ |
| |
| - grub_cls (); |
| +#if QUIET_BOOT |
| + /* Only clear the screen if we drew the menu in the first place. */ |
| + if (initial_timeout != 0) |
| +#endif |
| + grub_cls (); |
| |
| if (auto_boot) |
| grub_menu_execute_with_fallback (menu, e, autobooted, |
| -- |
| 2.34.0.384.gca35af8252-goog |
| |