1 1.26 christos /* $NetBSD: mcontext.h,v 1.26 2024/11/30 01:04:13 christos Exp $ */ 2 1.2 thorpej 3 1.2 thorpej /*- 4 1.2 thorpej * Copyright (c) 2001 The NetBSD Foundation, Inc. 5 1.2 thorpej * All rights reserved. 6 1.2 thorpej * 7 1.2 thorpej * This code is derived from software contributed to The NetBSD Foundation 8 1.2 thorpej * by Klaus Klein. 9 1.2 thorpej * 10 1.2 thorpej * Redistribution and use in source and binary forms, with or without 11 1.2 thorpej * modification, are permitted provided that the following conditions 12 1.2 thorpej * are met: 13 1.2 thorpej * 1. Redistributions of source code must retain the above copyright 14 1.2 thorpej * notice, this list of conditions and the following disclaimer. 15 1.2 thorpej * 2. Redistributions in binary form must reproduce the above copyright 16 1.2 thorpej * notice, this list of conditions and the following disclaimer in the 17 1.2 thorpej * documentation and/or other materials provided with the distribution. 18 1.2 thorpej * 19 1.2 thorpej * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.2 thorpej * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.2 thorpej * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.2 thorpej * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.2 thorpej * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.2 thorpej * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.2 thorpej * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.2 thorpej * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.2 thorpej * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.2 thorpej * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.2 thorpej * POSSIBILITY OF SUCH DAMAGE. 30 1.2 thorpej */ 31 1.2 thorpej 32 1.2 thorpej #ifndef _POWERPC_MCONTEXT_H_ 33 1.2 thorpej #define _POWERPC_MCONTEXT_H_ 34 1.2 thorpej 35 1.2 thorpej /* 36 1.2 thorpej * Layout of mcontext_t based on the System V Application Binary Interface, 37 1.2 thorpej * Edition 4.1, PowerPC Processor ABI Supplement - September 1995, and 38 1.2 thorpej * extended for the AltiVec Register File. Note that due to the increased 39 1.2 thorpej * alignment requirements of the latter, the offset of mcontext_t within 40 1.2 thorpej * an ucontext_t is different from System V. 41 1.2 thorpej */ 42 1.2 thorpej 43 1.2 thorpej #define _NGREG 39 /* GR0-31, CR, LR, SRR0, SRR1, CTR, XER, MQ */ 44 1.2 thorpej 45 1.5 matt typedef long __greg_t; 46 1.2 thorpej typedef __greg_t __gregset_t[_NGREG]; 47 1.2 thorpej 48 1.3 matt #define _REG_R0 0 49 1.3 matt #define _REG_R1 1 50 1.3 matt #define _REG_R2 2 51 1.3 matt #define _REG_R3 3 52 1.3 matt #define _REG_R4 4 53 1.3 matt #define _REG_R5 5 54 1.3 matt #define _REG_R6 6 55 1.3 matt #define _REG_R7 7 56 1.3 matt #define _REG_R8 8 57 1.3 matt #define _REG_R9 9 58 1.3 matt #define _REG_R10 10 59 1.3 matt #define _REG_R11 11 60 1.3 matt #define _REG_R12 12 61 1.3 matt #define _REG_R13 13 62 1.3 matt #define _REG_R14 14 63 1.3 matt #define _REG_R15 15 64 1.3 matt #define _REG_R16 16 65 1.3 matt #define _REG_R17 17 66 1.3 matt #define _REG_R18 18 67 1.3 matt #define _REG_R19 19 68 1.3 matt #define _REG_R20 20 69 1.3 matt #define _REG_R21 21 70 1.3 matt #define _REG_R22 22 71 1.3 matt #define _REG_R23 23 72 1.3 matt #define _REG_R24 24 73 1.3 matt #define _REG_R25 25 74 1.3 matt #define _REG_R26 26 75 1.3 matt #define _REG_R27 27 76 1.3 matt #define _REG_R28 28 77 1.3 matt #define _REG_R29 29 78 1.3 matt #define _REG_R30 30 79 1.3 matt #define _REG_R31 31 80 1.3 matt #define _REG_CR 32 /* Condition Register */ 81 1.3 matt #define _REG_LR 33 /* Link Register */ 82 1.3 matt #define _REG_PC 34 /* PC (copy of SRR0) */ 83 1.3 matt #define _REG_MSR 35 /* MSR (copy of SRR1) */ 84 1.3 matt #define _REG_CTR 36 /* Count Register */ 85 1.10 matt #define _REG_XER 37 /* Integer Exception Register */ 86 1.3 matt #define _REG_MQ 38 /* MQ Register (POWER only) */ 87 1.2 thorpej 88 1.2 thorpej typedef struct { 89 1.17 joerg #ifdef _KERNEL 90 1.17 joerg unsigned long long __fpu_regs[32]; /* FP0-31 */ 91 1.17 joerg #else 92 1.2 thorpej double __fpu_regs[32]; /* FP0-31 */ 93 1.17 joerg #endif 94 1.2 thorpej unsigned int __fpu_fpscr; /* FP Status and Control Register */ 95 1.2 thorpej unsigned int __fpu_valid; /* Set together with _UC_FPU */ 96 1.2 thorpej } __fpregset_t; 97 1.2 thorpej 98 1.2 thorpej #define _NVR 32 /* Number of Vector registers */ 99 1.2 thorpej 100 1.2 thorpej typedef struct { 101 1.2 thorpej union __vr { 102 1.2 thorpej unsigned char __vr8[16]; 103 1.2 thorpej unsigned short __vr16[8]; 104 1.2 thorpej unsigned int __vr32[4]; 105 1.10 matt unsigned char __spe8[8]; 106 1.10 matt unsigned short __spe16[4]; 107 1.10 matt unsigned int __spe32[2]; 108 1.10 matt } __vrs[_NVR] __aligned(16); 109 1.2 thorpej unsigned int __vscr; /* VSCR */ 110 1.2 thorpej unsigned int __vrsave; /* VRSAVE */ 111 1.2 thorpej } __vrf_t; 112 1.2 thorpej 113 1.2 thorpej typedef struct { 114 1.2 thorpej __gregset_t __gregs; /* General Purpose Register set */ 115 1.2 thorpej __fpregset_t __fpregs; /* Floating Point Register set */ 116 1.2 thorpej __vrf_t __vrf; /* Vector Register File */ 117 1.2 thorpej } mcontext_t; 118 1.2 thorpej 119 1.15 matt #if defined(_LP64) 120 1.15 matt typedef int __greg32_t; 121 1.15 matt typedef __greg32_t __gregset32_t[_NGREG]; 122 1.15 matt 123 1.15 matt typedef struct { 124 1.15 matt __gregset32_t __gregs; /* General Purpose Register set */ 125 1.15 matt __fpregset_t __fpregs; /* Floating Point Register set */ 126 1.15 matt __vrf_t __vrf; /* Vector Register File */ 127 1.15 matt } mcontext32_t; 128 1.15 matt #endif 129 1.15 matt 130 1.2 thorpej /* Machine-dependent uc_flags */ 131 1.23 thorpej #define _UC_POWERPC_VEC _UC_MD_BIT16 /* Vector Register File valid */ 132 1.23 thorpej #define _UC_POWERPC_SPE _UC_MD_BIT17 /* Vector Register File valid */ 133 1.23 thorpej #define _UC_TLSBASE _UC_MD_BIT19 /* thread context valid in R2 */ 134 1.23 thorpej #define _UC_SETSTACK _UC_MD_BIT20 135 1.23 thorpej #define _UC_CLRSTACK _UC_MD_BIT21 136 1.2 thorpej 137 1.6 thorpej #define _UC_MACHINE_SP(uc) ((uc)->uc_mcontext.__gregs[_REG_R1]) 138 1.18 kamil #define _UC_MACHINE_FP(uc) ((uc)->uc_mcontext.__gregs[_REG_R31]) 139 1.6 thorpej #define _UC_MACHINE_PC(uc) ((uc)->uc_mcontext.__gregs[_REG_PC]) 140 1.6 thorpej #define _UC_MACHINE_INTRV(uc) ((uc)->uc_mcontext.__gregs[_REG_R3]) 141 1.6 thorpej 142 1.6 thorpej #define _UC_MACHINE_SET_PC(uc, pc) _UC_MACHINE_PC(uc) = (pc) 143 1.2 thorpej 144 1.2 thorpej #endif /* !_POWERPC_MCONTEXT_H_ */ 145