Unified Configuration (styx-uconf)¶
Unified Configuration provides a configuration interface to declaratively construct processors and connect their peripherals. It is currently in incubation and should not be considered stable.
Styx allows for fine grained configuration of emulators (Processors) using its Rust, C, and Python APIs, if you know how to use them. While the programmatic APIs are useful for testing and developing Styx, security researchers would be better off with a simpler, more declarative emulator configuration framework.
Supplementary to this, there is an increased demand to use Styx as a service for creating emulators as opposed to a tool to create emulators. To enable this, there is a need for a declarative method of creating, storing, and sharing processor configurations.
Here is an example styx.yaml file.
version: 1
processors:
- name: FreeRTOS Processor
processor: ppc_4xx
backend: Pcode
executor:
id: gdb
config:
connection: 127.0.0.1:9999
arch: Ppc405
verbose: true
program:
- !FileRaw
base: 0xfff00000
file: ../../data/test-binaries/ppc/ppc405/bin/freertos.bin
perms: !AllowAll
- !RegisterImmediate
register: pc
value: 0xfffffffc
The styx.yaml can be ran using the styx-uconf
library or using the
styx-uconf-cli
, both of which are in incubation.
$ cargo run --manifest-path path/to/incubation/styx-uconf-cli/Cargo.toml -- --help
Usage: styx-uconf-cli [COMMAND]
Commands:
list Lists available components
run Runs a configuration file
help Print this message or the help of the given subcommand(s)
Options:
-h, --help Print help
-V, --version Print version
In the styx.yaml
configuration, at the top level there is a version
and
processors
mappings. version
specifies the schema version ensuring
future styx-uconf invocations work with previous schemas. processors
contains a list of processors in this definition.
An item in the processors
list corresponds to a ProcessorBuilder
in
styx. The concepts are largely the same and most options have reasonable
defaults. The largest difference is how custom plugins, executors, and
processors are defined, collectively referred to as components.
Components¶
Components are non-trivial, functional, and user-defined configuration of the processor. Currently, the complete set of components classes are plugins, executors, and processor impls.
Components are non-trivial and functional so they are represented as traits in
styx and passed to/stored in the ProcessorBuilder
as a Box<dyn trait>
.
In the unified configuration we handle this by registering components in
the styx-uconf build and referring to these components by id. Additionally,
because they are non-trivial, there is an method to provide arbitrary yaml
configuration to the component.
A component declaration in a processor configuration has an id
and a
config
.
executor:
id: gdb
config:
connection: 127.0.0.1:9999
arch: Ppc405
verbose: true
The config
schema is entirely defined by the component so refer to your
component reference for more information on its config.
The config
can be omitted and id
flattened to provided a less verbose
declaration.
executor: gdb
Components that are registered in the build can be found using the
styx-uconf-cli command list
. Refer to the styx-uconf
crate
documentation for details on registering additional components.
Other Parameters in Processor¶
name
is purely cosmetic and for debugging and displaying the processor.
backend
corresponds to the Backend
struct.
executor
refers to the ExecutorImpl
.
program
is a ParameterizedLoader
input to provide firmware files,
initial registers, and memory regions.
plugins
is a list of plugin components that will be added to the
processors.