diff mbox

[4/4] bootmenu: Wire up the new boot menu in the Forth code

Message ID 1496330742-18181-5-git-send-email-thuth@redhat.com
State Superseded
Headers show

Commit Message

Thomas Huth June 1, 2017, 3:25 p.m. UTC
Remove the old Forth-based boot menu code and use the
new libbootmenu module instead.

Signed-off-by: Thomas Huth <thuth@redhat.com>
---
 slof/fs/start-up.fs | 71 +++++++----------------------------------------------
 1 file changed, 9 insertions(+), 62 deletions(-)

Comments

Alexey Kardashevskiy June 6, 2017, 9:20 a.m. UTC | #1
On 02/06/17 01:25, Thomas Huth wrote:
> Remove the old Forth-based boot menu code and use the
> new libbootmenu module instead.
> 
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> ---
>  slof/fs/start-up.fs | 71 +++++++----------------------------------------------
>  1 file changed, 9 insertions(+), 62 deletions(-)
> 
> diff --git a/slof/fs/start-up.fs b/slof/fs/start-up.fs
> index dc5d1ed..7020f5c 100644
> --- a/slof/fs/start-up.fs
> +++ b/slof/fs/start-up.fs
> @@ -65,70 +65,17 @@
>  \ Watchdog will be rearmed during load if use-load-watchdog variable is TRUE
>  TRUE VALUE use-load-watchdog?
>  
> -1 value my-boot-dev
> -1 value digit-val
> -0 value boot-dev-no
> -
> -: boot-selected
> -   1 to my-boot-dev
> -   BEGIN parse-word dup WHILE
> -      boot-dev-no my-boot-dev = IF
> -         s" boot " 2swap $cat
> -         ['] evaluate catch ?dup IF     \ and execute it
> -            ." boot attempt returned: "
> -            abort"-str @ count type cr
> -            throw
> -         THEN
> -         0 0 load-list 2!
> -         UNLOOP EXIT
> -      ELSE
> -         2drop
> -      THEN
> -      my-boot-dev 1 + to my-boot-dev
> -   REPEAT 2drop 0 0 load-list 2!
> -
> -   (boot)
> -;
> -
> -: boot-start
> -   decimal
> -   BEGIN parse-word dup WHILE
> -      my-boot-dev (u.) s" . " $cat type 2dup type ." : " de-alias type cr
> -      my-boot-dev 1 + to my-boot-dev

If I read the patchset correctly, what you wanted was to fix this loop to
walk through all disk*/cdrom*/net* aliases instead of what contributed to
$bootdev....


> -   REPEAT 2drop 0 0 load-list 2!
> -
> -   \ Clear pending keys (to remove multiple F12 key presses for example)
> -   BEGIN key? WHILE
> -      key drop
> -   REPEAT
> -
> -   cr
> -   BEGIN
> -      KEY
> -      dup 1b = IF         \ ESC sequence ... could be yet another F12 key press
> -         BEGIN key? WHILE
> -            key drop

> -         REPEAT
> -      ELSE
> -         dup emit
> -      THEN
> -      dup isdigit IF
> -         dup 30 - to digit-val
> -         boot-dev-no a * digit-val + to boot-dev-no
> -      THEN
> -   d = UNTIL


... get rid of this 0xd (which I do not see as a huge improvement as now
you are limiting yourself to 0..9a..zA..Z while you could have billions
but whatever :) ). Also, there is a tiny chance that some may have test
scripts relying on SLOF waiting for \r :)

Would not it be easier to clear $bootdev and simply populate it with all
discovered aliases? Since we got this far, we do not care about $bootdev
anymore?


