[LinuxBIOS] GSoC status report: lbmenu
uwe at hermann-uwe.de
Thu Aug 2 19:34:01 CEST 2007
here's my (first) status report for the lbmenu project I'm working on as
part of the Google Summer of Code. I should have done this a lot
earlier, sorry for the delay.
What is lbmenu?
lbmenu is a simple payload which provides a LinuxBIOS config menu,
which allows you to change some config options at "runtime", i.e.
after LinuxBIOS did the hardware init, but before any bootloader or
OS is started.
Planned features, design goals (mostly copied from my GSoC proposal)
- Text-mode (Kconfig-like) console UI for changing LinuxBIOS settings.
- Bootsplash screen (text mode only for now) where the user can press a
certain (configurable) key to enter the configuration tool.
- The tool should also be accessible over serial console (for headless
clients, servers or debugging scenarios), as well as (if feasible) over
telnet or ssh (given a big enough ROM chip and Linux + busybox in ROM).
- The tool should work both in ROM (as part of LinuxBIOS), and as a
standalone application on a Linux system. The GUI should be the same
(or similar) in both cases. The standalone version might enable some
options which cannot be used in the embedded version because of
To investigate: Implement the standalone tool as a frontend of lxbios?
Or include the lxbios code in the standalone tool?
- The tool needs to fit into flash ROM (together with LinuxBIOS and at
least one LinuxBIOS payload), so size is important. Typical sizes of
flash ROM chips today range from 256 KB to 2 MB.
- It should be reasonably easy to extend the tool. For example, it should
be possible to (later) add a graphical user-interface on top of the
generic, UI-independent code of this tool.
A graphical user-interface is _not_ part of this GSoC project, though!
- "BIOS password" feature for setting a LinuxBIOS password.
Without the correct password, no payload should be executed/booted.
Random possible ideas for after GSoC
- Internationalization support (using gettext or something similar).
The strings in the UI should be fully translatable into other languages.
Changing the language at run-time would require the strings of all
supported languages to be placed into ROM (size constraints), so this
will probably be a compile-time option only.
- Configurable UI-Themes (colors, layouts, key mappings,
text-based or (later) graphical splash screens etc.)
- Payload selection mechanism to choose at runtime which
payload to boot (if multiple payloads are included in the ROM chip).
This would make it theoretically possible to choose between GRUB2, EFI,
Open Firmware and other payloads upon each system boot.
It's not yet clear if this should be done in lbmenu, or as a
mechanism in LinuxBIOS itself, or maybe as part of lbgrub2.
- LinuxBIOS Device Tree browser which shows the device tree
for this mainboard (maybe even allows changes?).
- Written in C code (minimal assembly code, if required).
- The code will be documented using Doxygen-style code comments.
- A manpage will explain the usage and parameters of the tool.
Optionally, there will be some help texts in the tool (configurable, as
that increases the size of the tool).
- Ideally, the building of the tool will be integrated in the normal
LinuxBIOSv3 build process, with hooks for adapting some defaults or
settings of the tool at compile-time.
- QEMU will be used for testing the implementation.
- License: GPL, version 2 or later.
- I have written a minimalist ncurses-implementation called tinycurses,
which allows some basic primitives such as printing characters on
screen, moving the cursor, reading keys from keyboard, beeping etc.
It (sort of) supports both, VGA text console, and serial; more work
is needed, though.
This is designed as a general purpose payload library, which can also
be used by other payloads which need console text support, serial
output, keyboard services, beep() etc.
- The alternative would be to use the stock ncurses, but there are
- Too big; tinycurses is stripped down to just provide the most
important functions and features (e.g. no wide character support).
- Requires syscalls, term library, and generally an OS. I _do_ have
a first test version which is compiled/linked against newlib
(http://sourceware.org/newlib/), a small libc implementation which
has stubs for OS-less builds (which we need in LinuxBIOS + payloads).
However, making this really fully work will require a lot more
work. Also, the smallest lbmenu payload size when using newlib
I've been able to get so far, is 130 KB or so (which is quite a lot).
My plan is to be able to use lbmenu with 256K ROM chips, and you
need to put LinuxBIOS (30-70 KB) in there, as well as at least one
payload (say FILO, ~60-80 KB), and lbmenu. So size is very important.
On the long term the lbmenu implementation should probably rely on
the tinycurses implementation for that reason (which is currently
smaller than 10 KB or so, and doesn't require newlib).
- The final goal of all of this would be to use plain Kconfig _within_
lbmenu (at runtime) to display lbmenu's options and let the user
change them. Thus ncurses or tinycurses needs to be complete enough
to be able to compile kconfig.
If this is absolutely not feasible, well, I'll have to implement a
small menu system from scratch, but I hope that won't be necessary.
- The compile-time options of lbmenu are configured via kconfig, just
like the options of LinuxBIOSv3 itself.
- So far my draft implementation of lbmenu can be booted, prints a text
banner (VGA and/or serial), can react on a (configurable) keypress,
e.g. ESC, then enter a "menu" (which is a stub right now), and
reboot upon another ESC keypress.
- Finish tinycurses and/or ncurses+newlib so they're usable with kconfig.
- Figure out a mechanism to select between various payloads included in
the ROM (_if_ this will be done in lbmenu, discussions welcome).
- Implement read/write of CMOS values.
- The configuration menu within lbmenu will be "dynamically" generated
(or that's my plan at least) from Kconfig.lbmenu files in the
LinuxBIOSv3 tree. The same parser which is used in Kconfig should
parse all *.lbmenu files and construct the lbmenu main menu from that.
So you can have southbridge/amd/cs5536/Kconfig.lbmenu which provides
lbmenu menu items which are CS5536-specific (e.g. enable/disable IDE).
Another mainboard/amd/norwich/Kconfig.lbmenu would provide mainboard-
specific menu items etc. etc.
- Probably a few other things I cannot think of right now.
No code yet, sorry, but I'll try to put together a small demo soon which
I can post here.
I intend to put tinycurses into the global util/ directory, as it's
independant of LinuxBIOS and generally usable for other payloads.
Same for lbmenu, it should be in util/ and gets its tinycurses implementation
via svn:externals (as should all other payloads which use it)...
Any comments and suggestions welcome!
http://www.hermann-uwe.de | http://www.holsham-traders.de
http://www.crazy-hacks.org | http://www.unmaintained-free-software.org
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 189 bytes
Desc: Digital signature
More information about the coreboot