root/sys/arch/ia64/include/_regset.h
/*      $NetBSD: _regset.h,v 1.1 2006/04/07 14:21:18 cherry Exp $       */

/*-
 * Copyright (c) 2002, 2003 Marcel Moolenaar
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * $FreeBSD$
 */

#ifndef _MACHINE_REGSET_H_
#define _MACHINE_REGSET_H_

/*
 * Create register sets, based on the runtime specification. This allows
 * us to better reuse code and to copy sets around more efficiently.
 * Contexts are defined in terms of these sets. These include trapframe,
 * sigframe, pcb, mcontext, reg and fpreg. Other candidates are unwind
 * and coredump related contexts.
 *
 * Notes:
 * o  Constant registers (r0, f0 and f1) are not accounted for,
 * o  The stacked registers (r32-r127) are not accounted for,
 * o  Predicates are not split across sets.
 */

/* A single FP register. */
union _ia64_fpreg {
        unsigned char   fpr_bits[16];
        long double     fpr_flt;
};

/*
 * Special registers.
 */
struct _special {
        unsigned long           sp;
        unsigned long           unat;           /* NaT before spilling */
        unsigned long           rp;
        unsigned long           pr;
        unsigned long           pfs;
        unsigned long           bspstore;
        unsigned long           rnat;
        unsigned long           __spare;
        /* Userland context and syscalls */
        unsigned long           tp;
        unsigned long           rsc;
        unsigned long           fpsr;
        unsigned long           psr;
        /* ASYNC: Interrupt specific */
        unsigned long           gp;
        unsigned long           ndirty;
        unsigned long           cfm;
        unsigned long           iip;
        unsigned long           ifa;
        unsigned long           isr;
};

struct _high_fp {
        union _ia64_fpreg       fr32;
        union _ia64_fpreg       fr33;
        union _ia64_fpreg       fr34;
        union _ia64_fpreg       fr35;
        union _ia64_fpreg       fr36;
        union _ia64_fpreg       fr37;
        union _ia64_fpreg       fr38;
        union _ia64_fpreg       fr39;
        union _ia64_fpreg       fr40;
        union _ia64_fpreg       fr41;
        union _ia64_fpreg       fr42;
        union _ia64_fpreg       fr43;
        union _ia64_fpreg       fr44;
        union _ia64_fpreg       fr45;
        union _ia64_fpreg       fr46;
        union _ia64_fpreg       fr47;
        union _ia64_fpreg       fr48;
        union _ia64_fpreg       fr49;
        union _ia64_fpreg       fr50;
        union _ia64_fpreg       fr51;
        union _ia64_fpreg       fr52;
        union _ia64_fpreg       fr53;
        union _ia64_fpreg       fr54;
        union _ia64_fpreg       fr55;
        union _ia64_fpreg       fr56;
        union _ia64_fpreg       fr57;
        union _ia64_fpreg       fr58;
        union _ia64_fpreg       fr59;
        union _ia64_fpreg       fr60;
        union _ia64_fpreg       fr61;
        union _ia64_fpreg       fr62;
        union _ia64_fpreg       fr63;
        union _ia64_fpreg       fr64;
        union _ia64_fpreg       fr65;
        union _ia64_fpreg       fr66;
        union _ia64_fpreg       fr67;
        union _ia64_fpreg       fr68;
        union _ia64_fpreg       fr69;
        union _ia64_fpreg       fr70;
        union _ia64_fpreg       fr71;
        union _ia64_fpreg       fr72;
        union _ia64_fpreg       fr73;
        union _ia64_fpreg       fr74;
        union _ia64_fpreg       fr75;
        union _ia64_fpreg       fr76;
        union _ia64_fpreg       fr77;
        union _ia64_fpreg       fr78;
        union _ia64_fpreg       fr79;
        union _ia64_fpreg       fr80;
        union _ia64_fpreg       fr81;
        union _ia64_fpreg       fr82;
        union _ia64_fpreg       fr83;
        union _ia64_fpreg       fr84;
        union _ia64_fpreg       fr85;
        union _ia64_fpreg       fr86;
        union _ia64_fpreg       fr87;
        union _ia64_fpreg       fr88;
        union _ia64_fpreg       fr89;
        union _ia64_fpreg       fr90;
        union _ia64_fpreg       fr91;
        union _ia64_fpreg       fr92;
        union _ia64_fpreg       fr93;
        union _ia64_fpreg       fr94;
        union _ia64_fpreg       fr95;
        union _ia64_fpreg       fr96;
        union _ia64_fpreg       fr97;
        union _ia64_fpreg       fr98;
        union _ia64_fpreg       fr99;
        union _ia64_fpreg       fr100;
        union _ia64_fpreg       fr101;
        union _ia64_fpreg       fr102;
        union _ia64_fpreg       fr103;
        union _ia64_fpreg       fr104;
        union _ia64_fpreg       fr105;
        union _ia64_fpreg       fr106;
        union _ia64_fpreg       fr107;
        union _ia64_fpreg       fr108;
        union _ia64_fpreg       fr109;
        union _ia64_fpreg       fr110;
        union _ia64_fpreg       fr111;
        union _ia64_fpreg       fr112;
        union _ia64_fpreg       fr113;
        union _ia64_fpreg       fr114;
        union _ia64_fpreg       fr115;
        union _ia64_fpreg       fr116;
        union _ia64_fpreg       fr117;
        union _ia64_fpreg       fr118;
        union _ia64_fpreg       fr119;
        union _ia64_fpreg       fr120;
        union _ia64_fpreg       fr121;
        union _ia64_fpreg       fr122;
        union _ia64_fpreg       fr123;
        union _ia64_fpreg       fr124;
        union _ia64_fpreg       fr125;
        union _ia64_fpreg       fr126;
        union _ia64_fpreg       fr127;
};

/*
 * Preserved registers.
 */
struct _callee_saved {
        unsigned long           unat;           /* NaT after spilling. */
        unsigned long           gr4;
        unsigned long           gr5;
        unsigned long           gr6;
        unsigned long           gr7;
        unsigned long           br1;
        unsigned long           br2;
        unsigned long           br3;
        unsigned long           br4;
        unsigned long           br5;
        unsigned long           lc;
        unsigned long           __spare;
};

struct _callee_saved_fp {
        union _ia64_fpreg       fr2;
        union _ia64_fpreg       fr3;
        union _ia64_fpreg       fr4;
        union _ia64_fpreg       fr5;
        union _ia64_fpreg       fr16;
        union _ia64_fpreg       fr17;
        union _ia64_fpreg       fr18;
        union _ia64_fpreg       fr19;
        union _ia64_fpreg       fr20;
        union _ia64_fpreg       fr21;
        union _ia64_fpreg       fr22;
        union _ia64_fpreg       fr23;
        union _ia64_fpreg       fr24;
        union _ia64_fpreg       fr25;
        union _ia64_fpreg       fr26;
        union _ia64_fpreg       fr27;
        union _ia64_fpreg       fr28;
        union _ia64_fpreg       fr29;
        union _ia64_fpreg       fr30;
        union _ia64_fpreg       fr31;
};

/*
 * Scratch registers.
 */
struct _caller_saved {
        unsigned long           unat;           /* NaT after spilling. */
        unsigned long           gr2;
        unsigned long           gr3;
        unsigned long           gr8;
        unsigned long           gr9;
        unsigned long           gr10;
        unsigned long           gr11;
        unsigned long           gr14;
        unsigned long           gr15;
        unsigned long           gr16;
        unsigned long           gr17;
        unsigned long           gr18;
        unsigned long           gr19;
        unsigned long           gr20;
        unsigned long           gr21;
        unsigned long           gr22;
        unsigned long           gr23;
        unsigned long           gr24;
        unsigned long           gr25;
        unsigned long           gr26;
        unsigned long           gr27;
        unsigned long           gr28;
        unsigned long           gr29;
        unsigned long           gr30;
        unsigned long           gr31;
        unsigned long           br6;
        unsigned long           br7;
        unsigned long           ccv;
        unsigned long           csd;
        unsigned long           ssd;
};

struct _caller_saved_fp {
        union _ia64_fpreg       fr6;
        union _ia64_fpreg       fr7;
        union _ia64_fpreg       fr8;
        union _ia64_fpreg       fr9;
        union _ia64_fpreg       fr10;
        union _ia64_fpreg       fr11;
        union _ia64_fpreg       fr12;
        union _ia64_fpreg       fr13;
        union _ia64_fpreg       fr14;
        union _ia64_fpreg       fr15;
};

#ifdef _KERNEL
void    restore_callee_saved(const struct _callee_saved *);
void    restore_callee_saved_fp(const struct _callee_saved_fp *);
void    restore_high_fp(const struct _high_fp *);
void    save_callee_saved(struct _callee_saved *);
void    save_callee_saved_fp(struct _callee_saved_fp *);
void    save_high_fp(struct _high_fp *);
#endif

#endif  /* _MACHINE_REGSET_H_ */