|  | // 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 <stdint.h> | 
|  |  | 
|  | 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 <cstddef> | 
|  | 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 |