> -
> -   boot-dev-no my-boot-dev < IF
> -      s" boot-selected " s" $bootdev" evaluate $cat strdup evaluate
> -   ELSE
> -      ." Invalid choice!" cr
> -   THEN
> -   hex
> -;
>  
>  : boot-menu-start
> -   ." Select boot device:" cr cr
> -   s" boot-start " s" $bootdev" evaluate $cat strdup evaluate
> +    boot-menu ?dup IF
> +       s" boot " 2swap $cat
> +       ['] evaluate catch ?dup IF
> +           ." boot attempt returned: "
> +           abort"-str @ count type cr
> +           throw
> +       THEN
> +       0 0 load-list 2!
> +    THEN
>  ;
>  
>  : boot-menu-enabled? ( -- true|false )
>
Thomas Huth June 6, 2017, 4:21 p.m. UTC | #2
On 06.06.2017 11:20, Alexey Kardashevskiy wrote:
> On 02/06/17 01:25, Thomas Huth wrote:
>> Remove the old Forth-based boot menu code and use the
>> new libbootmenu module instead.
>>
>> Signed-off-by: Thomas Huth <thuth@redhat.com>
>> ---
>>  slof/fs/start-up.fs | 71 +++++++----------------------------------------------
>>  1 file changed, 9 insertions(+), 62 deletions(-)
>>
>> diff --git a/slof/fs/start-up.fs b/slof/fs/start-up.fs
>> index dc5d1ed..7020f5c 100644
>> --- a/slof/fs/start-up.fs
>> +++ b/slof/fs/start-up.fs
>> @@ -65,70 +65,17 @@
>>  \ Watchdog will be rearmed during load if use-load-watchdog variable is TRUE
>>  TRUE VALUE use-load-watchdog?
>>  
>> -1 value my-boot-dev
>> -1 value digit-val
>> -0 value boot-dev-no
>> -
>> -: boot-selected
>> -   1 to my-boot-dev
>> -   BEGIN parse-word dup WHILE
>> -      boot-dev-no my-boot-dev = IF
>> -         s" boot " 2swap $cat
>> -         ['] evaluate catch ?dup IF     \ and execute it
>> -            ." boot attempt returned: "
>> -            abort"-str @ count type cr
>> -            throw
>> -         THEN
>> -         0 0 load-list 2!
>> -         UNLOOP EXIT
>> -      ELSE
>> -         2drop
>> -      THEN
>> -      my-boot-dev 1 + to my-boot-dev
>> -   REPEAT 2drop 0 0 load-list 2!
>> -
>> -   (boot)
>> -;
>> -
>> -: boot-start
>> -   decimal
>> -   BEGIN parse-word dup WHILE
>> -      my-boot-dev (u.) s" . " $cat type 2dup type ." : " de-alias type cr
>> -      my-boot-dev 1 + to my-boot-dev
> 
> If I read the patchset correctly, what you wanted was to fix this loop to
> walk through all disk*/cdrom*/net* aliases instead of what contributed to
> $bootdev....
> 
> 
>> -   REPEAT 2drop 0 0 load-list 2!
>> -
>> -   \ Clear pending keys (to remove multiple F12 key presses for example)
>> -   BEGIN key? WHILE
>> -      key drop
>> -   REPEAT
>> -
>> -   cr
>> -   BEGIN
>> -      KEY
>> -      dup 1b = IF         \ ESC sequence ... could be yet another F12 key press
>> -         BEGIN key? WHILE
>> -            key drop
> 
>> -         REPEAT
>> -      ELSE
>> -         dup emit
>> -      THEN
>> -      dup isdigit IF
>> -         dup 30 - to digit-val
>> -         boot-dev-no a * digit-val + to boot-dev-no
>> -      THEN
>> -   d = UNTIL
> 
> 
> ... get rid of this 0xd (which I do not see as a huge improvement as now
> you are limiting yourself to 0..9a..zA..Z while you could have billions
> but whatever :) ). Also, there is a tiny chance that some may have test
> scripts relying on SLOF waiting for \r :)

Honestly, every time I use the current boot menu after a while, I am
confused by its current behavior (I never press RETURN in that case
since I expect that one key press is enough to start an entry). I think
I hardly have ever seen another boot menu in the past where you have to
enter a multi-digit number and press RETURN afterwards ...
And if you've got more than 30 boot devices, they likely do not fit on
your screen anymore anyway, so using the boot menu does not make much
sense anymore in that case, too, I think.

