| // Copyright Microsoft and CHERIoT Contributors. |
| // SPDX-License-Identifier: MIT |
| |
| #pragma once |
| #include <assembly-helpers.h> |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, mepcc, 0 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, c1, 1 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, csp, 2 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, cgp, 3 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, c4, 4 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, c5, 5 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, c6, 6 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, c7, 7 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, c8, 8 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, c9, 9 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, c10, 10 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, c11, 11 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, c12, 12 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, c13, 13 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, c14, 14 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, c15, 15 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, hazardPointers, 16 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, mstatus, 17 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, mcause, (17 * 8) + 4) |
| #ifdef CONFIG_MSHWM |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, mshwm, 18 * 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, mshwmb, (18 * 8) + 4) |
| |
| // Size of everything up to this point |
| # define TSTACK_REGFRAME_SZ (19 * 8) |
| // frameoffset, inForcedUnwind and padding |
| # define TSTACK_HEADER_SZ 16 |
| #else |
| // Size of everything up to this point |
| # define TSTACK_REGFRAME_SZ ((17 * 8) + (2 * 4)) |
| // frameoffset, inForcedUnwind and padding |
| # define TSTACK_HEADER_SZ 8 |
| #endif |
| // The basic trusted stack is the size of the save area, 8 bytes of state for |
| // unwinding information, and then a single trusted stack frame used for the |
| // unwind state of the initial thread. (8 * 3) is the size of TrustedStackFrame |
| // and will match the value below. |
| EXPORT_ASSEMBLY_SIZE(TrustedStack, |
| TSTACK_REGFRAME_SZ + TSTACK_HEADER_SZ + (8 * 3)) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, |
| frames, |
| TSTACK_REGFRAME_SZ + TSTACK_HEADER_SZ) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, frameoffset, TSTACK_REGFRAME_SZ) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, threadID, TSTACK_REGFRAME_SZ + 2) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStack, inForcedUnwind, TSTACK_REGFRAME_SZ + 4) |
| |
| EXPORT_ASSEMBLY_OFFSET(TrustedStackFrame, csp, 0) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStackFrame, calleeExportTable, 8) |
| EXPORT_ASSEMBLY_OFFSET(TrustedStackFrame, errorHandlerCount, 16) |
| // If you change this value, you must replace size_to_trusted_stack_frames in |
| // entry.S with something that divides by the new size. |
| EXPORT_ASSEMBLY_SIZE(TrustedStackFrame, (8 * 3)) |
| |
| #define TSTACKOFFSET_FIRSTFRAME \ |
| (TrustedStack_offset_frameoffset + TSTACK_HEADER_SZ) |
| |
| /* Constant to represent the raw permissions of the compartment CSP. |
| * We use this in the switcher, to verify the CSP comes from the |
| * compartment is exactly what we expect. |
| * This represents the following permissions: |
| * Load, Store, LoadStoreCapability, LoadMutable StoreLocal and LoadGlobal |
| */ |
| #define COMPARTMENT_STACK_PERMISSIONS 0x7e |