// Copyright 2019 The Marl Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #define MARL_REG_R1 0x00 #define MARL_REG_R2 0x08 #define MARL_REG_R13 0x10 #define MARL_REG_R14 0x18 #define MARL_REG_R15 0x20 #define MARL_REG_R16 0x28 #define MARL_REG_R17 0x30 #define MARL_REG_R18 0x38 #define MARL_REG_R19 0x40 #define MARL_REG_R20 0x48 #define MARL_REG_R21 0x50 #define MARL_REG_R22 0x58 #define MARL_REG_R23 0x60 #define MARL_REG_R24 0x68 #define MARL_REG_R25 0x70 #define MARL_REG_R26 0x78 #define MARL_REG_R27 0x80 #define MARL_REG_R28 0x88 #define MARL_REG_R29 0x90 #define MARL_REG_R30 0x98 #define MARL_REG_R31 0xa0 #define MARL_REG_R3 0xa8 #define MARL_REG_R4 0xb0 #define MARL_REG_LR 0xb8 #define MARL_REG_CCR 0xc0 #define MARL_REG_FPR14 0xc8 #define MARL_REG_FPR15 0xd0 #define MARL_REG_FPR16 0xd8 #define MARL_REG_FPR17 0xe0 #define MARL_REG_FPR18 0xe8 #define MARL_REG_FPR19 0xf0 #define MARL_REG_FPR20 0xf8 #define MARL_REG_FPR21 0x100 #define MARL_REG_FPR22 0x108 #define MARL_REG_FPR23 0x110 #define MARL_REG_FPR24 0x118 #define MARL_REG_FPR25 0x120 #define MARL_REG_FPR26 0x128 #define MARL_REG_FPR27 0x130 #define MARL_REG_FPR28 0x138 #define MARL_REG_FPR29 0x140 #define MARL_REG_FPR30 0x148 #define MARL_REG_FPR31 0x150 #define MARL_REG_VRSAVE 0x158 #define MARL_REG_VMX 0x160 #ifndef MARL_BUILD_ASM #include struct marl_fiber_context { // non-volatile registers uintptr_t r1; uintptr_t r2; uintptr_t r13; uintptr_t r14; uintptr_t r15; uintptr_t r16; uintptr_t r17; uintptr_t r18; uintptr_t r19; uintptr_t r20; uintptr_t r21; uintptr_t r22; uintptr_t r23; uintptr_t r24; uintptr_t r25; uintptr_t r26; uintptr_t r27; uintptr_t r28; uintptr_t r29; uintptr_t r30; uintptr_t r31; // first two parameter registers (r3, r4) uintptr_t r3; uintptr_t r4; // special registers uintptr_t lr; uintptr_t ccr; // non-volatile floating-point registers (f14-f31) uintptr_t fpr14; uintptr_t fpr15; uintptr_t fpr16; uintptr_t fpr17; uintptr_t fpr18; uintptr_t fpr19; uintptr_t fpr20; uintptr_t fpr21; uintptr_t fpr22; uintptr_t fpr23; uintptr_t fpr24; uintptr_t fpr25; uintptr_t fpr26; uintptr_t fpr27; uintptr_t fpr28; uintptr_t fpr29; uintptr_t fpr30; uintptr_t fpr31; // non-volatile altivec registers uint32_t vrsave; uintptr_t vmx[12 * 2]; }; // Only the ELFv2 ABI is supported for now. #if !defined(_CALL_ELF) || (_CALL_ELF != 2) #error "Only the ppc64 ELFv2 ABI is supported." #endif #ifdef __cplusplus #include static_assert(offsetof(marl_fiber_context, r1) == MARL_REG_R1, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r2) == MARL_REG_R2, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r13) == MARL_REG_R13, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r15) == MARL_REG_R15, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r16) == MARL_REG_R16, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r17) == MARL_REG_R17, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r18) == MARL_REG_R18, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r19) == MARL_REG_R19, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r20) == MARL_REG_R20, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r21) == MARL_REG_R21, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r22) == MARL_REG_R22, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r23) == MARL_REG_R23, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r24) == MARL_REG_R24, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r25) == MARL_REG_R25, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r26) == MARL_REG_R26, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r27) == MARL_REG_R27, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r28) == MARL_REG_R28, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r29) == MARL_REG_R29, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r30) == MARL_REG_R30, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r31) == MARL_REG_R31, "Bad register offset"); static_assert(offsetof(marl_fiber_context, r14) == MARL_REG_R14, "Bad register offset"); static_assert(offsetof(marl_fiber_context, lr) == MARL_REG_LR, "Bad register offset"); static_assert(offsetof(marl_fiber_context, ccr) == MARL_REG_CCR, "Bad register offset"); static_assert(offsetof(marl_fiber_context, fpr14) == MARL_REG_FPR14, "Bad register offset"); static_assert(offsetof(marl_fiber_context, fpr15) == MARL_REG_FPR15, "Bad register offset"); static_assert(offsetof(marl_fiber_context, fpr16) == MARL_REG_FPR16, "Bad register offset"); static_assert(offsetof(marl_fiber_context, fpr17) == MARL_REG_FPR17, "Bad register offset"); static_assert(offsetof(marl_fiber_context, fpr18) == MARL_REG_FPR18, "Bad register offset"); static_assert(offsetof(marl_fiber_context, fpr19) == MARL_REG_FPR19, "Bad register offset"); static_assert(offsetof(marl_fiber_context, fpr20) == MARL_REG_FPR20, "Bad register offset"); static_assert(offsetof(marl_fiber_context, fpr21) == MARL_REG_FPR21, "Bad register offset"); static_assert(offsetof(marl_fiber_context, fpr22) == MARL_REG_FPR22, "Bad register offset"); static_assert(offsetof(marl_fiber_context, fpr23) == MARL_REG_FPR23, "Bad register offset"); static_assert(offsetof(marl_fiber_context, fpr24) == MARL_REG_FPR24, "Bad register offset"); static_assert(offsetof(marl_fiber_context, fpr25) == MARL_REG_FPR25, "Bad register offset"); static_assert(offsetof(marl_fiber_context, fpr26) == MARL_REG_FPR26, "Bad register offset"); static_assert(offsetof(marl_fiber_context, fpr27) == MARL_REG_FPR27, "Bad register offset"); static_assert(offsetof(marl_fiber_context, fpr28) == MARL_REG_FPR28, "Bad register offset"); static_assert(offsetof(marl_fiber_context, fpr29) == MARL_REG_FPR29, "Bad register offset"); static_assert(offsetof(marl_fiber_context, fpr30) == MARL_REG_FPR30, "Bad register offset"); static_assert(offsetof(marl_fiber_context, fpr31) == MARL_REG_FPR31, "Bad register offset"); static_assert((offsetof(marl_fiber_context, vmx) % 16) == 0, "VMX must be quadword aligned"); static_assert(offsetof(marl_fiber_context, vmx) == MARL_REG_VMX, "Bad register offset"); static_assert(offsetof(marl_fiber_context, vrsave) == MARL_REG_VRSAVE, "Bad register offset"); #endif // __cplusplus #endif // MARL_BUILD_ASM