But if you really think that the current behavior of the boot menu is
better, please say so, then I'll stop my efforts to improve that thing.

> Would not it be easier to clear $bootdev and simply populate it with all
> discovered aliases? Since we got this far, we do not care about $bootdev
> anymore?

First, I'm not sure whether chaning $bootdev is really a good idea here
now, since the user might exit the boot menu and type "boot" at the SLOF
prompt again instead.

Then I wonder why you apparently prefer now to keep the Forth
implementation of the boot menu?? IMHO the current code is quite hard to
maintain/understand/extend with all this "evaluate" + "parse-word" magic
in there. Last time you said "Either forth or c is ok" for an update
(see https://lists.ozlabs.org/pipermail/slof/2017-April/001511.html), so
I took the chance now to rewrite it in C, but if that's now suddenly not
OK for you anymore, please let me now, then I'll try to disimprove the
Forth code instead...

 Thomas
Alexey Kardashevskiy June 7, 2017, 3:45 a.m. UTC | #3
On 07/06/17 02:21, Thomas Huth wrote:
> On 06.06.2017 11:20, Alexey Kardashevskiy wrote:
>> On 02/06/17 01:25, Thomas Huth wrote:
>>> Remove the old Forth-based boot menu code and use the
>>> new libbootmenu module instead.
>>>
>>> Signed-off-by: Thomas Huth <thuth@redhat.com>
>>> ---
>>>  slof/fs/start-up.fs | 71 +++++++----------------------------------------------
>>>  1 file changed, 9 insertions(+), 62 deletions(-)
>>>
>>> diff --git a/slof/fs/start-up.fs b/slof/fs/start-up.fs
>>> index dc5d1ed..7020f5c 100644
>>> --- a/slof/fs/start-up.fs
>>> +++ b/slof/fs/start-up.fs
>>> @@ -65,70 +65,17 @@
>>>  \ Watchdog will be rearmed during load if use-load-watchdog variable is TRUE
>>>  TRUE VALUE use-load-watchdog?
>>>  
>>> -1 value my-boot-dev
>>> -1 value digit-val
>>> -0 value boot-dev-no
>>> -
>>> -: boot-selected
>>> -   1 to my-boot-dev
>>> -   BEGIN parse-word dup WHILE
>>> -      boot-dev-no my-boot-dev = IF
>>> -         s" boot " 2swap $cat
>>> -         ['] evaluate catch ?dup IF     \ and execute it
>>> -            ." boot attempt returned: "
>>> -            abort"-str @ count type cr
>>> -            throw
>>> -         THEN
>>> -         0 0 load-list 2!
>>> -         UNLOOP EXIT
>>> -      ELSE
>>> -         2drop
>>> -      THEN
>>> -      my-boot-dev 1 + to my-boot-dev
>>> -   REPEAT 2drop 0 0 load-list 2!
>>> -
>>> -   (boot)
>>> -;
>>> -
>>> -: boot-start
>>> -   decimal
>>> -   BEGIN parse-word dup WHILE
>>> -      my-boot-dev (u.) s" . " $cat type 2dup type ." : " de-alias type cr
>>> -      my-boot-dev 1 + to my-boot-dev
>>
>> If I read the patchset correctly, what you wanted was to fix this loop to
>> walk through all disk*/cdrom*/net* aliases instead of what contributed to
>> $bootdev....
>>
>>
>>> -   REPEAT 2drop 0 0 load-list 2!
>>> -
>>> -   \ Clear pending keys (to remove multiple F12 key presses for example)
>>> -   BEGIN key? WHILE
>>> -      key drop
>>> -   REPEAT
>>> -
>>> -   cr
>>> -   BEGIN
>>> -      KEY
>>> -      dup 1b = IF         \ ESC sequence ... could be yet another F12 key press
>>> -         BEGIN key? WHILE
>>> -            key drop
>>
>>> -         REPEAT
>>> -      ELSE
>>> -         dup emit
>>> -      THEN
>>> -      dup isdigit IF
>>> -         dup 30 - to digit-val
>>> -         boot-dev-no a * digit-val + to boot-dev-no
>>> -      THEN
>>> -   d = UNTIL
>>
>>
>> ... get rid of this 0xd (which I do not see as a huge improvement as now
>> you are limiting yourself to 0..9a..zA..Z while you could have billions
>> but whatever :) ). Also, there is a tiny chance that some may have test
>> scripts relying on SLOF waiting for \r :)
> 
> Honestly, every time I use the current boot menu after a while, I am
> confused by its current behavior (I never press RETURN in that case
> since I expect that one key press is enough to start an entry).

