For the fifth time, the Bootlin team attended the Embedded Recipes conference to meet and share with the embedded community. This year, like last year, it was in the beautiful city of Nice. We were also proud to be a Chef Sponsor of the event.
Participation from Bootlin was again strong, with no less than 19 engineers attending: Alexandre Belloni, Antonin Godard, Benjamin Robin, Benoit Monin, Hervé Codina, Jérémie Dautheribes, João Marcos Costa, Köry Maincent, Louis Chauvet, Luca Ceresoli, Mathieu Dubois-Briand, Miguel Gazquez, Paul Louvel, Richard Genoud, Romain Gantois, Théo Lebrun, Thomas Bonnefille, Thomas Petazzoni, Thomas Richard.
As usual, here is a blog post with summaries of a few talks. You can find the full schedule here, and video recordings are now available for day 1 and day 2.
Bootlin Debugging Chronicles [slides] [video]
One of the Bootlin-proposed talks was accepted: the Bootlin Debugging Chronicles. Six engineers each told a short story of a real customer issue and how they tracked it down:
- Blame it on the firmware (Romain Gantois): Malformed Ethernet packets on AM437x traced to a missing register store in the PRU firmware.
- A stupid hack bites you back! (Thomas Petazzoni): An i.MX6 SoM running at half speed because a DT hack made the RTC flood the system with 32 kHz interrupts. The issue was hidden on shipped units by the RTC’s battery-backed state, only appearing on freshly flashed boards.
- Just give me pixels (Luca Ceresoli): An i.MX93 LCD panel that refused to work. The investigation involved clock configurations, DSI bridge driver bugs, vendor tools, and a kernel hang. Multiple interlocking issues had to be resolved before the panel finally lit up.
- When Fresh DRAM Breaks Old Assumptions (Thomas Richard): Suspend-to-RAM on TI J7200 broke after switching DRAM suppliers, exposing two software bugs hidden by the old chips’ power-on state.
- Four Instructions Too Many (Théo Lebrun): Dynamic ftrace on MIPS EyeQ5 wrote past a buffer, corrupting the CPU boot mask and stalling the system.
- When Sine Waves Betray You (Alexandre Belloni): Distorted audio on i.MX7 caused by a DMA residue calculation bug that reordered periods — invisible to sine-wave tests but audible with real content.
The feedback was overwhelmingly positive, the audience really enjoyed the format and the variety of real-world stories. Several attendees told us this was their favorite talk of the conference.
Watch your scope!
The hidden pitfalls of scoped_guard()
and other cleanup.h macros [slides] [video]
In this talk David Lechner discussed the pitfalls of automatic cleanup macros in the Linux kernel.
He started mentioning some design aspects of high-level languages such as C++, C#, Python and Go:
- RAII: resource allocation and variable initialization are done in the same statement
- Automatic cleanup of variables (via destructors) when they go out of scope
Since around 2023 the kernel introduces some macros to achieve similar features (in the cleanup.h header), however they have subtle pitfalls.
The guard()() macro introduces a hidden variable, which is not obvious for users. This results in a warning in some constructs like switch/case statements, but it is easy to fix by just adding curly braces.
A more subtle issue comes from the scoped_guard() macro. This macro is implemented as a for loop, which is again not obvious to users. As a result, when used inside an outer loop, any break or continue will break/continue the scoped_guard() loop and not the outer one as perhaps intended by the user. This is particularly nasty because the compiler sees this as legitimate code and won’t warn. David’s opinion is that scoped_guard() should just not be used, although he admits for simple and obvious cases it is allows writing the cleanest code.
Finally the scoped_cond_guard() macro is even more tricky: it takes a statement as a macro argument (which is ugly), hides an if statement and, even worse, it ignores the return value of the acquire function. The speaker recommended to never use it, and use ACQUIRE() instead. Sadly we realized after the talk that ACQUIRE() is even more undocumented and its implementation is even more obscure.
Finally David recommended using the RAII idiom when using __free(). In other words, assigning the variable using __free() when it is declared, instead of later on as one would expect from the kernel coding practice for all other variables.
Overall we recommend this talk to kernel developers who started using the macros in cleanup.h and have a basic understanding of its macros, in order to ensure they understand the tools they are using and avoid their pitfalls.
U-Boot on boot core as an always-on debug tool [slides] [video]
What it says on the tin is pretty much what happened! Marek worked on an automotive SoC, which customarily has a good number of cores. The first boot core becomes unused once the system has booted. Instead of turning it off during development, Marek decided to keep U-Boot running on it with the shell still available. Thanks to that, all commands can be used to poke around the system, in particular to access the shared memory bus. One use case could be to investigate a stalled and silent CPU.
The effort started earlier than that; beforehand, Cortex-M33 support was added to U-Boot, with all the intricacies that come from such a core. Cortex-M33 cores are rather different in a few ways: no MMU (only MPU for protection, no remapping), split code versus data memory bus, etc.
Who knows, next year we might get a debugging chronicle from Marek (or anyone else in the community) using this new feature to debug a gnarly bug.
Conclusion
Embedded Recipes 2026 was once again an excellent gathering of the embedded Linux community in Nice. From kernel debugging stories to display-sharing frameworks to real-time networking, the presentations showcased the depth and breadth of work happening across the ecosystem. Bootlin was proud to contribute six debugging chronicles and to learn from the many other great talks. We are looking forward to Embedded Recipes 2027, see you there!
Some of us also stayed for the Display Next Hackfest 2026 that immediately followed, where Köry Maincent, Luca Ceresoli, and Louis Chauvet represented Bootlin in discussions about DisplayPort link training, DRM bridge hotplug, backlight configuration, and more.



