Examples
========

This directory contains a number of examples to understand the system:

 1. [Hello world](01.hello_world) is a simple example with a single compartment.
 2. [Compartmentalised hello world](02.hello_compartment) splits the first example into two compartments.
 3. [A more secure compartmentalised hello world](03.hello_safe_compartment) protects the UART compartment from the previous example against malicious callers.
 4. [A demonstration of heap temporal safety](04.temporal_safety) shows that use-after-free bugs will deterministically trap.
 5. [A sealing demonstration](05.sealing) shows how the CHERI sealing mechanism can protect opaque types across compartment boundaries.
 6. [A trivial producer-consumer system](06.producer-consumer) shows the basics of inter-thread communication.
 7. [Handling errors in compartments](07.error_handling) shows how to recover from crashes in compartments.
 8. [Memory safety examples](08.memory_safety) demonstrates how the CHERIoT platform enforces memory safety.
 9. [JavaScript](09.javascript) is a simple example embedding a JavaScript VM in a compartment.

Each example contains a readme file explaining what it is showing.

Building an example
-------------------

Each example is built with xmake, which first requires a configure step in the terminal:

```sh
$ cd {example_dir}
$ xmake config --sdk={path-to-cheriot-llvm-tools} -P .
```

If you are using the dev container then the `--sdk` flag will be `--sdk=/cheriot-tools/`.

You can pass some additional flags to this step.

 - `-m {debug,release}` will switch between debug and release builds.
 - `--debug-{allocator,scheduler,loader}={y,n}` will enable verbose output for the specified core RTOS component.
 - `--board={board name}` to compile for a target other than the default (the interpreter generated from the formal model).

Next, build the firmware image with:

```sh
$ xmake -P . -v
```

The `-v` (verbose) flag is optional but an xmake bug prevents the objdump output from being generated if it is not specified.
You will then end up with a firmware image and a `.dump` file containing the objdump output in `build/cheriot/cheriot/{debug,release}`.
The penultimate two status lines of the output will be something like:

```
[ 95%]: linking firmware build/cheriot/cheriot/debug/producer-consumer
[ 95%]: Creating firmware dump build/cheriot/cheriot/debug/producer-consumer.dump
```

The first of these tells you the path to the firmware image, the second the location of the dump file that is a (somewhat) human-readable version of the same file.

By default, the examples are built targeting the interpreter that is generated from the Sail formal model of the ISA.
This is the gold model, so anything that runs there should run on any compliant implementation.
This interpreter includes an ELF loader and so can run the examples directly, for example:

```sh
$ cheriot_sim -V ./build/cheriot/cheriot/debug/producer-consumer
```

Where `debug` is the value that you passed to the `-m` flag (`debug` is the default and the path that ends in `producer-consumer` is the path from the build output.