When would you use it at all? You can control the boot sequence via QEMU
command line, it is easier imho.

> I think
> I hardly have ever seen another boot menu in the past where you have to
> enter a multi-digit number and press RETURN afterwards ...
> And if you've got more than 30 boot devices, they likely do not fit on
> your screen anymore anyway, so using the boot menu does not make much
> sense anymore in that case, too, I think.

Well, then the next bugreport will be "I have 31 device and only 30 show up
in the list" ;) You could at least print a line saying "no more than 23 can
be shown" (80x25 minus one line for boot menu header minus one line for the
user input).

> 
> But if you really think that the current behavior of the boot menu is
> better, please say so, then I'll stop my efforts to improve that thing.

I have not heard of anyone actually using boot menu so since you are the
only user I know, and you are not happy and sent the patches, let it be
your way :)

> 
>> Would not it be easier to clear $bootdev and simply populate it with all
>> discovered aliases? Since we got this far, we do not care about $bootdev
>> anymore?
> 
> First, I'm not sure whether chaning $bootdev is really a good idea here
> now, since the user might exit the boot menu and type "boot" at the SLOF
> prompt again instead.
> 
> Then I wonder why you apparently prefer now to keep the Forth
> implementation of the boot menu?? IMHO the current code is quite hard to
> maintain/understand/extend with all this "evaluate" + "parse-word" magic
> in there. Last time you said "Either forth or c is ok" for an update
> (see https://lists.ozlabs.org/pipermail/slof/2017-April/001511.html),

I remember :) I just looked at the patches and wondered if it would be
easier to stick to Forth. I do not understand parse-word magic though so if
even you struggle here, then moving to C is a good thing.

> so
> I took the chance now to rewrite it in C, but if that's now suddenly not
> OK for you anymore, please let me now, then I'll try to disimprove the
> Forth code instead...

C is still ok. The patches splitting is confusing. I had to do little
debugging to find out where is that "\r" which you got rid of and where you
switched from qemu,boot-list/device to aliases, and commit logs did not
help with that. If the first patch moved forth bits to C (preserving the
old functionality) and the second one switched to aliases and removed "\r"
- that would make things easier to review imho, and also bisectable.
Thomas Huth June 7, 2017, 5:18 a.m. UTC | #4
On 07.06.2017 05:45, Alexey Kardashevskiy wrote:
> On 07/06/17 02:21, Thomas Huth wrote:
[...]
>>
>> Honestly, every time I use the current boot menu after a while, I am
>> confused by its current behavior (I never press RETURN in that case
>> since I expect that one key press is enough to start an entry).
> 
> When would you use it at all? You can control the boot sequence via QEMU
> command line, it is easier imho.

Sure, but apparently there are at least some people who try to use the
boot menu ... otherwise I would not get those Bugzilla tickets where
they complain about the crappy behavior ;-)

>> I think
>> I hardly have ever seen another boot menu in the past where you have to
>> enter a multi-digit number and press RETURN afterwards ...
>> And if you've got more than 30 boot devices, they likely do not fit on
>> your screen anymore anyway, so using the boot menu does not make much
>> sense anymore in that case, too, I think.
> 
> Well, then the next bugreport will be "I have 31 device and only 30 show up
> in the list" ;) You could at least print a line saying "no more than 23 can
> be shown" (80x25 minus one line for boot menu header minus one line for the
> user input).

I promise that I'll close that bug report as WONTFIX ... if you try to
use a boot menu for handling more than 30 devices, you're doing
something wrong anyway.

