Version Information: Version 1.0
Other formats: This document is also available in the following formats:
1. Introduction
Capstone is a novel CPU instruction set architecture (ISA) that creates a single unified architectural abstraction for achieving multiple security goals, thus liberating software developers from the burden of working with the distinct fundamental primitives exposed by numerous security extensions that often do not interoperate easily.
1.1. Properties to Support
The ultimate goal of Capstone is to provide a unified architectural abstraction for multiple security goals. This goal requires Capstone to support the following properties.
- Exclusive access
Software should be guaranteed exclusive access to certain memory regions if needed. This is in spite of the existence of software traditionally entitled to higher privileges such as the OS kernel and the hypervisor.
- Revocable delegation
Software components should be able to delegate authority to other components in a revocable manner. For example, after an untrusted library function has been granted access to a memory region, the caller should be able to revoke this access.
- Dynamically extensible hierarchy
The hierarchy of authority should be dynamically extensible, rather than predefined by the architecture such as hypervisor-kernel-user found in traditional platforms. This makes it possible to use the same set of abstractions for memory isolation and memory sharing regardless of where a software component lies in the hierarchy.
- Safe context switching
A mechanism that protects the confidentiality and integrity of the execution context of software during control flow transfers across security domain boundaries, including asynchronous ones such as those for interrupt and exception handling, should be provided.
1.2. Major Design Elements
The Capstone architecture design is based on the idea of capabilities, which are unforgeable tokens that represent authority to perform memory accesses and control flow transfers, among other operations. Capstone extends the traditional capability model with new capability types including the following.
- Linear capabilities
Linear capabilities are guaranteed not to alias with other capabilities that both grant memory access and are in architecturally visible locations (i.e., their actual contents might affect the execution of the whole system). Operations on linear capabilities maintain this property. For example, instructions can only move, but not copy, linear capabilities between general-purpose registers. They can hence enable safe exclusive access to memory regions. Capabilities that do not have this property are called non-linear capabilities.
- Revocation capabilities
Revocation capabilities cannot be used to perform memory accesses or control flow transfers. Instead, they convey the authority to revoke other capabilities. Each revocation capability is derived from a linear capability and can later be used to revoke (i.e., invalidate) capabilities derived from it. This mechanism enables revocable and arbitrarily extensible chains of delegation of authority.
- Uninitialised capabilities
Uninitialised capabilities convey write-only authority to memory. They can be turned into linear capabilities after the memory region has been “initialised”, i.e., when the whole memory region has been overwritten with fresh data. Uninitialised capabilities enable safe initialisation of memory regions and prevent secret leakage without incurring extra performance overhead.
1.3. Capstone-RISC-V ISA Overview
While Capstone does not assume any specific modern ISA, we choose to propose a Capstone extension to RISC-V due to its open nature and the availability of toolchains and simulators.
The Capstone-RISC-V ISA is an RV64IZicsr extension that makes the following types of changes to the base architecture:
- Registers
-
-
Each general-purpose register is extended to 129 bits to accommodate 128-bit capabilities.
-
New control and status registers (CSRs) are added.
-
Capability control and status registers (capability CSRs or CCSRs) are added.
-
New instructions for manipulating capabilities in general-purpose registers or CCSRs are added.
-
- Memory
-
-
The physical memory is partitioned into two disjoint regions, i.e., the normal memory and the secure memory.
-
The normal memory is exclusively for accesses through capabilities.
-
The secure memory is exclusively for accesses through the virtual memory.
-
-
Each memory location can either contains an integer or a capability, and the confusion between the two is not allowed.
-
New instructions for accessing capabilities in the memory or accessing memory using capabilities are added.
-
- World
-
-
Software components are allowed to run in either of the two worlds, i.e., the normal world and the secure world.
-
The normal world follows the traditional privilege levels, allows both capability-based accesses and virtual memory accesses, and is therefore compatible with existing software.
-
The secure world follows the Capstone design, limits memory accesses to capability-based accesses and provides the security guarantees of Capstone.
-
-
- Control flow instructions
-
-
New instructions for control flow transfers using capabilities are added.
-
New instructions for safe context switching in the secure world are added.
-
New instructions for world switching are added.
-
- Interrupts and exceptions
-
-
New exception types are added.
-
A new mechanism for handling interrupts and exceptions in the secure world is added.
-
- Existing instructions
-
-
Some existing instructions are adjusted, extended or disabled.
-
1.4. Assembly Mnemonics
Each Capstone-RISC-V instruction is given a mnemonic prefixed with CS.
.
In contexts where it is clear we are discussing Capstone-RISC-V instructions,
we will omit the CS.
prefix for brevity.
In assembly code, the list of operands to an instruction is supplied following the
instruction mnemonic, with the operands separated by commas, in the order of
rd
, rs1
, rs2
, imm
for any operand the instruction expects.
1.5. Notations
When specifying the semantics of instructions, we use the following notations to represent the type of each operand:
- I
-
Integer register.
- C
-
Capability register.
- S
-
Sign-extended immediate.
- Z
-
Zero-extended immediate.
1.6. Bibliography
The initial motivation, design, evaluation, and analysis of Capstone have been discussed in the following paper:
-
Capstone: A Capability-based Foundation for Trustless Secure Memory Access by Jason Zhijingcheng Yu, Conrad Watt, Aditya Badole, Trevor E. Carlson, Prateek Saxena. In Proceedings of the 32nd USENIX Security Symposium. Anaheim, CA, USA. August 2023.
2. Programming Model
The Capstone-RISC-V ISA has extended part of the machine state, including both some registers and the memory, to enable the storage and handling of capabilities.
2.1. Capabilities
2.1.1. Width
The width of a capability is 128 bits. We represent this as
CLEN = 128
and CLENBYTES = 16
. Note that this does not
affect the width of a raw address, which is XLEN = 64
bits,
or equivalently, XLENBYTES = 8
bytes, same as
in RV64IZicsr.
2.1.2. Fields
Each capability has the following architecturally-visible fields:
Name | Range | Description |
---|---|---|
|
|
Whether the capability is valid: |
|
|
The type of the capability:
|
|
|
Not applicable when |
|
|
The base memory address of the memory region associated with the capability |
|
|
Not applicable when |
|
|
Not applicable when |
|
|
Only applicable when |
|
|
Only applicable when |
The range of the perms
field has a partial order <=p
defined as follows:
<=p = { (0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (1, 1), (1, 3), (1, 5), (1, 7), (2, 2), (2, 3), (2, 6), (2, 7), (3, 3), (3, 7), (4, 4), (4, 5), (4, 6), (4, 7), (5, 5), (5, 7), (6, 6), (6, 7), (7, 7) }
We say a capability c
aliases with a capability d
if and only if the intersection
between [c.base, c.end)
and [d.base, d.end)
is non-empty.
For two revocation capabilities c
and d
(i.e., c.type = d.type = 2
),
we say c <t d
if and only if
-
c
aliases withd
-
The creation of
c
was earlier than the creation ofd
In addition to the above fields, an implementation also needs to maintain
sufficient metadata to test the <t
relation.
It will be clear that for any pair of aliasing revocation capabilities,
the order of their creations is well-defined.
Note: the implementation of valid
field
Note: addition/compression to capability fields
For different types of capabilities, a specific subset of the fields is used. The table below summarises the fields used for each type of capabilities.
Type | type |
valid |
cursor |
base |
end |
perms |
async |
reg |
---|---|---|---|---|---|---|---|---|
Linear |
|
Yes |
Yes |
Yes |
Yes |
Yes |
- |
- |
Non-linear |
|
Yes |
Yes |
Yes |
Yes |
Yes |
- |
- |
Revocation |
|
Yes |
Yes |
Yes |
Yes |
Yes |
- |
- |
Uninitialised |
|
Yes |
Yes |
Yes |
Yes |
Yes |
- |
- |
Sealed |
|
Yes |
- |
Yes |
- |
- |
Yes |
- |
Sealed-return |
|
Yes |
Yes |
Yes |
- |
- |
Yes |
Yes |
Exit |
|
Yes |
Yes |
Yes |
- |
- |
- |
- |
When the async
field of a sealed-return capability is 0
(synchronous),
or when the type
field of the capability is 6
(exit),
some memory accesses are granted by this capability.
The following table shows the memory accesses granted in such scenarios,
where size
is the size of the memory access in bytes.
Capability type | async |
Read | Write | Execute |
---|---|---|---|---|
Sealed-return |
|
|
|
No |
Exit |
- |
|
|
No |
In other scenarios and for other capability types without the perms
field, no read/write/execute
memory accesses are granted by the capability.
The following figure shows the overview of different types of capabilities in Capstone-RISC-V, and the operations that change the type of a capability.
2.2. Extension to General-Purpose Registers
The Capstone-RISC-V ISA extends each of the 32 general-purpose
registers, so it contains either a capability or a raw XLEN
-bit
integer.
The type of data contained in a register is maintained and confusion
of the type is not allowed, except for x0
/c0
as discussed below.
In assembly code, the type of data expected in a register operand
is indicated by the alias used for the register, as summarised
in the following table.
Index | XLEN -bit integer |
Capability |
---|---|---|
0 |
|
|
1 |
|
|
2 |
|
|
3 |
|
|
4 |
|
|
5 |
|
|
6 |
|
|
7 |
|
|
8 |
|
|
9 |
|
|
10 |
|
|
11 |
|
|
12 |
|
|
13 |
|
|
14 |
|
|
15 |
|
|
16 |
|
|
17 |
|
|
18 |
|
|
19 |
|
|
20 |
|
|
21 |
|
|
22 |
|
|
23 |
|
|
24 |
|
|
25 |
|
|
26 |
|
|
27 |
|
|
28 |
|
|
29 |
|
|
30 |
|
|
31 |
|
|
x0
/c0
is a read-only register that can be used both as an
integer and as a capability, depending on the context. When used
as an integer, it has the value 0
.
When used as a capability, it has the value
{ valid = 0, type = 0, cursor = 0, base = 0, end = 0, perms = 0 }
.
Any attempt to write to x0
/c0
will be silently ignored (no
exceptions are raised).
In this document,
for i = 0, 1, …, 31
, we use x[i]
to refer to the general-purpose
register with index i
.
2.3. Extension to Other Registers
2.3.1. Program Counter
Similar to the general-purpose registers,
the program counter (pc
) is extended to contain a capability or an integer.
Note: what is cwrld
During the instruction fetch stage, an exception is raised when any of the following conditions is met:
If no exception is raised:
Secure world (i.e., cwrld = 1
):
-
The instruction pointed to by
pc.cursor
is fetched and executed. -
Set
pc.cursor
topc.cursor + 4
at the end of the instruction.
Normal world (i.e., cwrld = 0
):
-
The instruction pointed to by
pc
is fetched and executed. -
Set
pc
topc + 4
at the end of the instruction.
2.4. Added Registers
The Capstone-RISC-V ISA adds the following registers.
Mnemonic | CCSR encoding | CSR encoding | Description |
---|---|---|---|
|
|
- |
The sealed capability or PC entry for the exception handler |
|
|
- |
The initial capability covering the entire address space of the secure memory |
|
|
- |
The exception program counter register |
|
- |
- |
The world currently in execution. |
|
- |
- |
The program counter for the normal world before the secure world is entered |
|
- |
- |
The stack pointer for the normal world before the secure world is entered |
|
- |
- |
The index of the general-purpose register used when switching worlds |
|
|
- |
The capability used to store contexts when switching worlds asynchronously |
|
- |
- |
The index of the general-purpose register for receiving the exit code when exiting the secure world |
|
- |
|
The exception data (trap value) register |
|
- |
|
The exception cause register |
|
- |
|
The encoding mode of the machine. |
Some of the registers only allow capability values and have special semantics related to the system-wide machine state. They are referred to as capability control and status registers (CCSRs). Under their respective constraints, CCSRs can be manipulated using control and status instructions.
The manipulation constraints for each CCSR are indicated below.
Mnemonic | Read | Write |
---|---|---|
|
Secure world |
Secure world |
|
Normal world; one-time only |
Not allowed |
|
Secure world |
Secure world |
|
Normal world |
Normal world |
Some of the registers are added as control and status registers (CSRs). These registers are manipulated by the same instructions that manipulate CSRs as in RV64IZicsr. When the manipulation constraints of these additional CSRs are not satisfied, the behaviour of these instructions follows the RV64IZicsr convention for other CSRs.
The manipulation constraints for each additional CSR are indicated below.
Mnemonic | Read | Write |
---|---|---|
|
Secure world |
Secure world |
|
Secure world |
Secure world |
|
Normal world |
Normal world |
Note: ceh
Note: cinit
2.5. Extension to Memory
The memory is addressed using an XLEN
-bit integer at byte-level
granularity.
In addition to raw integers, each CLEN
-bit aligned address can
also store a capability.
The type of data contained in a memory location is maintained and
confusion of the type is not allowed.
Note: maintaining the type of data
The physical memory is divided into two disjoint regions: the normal memory and the secure memory. While the normal memory is only accessible through Memory Management Unit (MMU), the secure memory can only be accessed through capabilities.
Hence, we have the following constraints on the memory accesses in different worlds.
World | Memory Management Unit (MMU) | Capabilities |
---|---|---|
Normal world |
Yes |
Yes |
Secure world |
No |
Yes |
The bounds of the secure memory [SBASE, SEND)
are implementation-defined.
But both SBASE
and SEND
are required to be CLENBYTES
-byte aligned.
Memory Region | Address Space | Access Method |
---|---|---|
Normal memory |
|
MMU |
Secure memory |
|
Capabilities |
Note: undefined behaviour
2.6. Instruction Set
The Capstone-RISC-V instruction set is based on the RV64IZicsr instruction set.
The (uncompressed) instructions are fixed 32-bit wide, and laid out in memory
in little-endian order. In the encoding space of the RV64IZicsr instruction set,
Capstone-RISC-V instructions occupies the “custom-2” subset, i.e., the opcode
of all Capstone-RISC-V instructions is 0b1011011
.
Capstone-RISC-V instruction encodings follow three basic formats: R-type, I-type and S-type, as described below (more details are also provided in the RISC-V ISA Manual).
R-type instructions receive up to three register operands, and I-type/S-type instructions receive up to two register operands and a 12-bit-wide immediate operand.
Capstone-RISC-V also uses a register operand of R-type as an immediate operand in some instructions, which is called register-immediate (RI) type for convenience in this document.
The so-called RI-type instructions are actually derivatives of R-type instructions. They receive up to two register operands and a 5-bit-wide immediate operand.
2.7. System Reset
Upon reset, the system state must conform to the following specifications.
3. Capability Manipulation Instructions
Capstone-RISC-V provides instructions for creating, modifying, and destroying capabilities. Note that due to the guarantee of provenance of capabilities, those instructions are the only way to manipulate capabilities. In particular, it is not possible to manipulate capabilities by manipulating the content of a memory location or register using other instructions.
3.1. Cursor, Bounds, and Permissions Manipulation
3.1.1. Capability Movement
Capabilities can be moved between registers with the MOVC instruction.
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
If
rs1 = rd
, the instruction is a no-op. -
Otherwise
-
Write
x[rs1]
tox[rd]
-
If
x[rs1]
is not a non-linear capability (i.e.,type != 1
), writecnull
tox[rs1]
.
-
3.1.2. Cursor Increment
The CINCOFFSET and CINCOFFSETIMM instructions increment the cursor
of a
capability by a given amount (offset).
CINCOFFSET
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
Set
val
tox[rs2]
. -
MOVC rd, rs1
. -
Set
x[rd].cursor
tox[rd].cursor + val
.
CINCOFFSETIMM
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
MOVC rd, rs1
. -
Set
x[rd].cursor
tox[rd].cursor + imm
.
3.1.3. Cursor Setter
The cursor
field of a capability can also be directly set with the SCC instruction.
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
Set
val
tox[rs2]
. -
MOVC rd, rs1
. -
Set
x[rd].cursor
toval
.
3.1.4. Field Query
The LCC instruction is used to read a field from a capability.
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
If
imm > 7
, writezero
tox[rd]
-
Otherwise, write
field
tox[rd]
according to the LCC multiplexing table.
imm |
field |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3.1.5. Bounds Shrinking
The bounds (base
and end
fields) of a capability can be shrunk with the SHRINK instruction.
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
Set
x[rd].base
tox[rs1]
andx[rd].end
tox[rs2]
. -
If
x[rd].cursor < x[rs1]
, setx[rd].cursor
tox[rs1]
. -
If
x[rd].cursor > x[rs2]
, setx[rd].cursor
tox[rs2]
.
3.1.6. Bounds Splitting
The SPLIT instruction can split a capability into two by splitting the bounds.
It attempts to split the capability x[rs1]
into two capabilities,
one with bounds [x[rs1].base, x[rs2])
and the other with bounds [x[rs2], x[rs1].end)
.
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
If
rs1 = rd
, the instruction is a no-op. -
Set
val
tox[rs2]
. -
Write
x[rs1]
tox[rd]
. -
Set
x[rs1].end
toval
,x[rs1].cursor
tox[rs1].base
. -
Set
x[rd].base
toval
,x[rd].cursor
toval
.
3.1.7. Permission Tightening
The TIGHTEN instruction tightens the permissions (perms
field) of a capability.
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
MOVC rd, rs1
. -
If
imm > 7
, setx[rs1].perms
to0
. Otherwise, setx[rs1].perms
toimm
.
3.2. Type Manipulation
Some instructions can affect the type
field of a capability directly.
In general, the type
field cannot be set arbitrarily.
Instead, it is changed as the side effect of certain semantically significant operations.
3.2.1. Delinearisation
The DELIN instruction delinearises a linear capability.
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
Set
x[rd].type
to1
(non-linear).
3.2.2. Initialisation
The INIT instruction transforms an uninitialised capability into a linear capability after its associated memory region has been fully initialised (written with new data).
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
Set
val
tox[rs2]
. -
MOVC rd, rs1
. -
Set
x[rd].type
to0
(linear), andx[rd].cursor
tox[rd].base + val
.
3.2.3. Sealing
The SEAL instruction seals a linear capability.
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
MOVC rd, rs1
. -
Set
x[rd].type
to2
(sealed), andx[rd].async
to0
(synchronous).
3.3. Dropping
The DROP instruction invalidates a capability.
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
If
x[rs1].valid
is0
(invalid), the instruction is a no-op. -
Otherwise, set
x[rs1].valid
to0
(invalid).
3.4. Revocation
3.4.1. Revocation Capability Creation
The MREV instruction creates a revocation capability.
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
Write
x[rs1]
tox[rd]
. -
Set
x[rd].type
to2
(revocation).
3.4.2. Revocation Operation
The REVOKE instruction revokes a capability.
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
For each capability
c
in the system (in either a register or memory location),c.valid
is set to0
(invalid) if any of the following conditions are met: -
x[rs1].type
is set to0
(linear) if at least one of the following conditions are met:-
For every invalidated capability
c
, the type ofc
is non-linear (i.e.,c.type
is1
). -
2 <=p x[rs1].perms
does not hold.
-
-
Otherwise, set
x[rs1].type
to3
(uninitialised), andx[rs1].cursor
tox[rs1].base
.
4. Memory Access Instructions
Capstone-RISC-V provides instructions to load and store capabilities from/to memory regions.
4.1. Load Capabilities
The LDC instruction loads a capability from the memory.
4.1.1. Secure world or normal world capability encoding mode
The LDC instruction loads a capability from the memory using a capability,
when cwrld
is 1
(secure world),
or when cwrld
is 0
(normal world) but emode
is 1
(capability encoding mode).
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
Set
cap
tox[rs1]
. -
Load the capability at the memory location
cap.cursor + imm, cap.cursor + imm + CLENBYTES)
intox[rd]
. -
If
x[rd].type
is not1
(non-linear), writecnull
to the memory location[cap.cursor + imm, cap.cursor + imm + CLENBYTES)
.
4.1.2. Normal world integer encoding mode
When cwrld
is 0
(normal world) and emode
is 0
(integer encoding mode),
the LDC instruction loads a capability from the normal memory using raw addresses.
The raw addresses are interpreted as physical addresses or virtual addresses
depending on the whether virtual memory is enabled.
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
Set
int
tox[rs1]
. -
Load the capability at the memory location
[int + imm, int + imm + CLENBYTES)
intox[rd]
. -
If
x[rd].type
is not1
(non-linear), writecnull
to the memory location[int + imm, int + imm + CLENBYTES)
.
4.2. Store Capabilities
The STC instruction stores a capability to the memory.
4.2.1. Secure world or normal world capability encoding mode
The STC instruction stores a capability to the memory using a capability,
when cwrld
is 1
(secure world),
or when cwrld
is 0
(normal world) but emode
is 1
(capability encoding mode).
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
Store
x[rs2]
to the memory location[x[rs1].cursor + imm, x[rs1].cursor + imm + CLENBYTES)
. -
If
x[rs1].type
is3
(uninitialised), setx[rs1].cursor
tox[rs1].cursor + CLENBYTES
. -
If
x[rs2].type
is not1
(non-linear), writecnull
tox[rs2]
.
4.2.2. Normal world integer encoding mode
When cwrld
is 0
(normal world) and emode
is 0
(integer encoding mode),
the STC instruction stores a capability to the normal memory using raw addresses.
The raw addresses are interpreted as physical addresses or virtual addresses
depending on the whether virtual memory is enabled.
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
Store
x[rs2]
to the memory location[x[rs1] + imm, x[rs1] + imm + CLENBYTES)
. -
If
x[rs2].type
is not1
(non-linear), writecnull
tox[rs2]
.
5. Control Flow Instructions
5.1. Jump to Capabilities
The CJALR and CBNZ instructions allow jumping to a capability, i.e., setting the program counter to a given capability, in a unconditional or conditional manner.
5.1.1. CJALR
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
Set
cap
tox[rs1]
. -
Set
pc.cursor
topc.cursor + 4
, writepc
tox[rd]
. -
Set
cap.cursor
tocap.cursor + imm
, writecap
topc
. -
If
rs1 != rd
andx[rs1].type != 1
, writecnull
tox[rs1]
.
5.1.2. CBNZ
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
If
x[rs1]
is0
, the instruction is a no-op. -
Otherwise
-
Write
x[rd]
topc
. -
Set
pc.cursor
topc.cursor + imm
. -
If
x[rd].type != 1
, writecnull
tox[rd]
.
-
5.2. Domain Crossing
Domains in Capstone-RISC-V are individual software compartments that are protected by a safe context switching mechanism, i.e., domain crossing. The mechanism is provided by the CALL and RETURN instructions.
5.2.1. CALL
The CALL instruction is used to call a sealed capability, i.e., to switch to another domain.
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
MOVC cra, rs1
. -
Swap the program counter (
pc
) with the content at the memory location[cra.base, cra.base + CLENBYTES)
. -
Swap
ceh
with the content at the memory location[cra.base + CLENBYTES, cra.base + 2 * CLENBYTES)
. -
Swap
csp
with the content at the memory location[cra.base + 2 * CLENBYTES, cra.base + 3 * CLENBYTES)
. -
Set
cra.type
to5
(sealed-return),cra.cursor
tocra.base
,cra.reg
tord
, andcra.async
to0
(synchronous).
5.2.2. RETURN
An exception is raised when any of the following conditions is met:
If no exception is raised:
If rs1 = 0
:
-
Set
pc.cursor
tox[rs2]
. -
Write
pc
toceh
, andepc
topc
. -
If
epc.type != 1
, writecnull
toepc
.
Otherwise:
When x[rs1].async = 0
(synchronous):
-
Write
x[rs1]
tocap
andcnull
tox[rs1]
. -
Set
pc.cursor
tox[rs2]
, and swap the program counter (pc
) with the content at the memory location[cap.base, cap.base + CLENBYTES)
. -
Swap
ceh
with the content at the memory location[cap.base + CLENBYTES, cap.base + 2 * CLENBYTES)
. -
Swap
csp
with the content at the memory location[cap.base + 2 * CLENBYTES, cap.base + 3 * CLENBYTES)
. -
Write
cap
tox[cap.reg]
and setx[cap.reg].type
to4
(sealed).
When x[rs1].async = 1
(upon exception):
-
Set
pc.cursor
tox[rs2]
, and swap the program counter (pc
) with the content at the memory location[x[rs1].base, x[rs1].base + CLENBYTES)
. -
Store
ceh
to the memory location[x[rs1].base + CLENBYTES, x[rs1].base + 2 * CLENBYTES)
. -
Set
x[rs1].type
to4
(sealed),x[rs1].async
to0
(synchronous). -
Write the resulting
x[rs1]
toceh
, andcnull
tox[rs1]
. -
For
i = 1, 2, …, 31
, swapx[i]
with the content at the memory location[ceh.base + (i + 1) * CLENBYTES, ceh.base + (i + 2) * CLENBYTES)
.
5.3. World Switching
The world switching mechanism of Capstone-RISC-V is provided by the CAPENTER and CAPEXIT instructions.
5.3.1. CAPENTER
The CAPENTER instruction causes an entry into the secure world from the normal world. And it is only available in the normal world.
An exception is raised when any of the following conditions is met:
If no exception is raised:
When x[rs1].async = 0
(synchronous):
-
MOVC cra, rs1
. -
Write
pc
andsp
tonormal_pc
andnormal_sp
respectively. -
Load the program counter (
pc
) from the memory location[cra.base, cra.base + CLENBYTES)
. -
Load
ceh
from the memory location[cra.base + CLENBYTES, cra.base + 2 * CLENBYTES)
. -
Load
csp
from the memory location[cra.base + 2 * CLENBYTES, cra.base + 3 * CLENBYTES)
. -
Set
cra.type
to6
(exit),cra.cursor
tocra.base
. -
Write
rs1
toswitch_reg
,rd
toexit_reg
. -
Set
cwrld
to1
(secure world).
When x[rs1].async
is 1
(upon exception) or 2
(upon interrupt):
-
Write
x[rs1]
toswitch_cap
, andcnull
tox[rs1]
. -
Write
pc
andsp
tonormal_pc
andnormal_sp
respectively. -
Load the program counter (
pc
) from the memory location[switch_cap.base, switch_cap.base + CLENBYTES)
. -
Load
ceh
from the memory location[switch_cap.base + CLENBYTES, switch_cap.base + 2 * CLENBYTES)
. -
For
i = 1, 2, …, 31
, loadx[i]
from the memory location[switch_cap.base + (i + 1) * CLENBYTES, switch_cap.base + (i + 2) * CLENBYTES)
. -
Set
switch_cap.type
to3
(uninitialised),switch_cap.cursor
toswitch_cap.base
. -
Write
rs1
toswitch_reg
,rd
toexit_reg
. -
Set
cwrld
to1
(secure world).
Note: the purpose of the rd
operand
5.3.2. CAPEXIT
The CAPEXIT instruction causes an exit from the secure world into the normal world. It is only available in the secure world and can only be used with an exit capability.
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
Write
x[rs1]
tocap
, andcnull
tox[rs1]
. -
Set
pc.cursor
tox[rs2]
, and writepc
,ceh
, andcsp
to the memory location[cap.base, cap.base + CLENBYTES)
,[cap.base + CLENBYTES, cap.base + 2 * CLENBYTES)
, and[cap.base + 2 * CLENBYTES, cap.base + 3 * CLENBYTES)
respectively. -
Write
normal_pc + 4
andnormal_sp
topc
andsp
respectively. -
Set
cap.type
to4
(sealed),cap.async
to0
(synchronous), and write the resultingcap
tox[switch_reg]
. -
Set
x[exit_reg]
to0
(normal exit). -
Set
cwrld
to0
(normal world).
6. Control and Status Instructions
The CCSRRW instruction is used to read and write specified capability control and status registers (CCSRs).
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
If the read constraint is satisfied
-
The content of the CCSR specified by
imm
is written tox[rd]
. -
If
x[rd].type
is not1
(non-linear), writecnull
to the CCSR specified byimm
.
-
-
Otherwise, write
cnull
tox[rd]
. -
If the write constraint is satisfied
-
Write
x[rs1]
to the CCSR specified byimm
. -
If
x[rs1].type
is not1
(non-linear), writecnull
tox[rs1]
.
-
-
Otherwise, preserve the current content of the CCSR specified by
imm
.
7. Adjustments to Existing Instructions
For most of the existing instructions in RV64IZicsr, their behaviour is unmodified.
The cursor
field (if type != 4
) or base
field (if type = 4
) of the capability is used
if a register containing a capability is used as an operand.
The following instructions in RV64IZicsr are adjusted in Capstone-RISC-V:
7.1. Memory Access Instructions
In RV64IZicsr, memory access instructions include load instructions
(i.e., lb
, lh
, ld
, lw
, lbu
, lhu
, lwu
), and store instructions (i.e., sb
, sh
, sw
, sd
).
These instructions take an integer as a raw address, and load or store a value from/to this address.
In Capstone-RISC-V, these instructions are extended to take a capability as an address.
7.1.1. Load Instructions
Note: size
of load instructions
Normal world integer encoding mode
When cwrld
is 0
(normal world) and emode
is 0
(integer encoding mode),
RV64IZicsr load instructions behave the same as in RV64IZicsr,
except that the following adjustments are made to these instructions:
Secure world or normal world capability encoding mode
RV64IZicsr load instructions are modified to load integers of different
sizes using capabilities, when cwrld
is 1
(secure world),
or when cwrld
is 0
(normal world) and emode
is 1
(capability encoding mode).
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
Load the content at the memory location
[x[rs1].cursor + imm, x[rs1].cursor + imm + size)
as a signed integer tox[rd]
.
If no exception is raised:
-
Load the content at the memory location
[x[rs1].cursor + imm, x[rs1].cursor + imm + size)
as an unsigned integer tox[rd]
.
7.1.2. Store Instructions
Note: size
of store instructions
Normal world integer encoding mode
When cwrld
is 0
(normal world) and emode
is 0
(integer encoding mode),
RV64IZicsr store instructions behave the same as in RV64IZicsr,
except that the following adjustments are made to these instructions:
Secure world or normal world capability encoding mode
RV64IZicsr store instructions are modified to store integers of different
sizes using capabilities, when cwrld
is 1
(secure world),
or when cwrld
is 0
(normal world) and emode
is 1
(capability encoding mode).
An exception is raised when any of the following conditions is met:
If no exception is raised:
-
Store
x[rs2]
to the memory location[x[rs1].cursor + imm, x[rs1].cursor + imm + size)
as an integer. -
If
x[rs1].type
is3
(uninitialised), setx[rs1].cursor
tox[rs1].cursor + size
.
7.2. Control Flow Instructions
In RV64IZicsr, conditional branch instructions (i.e., beq
, bne
, blt
, bge
, bltu
, and bgeu
),
and unconditional jump instructions (i.e., jal
and jalr
) are used to control the flow of execution.
In Capstone-RISC-V, these instructions are adjusted to support the situation where the program counter is a capability.
7.2.1. Branch Instructions
The following adjustments are made to these instructions:
7.2.2. Jump Instructions
The following adjustments are made to these instructions:
7.3. Illegal Instructions
Some instructions in RV64IZicsr now raise illegal instruction (2)
exceptions
when executed in the secure world, under all or some circumstances.
These instructions are:
8. Interrupts and Exceptions
8.1. Exception and Exit Codes
Note: where are the exception codes relevant?
The exception code is what the exception handler domain receives as an argument when an exception occurs in the secure world. It is an integer value that indicates what the type of the exception is.
Capstone-RISC-V also has exit codes, which are the values returned to the CAPENTER instruction in case the exception cannot be handled in the secure world.
We define the exception code and the exit code for each type of exception below. It aligns with the exception codes defined in RV64IZicsr, where applicable, for ease of implementation and interoperability.
Exception | Exception code | Exit code |
---|---|---|
Instruction address misaligned |
0 |
1 |
Instruction access fault |
1 |
1 |
Illegal instruction |
2 |
1 |
Breakpoint |
3 |
1 |
Load address misaligned |
4 |
1 |
Load access fault |
5 |
1 |
Store/AMO address misaligned |
6 |
1 |
Store/AMO access fault |
7 |
1 |
Unexpected operand type |
24 |
1 |
Invalid capability |
25 |
1 |
Unexpected capability type |
26 |
1 |
Insufficient capability permissions |
27 |
1 |
Capability out of bound |
28 |
1 |
Illegal operand value |
29 |
1 |
Insufficient system resources |
30 |
1 |
For interrupts, the same encodings as in RV64IZicsr are used.
Note: exit code
Note: implementation specified exception
8.2. Exception Data
For the secure world, the exception-related data is stored in the tval
CSR,
similar to RV64IZicsr. The exception handler
can use the value to decide how to handle the exception.
However, such data is available only for in-domain exception handling, where the
exception handling process does not involve a domain switch.
Note: tval
is only available in in-domain exception handling
For exceptions defined in RV64IZicsr, the same data as in it is written to tval
.
For the added exceptions, the following data is written to tval
:
Exception | Data |
---|---|
|
The instruction itself (or the lowest XLEN bits if it is wider than XLEN) |
|
The instruction itself (or the lowest XLEN bits if it is wider than XLEN) |
|
The instruction itself (or the lowest XLEN bits if it is wider than XLEN) |
|
The instruction itself (or the lowest XLEN bits if it is wider than XLEN) |
|
The instruction itself (or the lowest XLEN bits if it is wider than XLEN) |
|
The instruction itself (or the lowest XLEN bits if it is wider than XLEN) |
8.3. Handling of Secure-World Interrupts
Note: overview of interrupt handling in the secure world
When an interrupt occurs in the secure world, the processor core directly saves the full context, scrubs it, and exits to the normal world. It then generates a corresponding interrupt in the normal world, and follows the normal-world interrupt handling process thereafter.
The figure below shows the overview of interrupt handling in Capstone-RISC-V.
If the content in switch_cap
satisfies the following conditions:
-
Store
pc
to the memory location[switch_cap.base, switch_cap.base + CLENBYTES)
. -
Store
ceh
to the memory location[switch_cap.base + CLENBYTES, switch_cap.base + 2 * CLENBYTES)
, and writecnull
toceh
. -
For
i = 1, 2, …, 31
, store the content ofx[i]
to the memory location[switch_cap.base + (i + 1) * CLENBYTES, switch_cap.base + (i + 2) * CLENBYTES)
. -
Load the program counter
pc
and the stack pointersp
fromnormal_pc
andnormal_sp
respectively. -
Set
switch_cap.type
to4
(sealed),switch_cap.async
to2
(upon interrupt). -
Write
switch_cap
to the registerx[switch_reg]
, andcnull
toswitch_cap
. -
Scrub the other general-purpose registers (i.e., write
zero
tox[i]
wherei != 2
andi != switch_reg
). -
Set the
cwrld
register to0
(normal world). -
Trigger an interrupt in the normal world.
Otherwise:
-
Load the program counter
pc
and the stack pointersp
fromnormal_pc
andnormal_sp
respectively. -
Write
cnull
tox[switch_reg]
. -
Scrub the other general-purpose registers (i.e., write
zero
tox[i]
wherei != 2
andi != switch_reg
). -
Set the
cwrld
register to0
(normal world). -
Trigger an interrupt in the normal world.
Note that in this case, there will be another exception in the normal world
when the user process resumes execution after the interrupt has been handled
by the OS, due to the invalid switch_cap
value written to the CAPENTER
operand.
8.4. Handling of Secure-World Exceptions
Note: overview of exception handling in the secure world
When an exception occurs, the processor core first attempts to handle the exception in the secure world. If this fails, the processor core saves the full context if it can and exits to the normal world with a proper error code.
The figure below shows the overview of exception handling in Capstone-RISC-V.
If the content in ceh
satisfies the following conditions:
-
Swap
pc
with the content at memory location[ceh.base, ceh.base + CLENBYTES)
. -
For
i = 1, 2, …, 31
, swapx[i]
with the content at the memory location[ceh.base + (i + 1) * CLENBYTES, ceh.base + (i + 2) * CLENBYTES)
. -
Set the
ceh.type
to5
(sealed-return),ceh.cursor
toceh.base
, andceh.async
to1
(upon exception). -
Write
ceh
to the registercra
, andcnull
to the registerceh
. -
Swap
ceh
with the content at the memory location[cra.base + CLENBYTES, cra.base + 2 * CLENBYTES)
. -
Write the exception code to the register
a0
.
If the content is ceh
is a valid executable non-linear capability or linear capability:
-
Write
pc
toepc
. -
Write
ceh
topc
. Ifceh.type != 1
, writecnull
toceh
. -
Write the exception code to
cause
. -
Write extra exception data to
tval
.
Otherwise:
If the content in switch_cap
satisfies the following conditions:
-
Store the current value of the program counter (
pc
) to the memory location[switch_cap.base, switch_cap.base + CLENBYTES)
. -
Store
ceh
to the memory location[switch_cap.base + CLENBYTES, switch_cap.base + 2 * CLENBYTES)
, and writecnull
toceh
. -
For
i = 1, 2, …, 31
, store the content ofx[i]
to the memory location[switch_cap.base + (i + 1) * CLENBYTES, switch_cap.base + (i + 2) * CLENBYTES)
. -
Load the program counter
pc
and the stack pointersp
fromnormal_pc
andnormal_sp
respectively. -
Write
normal_pc + 4
andnormal_sp
topc
andsp
respectively. -
Set
switch_cap.type
to4
(sealed),switch_cap.async
to1
(upon exception). -
Write the content of
switch_cap
tox[switch_reg]
, andcnull
toswitch_cap
. -
Scrub the other general-purpose registers (i.e., write
zero
tox[i]
wherei != 2
andi != switch_reg
). -
Write the exit code to
x[exit_reg]
. -
Set the
cwrld
register to0
(normal world).
Otherwise:
-
Write
normal_pc + 4
andnormal_sp
topc
andsp
respectively. -
Write
cnull
tox[switch_reg]
. -
Scrub the other general-purpose registers (i.e., write
zero
tox[i]
wherei != 2
andi != switch_reg
). -
Write the exit code to
x[exit_reg]
. -
Set the
cwrld
register to0
(normal world).
Note: comparison between synchronous and asynchronous exit
Appendix A: Instruction Listing
A.1. Capstone Instructions
Mnemonic | Sail model | Format | Func3 | Func7 | rs1 | rs2 | rd | imm [4:0] | imm[11:0] | World |
---|---|---|---|---|---|---|---|---|---|---|
R |
|
|
C |
- |
- |
- |
- |
* |
||
R |
|
|
I |
I |
C |
- |
- |
* |
||
RI |
|
|
C |
- |
C |
Z |
- |
* |
||
R |
|
|
- |
- |
C |
- |
- |
* |
||
RI |
|
|
C |
- |
I |
Z |
- |
* |
||
R |
|
|
C |
I |
C |
- |
- |
* |
||
R |
|
|
C |
I |
C |
- |
- |
* |
||
R |
|
|
C |
- |
C |
- |
- |
* |
||
R |
|
|
C |
- |
C |
- |
- |
* |
||
R |
|
|
C |
I |
C |
- |
- |
* |
||
R |
|
|
C |
- |
C |
- |
- |
* |
||
R |
|
|
C |
- |
- |
- |
- |
* |
||
R |
|
|
C |
I |
C |
- |
- |
* |
||
I |
|
- |
C |
- |
C |
- |
S |
* |
Mnemonic | Sail model | Format | emode |
Func3 | Func7 | rs1 | rs2 | rd | imm[11:0] | World |
---|---|---|---|---|---|---|---|---|---|---|
I |
|
|
- |
I |
- |
C |
S |
N |
||
I |
|
|
- |
C |
- |
C |
S |
N |
||
I |
- |
|
- |
C |
- |
C |
S |
S |
||
S |
|
|
- |
I |
C |
- |
S |
N |
||
S |
|
|
- |
C |
C |
- |
S |
N |
||
S |
- |
|
- |
C |
C |
- |
S |
S |
Mnemonic | Sail model | Format | Func3 | Func7 | rs1 | rs2 | rd | imm[11:0] | World |
---|---|---|---|---|---|---|---|---|---|
R |
|
|
C |
- |
C |
- |
S |
||
R |
|
|
C |
I |
- |
- |
S |
||
I |
|
- |
C |
- |
C |
S |
S |
||
I |
|
- |
I |
- |
C |
S |
S |
||
R |
|
|
C |
- |
I |
- |
N |
||
R |
|
|
C |
I |
- |
- |
S |
Mnemonic | Sail model | Format | Func3 | Func7 | rs1 | rs2 | rd | imm[11:0] | World |
---|---|---|---|---|---|---|---|---|---|
I |
|
- |
C |
- |
C |
Z |
* |
A.2. Extended RV64IZicsr Memory Access Instructions
Mnemonic | Format | emode |
Func3 | Func7 | rs1 | rs2 | rd | imm[11:0] | World |
---|---|---|---|---|---|---|---|---|---|
I |
|
|
- |
I |
- |
I |
S |
N |
|
I |
|
|
- |
C |
- |
I |
S |
N |
|
I |
- |
|
- |
C |
- |
I |
S |
S |
|
I |
|
|
- |
I |
- |
I |
S |
N |
|
I |
|
|
- |
C |
- |
I |
S |
N |
|
I |
- |
|
- |
C |
- |
I |
S |
S |
|
I |
|
|
- |
I |
- |
I |
S |
N |
|
I |
|
|
- |
C |
- |
I |
S |
N |
|
I |
- |
|
- |
C |
- |
I |
S |
S |
|
I |
|
|
- |
I |
- |
I |
S |
N |
|
I |
|
|
- |
C |
- |
I |
S |
N |
|
I |
- |
|
- |
C |
- |
I |
S |
S |
|
I |
|
|
- |
I |
- |
I |
S |
N |
|
I |
|
|
- |
C |
- |
I |
S |
N |
|
I |
- |
|
- |
C |
- |
I |
S |
S |
|
I |
|
|
- |
I |
- |
I |
S |
N |
|
I |
|
|
- |
C |
- |
I |
S |
N |
|
I |
- |
|
- |
C |
- |
I |
S |
S |
|
I |
|
|
- |
I |
- |
I |
S |
N |
|
I |
|
|
- |
C |
- |
I |
S |
N |
|
I |
- |
|
- |
C |
- |
I |
S |
S |
Mnemonic | Format | emode |
Func3 | Func7 | rs1 | rs2 | rd | imm[11:0] | World |
---|---|---|---|---|---|---|---|---|---|
S |
|
|
- |
I |
I |
- |
S |
N |
|
S |
|
|
- |
C |
I |
- |
S |
N |
|
S |
- |
|
- |
C |
I |
- |
S |
S |
|
S |
|
|
- |
I |
I |
- |
S |
N |
|
S |
|
|
- |
C |
I |
- |
S |
N |
|
S |
- |
|
- |
C |
I |
- |
S |
S |
|
S |
|
|
- |
I |
I |
- |
S |
N |
|
S |
|
|
- |
C |
I |
- |
S |
N |
|
S |
- |
|
- |
C |
I |
- |
S |
S |
|
S |
|
|
- |
I |
I |
- |
S |
N |
|
S |
|
|
- |
C |
I |
- |
S |
N |
|
S |
- |
|
- |
C |
I |
- |
S |
S |
Note: the meaning of abbreviations in the table
Appendix B: Comparison with Other Capability-Based ISA Extensions to RISC-V
Similar to Capstone-RISC-V, CHERI-RISC-V [1] and CHERIoT [2] are also capability-based ISA extension to RISC-V, both derived from the CHERI architecture. CHERI-RISC-V is designed for general-purpose computing, whereas CHERIoT builds on RV32E and specialises in low-cost embedded systems such as IoT devices.
We discuss the commonalities and differences between Capstone-RISC-V, CHERI-RISC-V, and CHERIoT in this appendix, in the hope to shed light on how to allow Capstone-RISC-V to coexist with the other two ISA extensions in the RISC-V ecosystem.
B.1. Commonalities
Capstone-RISC-V, CHERI-RISC-V, and CHERIoT all use architectural capabilities to allow capabilities to be stored in either registers or memory, with hardware-enforced provenance and monotonicity guarantees as well as bounds checks on capability dereferences. As a result, some of the instructions in the three ISAs have obvious and direct correspondence, as summarised in the following table.
Capstone-RISC-V instruction(s) | CHERI-RISC-V instruction(s) | CHERIoT instruction(s) |
---|---|---|
DROP |
CClearTag |
CClearTag |
CJALR |
CJALR |
CJALR |
CALL |
CInvoke |
- |
SEAL |
CSealEntry |
- |
CIncOffset |
CIncOffset |
CIncAddr |
CIncOffsetImm |
CIncOffsetImm |
CIncAddrImm |
LCC |
CGetAddr, CGetBase, CGetType, CGetPerm |
CGetAddr, CGetBase, CGetTop, CGetType, CGetPerm |
SCC |
CSetAddr |
CSetAddr |
TIGHTEN |
CAndPerm |
CAndPerm |
SHRINK |
CSetBounds, CSetBoundsExact |
CSetBounds, CSetBoundsExact |
MOVC |
CMove |
CMove |
LDC |
LC.CAP, LC.DDC, CLC |
CLC |
STC |
SC.CAP, LC.DDC, CSC |
CSC |
L[BHWD] |
L[BHWD][U].CAP |
L[BHWD][U] |
S[BHWD] |
S[BHWD][U].CAP |
S[BHWD][U] |
CCSRRW |
CSpecialRW |
CSpecialRW |
Most of the shared instructions are the ones for capability manipulations, as a result of having similar capability fields across the three ISA extensions. The basic use of capabilities, namely, explicit capability-based memory accesses, is also common in all three ISA extensions.
B.2. Differences
The differences stem from the different sets of extra features and capability types supported by the ISA extensions. For example, Capstone-RISC-V supports linear capabilities and revocation through revocation capabilities that are found in neither CHERI-RISC-V nor CHERIoT. Moreover, CHERIoT does not support hybrid-mode memory accesses that use raw addresses in place of explicit capabilities, or domain switches that involve atomic swapping of sealed execution contexts, and hence lacks the relevant instructions.
While Capstone-RISC-V and CHERI-RISC-V both have hybrid mode support, they adopt different models, with Capstone-RISC-V using a two-world model that aligns with its high-level goal of isolating pure capability code from privileged legacy code. Sealed capabilities in Capstone-RISC-V are also different from those in CHERI-RISC-V and CHERIoT. Capstone-RISC-V uses sealed capabilities exclusively for protecting domain execution contexts, allowing unsealing only upon domain switching, whereas the other two ISA extensions find more generic use for them and allow software to unseal them explicitly through an instruction.
The feature sets of the three ISA extensions are summarised in the table below.
Feature | Capstone-RISC-V | CHERI-RISC-V | CHERIoT |
---|---|---|---|
Linear capabilities |
Y |
- |
- |
Revocation |
Revocation capabilities with tracked derivation |
Local capabilities |
Local capabilities, revocation bits bound to object memory locations, local capabilities |
Capability load |
Anyone can load capabilities |
|
|
Capability store |
Anyone can store capabilities |
|
|
Memory zeroing |
Uninitialised capabilities |
- |
- |
Software-defined fields |
- |
Y |
Y |
Hybrid mode |
Separate normal and secure worlds, with MMU for integer address accesses in normal world |
Default data capability for integer address accesses |
- |
Explicit sealing |
Anyone can seal |
|
|
Implicit sealing upon domain switching |
Y |
- |
- |
Explicit unsealing |
- |
Matching |
Matching |
Implicit unsealing upon domain switching |
Anyone can perform domain switching |
Matching |
- |
Bibliography
-
[1] Robert N M Watson, Peter G Neumann, Jonathan Woodruff, Michael Roe, Hesham Almatary, Jonathan Anderson, John Baldwin, Graeme Barnes, David Chisnall, Jessica Clarke, Brooks Davis, Lee Eisen, Nathaniel Wesley Filardo, Richard Grisenthwaite, Alexandre Joannou, Ben Laurie, A Theodore Markettos, Simon W Moore, Steven J Murdoch, Kyndylan Nienhuis, Robert Norton, Alexander Richardson, Peter Rugg, Peter Sewell, Stacey Son, and Hongyan Xia. Capability Hardware Enhanced RISC Instructions: CHERI Instruction-Set Architecture (Version 8).
-
[2] Saar Amar, Tony Chen, David Chisnall, Felix Domke, Nathaniel Wesley Filardo, Kunyan Liu, Robert M Norton, Yucong Tao, Robert N M Watson, and Hongyan Xia. CHERIoT: Rethinking security for low-cost embedded systems.