| // 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 |