* refactor to only target uconsole * add update-u-boot tool [ci:skip-vercheck]: not new package Part-of: <https://gitlab.postmarketos.org/postmarketOS/pmaports/-/merge_requests/7918>
80 lines
2.6 KiB
Diff
80 lines
2.6 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Masahiro Yamada <yamada.masahiro@socionext.com>
|
|
Date: Thu, 24 May 2018 17:04:57 +0900
|
|
Subject: [PATCH] menu: fix timeout duration
|
|
|
|
For distro-boot, the TIMEOUT directive in the boot script specifies
|
|
how long to pause in units of 1/10 sec. [1]
|
|
|
|
Commit 8594753ba0a7 ("menu: only timeout when menu is displayed")
|
|
corrected this by simply dividing the timeout value by 10 in
|
|
menu_interactive_choice().
|
|
|
|
I see two problems:
|
|
|
|
- For example, "TIMEOUT 5" should wait for 0.5 sec, but the current
|
|
implementation cannot handle the granularity of 1/10 sec.
|
|
In fact, it never breaks because "m->timeout / 10" is zero,
|
|
which means no timeout.
|
|
|
|
- The menu API is used not only by cmd/pxe.c but also by
|
|
common/autoboot.c . For the latter case, the unit of the
|
|
timeout value is _second_ because its default is associated
|
|
with CONFIG_BOOTDELAY.
|
|
|
|
To fix the first issue, use DIV_ROUND_UP() so that the timeout value
|
|
is rounded up to the closest integer.
|
|
|
|
For the second issue, move the division to the boundary between
|
|
cmd/pxe.c and common/menu.c . This is a more desirable place because
|
|
the comment of struct pxe_menu says:
|
|
|
|
* timeout - time in tenths of a second to wait for a user key-press before
|
|
* booting the default label.
|
|
|
|
Then, the comment of menu_create() says:
|
|
|
|
* timeout - A delay in seconds to wait for user input. If 0, timeout is
|
|
* disabled, and the default choice will be returned unless prompt is 1.
|
|
|
|
[1] https://www.syslinux.org/wiki/index.php?title=SYSLINUX#TIMEOUT_timeout
|
|
|
|
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
|
|
---
|
|
cmd/pxe.c | 4 ++--
|
|
common/menu.c | 3 +--
|
|
2 files changed, 3 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/cmd/pxe.c b/cmd/pxe.c
|
|
index cce48e01e..32fc299f6 100644
|
|
--- a/cmd/pxe.c
|
|
+++ b/cmd/pxe.c
|
|
@@ -1558,8 +1558,8 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg)
|
|
/*
|
|
* Create a menu and add items for all the labels.
|
|
*/
|
|
- m = menu_create(cfg->title, cfg->timeout, cfg->prompt, label_print,
|
|
- NULL, NULL);
|
|
+ m = menu_create(cfg->title, DIV_ROUND_UP(cfg->timeout, 10),
|
|
+ cfg->prompt, label_print, NULL, NULL);
|
|
|
|
if (!m)
|
|
return NULL;
|
|
diff --git a/common/menu.c b/common/menu.c
|
|
index c53030f36..69f98ff33 100644
|
|
--- a/common/menu.c
|
|
+++ b/common/menu.c
|
|
@@ -195,8 +195,7 @@ static inline int menu_interactive_choice(struct menu *m, void **choice)
|
|
|
|
if (!m->item_choice) {
|
|
readret = cli_readline_into_buffer("Enter choice: ",
|
|
- cbuf,
|
|
- m->timeout / 10);
|
|
+ cbuf, m->timeout);
|
|
|
|
if (readret >= 0) {
|
|
choice_item = menu_item_by_key(m, cbuf);
|
|
--
|
|
2.37.2
|
|
|