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