Home | History | Annotate | Line # | Download | only in include
frame.h revision 1.16
      1  1.16     matt /*	$NetBSD: frame.h,v 1.16 2003/08/12 18:34:48 matt Exp $	*/
      2   1.1       ws 
      3   1.1       ws /*
      4   1.1       ws  * Copyright (C) 1995, 1996 Wolfgang Solfrank.
      5   1.1       ws  * Copyright (C) 1995, 1996 TooLs GmbH.
      6   1.1       ws  * All rights reserved.
      7   1.1       ws  *
      8   1.1       ws  * Redistribution and use in source and binary forms, with or without
      9   1.1       ws  * modification, are permitted provided that the following conditions
     10   1.1       ws  * are met:
     11   1.1       ws  * 1. Redistributions of source code must retain the above copyright
     12   1.1       ws  *    notice, this list of conditions and the following disclaimer.
     13   1.1       ws  * 2. Redistributions in binary form must reproduce the above copyright
     14   1.1       ws  *    notice, this list of conditions and the following disclaimer in the
     15   1.1       ws  *    documentation and/or other materials provided with the distribution.
     16   1.1       ws  * 3. All advertising materials mentioning features or use of this software
     17   1.1       ws  *    must display the following acknowledgement:
     18   1.1       ws  *	This product includes software developed by TooLs GmbH.
     19   1.1       ws  * 4. The name of TooLs GmbH may not be used to endorse or promote products
     20   1.1       ws  *    derived from this software without specific prior written permission.
     21   1.1       ws  *
     22   1.1       ws  * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
     23   1.1       ws  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     24   1.1       ws  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     25   1.1       ws  * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     26   1.1       ws  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     27   1.1       ws  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     28   1.1       ws  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     29   1.1       ws  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     30   1.1       ws  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     31   1.1       ws  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     32   1.1       ws  */
     33   1.8     matt #ifndef	_POWERPC_FRAME_H_
     34   1.8     matt #define	_POWERPC_FRAME_H_
     35   1.1       ws 
     36   1.1       ws #include <machine/types.h>
     37   1.1       ws 
     38   1.1       ws /*
     39   1.1       ws  * We have to save all registers on every trap, because
     40   1.1       ws  *	1. user could attach this process every time
     41   1.1       ws  *	2. we must be able to restore all user registers in case of fork
     42   1.1       ws  * Actually, we do not save the fp registers on trap, since
     43   1.1       ws  * these are not used by the kernel. They are saved only when switching
     44   1.1       ws  * between processes using the FPU.
     45   1.1       ws  *
     46   1.1       ws  * Change ordering to cluster together these register_t's.		XXX
     47   1.1       ws  */
     48  1.14     matt struct utrapframe {
     49  1.14     matt 	register_t fixreg[32];
     50  1.14     matt 	register_t lr;
     51  1.14     matt 	int cr;
     52  1.14     matt 	int xer;
     53  1.14     matt 	register_t ctr;
     54  1.14     matt 	register_t srr0;
     55  1.14     matt 	register_t srr1;
     56  1.14     matt 	int vrsave;
     57  1.14     matt 	int mq;
     58  1.14     matt 	int spare;
     59  1.14     matt };
     60  1.14     matt 
     61   1.1       ws struct trapframe {
     62   1.1       ws 	register_t fixreg[32];
     63   1.1       ws 	register_t lr;
     64   1.1       ws 	int cr;
     65   1.1       ws 	int xer;
     66   1.1       ws 	register_t ctr;
     67   1.1       ws 	register_t srr0;
     68   1.1       ws 	register_t srr1;
     69  1.13     matt 	/*
     70  1.13     matt 	 * DAR is the OEA name.  On IBM4xx is DAR is really DEAR.
     71  1.13     matt 	 */
     72  1.13     matt 	register_t dar;		/* dar & dsisr are only filled on a DSI trap */
     73   1.1       ws 	int dsisr;
     74   1.1       ws 	int exc;
     75  1.13     matt 	int tf_xtra[2];
     76   1.1       ws };
     77  1.13     matt #define	TF_VRSAVE	0
     78  1.13     matt #define	TF_MQ		1
     79  1.13     matt #define	TF_ESR		0
     80  1.13     matt #define	TF_PID		1
     81  1.10     matt 
     82  1.10     matt #if defined(_KERNEL) || defined(_LKM)
     83  1.10     matt #ifdef _LP64
     84  1.15     matt struct utrapframe32 {
     85  1.10     matt 	register32_t fixreg[32];
     86  1.10     matt 	register32_t lr;
     87  1.10     matt 	int cr;
     88  1.10     matt 	int xer;
     89  1.10     matt 	register32_t ctr;
     90  1.10     matt 	register32_t srr0;
     91  1.10     matt 	register32_t srr1;
     92  1.14     matt 	int vrsave;
     93  1.14     matt 	int mq;
     94  1.14     matt 	int spare;
     95  1.10     matt };
     96  1.10     matt #endif
     97  1.10     matt #endif /* _KERNEL || _LKM */
     98  1.10     matt 
     99   1.1       ws /*
    100   1.1       ws  * This is to ensure alignment of the stackpointer
    101   1.1       ws  */
    102  1.11     matt #define	FRAMELEN	roundup(sizeof(struct trapframe) + 8, CALLFRAMELEN)
    103   1.9  thorpej #define	trapframe(l)	((struct trapframe *)((char *)(l)->l_addr + USPACE - FRAMELEN + 8))
    104   1.1       ws 
    105   1.1       ws struct switchframe {
    106   1.1       ws 	register_t sp;
    107  1.16     matt 	register_t lr;
    108  1.15     matt 	register_t user_sr;	/* VSID on IBM4XX */
    109  1.15     matt 	register_t cr;
    110   1.1       ws 	register_t fixreg2;
    111   1.1       ws 	register_t fixreg[19];		/* R13-R31 */
    112   1.1       ws };
    113   1.1       ws 
    114   1.1       ws struct clockframe {
    115   1.1       ws 	register_t srr1;
    116   1.1       ws 	register_t srr0;
    117   1.1       ws 	int pri;
    118   1.1       ws 	int depth;
    119   1.1       ws };
    120   1.1       ws 
    121   1.1       ws /*
    122   1.1       ws  * Call frame for PowerPC used during fork.
    123   1.1       ws  */
    124  1.10     matt #define	CALLFRAMELEN	sizeof(struct callframe)
    125   1.1       ws struct callframe {
    126   1.1       ws 	register_t sp;
    127   1.1       ws 	register_t lr;
    128   1.1       ws 	register_t r30;
    129   1.1       ws 	register_t r31;
    130   1.3     matt };
    131   1.3     matt 
    132   1.9  thorpej struct saframe {
    133   1.9  thorpej 	register_t r1;		/* stack pointer */
    134   1.9  thorpej 	register_t lr;		/* Callee lr save area */
    135   1.9  thorpej 	register_t fill[2];	/* Pad to multiple of 16 bytes */
    136   1.9  thorpej };
    137   1.6     matt 
    138  1.11     matt #define	IFRAMELEN	roundup(sizeof(struct intrframe), CALLFRAMELEN)
    139   1.3     matt struct intrframe {
    140   1.3     matt 	register_t r1;			/*  0 */
    141   1.3     matt 	register_t _pad4;		/*  4 */
    142   1.3     matt 	/*
    143   1.3     matt 	 * The next 4 fields are "clockframe"
    144   1.3     matt 	 */
    145   1.3     matt 	register_t srr1;		/*  8 */
    146   1.3     matt 	register_t srr0;		/* 12 */
    147   1.3     matt 	int pri;			/* 16 */
    148   1.7      chs 	int intrdepth;			/* 20 */
    149  1.13     matt 	register_t pid;			/* 24 */
    150   1.3     matt 	register_t ctr;			/* 28 */
    151   1.3     matt 	register_t xer;			/* 32 */
    152   1.3     matt 	register_t cr;			/* 36 */
    153   1.3     matt 	register_t lr;			/* 40 */
    154   1.3     matt 	register_t r12;			/* 44 */
    155   1.3     matt 	register_t r11;			/* 48 */
    156   1.3     matt 	register_t r10;			/* 52 */
    157   1.3     matt 	register_t r9;			/* 56 */
    158   1.3     matt 	register_t r8;			/* 60 */
    159   1.3     matt 	register_t r7;			/* 64 */
    160   1.3     matt 	register_t r6;			/* 68 */
    161   1.3     matt 	register_t r5;			/* 72 */
    162   1.3     matt 	register_t r4;			/* 76 */
    163   1.3     matt 	register_t r3;			/* 80 */
    164   1.3     matt 	register_t r0;			/* 84 */
    165   1.4   kleink };
    166   1.4   kleink 
    167   1.4   kleink #define	SPFRAMELEN	sizeof(struct spillframe)
    168   1.4   kleink struct spillframe {
    169   1.4   kleink 	register_t	r1;		/*  0 */
    170   1.4   kleink 	register_t	_pad4;		/*  4 */
    171   1.4   kleink 	register_t	r12;		/*  8 */
    172   1.4   kleink 	register_t	r11;		/* 12 */
    173   1.4   kleink 	register_t	r10;		/* 16 */
    174   1.4   kleink 	register_t	r9;		/* 20 */
    175   1.4   kleink 	register_t	r8;		/* 24 */
    176   1.4   kleink 	register_t	r7;		/* 28 */
    177   1.4   kleink 	register_t	r6;		/* 32 */
    178   1.4   kleink 	register_t	r5;		/* 36 */
    179   1.4   kleink 	register_t	r4;		/* 40 */
    180   1.4   kleink 	register_t	r3;		/* 44 */
    181   1.4   kleink 	register_t	r0;		/* 48 */
    182   1.1       ws };
    183   1.1       ws 
    184   1.8     matt #endif	/* _POWERPC_FRAME_H_ */
    185