_regset.h revision 267654
1/*- 2 * Copyright (c) 2002, 2003 Marcel Moolenaar 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * 26 * $FreeBSD: releng/9.3/sys/ia64/include/_regset.h 139790 2005-01-06 22:18:23Z imp $ 27 */ 28 29#ifndef _MACHINE_REGSET_H_ 30#define _MACHINE_REGSET_H_ 31 32/* 33 * Create register sets, based on the runtime specification. This allows 34 * us to better reuse code and to copy sets around more efficiently. 35 * Contexts are defined in terms of these sets. These include trapframe, 36 * sigframe, pcb, mcontext, reg and fpreg. Other candidates are unwind 37 * and coredump related contexts. 38 * 39 * Notes: 40 * o Constant registers (r0, f0 and f1) are not accounted for, 41 * o The stacked registers (r32-r127) are not accounted for, 42 * o Predicates are not split across sets. 43 */ 44 45/* A single FP register. */ 46union _ia64_fpreg { 47 unsigned char fpr_bits[16]; 48 long double fpr_flt; 49}; 50 51/* 52 * Special registers. 53 */ 54struct _special { 55 unsigned long sp; 56 unsigned long unat; /* NaT before spilling */ 57 unsigned long rp; 58 unsigned long pr; 59 unsigned long pfs; 60 unsigned long bspstore; 61 unsigned long rnat; 62 unsigned long __spare; 63 /* Userland context and syscalls */ 64 unsigned long tp; 65 unsigned long rsc; 66 unsigned long fpsr; 67 unsigned long psr; 68 /* ASYNC: Interrupt specific */ 69 unsigned long gp; 70 unsigned long ndirty; 71 unsigned long cfm; 72 unsigned long iip; 73 unsigned long ifa; 74 unsigned long isr; 75}; 76 77struct _high_fp { 78 union _ia64_fpreg fr32; 79 union _ia64_fpreg fr33; 80 union _ia64_fpreg fr34; 81 union _ia64_fpreg fr35; 82 union _ia64_fpreg fr36; 83 union _ia64_fpreg fr37; 84 union _ia64_fpreg fr38; 85 union _ia64_fpreg fr39; 86 union _ia64_fpreg fr40; 87 union _ia64_fpreg fr41; 88 union _ia64_fpreg fr42; 89 union _ia64_fpreg fr43; 90 union _ia64_fpreg fr44; 91 union _ia64_fpreg fr45; 92 union _ia64_fpreg fr46; 93 union _ia64_fpreg fr47; 94 union _ia64_fpreg fr48; 95 union _ia64_fpreg fr49; 96 union _ia64_fpreg fr50; 97 union _ia64_fpreg fr51; 98 union _ia64_fpreg fr52; 99 union _ia64_fpreg fr53; 100 union _ia64_fpreg fr54; 101 union _ia64_fpreg fr55; 102 union _ia64_fpreg fr56; 103 union _ia64_fpreg fr57; 104 union _ia64_fpreg fr58; 105 union _ia64_fpreg fr59; 106 union _ia64_fpreg fr60; 107 union _ia64_fpreg fr61; 108 union _ia64_fpreg fr62; 109 union _ia64_fpreg fr63; 110 union _ia64_fpreg fr64; 111 union _ia64_fpreg fr65; 112 union _ia64_fpreg fr66; 113 union _ia64_fpreg fr67; 114 union _ia64_fpreg fr68; 115 union _ia64_fpreg fr69; 116 union _ia64_fpreg fr70; 117 union _ia64_fpreg fr71; 118 union _ia64_fpreg fr72; 119 union _ia64_fpreg fr73; 120 union _ia64_fpreg fr74; 121 union _ia64_fpreg fr75; 122 union _ia64_fpreg fr76; 123 union _ia64_fpreg fr77; 124 union _ia64_fpreg fr78; 125 union _ia64_fpreg fr79; 126 union _ia64_fpreg fr80; 127 union _ia64_fpreg fr81; 128 union _ia64_fpreg fr82; 129 union _ia64_fpreg fr83; 130 union _ia64_fpreg fr84; 131 union _ia64_fpreg fr85; 132 union _ia64_fpreg fr86; 133 union _ia64_fpreg fr87; 134 union _ia64_fpreg fr88; 135 union _ia64_fpreg fr89; 136 union _ia64_fpreg fr90; 137 union _ia64_fpreg fr91; 138 union _ia64_fpreg fr92; 139 union _ia64_fpreg fr93; 140 union _ia64_fpreg fr94; 141 union _ia64_fpreg fr95; 142 union _ia64_fpreg fr96; 143 union _ia64_fpreg fr97; 144 union _ia64_fpreg fr98; 145 union _ia64_fpreg fr99; 146 union _ia64_fpreg fr100; 147 union _ia64_fpreg fr101; 148 union _ia64_fpreg fr102; 149 union _ia64_fpreg fr103; 150 union _ia64_fpreg fr104; 151 union _ia64_fpreg fr105; 152 union _ia64_fpreg fr106; 153 union _ia64_fpreg fr107; 154 union _ia64_fpreg fr108; 155 union _ia64_fpreg fr109; 156 union _ia64_fpreg fr110; 157 union _ia64_fpreg fr111; 158 union _ia64_fpreg fr112; 159 union _ia64_fpreg fr113; 160 union _ia64_fpreg fr114; 161 union _ia64_fpreg fr115; 162 union _ia64_fpreg fr116; 163 union _ia64_fpreg fr117; 164 union _ia64_fpreg fr118; 165 union _ia64_fpreg fr119; 166 union _ia64_fpreg fr120; 167 union _ia64_fpreg fr121; 168 union _ia64_fpreg fr122; 169 union _ia64_fpreg fr123; 170 union _ia64_fpreg fr124; 171 union _ia64_fpreg fr125; 172 union _ia64_fpreg fr126; 173 union _ia64_fpreg fr127; 174}; 175 176/* 177 * Preserved registers. 178 */ 179struct _callee_saved { 180 unsigned long unat; /* NaT after spilling. */ 181 unsigned long gr4; 182 unsigned long gr5; 183 unsigned long gr6; 184 unsigned long gr7; 185 unsigned long br1; 186 unsigned long br2; 187 unsigned long br3; 188 unsigned long br4; 189 unsigned long br5; 190 unsigned long lc; 191 unsigned long __spare; 192}; 193 194struct _callee_saved_fp { 195 union _ia64_fpreg fr2; 196 union _ia64_fpreg fr3; 197 union _ia64_fpreg fr4; 198 union _ia64_fpreg fr5; 199 union _ia64_fpreg fr16; 200 union _ia64_fpreg fr17; 201 union _ia64_fpreg fr18; 202 union _ia64_fpreg fr19; 203 union _ia64_fpreg fr20; 204 union _ia64_fpreg fr21; 205 union _ia64_fpreg fr22; 206 union _ia64_fpreg fr23; 207 union _ia64_fpreg fr24; 208 union _ia64_fpreg fr25; 209 union _ia64_fpreg fr26; 210 union _ia64_fpreg fr27; 211 union _ia64_fpreg fr28; 212 union _ia64_fpreg fr29; 213 union _ia64_fpreg fr30; 214 union _ia64_fpreg fr31; 215}; 216 217/* 218 * Scratch registers. 219 */ 220struct _caller_saved { 221 unsigned long unat; /* NaT after spilling. */ 222 unsigned long gr2; 223 unsigned long gr3; 224 unsigned long gr8; 225 unsigned long gr9; 226 unsigned long gr10; 227 unsigned long gr11; 228 unsigned long gr14; 229 unsigned long gr15; 230 unsigned long gr16; 231 unsigned long gr17; 232 unsigned long gr18; 233 unsigned long gr19; 234 unsigned long gr20; 235 unsigned long gr21; 236 unsigned long gr22; 237 unsigned long gr23; 238 unsigned long gr24; 239 unsigned long gr25; 240 unsigned long gr26; 241 unsigned long gr27; 242 unsigned long gr28; 243 unsigned long gr29; 244 unsigned long gr30; 245 unsigned long gr31; 246 unsigned long br6; 247 unsigned long br7; 248 unsigned long ccv; 249 unsigned long csd; 250 unsigned long ssd; 251}; 252 253struct _caller_saved_fp { 254 union _ia64_fpreg fr6; 255 union _ia64_fpreg fr7; 256 union _ia64_fpreg fr8; 257 union _ia64_fpreg fr9; 258 union _ia64_fpreg fr10; 259 union _ia64_fpreg fr11; 260 union _ia64_fpreg fr12; 261 union _ia64_fpreg fr13; 262 union _ia64_fpreg fr14; 263 union _ia64_fpreg fr15; 264}; 265 266#ifdef _KERNEL 267void restore_callee_saved(const struct _callee_saved *); 268void restore_callee_saved_fp(const struct _callee_saved_fp *); 269void restore_high_fp(const struct _high_fp *); 270void save_callee_saved(struct _callee_saved *); 271void save_callee_saved_fp(struct _callee_saved_fp *); 272void save_high_fp(struct _high_fp *); 273#endif 274 275#endif /* _MACHINE_REGSET_H_ */ 276