>> Then I wonder why you apparently prefer now to keep the Forth
>> implementation of the boot menu?? IMHO the current code is quite hard to
>> maintain/understand/extend with all this "evaluate" + "parse-word" magic
>> in there. Last time you said "Either forth or c is ok" for an update
>> (see https://lists.ozlabs.org/pipermail/slof/2017-April/001511.html),
> 
> I remember :) I just looked at the patches and wondered if it would be
> easier to stick to Forth. I do not understand parse-word magic though so if
> even you struggle here, then moving to C is a good thing.
> 
>> so
>> I took the chance now to rewrite it in C, but if that's now suddenly not
>> OK for you anymore, please let me now, then I'll try to disimprove the
>> Forth code instead...
> 
> C is still ok. The patches splitting is confusing. I had to do little
> debugging to find out where is that "\r" which you got rid of and where you
> switched from qemu,boot-list/device to aliases, and commit logs did not
> help with that. If the first patch moved forth bits to C (preserving the
> old functionality) and the second one switched to aliases and removed "\r"
> - that would make things easier to review imho, and also bisectable.

It's a complete rewrite, so first trying to implement the old behavior
in C and then rewrite most of the code again to implement the new
behavior does not make much sense either, I think. So I'll squash the
current patches together, let's see how that looks like...

 Thomas
diff mbox

Patch

diff --git a/slof/fs/start-up.fs b/slof/fs/start-up.fs
index dc5d1ed..7020f5c 100644
--- a/slof/fs/start-up.fs
+++ b/slof/fs/start-up.fs
@@ -65,70 +65,17 @@ 
 \ Watchdog will be rearmed during load if use-load-watchdog variable is TRUE
 TRUE VALUE use-load-watchdog?
 
-1 value my-boot-dev
-1 value digit-val
-0 value boot-dev-no
-
-: boot-selected
-   1 to my-boot-dev
-   BEGIN parse-word dup WHILE
-      boot-dev-no my-boot-dev = IF
-         s" boot " 2swap $cat
-         ['] evaluate catch ?dup IF     \ and execute it
-            ." boot attempt returned: "
-            abort"-str @ count type cr
-            throw
-         THEN
-         0 0 load-list 2!
-         UNLOOP EXIT
-      ELSE
-         2drop
-      THEN
-      my-boot-dev 1 + to my-boot-dev
-   REPEAT 2drop 0 0 load-list 2!
-
-   (boot)
-;
-
-: boot-start
-   decimal
-   BEGIN parse-word dup WHILE
-      my-boot-dev (u.) s" . " $cat type 2dup type ." : " de-alias type cr
-      my-boot-dev 1 + to my-boot-dev
-   REPEAT 2drop 0 0 load-list 2!
-
-   \ Clear pending keys (to remove multiple F12 key presses for example)
-   BEGIN key? WHILE
-      key drop
-   REPEAT
-
-   cr
-   BEGIN
-      KEY
-      dup 1b = IF         \ ESC sequence ... could be yet another F12 key press
-         BEGIN key? WHILE
-            key drop
-         REPEAT
-      ELSE
-         dup emit
-      THEN
-      dup isdigit IF
-         dup 30 - to digit-val
-         boot-dev-no a * digit-val + to boot-dev-no
-      THEN
-   d = UNTIL
-
-   boot-dev-no my-boot-dev < IF
-      s" boot-selected " s" $bootdev" evaluate $cat strdup evaluate
-   ELSE
-      ." Invalid choice!" cr
-   THEN
-   hex
-;
 
 : boot-menu-start
-   ." Select boot device:" cr cr
-   s" boot-start " s" $bootdev" evaluate $cat strdup evaluate
+    boot-menu ?dup IF
+       s" boot " 2swap $cat
+       ['] evaluate catch ?dup IF
+           ." boot attempt returned: "
+           abort"-str @ count type cr
+           throw
+       THEN
+       0 0 load-list 2!
+    THEN
 ;
 
 : boot-menu-enabled? ( -- true|false )