Home | History | Annotate | Line # | Download | only in include
frame.h revision 1.12
      1  1.12   kleink /*	$NetBSD: frame.h,v 1.12 2003/01/22 21:44:54 kleink 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.1       ws struct trapframe {
     49   1.1       ws 	register_t fixreg[32];
     50   1.1       ws 	register_t lr;
     51   1.1       ws 	int cr;
     52   1.1       ws 	int xer;
     53   1.1       ws 	register_t ctr;
     54   1.1       ws 	register_t srr0;
     55   1.1       ws 	register_t srr1;
     56   1.1       ws 	register_t dar;			/* dar & dsisr are only filled on a DSI trap */
     57   1.1       ws 	int dsisr;
     58   1.1       ws 	int exc;
     59   1.5     matt 	uint32_t vrsave;
     60  1.12   kleink 	uint32_t mq;
     61   1.1       ws };
     62  1.10     matt 
     63  1.10     matt #if defined(_KERNEL) || defined(_LKM)
     64  1.10     matt #ifdef _LP64
     65  1.10     matt struct trapframe32 {
     66  1.10     matt 	register32_t fixreg[32];
     67  1.10     matt 	register32_t lr;
     68  1.10     matt 	int cr;
     69  1.10     matt 	int xer;
     70  1.10     matt 	register32_t ctr;
     71  1.10     matt 	register32_t srr0;
     72  1.10     matt 	register32_t srr1;
     73  1.10     matt 	register32_t dar;		/* dar & dsisr are only filled on a DSI trap */
     74  1.10     matt 	int dsisr;
     75  1.10     matt 	int exc;
     76  1.10     matt 	uint32_t vrsave;
     77  1.12   kleink 	uint32_t mq;
     78  1.10     matt };
     79  1.10     matt #endif
     80  1.10     matt #endif /* _KERNEL || _LKM */
     81  1.10     matt 
     82   1.1       ws /*
     83   1.1       ws  * This is to ensure alignment of the stackpointer
     84   1.1       ws  */
     85  1.11     matt #define	FRAMELEN	roundup(sizeof(struct trapframe) + 8, CALLFRAMELEN)
     86   1.9  thorpej #define	trapframe(l)	((struct trapframe *)((char *)(l)->l_addr + USPACE - FRAMELEN + 8))
     87   1.1       ws 
     88   1.1       ws struct switchframe {
     89   1.1       ws 	register_t sp;
     90   1.1       ws 	int fill;
     91   1.1       ws 	int user_sr;
     92   1.1       ws 	int cr;
     93   1.1       ws 	register_t fixreg2;
     94   1.1       ws 	register_t fixreg[19];		/* R13-R31 */
     95   1.1       ws };
     96   1.1       ws 
     97   1.1       ws struct clockframe {
     98   1.1       ws 	register_t srr1;
     99   1.1       ws 	register_t srr0;
    100   1.1       ws 	int pri;
    101   1.1       ws 	int depth;
    102   1.1       ws };
    103   1.1       ws 
    104   1.1       ws /*
    105   1.1       ws  * Call frame for PowerPC used during fork.
    106   1.1       ws  */
    107  1.10     matt #define	CALLFRAMELEN	sizeof(struct callframe)
    108   1.1       ws struct callframe {
    109   1.1       ws 	register_t sp;
    110   1.1       ws 	register_t lr;
    111   1.1       ws 	register_t r30;
    112   1.1       ws 	register_t r31;
    113   1.3     matt };
    114   1.3     matt 
    115   1.9  thorpej struct saframe {
    116   1.9  thorpej 	register_t r1;		/* stack pointer */
    117   1.9  thorpej 	register_t lr;		/* Callee lr save area */
    118   1.9  thorpej 	register_t fill[2];	/* Pad to multiple of 16 bytes */
    119   1.9  thorpej };
    120   1.6     matt 
    121  1.11     matt #define	IFRAMELEN	roundup(sizeof(struct intrframe), CALLFRAMELEN)
    122   1.3     matt struct intrframe {
    123   1.3     matt 	register_t r1;			/*  0 */
    124   1.3     matt 	register_t _pad4;		/*  4 */
    125   1.3     matt 	/*
    126   1.3     matt 	 * The next 4 fields are "clockframe"
    127   1.3     matt 	 */
    128   1.3     matt 	register_t srr1;		/*  8 */
    129   1.3     matt 	register_t srr0;		/* 12 */
    130   1.3     matt 	int pri;			/* 16 */
    131   1.7      chs 	int intrdepth;			/* 20 */
    132   1.3     matt 	register_t vrsave;		/* 24 */
    133   1.3     matt 	register_t ctr;			/* 28 */
    134   1.3     matt 	register_t xer;			/* 32 */
    135   1.3     matt 	register_t cr;			/* 36 */
    136   1.3     matt 	register_t lr;			/* 40 */
    137   1.3     matt 	register_t r12;			/* 44 */
    138   1.3     matt 	register_t r11;			/* 48 */
    139   1.3     matt 	register_t r10;			/* 52 */
    140   1.3     matt 	register_t r9;			/* 56 */
    141   1.3     matt 	register_t r8;			/* 60 */
    142   1.3     matt 	register_t r7;			/* 64 */
    143   1.3     matt 	register_t r6;			/* 68 */
    144   1.3     matt 	register_t r5;			/* 72 */
    145   1.3     matt 	register_t r4;			/* 76 */
    146   1.3     matt 	register_t r3;			/* 80 */
    147   1.3     matt 	register_t r0;			/* 84 */
    148   1.4   kleink };
    149   1.4   kleink 
    150   1.4   kleink #define	SPFRAMELEN	sizeof(struct spillframe)
    151   1.4   kleink struct spillframe {
    152   1.4   kleink 	register_t	r1;		/*  0 */
    153   1.4   kleink 	register_t	_pad4;		/*  4 */
    154   1.4   kleink 	register_t	r12;		/*  8 */
    155   1.4   kleink 	register_t	r11;		/* 12 */
    156   1.4   kleink 	register_t	r10;		/* 16 */
    157   1.4   kleink 	register_t	r9;		/* 20 */
    158   1.4   kleink 	register_t	r8;		/* 24 */
    159   1.4   kleink 	register_t	r7;		/* 28 */
    160   1.4   kleink 	register_t	r6;		/* 32 */
    161   1.4   kleink 	register_t	r5;		/* 36 */
    162   1.4   kleink 	register_t	r4;		/* 40 */
    163   1.4   kleink 	register_t	r3;		/* 44 */
    164   1.4   kleink 	register_t	r0;		/* 48 */
    165   1.1       ws };
    166   1.1       ws 
    167   1.8     matt #endif	/* _POWERPC_FRAME_H_ */
    168