1 // Copyright 2019 The Marl Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // https://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #define MARL_REG_RBX 0x00 16 #define MARL_REG_RBP 0x08 17 #define MARL_REG_R12 0x10 18 #define MARL_REG_R13 0x18 19 #define MARL_REG_R14 0x20 20 #define MARL_REG_R15 0x28 21 #define MARL_REG_RDI 0x30 22 #define MARL_REG_RSI 0x38 23 #define MARL_REG_RSP 0x40 24 #define MARL_REG_RIP 0x48 25 26 #if defined(__APPLE__) 27 #define MARL_ASM_SYMBOL(x) _##x 28 #else 29 #define MARL_ASM_SYMBOL(x) x 30 #endif 31 32 #ifndef MARL_BUILD_ASM 33 34 #include <stdint.h> 35 36 struct marl_fiber_context { 37 // callee-saved registers 38 uintptr_t RBX; 39 uintptr_t RBP; 40 uintptr_t R12; 41 uintptr_t R13; 42 uintptr_t R14; 43 uintptr_t R15; 44 45 // parameter registers 46 uintptr_t RDI; 47 uintptr_t RSI; 48 49 // stack and instruction registers 50 uintptr_t RSP; 51 uintptr_t RIP; 52 }; 53 54 #ifdef __cplusplus 55 #include <cstddef> 56 static_assert(offsetof(marl_fiber_context, RBX) == MARL_REG_RBX, 57 "Bad register offset"); 58 static_assert(offsetof(marl_fiber_context, RBP) == MARL_REG_RBP, 59 "Bad register offset"); 60 static_assert(offsetof(marl_fiber_context, R12) == MARL_REG_R12, 61 "Bad register offset"); 62 static_assert(offsetof(marl_fiber_context, R13) == MARL_REG_R13, 63 "Bad register offset"); 64 static_assert(offsetof(marl_fiber_context, R14) == MARL_REG_R14, 65 "Bad register offset"); 66 static_assert(offsetof(marl_fiber_context, R15) == MARL_REG_R15, 67 "Bad register offset"); 68 static_assert(offsetof(marl_fiber_context, RDI) == MARL_REG_RDI, 69 "Bad register offset"); 70 static_assert(offsetof(marl_fiber_context, RSI) == MARL_REG_RSI, 71 "Bad register offset"); 72 static_assert(offsetof(marl_fiber_context, RSP) == MARL_REG_RSP, 73 "Bad register offset"); 74 static_assert(offsetof(marl_fiber_context, RIP) == MARL_REG_RIP, 75 "Bad register offset"); 76 #endif // __cplusplus 77 78 #endif // MARL_BUILD_ASM 79