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