ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / arch / s390 / kernel / compat_linux.h
1 #ifndef _ASM_S390X_S390_H
2 #define _ASM_S390X_S390_H
3
4 #include <linux/config.h>
5 #include <linux/compat.h>
6 #include <linux/socket.h>
7 #include <linux/syscalls.h>
8 #include <linux/nfs_fs.h>
9 #include <linux/sunrpc/svc.h>
10 #include <linux/nfsd/nfsd.h>
11 #include <linux/nfsd/export.h>
12
13 /* Macro that masks the high order bit of an 32 bit pointer and converts it*/
14 /*       to a 64 bit pointer */
15 #define A(__x) ((unsigned long)((__x) & 0x7FFFFFFFUL))
16 #define AA(__x)                         \
17         ((unsigned long)(__x))
18
19 /* Now 32bit compatibility types */
20 struct ipc_kludge_32 {
21         __u32   msgp;                           /* pointer              */
22         __s32   msgtyp;
23 };
24
25 struct old_sigaction32 {
26        __u32                    sa_handler;     /* Really a pointer, but need to deal with 32 bits */
27        compat_old_sigset_t      sa_mask;        /* A 32 bit mask */
28        __u32                    sa_flags;
29        __u32                    sa_restorer;    /* Another 32 bit pointer */
30 };
31  
32 typedef union sigval32 {
33         int     sival_int;
34         __u32   sival_ptr;
35 } sigval_t32;
36                  
37 typedef struct siginfo32 {
38         int     si_signo;
39         int     si_errno;
40         int     si_code;
41
42         union {
43                 int _pad[((128/sizeof(int)) - 3)];
44
45                 /* kill() */
46                 struct {
47                         pid_t   _pid;   /* sender's pid */
48                         uid_t   _uid;   /* sender's uid */
49                 } _kill;
50
51                 /* POSIX.1b timers */
52                 struct {
53                         unsigned int    _timer1;
54                         unsigned int    _timer2;
55                 
56                 } _timer;
57
58                 /* POSIX.1b signals */
59                 struct {
60                         pid_t                   _pid;   /* sender's pid */
61                         uid_t                   _uid;   /* sender's uid */
62                         sigval_t32              _sigval;
63                 } _rt;
64
65                 /* SIGCHLD */
66                 struct {
67                         pid_t                   _pid;   /* which child */
68                         uid_t                   _uid;   /* sender's uid */
69                         int                     _status;/* exit code */
70                         compat_clock_t          _utime;
71                         compat_clock_t          _stime;
72                 } _sigchld;
73
74                 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
75                 struct {
76                         __u32   _addr;  /* faulting insn/memory ref. - pointer */
77                 } _sigfault;
78                           
79                 /* SIGPOLL */
80                 struct {
81                         int     _band;  /* POLL_IN, POLL_OUT, POLL_MSG */
82                         int     _fd;
83                 } _sigpoll;
84         } _sifields;
85 } siginfo_t32;  
86
87 /*
88  * How these fields are to be accessed.
89  */
90 #define si_pid          _sifields._kill._pid
91 #define si_uid          _sifields._kill._uid
92 #define si_status       _sifields._sigchld._status
93 #define si_utime        _sifields._sigchld._utime
94 #define si_stime        _sifields._sigchld._stime
95 #define si_value        _sifields._rt._sigval
96 #define si_int          _sifields._rt._sigval.sival_int
97 #define si_ptr          _sifields._rt._sigval.sival_ptr
98 #define si_addr         _sifields._sigfault._addr
99 #define si_band         _sifields._sigpoll._band
100 #define si_fd           _sifields._sigpoll._fd    
101
102 /* asm/sigcontext.h */
103 typedef union
104 {
105         __u64   d;
106         __u32   f; 
107 } freg_t32;
108
109 typedef struct
110 {
111         unsigned int    fpc;
112         freg_t32        fprs[__NUM_FPRS];              
113 } _s390_fp_regs32;
114
115 typedef struct 
116 {
117         __u32   mask;
118         __u32   addr;
119 } _psw_t32 __attribute__ ((aligned(8)));
120
121 #define PSW32_MASK_PER          0x40000000UL
122 #define PSW32_MASK_DAT          0x04000000UL
123 #define PSW32_MASK_IO           0x02000000UL
124 #define PSW32_MASK_EXT          0x01000000UL
125 #define PSW32_MASK_KEY          0x00F00000UL
126 #define PSW32_MASK_MCHECK       0x00040000UL
127 #define PSW32_MASK_WAIT         0x00020000UL
128 #define PSW32_MASK_PSTATE       0x00010000UL
129 #define PSW32_MASK_ASC          0x0000C000UL
130 #define PSW32_MASK_CC           0x00003000UL
131 #define PSW32_MASK_PM           0x00000f00UL
132
133 #define PSW32_ADDR_AMODE31      0x80000000UL
134 #define PSW32_ADDR_INSN         0x7FFFFFFFUL
135
136 #define PSW32_BASE_BITS         0x00080000UL
137
138 #define PSW32_ASC_PRIMARY       0x00000000UL
139 #define PSW32_ASC_ACCREG        0x00004000UL
140 #define PSW32_ASC_SECONDARY     0x00008000UL
141 #define PSW32_ASC_HOME          0x0000C000UL
142
143 #define PSW32_USER_BITS (PSW32_BASE_BITS | PSW32_MASK_DAT | PSW32_ASC_HOME | \
144                          PSW32_MASK_IO | PSW32_MASK_EXT | PSW32_MASK_MCHECK | \
145                          PSW32_MASK_PSTATE)
146
147 #define PSW32_MASK_MERGE(CURRENT,NEW) \
148         (((CURRENT) & ~(PSW32_MASK_CC|PSW32_MASK_PM)) | \
149          ((NEW) & (PSW32_MASK_CC|PSW32_MASK_PM)))
150
151
152 typedef struct
153 {
154         _psw_t32        psw;
155         __u32           gprs[__NUM_GPRS];
156         __u32           acrs[__NUM_ACRS];
157 } _s390_regs_common32;
158
159 typedef struct
160 {
161         _s390_regs_common32 regs;
162         _s390_fp_regs32     fpregs;
163 } _sigregs32;
164
165 #define _SIGCONTEXT_NSIG32      64
166 #define _SIGCONTEXT_NSIG_BPW32  32
167 #define __SIGNAL_FRAMESIZE32    96
168 #define _SIGMASK_COPY_SIZE32    (sizeof(u32)*2)
169
170 struct sigcontext32
171 {
172         __u32   oldmask[_COMPAT_NSIG_WORDS];
173         __u32   sregs;                          /* pointer */
174 };
175
176 /* asm/signal.h */
177 struct sigaction32 {
178         __u32           sa_handler;             /* pointer */
179         __u32           sa_flags;
180         __u32           sa_restorer;            /* pointer */
181         compat_sigset_t sa_mask;        /* mask last for extensibility */
182 };
183
184 typedef struct {
185         __u32                   ss_sp;          /* pointer */
186         int                     ss_flags;
187         compat_size_t           ss_size;
188 } stack_t32;
189
190 /* asm/ucontext.h */
191 struct ucontext32 {
192         __u32                   uc_flags;
193         __u32                   uc_link;        /* pointer */   
194         stack_t32               uc_stack;
195         _sigregs32              uc_mcontext;
196         compat_sigset_t         uc_sigmask;     /* mask last for extensibility */
197 };
198
199 #define SIGEV_PAD_SIZE32 ((SIGEV_MAX_SIZE/sizeof(int)) - 3)
200 struct sigevent32 {
201         union {
202                 int sival_int;
203                 u32 sival_ptr;
204         } sigev_value;
205         int sigev_signo;
206         int sigev_notify;
207         union {
208                 int _pad[SIGEV_PAD_SIZE32];
209                 int _tid;
210                 struct {
211                         u32 *_function;
212                         u32 *_attribute;
213                 } _sigev_thread;
214         } _sigev_un;
215 };
216
217 #endif /* _ASM_S390X_S390_H */