blob: b10d059c97e548edf54462a877fe61ec84465df6 [file] [log] [blame]
// Copyright CHERIoT Contributors.
// SPDX-License-Identifier: MIT
#pragma once
#include <compartment-macros.h>
#include <stddef.h>
#include <stdint.h>
struct Timeout;
/**
* The complete set of architectural permissions.
*/
enum CHERIPermission
{
/**
* Capability refers to global memory (this capability may be stored
* anywhere).
*/
CheriPermissionGlobal = 0,
/**
* Global capabilities can be loaded through this capability. Without
* this permission, any capability loaded via this capability will
* have `Global` and `LoadGlobal` removed.
*/
CheriPermissionLoadGlobal = 1,
/**
* Capability may be used to store. Any store via a capability without
* this permission will trap.
*/
CheriPermissionStore = 2,
/**
* Capabilities with store permission may be loaded through this
* capability. Without this, any loaded capability will have
* `LoadMutable` and `Store` removed.
*/
CheriPermissionLoadMutable = 3,
/**
* This capability may be used to store capabilities that do not have
* `Global` permission.
*/
CheriPermissionStoreLocal = 4,
/**
* This capability can be used to load.
*/
CheriPermissionLoad = 5,
/**
* Any load and store permissions on this capability convey the right to
* load or store capabilities in addition to data.
*/
CheriPermissionLoadStoreCapability = 6,
/**
* If installed as the program counter capability, running code may
* access privileged system registers.
*/
CheriPermissionAccessSystemRegisters = 7,
/**
* This capability may be used as a jump target and used to execute
* instructions.
*/
CheriPermissionExecute = 8,
/**
* This capability may be used to unseal other capabilities. The
* 'address' range is in the sealing type namespace and not in the
* memory namespace.
*/
CheriPermissionUnseal = 9,
/**
* This capability may be used to seal other capabilities. The
* 'address' range is in the sealing type namespace and not in the
* memory namespace.
*/
CheriPermissionSeal = 10,
/**
* Software defined permission bit, no architectural meaning.
*/
CheriPermissionUser0 = 11
};
/**
* The codes used in the cause field of the mtval CSR when the processor
* takes a CHERI exception.
*/
enum CHERICauseCode
{
/**
* No exception. This value is passed to the error handler after a
* forced unwind in a called compartment.
*/
CheriCauseCodeNone = 0,
/**
* Attempted to use a capability outside its bounds.
*/
CheriCauseCodeBoundsViolation = 1,
/**
* Attempted to use an untagged capability to authorize something.
*/
CheriCauseCodeTagViolation = 2,
/**
* Attempted to use a sealed capability to authorize something.
*/
CheriCauseCodeSealViolation = 3,
/**
* Attempted to jump to a capability without `Permission::Execute`.
*/
CheriCauseCodePermitExecuteViolation = 0x11,
/**
* Attempted to load via a capability without `Permission::Load`.
*/
CheriCauseCodePermitLoadViolation = 0x12,
/**
* Attempted to store via a capability without `Permission::Store`.
*/
CheriCauseCodePermitStoreViolation = 0x13,
/**
* Attempted to store a tagged capability via a capability without
* `Permission::LoadStoreCapability`.
*/
CheriCauseCodePermitStoreCapabilityViolation = 0x15,
/**
* Attempted to store a tagged capability without `Permission::Global`
* via capability without `Permission::StoreLocal`.
*/
CheriCauseCodePermitStoreLocalCapabilityViolation = 0x16,
/**
* Attempted to access a restricted CSR or SCR with PCC without
* `Permission::AccessSystemRegisters`.
*/
CheriCauseCodePermitAccessSystemRegistersViolation = 0x18,
/**
* Used to represent a value that has no valid meaning in hardware.
*/
CheriCauseCodeInvalid = -1
};
/**
* Register numbers as reported in cap idx field of `mtval` CSR when
* a CHERI exception is taken. Values less than 32 refer to general
* purpose registers and others to SCRs (of these, only PCC can actually
* cause an exception).
*/
enum CHERIRegisterNumber
{
/**
* The zero register, which always contains the `NULL` capability.
*/
CheriRegisterNumberCzr = 0x0,
/**
* `$c1` / `$cra` used by the ABI as the return address.
* Not preserved across calls.
*/
CheriRegisterNumberCra = 0x1,
/**
* `$c2` / `$csp` used by the ABI as the stack pointer.
* Preserved across calls.
*/
CheriRegisterNumberCsp = 0x2,
/**
* `$c3` / `$cgp` used by the ABI as the global pointer.
* Not allocatable by the compiler, set by the switcher on compartment
* entry.
*/
CheriRegisterNumberCgp = 0x3,
/**
* `$c4` / `$ctp` used by the ABI as the thread pointer.
* Currently unused by the compiler.
* Not preserved across compartment calls.
*/
CheriRegisterNumberCtp = 0x4,
/**
* `$c5` / `$ct0` used by the ABI as temporary register.
* Not preserved across calls.
*/
CheriRegisterNumberCT0 = 0x5,
/**
* `$c6` / `$ct1` used by the ABI as temporary register.
* Not preserved across calls.
*/
CheriRegisterNumberCT1 = 0x6,
/**
* `$c7` / `$ct2` used by the ABI as temporary register.
* Not preserved across calls.
*/
CheriRegisterNumberCT2 = 0x7,
/**
* `$c8` / `$cs0` used by the ABI as a callee-saved register.
* Preserved across calls.
*/
CheriRegisterNumberCS0 = 0x8,
/**
* `$c9` / `$cs1` used by the ABI as a callee-saved register.
* Preserved across calls.
*/
CheriRegisterNumberCS1 = 0x9,
/**
* `$c10` / `$ca0` used by the ABI as an argument register.
* Not preserved across calls.
*/
CheriRegisterNumberCA0 = 0xa,
/**
* `$c11` / `$ca1` used by the ABI as an argument register.
* Not preserved across calls.
*/
CheriRegisterNumberCA1 = 0xb,
/**
* `$c12` / `$ca2` used by the ABI as an argument register.
* Not preserved across calls.
*/
CheriRegisterNumberCA2 = 0xc,
/**
* `$c13` / `$ca3` used by the ABI as an argument register.
* Not preserved across calls.
*/
CheriRegisterNumberCA3 = 0xd,
/**
* `$c14` / `$ca4` used by the ABI as an argument register.
* Not preserved across calls.
*/
CheriRegisterNumberCA4 = 0xe,
/**
* `$c15` / `$ca5` used by the ABI as an argument register.
* Not preserved across calls.
*/
CheriRegisterNumberCA5 = 0xf,
/**
* The Program Counter Capability.
*
* Special capability register used to authorize instruction fetch. The
* address is that of the faulting instruction. Also used for accessing
* read-only globals.
*/
CheriRegisterNumberPcc = 0x20,
/**
* Machine-mode Trap Code Capability.
*
* Special capability register that
* is installed in PCC when the CPU takes a trap. The address has the
* same semantics as the RISC-V `mtvec` CSR. Only accessible when PCC
* has the AccessSystemRegisters permission.
*/
CheriRegisterNumberMtcc = 0x3c,
/**
* Machine-mode Tusted Data Capability.
*
* Special capability register that contains the memory root capability
* on boot. Only accessible when PCC has the AccessSystemRegisters
* permission. Use by the RTOS to store a capability to the trusted
* stack.
*/
CheriRegisterNumberMtdc = 0x3d,
/**
* Machine-mode Scratch Capability. Special capabiltiy register that
* contains the sealing root capability on boot. Only accessible when
* PCC has the AccessSystemRegisters permission.
*/
CheriRegisterNumberMScratchC = 0x3e,
/**
* Machine-mode Exception Program Counter Capability. Special capability
* register that contains the PCC of the faulting instruction on trap.
* The address has the same semantics as the RISC-V `mepc` CSR. Only
* accessible when PCC has the AccessSystemRegisters permission.
*/
CheriRegisterNumberMepcc = 0x3f,
/**
* Indicates a value that is not used by the hardware to refer to a
* register.
*/
CheriRegisterNumberInvalid = -1
};
/**
* Sealing types.
*/
enum CHERISealingType
{
/**
* 0 represents unsealed.
*/
CheriSealTypeUnsealed = 0,
/**
* Sentry that inherits interrupt status.
*/
CheriSealTypeSentryInheriting,
/**
* Sentry that disables interrupts on calls.
*/
CheriSealTypeSentryDisabling,
/**
* Sentry that enables interrupts on calls.
*/
CheriSealTypeSentryEnabling,
/**
* Return sentry that disables interrupts on return
*/
CheriSealTypeReturnSentryDisabling,
/**
* Return sentry that enables interrupts on return
*/
CheriSealTypeReturnSentryEnabling,
/**
* Marker for the first sealing type that's valid for data capabilities.
*/
CheriSealTypeFirstDataSealingType = 9,
/**
* The sealing type used for sealed export table entries.
*
* This is RTOS- and not CHERIoT-specific.
*/
CheriSealTypeSealedImportTableEntries = CheriSealTypeFirstDataSealingType,
/**
* The compartment switcher has a sealing type for the trusted stack.
*
* This must be the second data sealing type so that we can also permit
* the switcher to unseal sentries and export table entries.
*
* This is RTOS- and not CHERIoT-specific.
*/
CheriSealTypeSealedTrustedStacks,
/**
* The allocator has a sealing type for the software sealing mechanism
* with dynamically allocated objects.
*
* This is RTOS- and not CHERIoT-specific.
*/
CheriSealTypeAllocator,
/**
* The loader reserves a sealing type for the software sealing
* mechanism. The permit-unseal capability for this is destroyed after
* the loader has run, which guarantees that anything sealed with this
* type was present in the original firmware image. The token library
* has the only permit-unseal capability for this type.
*
* This is RTOS- and not CHERIoT-specific.
*/
CheriSealTypeStaticToken,
/**
* The first sealing key that is reserved for use by the allocator's
* software sealing mechanism and used for static sealing types,
*
* Architecturally, this is the smallest non-interpreted sealing type.
*/
CheriSealTypeFirstStaticSoftware = 16,
/**
* The first sealing key in the space that the allocator will
* dynamically allocate for sealing types.
*
* This is RTOS- and not CHERIoT-specific.
*/
CheriSealTypeFirstDynamicSoftware = 0x1000000
};
/**
* Checks that `ptr` is valid, unsealed, has at least `rawPermissions`, and has
* at least `space` bytes after the current offset.
*
* If the permissions do not include Global and `checkStackNeeded` is `false`,
* then this will also check that the capability does not point to the current
* thread's stack.
*
* To reduce code size, this function is provided as part of the compartment
* helper library.
*/
bool __cheri_libcall check_pointer(const void *ptr,
size_t space,
uint32_t rawPermissions,
bool checkStackNeeded);
/**
* Check that the argument is a valid pointer to a `Timeout` structure. This
* must have read/write permissions, be unsealed, and must not be a heap
* address.
*/
bool __cheri_libcall check_timeout_pointer(const struct Timeout *timeout);