This section collects ideas to improve coreboot and related projects and should serve as a pool of ideas for people who want to enter the field of firmware development but need some guidance what to work on.
These tasks can be adopted as part of programs like Google Summer of Code or by motivated individuals outside such programs.
Each entry should outline what would be done, the benefit it brings to the project, the pre-requisites, both in knowledge and parts. They should also list people interested in supporting people who want to work on them - since we started building this list for Google Summer of Code, we'll adopt its term for those people and call them mentors.
The requirements for each project aim for productive work on the project, but it's always possible to learn them "on the job". If you have any doubt if you can bring yourself up to speed in a required time frame (e.g. for GSoC), feel free to ask in the community or the mentors listed with the projects. We can then try together to figure out if you're a good match for a project, even when requirements might not all be met.
Our crossgcc subproject provides a uniform compiler environment for working on coreboot and related projects. Sadly, building it takes hours, which is a bad experience when trying to build coreboot the first time.
Provide packages/installers of our compiler toolchain for Linux distros, Windows, Mac OS. For Windows, this should also include the environment (shell, make, ...). A student doesn't have to cover all platforms, but pick a set of systems that match their interest and knowledge and lay out a plan on how to do this.
The scripts to generate these packages should be usable on a Linux host, as that's what we're using for our automated build testing system that we could extend to provide current packages going forward. This might include automating some virtualization system (eg. QEMU or CrosVM) for non-Linux builds or Docker for different Linux distributions.
There are some basic PPC64 stubs in coreboot, and there's open hardware in TALOS2 and its family. While they already have fully open source firmware, coreboot support adds a unified story for minimal firmware across architectures.
While we have a rather big set of payloads for x86 based platforms, all other architectures are rather limited. Improve the situation by porting a payload to one of the platforms, for example GRUB2, U-Boot (the UI part), Tianocore, yabits, FILO, or Linux-as-Payload.
Since this is a bit of a catch-all idea, an application to GSoC should pick a combination of payload and architecture to support.
Most coreboot code is written in C, and it would be useful to support a second compiler suite in addition to gcc. Clang is another popular compiler suite and the build system generally supports building coreboot with it, but firmware is a rather special situation and we need to adjust coreboot and Clang some more to get usable binaries out of that combination.
The goal would be to get the emulation targets to boot reliably first, but also to support real hardware. If you don't have hardware around, you likely will find willing testers for devices they own and work from their bug reports.
Ghidra is a recently released cross-platform disassembler and decompiler that is extensible through plugins. Make it useful for firmware related work: Automatically parse formats (eg. by integrating UEFITool, cbfstool, decompressors), automatically identify 16/32/64bit code on x86/amd64, etc.
This has been done in 2019 with some neat features being developed, but it may be possible to expand support for all kinds of firmware analyses.
SerialICE is a tool to trace the behavior of executable code like firmware images. One result of that is a long log file containing the accesses to hardware resources.
It would be useful to have a tool that assists a developer-analyst in deriving knowledge about hardware from such logs. This likely can't be entirely automatic, but a tool that finds patterns and can propagate them across the log (incrementially raising the log from plain I/O accesses to a high-level description of driver behavior) would be of great use.
This is a research-heavy project.
Memtest86+ has some limitations: first and foremost it only works on x86, while it can print to serial console the GUI only works in legacy VGA mode.
This project would involve porting the memtest suite to libpayload and build a payload around it.
coreboot supports writing POST codes to I/O port 80. There are various Kconfigs that deal with POST codes, which don't have effect on most platforms. The code to send POST codes is scattered in C and Assembly, some use functions, some use macros and others simply use the outb
instruction. The POST codes are duplicated between stages and aren't documented properly.
Tasks:
outb(0x80, ...)
with calls to post_code(...)
The Board status page allows to see last working commit of a board. The page is generated by a cron job that runs on a huge git repository.
Build an open source replacement written in Golang using existing tools and libraries, consisting of a backend, a frontend and client side scripts. The backend should connect to an SQL database with can be controlled using a RESTful API. The RESTful API should have basic authentication for management tasks and new board status uploads.
At least one older test result should be kept in the database.
The frontend should use established UI libraries or frameworks (for example Angular) to display the current board status, that is if it's working or not and some details provided with the last test. If a board isn't working the last working commit (if any) should be shown in addition to the broken one.
Provide a script/tool that allows to: