grub/grub-core/normal
Paul Menzel 3be9268318 normal/menu: Do not treat error values as key presses
Some terminals, like `grub-core/term/at_keyboard.c`, return `-1` in case
they are not ready yet.

      if (! KEYBOARD_ISREADY (grub_inb (KEYBOARD_REG_STATUS)))
        return -1;

Currently, that is treated as a key press, and the menu time-out is
cancelled/cleared. This is unwanted, as the boot is stopped and the user
manually has to select a menu entry. Therefore, adapt the condition to
require the key value also to be greater than 0.

`GRUB_TERM_NO_KEY` is defined as 0, so the condition could be collapsed
to greater or equal than (≥) 0, but the compiler will probably do that
for us anyway, so keep the cases separate for clarity.

This is tested with coreboot, the GRUB default payload, and the
configuration file `grub.cfg` below.

For GRUB:

    $ ./autogen.sh
    $ ./configure --with-platform=coreboot
    $ make -j`nproc`
    $ make default_payload.elf

For coreboot:

    $ more grub.cfg
    serial --unit 0 --speed 115200
    set timeout=5

    menuentry 'halt' {
        halt
    }
    $ build/cbfstool build/coreboot.rom add-payload \
        -f /dev/shm/grub/default_payload.elf -n fallback/payload -c lzma
    $ build/cbfstool build/coreboot.rom add -f grub.cfg -n etc/grub.cfg -t raw
    $ qemu-system-x86_64 --version
    QEMU emulator version 3.1.0 (Debian 1:3.1+dfsg-2+b1)
    Copyright (c) 2003-2018 Fabrice Bellard and the QEMU Project developers
    $ qemu-system-x86_64 -M pc -bios build/coreboot.rom -serial stdio -nic none

Currently, the time-out is cancelled/cleared. With the commit, it is not.
With a small GRUB payload, this the problem is also reproducible on the
ASRock E350M1.

Link: http://lists.gnu.org/archive/html/grub-devel/2019-01/msg00037.html

Signed-off-by: Paul Menzel <pmenzel@molgen.mpg.de>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2020-09-21 16:43:54 -04:00
..
auth.c core: use GRUB_TERM_ definitions when handling term characters 2020-09-21 12:02:37 -04:00
autofs.c verifiers: File type for fine-grained signature-verification controlling 2020-09-21 13:29:05 -04:00
charset.c charset: Trim away RLM and LRM. 2017-01-31 19:29:31 +01:00
cmdline.c core: use GRUB_TERM_ definitions when handling term characters 2020-09-21 12:02:37 -04:00
color.c Replace explicit sizeof divisions by ARRAY_SIZE. 2015-01-21 17:37:31 +01:00
completion.c * include/grub/misc.h (grub_strcat): Removed. All users changed to 2013-11-01 16:27:37 +01:00
context.c normal: fix memory leak 2015-06-20 23:38:19 +03:00
crypto.c verifiers: File type for fine-grained signature-verification controlling 2020-09-21 13:29:05 -04:00
datetime.c * grub-core/normal/datetime.c (grub_get_weekday): Use if rather than 2013-11-13 09:26:13 +01:00
dyncmd.c verifiers: File type for fine-grained signature-verification controlling 2020-09-21 13:29:05 -04:00
main.c verifiers: File type for fine-grained signature-verification controlling 2020-09-21 13:29:05 -04:00
menu.c normal/menu: Do not treat error values as key presses 2020-09-21 16:43:54 -04:00
menu_entry.c core: use GRUB_TERM_ definitions when handling term characters 2020-09-21 12:02:37 -04:00
menu_text.c grub_menu_init_page: Avoid returning 0 geometry to avoid divisions by 0. 2015-01-21 17:42:15 +01:00
misc.c normal/misc: Close device on all pathes. 2015-01-26 09:49:32 +01:00
term.c verifiers: File type for fine-grained signature-verification controlling 2020-09-21 13:29:05 -04:00