convert vm_page bit fields to flags
[unix-history] / usr / src / sys / kern / kern_subr.c
CommitLineData
da7c5cc6 1/*
8429d022 2 * Copyright (c) 1982, 1986, 1991 Regents of the University of California.
6a8af092 3 * All rights reserved.
da7c5cc6 4 *
8429d022
MK
5 * %sccs.include.redist.c%
6 *
bb0591a3 7 * @(#)kern_subr.c 7.10 (Berkeley) %G%
da7c5cc6 8 */
358708a6 9
94368568
JB
10#include "param.h"
11#include "systm.h"
c49c0c2b 12#include "proc.h"
bb0591a3 13#include "malloc.h"
358708a6 14
c4ec2128 15uiomove(cp, n, uio)
358708a6
SL
16 register caddr_t cp;
17 register int n;
358708a6
SL
18 register struct uio *uio;
19{
20 register struct iovec *iov;
21 u_int cnt;
22 int error = 0;
23
c49c0c2b 24#ifdef DIAGNOSTIC
c4ec2128
KM
25 if (uio->uio_rw != UIO_READ && uio->uio_rw != UIO_WRITE)
26 panic("uiomove: mode");
c49c0c2b
KM
27 if (uio->uio_segflg == UIO_USERSPACE && uio->uio_procp != curproc)
28 panic("uiomove proc");
29#endif
358708a6
SL
30 while (n > 0 && uio->uio_resid) {
31 iov = uio->uio_iov;
32 cnt = iov->iov_len;
33 if (cnt == 0) {
34 uio->uio_iov++;
35 uio->uio_iovcnt--;
36 continue;
37 }
38 if (cnt > n)
39 cnt = n;
40 switch (uio->uio_segflg) {
41
c41770c0
KM
42 case UIO_USERSPACE:
43 case UIO_USERISPACE:
c4ec2128 44 if (uio->uio_rw == UIO_READ)
358708a6
SL
45 error = copyout(cp, iov->iov_base, cnt);
46 else
47 error = copyin(iov->iov_base, cp, cnt);
48 if (error)
49 return (error);
50 break;
51
c41770c0 52 case UIO_SYSSPACE:
c4ec2128 53 if (uio->uio_rw == UIO_READ)
358708a6
SL
54 bcopy((caddr_t)cp, iov->iov_base, cnt);
55 else
56 bcopy(iov->iov_base, (caddr_t)cp, cnt);
57 break;
58 }
59 iov->iov_base += cnt;
60 iov->iov_len -= cnt;
61 uio->uio_resid -= cnt;
62 uio->uio_offset += cnt;
63 cp += cnt;
64 n -= cnt;
65 }
66 return (error);
67}
68
69/*
70 * Give next character to user as result of read.
71 */
72ureadc(c, uio)
73 register int c;
74 register struct uio *uio;
75{
76 register struct iovec *iov;
77
78again:
79 if (uio->uio_iovcnt == 0)
80 panic("ureadc");
81 iov = uio->uio_iov;
82 if (iov->iov_len <= 0 || uio->uio_resid <= 0) {
83 uio->uio_iovcnt--;
84 uio->uio_iov++;
85 goto again;
86 }
87 switch (uio->uio_segflg) {
88
c41770c0 89 case UIO_USERSPACE:
358708a6
SL
90 if (subyte(iov->iov_base, c) < 0)
91 return (EFAULT);
92 break;
93
c41770c0 94 case UIO_SYSSPACE:
358708a6
SL
95 *iov->iov_base = c;
96 break;
97
c41770c0 98 case UIO_USERISPACE:
358708a6
SL
99 if (suibyte(iov->iov_base, c) < 0)
100 return (EFAULT);
101 break;
102 }
103 iov->iov_base++;
104 iov->iov_len--;
105 uio->uio_resid--;
106 uio->uio_offset++;
107 return (0);
108}
109
6a8af092 110#ifdef vax /* unused except by ct.c, other oddities XXX */
358708a6
SL
111/*
112 * Get next character written in by user from uio.
113 */
114uwritec(uio)
115 struct uio *uio;
116{
117 register struct iovec *iov;
118 register int c;
119
9b428195
MK
120 if (uio->uio_resid <= 0)
121 return (-1);
358708a6 122again:
9b428195 123 if (uio->uio_iovcnt <= 0)
358708a6
SL
124 panic("uwritec");
125 iov = uio->uio_iov;
126 if (iov->iov_len == 0) {
358708a6 127 uio->uio_iov++;
9b428195
MK
128 if (--uio->uio_iovcnt == 0)
129 return (-1);
358708a6
SL
130 goto again;
131 }
132 switch (uio->uio_segflg) {
133
c41770c0 134 case UIO_USERSPACE:
358708a6
SL
135 c = fubyte(iov->iov_base);
136 break;
137
c41770c0 138 case UIO_SYSSPACE:
8429d022 139 c = *(u_char *) iov->iov_base;
358708a6
SL
140 break;
141
c41770c0 142 case UIO_USERISPACE:
358708a6
SL
143 c = fuibyte(iov->iov_base);
144 break;
145 }
146 if (c < 0)
147 return (-1);
148 iov->iov_base++;
149 iov->iov_len--;
150 uio->uio_resid--;
151 uio->uio_offset++;
8429d022 152 return (c);
358708a6 153}
6a8af092 154#endif /* vax */
bb0591a3
KM
155
156/*
157 * General routine to allocate a hash table.
158 */
159void *
160hashinit(elements, type, hashmask)
161 int elements, type;
162 u_long *hashmask;
163{
164 long hashsize;
165 void *hashtbl;
166
167 if (elements <= 0)
168 panic("hashinit: bad cnt");
169 for (hashsize = 1; hashsize <= elements; hashsize <<= 1)
170 continue;
171 hashsize >>= 1;
172 hashtbl = malloc((u_long)hashsize * sizeof(void *), type, M_WAITOK);
173 bzero(hashtbl, hashsize * sizeof(void *));
174 *hashmask = hashsize - 1;
175 return (hashtbl);
176}