Emulating the Badge Under Renode
(Eventually)
Sean "xobs" Cross
About Me
Talk Outline
- What is Renode?
- How is it extensible?
- What is the state of the badge?
Whole-system Emulator
- CPU cores
- Peripherals
- Interconnections
CPU Cores
- x86
- arm
- arm64
- ppc
- riscv
- spark
- xtensa
Peripherals
Peripherals Are Just Special Memory
- Writing to a memory address does a thing
- Reading from an address gets a result
- Interrupts are just GPIOs
10% of the Functionality Gets You 90% of the Way There
- E.g. in a serial device, baudrate, timers, and parity/stop can be ignored
- Just "Tx", "Rx", and interrupt setup
- Most software works just fine if you return zeroes for invalid addresses
SVD files are your friend
- Your chip probably comes with a SVD file
- This gives a map of RAM and peripherals
- Renode can parse this and use it for logging / defaults
Existing Peripherals in Renode
- Built-in peripherals for a number of devices
- See
https://github.com/renode/renode-infrastructure/tree/master/src/Emulator/Peripherals/Peripherals
for more
Creating Peripherals
- Renode is written in C#
- Like Java, C# has an `eval()` function
- Peripherals can be written and loaded at runtime
Networks in Renode
- Built-in support for CAN, Ethernet, and Wireless
- Also possible to add networks at runtime
- No latency, just packets of data
- Different devices run at different speeds
Other Goodies
- LCD monitor with touchscreen support
- Python interpreter for quick hacks
- Attach GDB to any CPU core
- Attach a serial port to a network connection
- Scriptable with Robot framework
- Log function calls
Shortcomings
- Unable to unload modules
- Need to restart Renode when you change a file
- No real audio support
- Support for verifying I2S, but can't play it
- Only x64 hosts
- Runs under Rosetta on Mac
- Documentation needs work
First, Betrusted
- FPGA with VexRiscv
- 2nd FPGA with smaller VexRiscv
- 16-bit COM bus between them
- AES extensions
- x25519 "ENGINE" accelerator
- SHA accelerator
- Battery charger and manager
- Custom lcd, timers, and USB
Emulating it under Renode
- Good enough to develop the OS!
- Good enough to catch bugs
ENGINE bug
- Added test vectors to the OS
- Ran test vectors on physical device
- Got test vectors passing in Renode
-
- Someone (without a device!) decided to add more vectors
- Tested in Renode
- Passed
- Failed on hardware
- Bug in detecting overflow condition for normalization in hardware
- https://github.com/betrusted-io/gateware/commit/817e284a3d92037b8cb0686735578d2bb60853e9
Getting Started with Renode
- Renode Platform Definition (
.repl
)
- Renode Script (
.resc
)
How to Extend Renode
- Find a peripheral that does what you want
-
- You might even find a compatible peripheral!
- Copy it to your project
- Change the constructor
- Change the register set
- Import the `.cs` file into Renode
- Add it to your platform file
Running Badge Software in Renode
Xtensa is a New Architecture
- Added support for ESP32 family
- Merged quickly
- Few others use Xtensa
Extensive use of Boot ROM
- Pulled ROM off device with esptool
- Load into RAM
- Set entrypoint
Add a serial port
- Immediately get output
- Breaks immediately
What's Left
- SPI Controller
- Interrupt Controller
Getting involved
- Try Renode for your projects!
- Add CI tests for your firmware!
- Explore binaries for unknown targets!
Thank you
Questions?