5.5 KiB
5.5 KiB
- Emulating the Badge under Renode (Eventually)
- Talk Outline
- About Me
- What is Renode?
- Extending Renode
- Demonstration!
- Running Badge Software in Renode
- Getting involved!
- Thank you!
Emulating the Badge under Renode (Eventually)
Talk Outline
- What is Renode?
- How is it extensible?
- What is the state of the badge?
About Me
What is Renode?
Target Platforms
- Windows
- Mac
- Linux
- CI
Whole-system Emulator
- Emulates CPU cores
- Emulates peripherals
- Emulates interconnects
CPU Cores
- x86
- arm
- arm64
- ppc
- riscv
- sparc
- xtensa
Peripherals
[Image of a CPU chart]
Peripherals Are Just Memory Addresses That Are Special
- In a MMIO system, 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
- STM32
- NRF52
- IMXRT
- LiteX
- 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
- Use the source!
Extending Renode
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 catch bugs!
ENGINE bug
- Added test vectors to the OS
- Ran test vectors on physical device
- Got test vectors passing in Renode
- Yay!
- 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
817e284a3d
Getting Started with Renode
- Renode Platform Definition (
.repl
) - Renode Script (
.resc
)
Example project repl
Example project resc
Running it
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
Demonstration!
Running Badge Software in Renode
It Doesn't
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
Load SVD file
Add Peripherals
Slowly Advance
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!