Updates to the Cache Manager to include NetBSD5 support
[openafs.git] / src / afs / NBSD / osi_machdep.h
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  *
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /*
11  *
12  * OpenBSD OSI header file. Extends afs_osi.h.
13  *
14  * afs_osi.h includes this file, which is the only way this file should
15  * be included in a source file. This file can redefine macros declared in
16  * afs_osi.h.
17  */
18
19 #ifndef _OSI_MACHDEP_H_
20 #define _OSI_MACHDEP_H_
21
22 #define RXK_LISTENER_ENV 1
23 #define AFS_DIRENT 1
24
25 #include <sys/lock.h>
26 #if defined(AFS_NBSD50_ENV)
27 #include <sys/kmem.h>
28 #include <sys/specificdata.h>
29 #include <sys/mutex.h>
30 #include <sys/rwlock.h>
31 #endif
32 #include <sys/malloc.h>
33 #include <sys/syscall.h>
34 #include <sys/syscallargs.h>
35
36 #ifndef AFS_NBSD50_ENV
37 /* Why are we including the rump debugger? */
38 #include "opt_ddb.h" /* Debugger() */
39 #endif
40
41 #if defined(AFS_NBSD50_ENV)
42 # if !defined(DEF_CADDR_T)
43 typedef char * caddr_t;
44 #define DEF_CADDR_T
45 # endif
46 #endif
47
48 #define M_AFSFID        (M_TEMP-1)
49 #define M_AFSBUFHDR     (M_TEMP-2)
50 #define M_AFSBUFFER     (M_TEMP-3)
51 #define M_AFSGENERIC    (M_TEMP-4)
52
53 /* vfs */
54 #define osi_vfs         mount
55 #define osi_vfs_bsize   mnt_stat.f_bsize
56 #define osi_vfs_iosize  mnt_stat.f_iosize
57 #define osi_vfs_fsid    mnt_stat.f_fsid
58 #if 0
59 #define vfs_bsize       mnt_stat.f_bsize
60 #define vfs_fsid        mnt_stat.f_fsid
61 #endif
62 #define vfs_vnodecovered mnt_vnodecovered
63 #define v_vfsp          v_mount
64 #define VFS_STATFS      afs_statvfs
65
66 #ifndef AFS_NBSD50_ENV
67 /* Defined in sys/syscallargs.h */
68 int
69 sys_ioctl(struct lwp *l, void *v, register_t *retval);
70 #endif
71
72 /* vnode */
73 #define VN_HOLD(vp)     (vref(vp))
74 #define VN_RELE(vp)     (vrele(vp))
75 #define osi_vnhold(avc, r) (VN_HOLD(AFSTOV(avc)))
76
77 #define va_nodeid       va_fileid
78
79 /* syscall */
80 struct afs_sysargs {
81     syscallarg(long) syscall;
82     syscallarg(long) parm1;
83     syscallarg(long) parm2;
84     syscallarg(long) parm3;
85     syscallarg(long) parm4;
86     syscallarg(long) parm5;
87     syscallarg(long) parm6;
88 };
89
90 /* uio */
91 #define afsio_iov       uio_iov
92 #define afsio_iovcnt    uio_iovcnt
93 #define afsio_offset    uio_offset
94 #define afsio_resid     uio_resid
95 #define afsio_seg       uio_segflg
96 #define AFS_UIOSYS      UIO_SYSSPACE
97 #define AFS_UIOUSER     UIO_USERSPACE
98
99 /* malloc */
100 inline void * afs_osi_Alloc(size_t asize);
101 inline void * afs_osi_Alloc_NoSleep(size_t asize);
102 extern void *osi_nbsd_Alloc(size_t asize, int cansleep);
103 extern void osi_nbsd_Free(void *p, size_t asize);
104
105 #ifdef AFS_KALLOC
106 #undef AFS_KALLOC
107 #define AFS_KALLOC(s) (osi_nbsd_Alloc((s), 1 /* cansleep */))
108 #endif
109
110 #ifdef AFS_KFREE
111 #undef AFS_KFREE
112 #define AFS_KFREE(p, s) (osi_nbsd_Free((p), (s)))
113 #endif
114
115
116 /* proc */
117 typedef struct lwp afs_proc_t;
118 #define osi_curproc()   curlwp
119 #define getpid()        (osi_curproc())->l_proc->p_pid
120 #define osi_procname(procname, size) strncpy(procname, curproc->p_comm, size)
121
122 /*
123  * XXX  I'm exporting the internal definition of kauth_cred_t
124  * until I work out protocol for switching group buffers.
125  * Matt.
126  */
127
128 #define KAUTH_EXPORT 1
129 #if defined(KAUTH_EXPORT)
130 /* internal type from kern_auth.c */
131 #if defined(AFS_NBSD50_ENV)
132 /*
133  * Credentials.
134  *
135  * A subset of this structure is used in kvm(3) (src/lib/libkvm/kvm_proc.c)
136  * and should be synchronized with this structure when the update is
137  * relevant.
138  */
139 struct kauth_cred {
140         /*
141          * Ensure that the first part of the credential resides in its own
142          * cache line.  Due to sharing there aren't many kauth_creds in a
143          * typical system, but the reference counts change very often.
144          * Keeping it seperate from the rest of the data prevents false
145          * sharing between CPUs.
146          */
147         u_int cr_refcnt;                /* reference count */
148 #if COHERENCY_UNIT > 4
149         uint8_t cr_pad[COHERENCY_UNIT - 4];
150 #endif
151         uid_t cr_uid;                   /* user id */
152         uid_t cr_euid;                  /* effective user id */
153         uid_t cr_svuid;                 /* saved effective user id */
154         gid_t cr_gid;                   /* group id */
155         gid_t cr_egid;                  /* effective group id */
156         gid_t cr_svgid;                 /* saved effective group id */
157         u_int cr_ngroups;               /* number of groups */
158         gid_t cr_groups[NGROUPS];       /* group memberships */
159         specificdata_reference cr_sd;   /* specific data */
160 };
161 #elif defined(AFS_NBSD40_ENV)
162 struct kauth_cred {
163         struct simplelock cr_lock;      /* lock on cr_refcnt */
164         u_int cr_refcnt;                /* reference count */
165         uid_t cr_uid;                   /* user id */
166         uid_t cr_euid;                  /* effective user id */
167         uid_t cr_svuid;                 /* saved effective user id */
168         gid_t cr_gid;                   /* group id */
169         gid_t cr_egid;                  /* effective group id */
170         gid_t cr_svgid;                 /* saved effective group id */
171         u_int cr_ngroups;               /* number of groups */
172         gid_t cr_groups[NGROUPS];       /* group memberships */
173 };
174 #else
175 #error TODO:  verify kauth_cred structure, if this is still here
176 #endif /* AFS_NBSD40_ENV */
177 #endif /* KAUTH_EXPORT */
178
179 typedef kauth_cred_t afs_ucred_t;
180 #define osi_curcred()   (kauth_cred_get())
181 #define afs_suser(x)    afs_osi_suser(osi_curcred())
182 #define osi_crgetruid(acred) (kauth_cred_getuid(acred))
183 #define osi_crgetrgid(acred) (kauth_cred_getgid(acred))
184 #define osi_crngroups(acred) (kauth_cred_ngroups(acred))
185 #define osi_proccred(aproc) (aproc->p_cred)
186 #define osi_crdup(acred) (kauth_cred_dup(acred))
187 #define crref osi_crdup
188 #define crdup osi_crdup
189 #define crhold crref
190 #define crfree kauth_cred_free
191
192 #define afs_cr_gid osi_crgetrgid
193 #define afs_cr_uid osi_crgetruid
194
195 inline gid_t osi_crgroupbyid(afs_ucred_t *acred, int gindex);
196
197 /* time */
198 #define afs_hz          hz
199 #define osi_GetTime(x)  microtime(x)
200 #define osi_Time()      time_second
201
202 /* str */
203 #define afs_strcasecmp(s1, s2)  strncasecmp((s1), (s2), 65535)
204 #define afs_strcat(s1, s2)      strcat((s1), (s2))
205
206 /* other */
207 #define afs_bufferpages bufpages
208 #ifndef iodone
209 #define iodone biodone
210 #endif
211 #define printk          printf  /* for RX version of xdr_* */
212 #define setgroups       sys_setgroups
213 #define UVM
214
215 /* This is not always in scope yet */
216 struct vcache;
217
218 extern int afs_nbsd_lookupname(char *fnamep, enum uio_seg segflg,
219                                int followlink, struct vnode **compvpp);
220 extern void afs_nbsd_getnewvnode(struct vcache *tvc);
221 extern int afs_vget();
222
223 #undef gop_lookupname
224 #undef gop_lookupname_user
225 #define osi_lookupname_user(fnamep, segflg, followlink, compvpp) \
226         afs_nbsd_lookupname((fnamep), (segflg), (followlink), (compvpp))
227 #define gop_lookupname_user osi_lookupname_user
228 #define gop_lookupname osi_lookupname_user
229
230 #ifdef KERNEL
231 #ifdef AFS_GLOBAL_SUNLOCK
232
233 #if defined(AFS_NBSD50_ENV)
234 extern kmutex_t afs_global_mtx;
235 #define AFS_GLOCK() \
236     do { \
237         mutex_enter(&afs_global_mtx); \
238     } while (0)
239 #define AFS_GUNLOCK() \
240     do { \
241         mutex_exit(&afs_global_mtx); \
242     } while (0)
243 #define ISAFS_GLOCK() (mutex_owned(&afs_global_mtx))
244 #define osi_InitGlock() \
245     do { \
246         mutex_init(&afs_global_mtx, MUTEX_DEFAULT, IPL_NONE); \
247     } while (0)
248 #else /* !50 */
249 extern struct lock afs_global_lock;
250 #if defined(LOCKDEBUG)
251 #define AFS_GLOCK() \
252   do { \
253       _lockmgr(&afs_global_lock, LK_EXCLUSIVE, NULL, __FILE__, __LINE__); \
254   } while(0);
255 #define AFS_GUNLOCK() \
256   do { \
257       _lockmgr(&afs_global_lock, LK_RELEASE, NULL, __FILE__, __LINE__); \
258   } while(0);
259 #else
260 #define AFS_GLOCK() \
261   do { \
262     lockmgr(&afs_global_lock, LK_EXCLUSIVE, NULL); \
263   } while(0);
264 #define AFS_GUNLOCK() \
265   do { \
266     lockmgr(&afs_global_lock, LK_RELEASE, NULL); \
267   } while(0);
268 #endif /* LOCKDEBUG */
269 #endif /* !50 */
270 #else
271 #define ISAFS_GLOCK() (lockstatus(&afs_global_lock) == LK_EXCLUSIVE)
272 extern struct lock afs_global_lock;
273 #define AFS_GLOCKP(p)
274 #define AFS_GUNLOCKP(p)
275 #define AFS_ASSERT_GLOCK()
276 #define ISAFS_GLOCK() 1
277 #endif /* !AFS_GLOBAL_SUNLOCK */
278
279 #undef SPLVAR
280 #define SPLVAR int splvar
281 #undef NETPRI
282 #define NETPRI splvar=splnet()
283 #undef USERPRI
284 #define USERPRI splx(splvar)
285 #endif /* KERNEL */
286
287 #if     !defined(ASSEMBLER) && !defined(__LANGUAGE_ASSEMBLY__) && !defined(IGNORE_STDS_H)
288 enum vcexcl { NONEXCL, EXCL };
289
290 #ifndef MIN
291 #define MIN(A,B) ((A) < (B) ? (A) : (B))
292 #endif
293 #ifndef MAX
294 #define MAX(A,B) ((A) > (B) ? (A) : (B))
295 #endif
296
297 #endif /* ASSEMBLER */
298
299 /* vnodes */
300 extern int (**afs_vnodeop_p) ();
301 #define vType(vc)               AFSTOV(vc)->v_type
302 #define vSetVfsp(vc, vfsp)      AFSTOV(vc)->v_mount = (vfsp)
303 #define vSetType(vc, type)      AFSTOV(vc)->v_type = (type)
304 #define IsAfsVnode(v)      ((v)->v_op == afs_vnodeop_p)
305 #define SetAfsVnode(v)     /* nothing; done in getnewvnode() */
306
307
308 #endif /* _OSI_MACHDEP_H_ */