1139790Simp/*- 2115019Smarcel * Copyright (c) 2002, 2003 Marcel Moolenaar 3115019Smarcel * All rights reserved. 4115019Smarcel * 5115019Smarcel * Redistribution and use in source and binary forms, with or without 6115019Smarcel * modification, are permitted provided that the following conditions 7115019Smarcel * are met: 8115019Smarcel * 9115019Smarcel * 1. Redistributions of source code must retain the above copyright 10115019Smarcel * notice, this list of conditions and the following disclaimer. 11115019Smarcel * 2. Redistributions in binary form must reproduce the above copyright 12115019Smarcel * notice, this list of conditions and the following disclaimer in the 13115019Smarcel * documentation and/or other materials provided with the distribution. 14115019Smarcel * 15115019Smarcel * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16115019Smarcel * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17115019Smarcel * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18115019Smarcel * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19115019Smarcel * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20115019Smarcel * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21115019Smarcel * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22115019Smarcel * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23115019Smarcel * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24115019Smarcel * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25115019Smarcel * 26115019Smarcel * $FreeBSD: releng/10.3/sys/ia64/include/_regset.h 139790 2005-01-06 22:18:23Z imp $ 27115019Smarcel */ 28115019Smarcel 29115019Smarcel#ifndef _MACHINE_REGSET_H_ 30115019Smarcel#define _MACHINE_REGSET_H_ 31115019Smarcel 32115019Smarcel/* 33115019Smarcel * Create register sets, based on the runtime specification. This allows 34115019Smarcel * us to better reuse code and to copy sets around more efficiently. 35115019Smarcel * Contexts are defined in terms of these sets. These include trapframe, 36115019Smarcel * sigframe, pcb, mcontext, reg and fpreg. Other candidates are unwind 37115019Smarcel * and coredump related contexts. 38115019Smarcel * 39115019Smarcel * Notes: 40115019Smarcel * o Constant registers (r0, f0 and f1) are not accounted for, 41115019Smarcel * o The stacked registers (r32-r127) are not accounted for, 42115019Smarcel * o Predicates are not split across sets. 43115019Smarcel */ 44115019Smarcel 45115019Smarcel/* A single FP register. */ 46117999Smarcelunion _ia64_fpreg { 47115019Smarcel unsigned char fpr_bits[16]; 48117999Smarcel long double fpr_flt; 49117999Smarcel}; 50115019Smarcel 51115019Smarcel/* 52115019Smarcel * Special registers. 53115019Smarcel */ 54115019Smarcelstruct _special { 55115019Smarcel unsigned long sp; 56115019Smarcel unsigned long unat; /* NaT before spilling */ 57115019Smarcel unsigned long rp; 58115019Smarcel unsigned long pr; 59115019Smarcel unsigned long pfs; 60115019Smarcel unsigned long bspstore; 61115019Smarcel unsigned long rnat; 62115019Smarcel unsigned long __spare; 63115019Smarcel /* Userland context and syscalls */ 64115019Smarcel unsigned long tp; 65115019Smarcel unsigned long rsc; 66115019Smarcel unsigned long fpsr; 67115019Smarcel unsigned long psr; 68115019Smarcel /* ASYNC: Interrupt specific */ 69115019Smarcel unsigned long gp; 70115019Smarcel unsigned long ndirty; 71115019Smarcel unsigned long cfm; 72115019Smarcel unsigned long iip; 73115019Smarcel unsigned long ifa; 74115019Smarcel unsigned long isr; 75115019Smarcel}; 76115019Smarcel 77115019Smarcelstruct _high_fp { 78117999Smarcel union _ia64_fpreg fr32; 79117999Smarcel union _ia64_fpreg fr33; 80117999Smarcel union _ia64_fpreg fr34; 81117999Smarcel union _ia64_fpreg fr35; 82117999Smarcel union _ia64_fpreg fr36; 83117999Smarcel union _ia64_fpreg fr37; 84117999Smarcel union _ia64_fpreg fr38; 85117999Smarcel union _ia64_fpreg fr39; 86117999Smarcel union _ia64_fpreg fr40; 87117999Smarcel union _ia64_fpreg fr41; 88117999Smarcel union _ia64_fpreg fr42; 89117999Smarcel union _ia64_fpreg fr43; 90117999Smarcel union _ia64_fpreg fr44; 91117999Smarcel union _ia64_fpreg fr45; 92117999Smarcel union _ia64_fpreg fr46; 93117999Smarcel union _ia64_fpreg fr47; 94117999Smarcel union _ia64_fpreg fr48; 95117999Smarcel union _ia64_fpreg fr49; 96117999Smarcel union _ia64_fpreg fr50; 97117999Smarcel union _ia64_fpreg fr51; 98117999Smarcel union _ia64_fpreg fr52; 99117999Smarcel union _ia64_fpreg fr53; 100117999Smarcel union _ia64_fpreg fr54; 101117999Smarcel union _ia64_fpreg fr55; 102117999Smarcel union _ia64_fpreg fr56; 103117999Smarcel union _ia64_fpreg fr57; 104117999Smarcel union _ia64_fpreg fr58; 105117999Smarcel union _ia64_fpreg fr59; 106117999Smarcel union _ia64_fpreg fr60; 107117999Smarcel union _ia64_fpreg fr61; 108117999Smarcel union _ia64_fpreg fr62; 109117999Smarcel union _ia64_fpreg fr63; 110117999Smarcel union _ia64_fpreg fr64; 111117999Smarcel union _ia64_fpreg fr65; 112117999Smarcel union _ia64_fpreg fr66; 113117999Smarcel union _ia64_fpreg fr67; 114117999Smarcel union _ia64_fpreg fr68; 115117999Smarcel union _ia64_fpreg fr69; 116117999Smarcel union _ia64_fpreg fr70; 117117999Smarcel union _ia64_fpreg fr71; 118117999Smarcel union _ia64_fpreg fr72; 119117999Smarcel union _ia64_fpreg fr73; 120117999Smarcel union _ia64_fpreg fr74; 121117999Smarcel union _ia64_fpreg fr75; 122117999Smarcel union _ia64_fpreg fr76; 123117999Smarcel union _ia64_fpreg fr77; 124117999Smarcel union _ia64_fpreg fr78; 125117999Smarcel union _ia64_fpreg fr79; 126117999Smarcel union _ia64_fpreg fr80; 127117999Smarcel union _ia64_fpreg fr81; 128117999Smarcel union _ia64_fpreg fr82; 129117999Smarcel union _ia64_fpreg fr83; 130117999Smarcel union _ia64_fpreg fr84; 131117999Smarcel union _ia64_fpreg fr85; 132117999Smarcel union _ia64_fpreg fr86; 133117999Smarcel union _ia64_fpreg fr87; 134117999Smarcel union _ia64_fpreg fr88; 135117999Smarcel union _ia64_fpreg fr89; 136117999Smarcel union _ia64_fpreg fr90; 137117999Smarcel union _ia64_fpreg fr91; 138117999Smarcel union _ia64_fpreg fr92; 139117999Smarcel union _ia64_fpreg fr93; 140117999Smarcel union _ia64_fpreg fr94; 141117999Smarcel union _ia64_fpreg fr95; 142117999Smarcel union _ia64_fpreg fr96; 143117999Smarcel union _ia64_fpreg fr97; 144117999Smarcel union _ia64_fpreg fr98; 145117999Smarcel union _ia64_fpreg fr99; 146117999Smarcel union _ia64_fpreg fr100; 147117999Smarcel union _ia64_fpreg fr101; 148117999Smarcel union _ia64_fpreg fr102; 149117999Smarcel union _ia64_fpreg fr103; 150117999Smarcel union _ia64_fpreg fr104; 151117999Smarcel union _ia64_fpreg fr105; 152117999Smarcel union _ia64_fpreg fr106; 153117999Smarcel union _ia64_fpreg fr107; 154117999Smarcel union _ia64_fpreg fr108; 155117999Smarcel union _ia64_fpreg fr109; 156117999Smarcel union _ia64_fpreg fr110; 157117999Smarcel union _ia64_fpreg fr111; 158117999Smarcel union _ia64_fpreg fr112; 159117999Smarcel union _ia64_fpreg fr113; 160117999Smarcel union _ia64_fpreg fr114; 161117999Smarcel union _ia64_fpreg fr115; 162117999Smarcel union _ia64_fpreg fr116; 163117999Smarcel union _ia64_fpreg fr117; 164117999Smarcel union _ia64_fpreg fr118; 165117999Smarcel union _ia64_fpreg fr119; 166117999Smarcel union _ia64_fpreg fr120; 167117999Smarcel union _ia64_fpreg fr121; 168117999Smarcel union _ia64_fpreg fr122; 169117999Smarcel union _ia64_fpreg fr123; 170117999Smarcel union _ia64_fpreg fr124; 171117999Smarcel union _ia64_fpreg fr125; 172117999Smarcel union _ia64_fpreg fr126; 173117999Smarcel union _ia64_fpreg fr127; 174115019Smarcel}; 175115019Smarcel 176115019Smarcel/* 177115019Smarcel * Preserved registers. 178115019Smarcel */ 179115019Smarcelstruct _callee_saved { 180115019Smarcel unsigned long unat; /* NaT after spilling. */ 181115019Smarcel unsigned long gr4; 182115019Smarcel unsigned long gr5; 183115019Smarcel unsigned long gr6; 184115019Smarcel unsigned long gr7; 185115019Smarcel unsigned long br1; 186115019Smarcel unsigned long br2; 187115019Smarcel unsigned long br3; 188115019Smarcel unsigned long br4; 189115019Smarcel unsigned long br5; 190115019Smarcel unsigned long lc; 191115019Smarcel unsigned long __spare; 192115019Smarcel}; 193115019Smarcel 194115019Smarcelstruct _callee_saved_fp { 195117999Smarcel union _ia64_fpreg fr2; 196117999Smarcel union _ia64_fpreg fr3; 197117999Smarcel union _ia64_fpreg fr4; 198117999Smarcel union _ia64_fpreg fr5; 199117999Smarcel union _ia64_fpreg fr16; 200117999Smarcel union _ia64_fpreg fr17; 201117999Smarcel union _ia64_fpreg fr18; 202117999Smarcel union _ia64_fpreg fr19; 203117999Smarcel union _ia64_fpreg fr20; 204117999Smarcel union _ia64_fpreg fr21; 205117999Smarcel union _ia64_fpreg fr22; 206117999Smarcel union _ia64_fpreg fr23; 207117999Smarcel union _ia64_fpreg fr24; 208117999Smarcel union _ia64_fpreg fr25; 209117999Smarcel union _ia64_fpreg fr26; 210117999Smarcel union _ia64_fpreg fr27; 211117999Smarcel union _ia64_fpreg fr28; 212117999Smarcel union _ia64_fpreg fr29; 213117999Smarcel union _ia64_fpreg fr30; 214117999Smarcel union _ia64_fpreg fr31; 215115019Smarcel}; 216115019Smarcel 217115019Smarcel/* 218115019Smarcel * Scratch registers. 219115019Smarcel */ 220115019Smarcelstruct _caller_saved { 221115019Smarcel unsigned long unat; /* NaT after spilling. */ 222115019Smarcel unsigned long gr2; 223115019Smarcel unsigned long gr3; 224115019Smarcel unsigned long gr8; 225115019Smarcel unsigned long gr9; 226115019Smarcel unsigned long gr10; 227115019Smarcel unsigned long gr11; 228115019Smarcel unsigned long gr14; 229115019Smarcel unsigned long gr15; 230115019Smarcel unsigned long gr16; 231115019Smarcel unsigned long gr17; 232115019Smarcel unsigned long gr18; 233115019Smarcel unsigned long gr19; 234115019Smarcel unsigned long gr20; 235115019Smarcel unsigned long gr21; 236115019Smarcel unsigned long gr22; 237115019Smarcel unsigned long gr23; 238115019Smarcel unsigned long gr24; 239115019Smarcel unsigned long gr25; 240115019Smarcel unsigned long gr26; 241115019Smarcel unsigned long gr27; 242115019Smarcel unsigned long gr28; 243115019Smarcel unsigned long gr29; 244115019Smarcel unsigned long gr30; 245115019Smarcel unsigned long gr31; 246115019Smarcel unsigned long br6; 247115019Smarcel unsigned long br7; 248115019Smarcel unsigned long ccv; 249115019Smarcel unsigned long csd; 250115019Smarcel unsigned long ssd; 251115019Smarcel}; 252115019Smarcel 253115019Smarcelstruct _caller_saved_fp { 254117999Smarcel union _ia64_fpreg fr6; 255117999Smarcel union _ia64_fpreg fr7; 256117999Smarcel union _ia64_fpreg fr8; 257117999Smarcel union _ia64_fpreg fr9; 258117999Smarcel union _ia64_fpreg fr10; 259117999Smarcel union _ia64_fpreg fr11; 260117999Smarcel union _ia64_fpreg fr12; 261117999Smarcel union _ia64_fpreg fr13; 262117999Smarcel union _ia64_fpreg fr14; 263117999Smarcel union _ia64_fpreg fr15; 264115019Smarcel}; 265115019Smarcel 266115019Smarcel#ifdef _KERNEL 267115564Smarcelvoid restore_callee_saved(const struct _callee_saved *); 268115564Smarcelvoid restore_callee_saved_fp(const struct _callee_saved_fp *); 269115564Smarcelvoid restore_high_fp(const struct _high_fp *); 270115019Smarcelvoid save_callee_saved(struct _callee_saved *); 271115019Smarcelvoid save_callee_saved_fp(struct _callee_saved_fp *); 272115019Smarcelvoid save_high_fp(struct _high_fp *); 273115019Smarcel#endif 274115019Smarcel 275115019Smarcel#endif /* _MACHINE_REGSET_H_ */ 276