102 lines
3.6 KiB
Markdown
102 lines
3.6 KiB
Markdown
|
# Emulator events
|
||
|
|
||
|
The events processed by the emulator are described in each model.
|
||
|
Unrecognized events will cause a panic and stop the emulator in most
|
||
|
cases.
|
||
|
|
||
|
The events may have additional arguments in the payload, which are also
|
||
|
described. To this end, a simple language was created to specify the
|
||
|
format of each event in a concise declaration.
|
||
|
|
||
|
Additionally, a printf-like string is declared for each event, so they
|
||
|
can be explained in plain English. The values of the arguments are also
|
||
|
substituted in the description of the event following a extended printf
|
||
|
format described below.
|
||
|
|
||
|
## Event format
|
||
|
|
||
|
The events are defined by a small language that defines the MCV of an event, if
|
||
|
is a jumbo and the arguments in the payload (if any).
|
||
|
|
||
|
The grammar of this language is as follows in [ABNF][abnf].
|
||
|
|
||
|
[abnf]: https://en.wikipedia.org/wiki/Augmented_Backus%E2%80%93Naur_form
|
||
|
|
||
|
```ABNF
|
||
|
event-definition = event-mcv event-type [ "(" argument-list ")" ]
|
||
|
event-mcv = VCHAR VCHAR VCHAR
|
||
|
event-type = [ '+' ]
|
||
|
argument-list = argument-type " " argument-name [ ", " argument-list ]
|
||
|
argument-name = 1*(CHAR / DIGIT)
|
||
|
argument-type = type-signed | type-unsigned | type-string
|
||
|
type-signed = "i8" | "i16" | "i32" | "i64"
|
||
|
type-unsigned = "u8" | "u16" | "u32" | "u64"
|
||
|
type-string = "str"
|
||
|
```
|
||
|
|
||
|
The `event-type` defines the type of event. Using the symbol `+` defines
|
||
|
the event as jumbo. Otherwise, if not given it is considered a normal
|
||
|
event.
|
||
|
|
||
|
Here are some examples:
|
||
|
|
||
|
- `OHp`: A normal event with `OHp` MCV and no payload.
|
||
|
|
||
|
- `OAs(i32 cpu)`: A normal event with `OAs` MCV that has the cpu stored in
|
||
|
the payload as a 32 bits signed integer.
|
||
|
|
||
|
- `OHC(i32 cpu, u64 tag)`: A normal event with `OHC` MCV that has two
|
||
|
arguments in the payload: the cpu stored as a 32 bit signed integer,
|
||
|
and a tag stored as a 64 bit unsigned integer.
|
||
|
|
||
|
- `VYc+(u32 typeid, str label)`: A jumbo event with `VTc` MCV that has in the
|
||
|
jumbo payload a 32 bits unsigned integer for the typeid followed by the label
|
||
|
null-terminated string of variable size.
|
||
|
|
||
|
## Event description
|
||
|
|
||
|
To describe the meaning of each event, a description follows the event
|
||
|
declaration. This description accepts printf-like format specifiers that
|
||
|
are replaced with the value of the argument they refer to.
|
||
|
|
||
|
The formats are specified as follows:
|
||
|
|
||
|
```ABNF
|
||
|
format-specifier = "%" [ printf-format] "{" argument-name "}"
|
||
|
argument-name = 1*(CHAR / DIGIT)
|
||
|
```
|
||
|
|
||
|
Where the optional `printf-format` is any string accepted by the format
|
||
|
specifier of `printf()`, as defined in the manual `printf(3)`. If the
|
||
|
`printf-format` is not given, the default format for the argument type
|
||
|
is used.
|
||
|
|
||
|
Here are some examples of event descriptions of the previous events:
|
||
|
|
||
|
```c
|
||
|
{ "OHp", "pauses the execution" },
|
||
|
{ "OAs(i32 cpu)", "switches it's own affinity to the CPU %{cpu}" },
|
||
|
{ "OHC(i32 cpu, u64 tag)", "creates a new thread on CPU %{cpu} with tag %#llx{tag}" },
|
||
|
{ "VYc+(u32 typeid, str label)", "creates task type %{typeid} with label \"%{label}\"" },
|
||
|
```
|
||
|
|
||
|
Which would be printed with ovnidump like:
|
||
|
|
||
|
```nohighlight
|
||
|
OHp pauses the execution
|
||
|
OAs switches it's own affinity to the CPU 7
|
||
|
OHC creates a new thread on CPU 3 with tag 0x7f9239c6b6c0
|
||
|
VYc creates task type 4 with label "block computation"
|
||
|
```
|
||
|
|
||
|
## Model version
|
||
|
|
||
|
When adding new events of changing the format of already existing
|
||
|
events, the version of the model that defines the event must be changed
|
||
|
accordingly to the rules of [Semantic Versions](https://semver.org).
|
||
|
|
||
|
In general, adding new events will cause a minor increase in the
|
||
|
version, while changing events will cause a major increase. Notice that
|
||
|
the emulator will reject a stream which contains events from a model
|
||
|
which is not compatible with the current model version.
|