1 /*
2 * Copyright (c) 1988 University of Utah.
3 * Copyright (c) 1992, 1993
4 * The Regents of the University of California. All rights reserved.
5 *
6 * This code is derived from software contributed to Berkeley by
7 * the Systems Programming Group of the University of Utah Computer
8 * Science Department and Ralph Campbell.
9 *
10 * %sccs.include.redist.c%
11 *
12 * from: Utah $Hdr: machparam.h 1.11 89/08/14$
13 *
14 * @(#)param.h 8.3 (Berkeley) 05/14/95
15 */
16
17 /*
18 * Machine dependent constants for DEC Station 3100.
19 */
20 #define MACHINE "news3400"
21 #define NCPUS 1
22 #define COFF
23
24 /*
25 * Round p (pointer or byte index) up to a correctly-aligned value for all
26 * data types (int, long, ...). The result is u_int and must be cast to
27 * any desired pointer type.
28 */
29 #define ALIGNBYTES 7
30 #define ALIGN(p) (((u_int)(p) + ALIGNBYTES) &~ ALIGNBYTES)
31
32 #define NBPG 4096 /* bytes/page */
33 #define PGOFSET (NBPG-1) /* byte offset into page */
34 #define PGSHIFT 12 /* LOG2(NBPG) */
35 #define NPTEPG (NBPG/4)
36
37 #define NBSEG 0x400000 /* bytes/segment */
38 #define SEGOFSET (NBSEG-1) /* byte offset into segment */
39 #define SEGSHIFT 22 /* LOG2(NBSEG) */
40
41 #define KERNBASE 0x80000000 /* start of kernel virtual */
42 #define BTOPKERNBASE ((u_long)KERNBASE >> PGSHIFT)
43
44 #define DEV_BSIZE 512
45 #define DEV_BSHIFT 9 /* log2(DEV_BSIZE) */
46 #define BLKDEV_IOSIZE 2048
47 #define MAXPHYS (128 * 1024) /* max raw I/O transfer size */
48
49 #define CLSIZE 1
50 #define CLSIZELOG2 0
51
52 /* NOTE: SSIZE, SINCR and UPAGES must be multiples of CLSIZE */
53 #define SSIZE 1 /* initial stack size/NBPG */
54 #define SINCR 1 /* increment of stack/NBPG */
55
56 #define UPAGES 2 /* pages of u-area */
57 #define UADDR 0xffffd000 /* address of u */
58 #define UVPN (UADDR>>PGSHIFT)/* virtual page number of u */
59 #define KERNELSTACK (UADDR+UPAGES*NBPG) /* top of kernel stack */
60
61 /*
62 * Constants related to network buffer management.
63 * MCLBYTES must be no larger than CLBYTES (the software page size), and,
64 * on machines that exchange pages of input or output buffers with mbuf
65 * clusters (MAPPED_MBUFS), MCLBYTES must also be an integral multiple
66 * of the hardware page size.
67 */
68 #define MSIZE 128 /* size of an mbuf */
69 #define MCLBYTES 1024
70 #define MCLSHIFT 10
71 #define MCLOFSET (MCLBYTES - 1)
72 #ifndef NMBCLUSTERS
73 #ifdef GATEWAY
74 #define NMBCLUSTERS 512 /* map size, max cluster allocation */
75 #else
76 #define NMBCLUSTERS 256 /* map size, max cluster allocation */
77 #endif
78 #endif
79
80 /*
81 * Size of kernel malloc arena in CLBYTES-sized logical pages
82 */
83 #ifndef NKMEMCLUSTERS
84 #define NKMEMCLUSTERS (2048*1024/CLBYTES)
85 #endif
86
87 /* pages ("clicks") (4096 bytes) to disk blocks */
88 #define ctod(x) ((x)<<(PGSHIFT-DEV_BSHIFT))
89 #define dtoc(x) ((x)>>(PGSHIFT-DEV_BSHIFT))
90 #define dtob(x) ((x)<<DEV_BSHIFT)
91
92 /* pages to bytes */
93 #define ctob(x) ((x)<<PGSHIFT)
94
95 /* bytes to pages */
96 #define btoc(x) (((unsigned)(x)+(NBPG-1))>>PGSHIFT)
97
98 #define btodb(bytes) /* calculates (bytes / DEV_BSIZE) */ \
99 ((bytes) >> DEV_BSHIFT)
100 #define dbtob(db) /* calculates (db * DEV_BSIZE) */ \
101 ((db) << DEV_BSHIFT)
102
103 /*
104 * Map a ``block device block'' to a file system block.
105 * This should be device dependent, and should use the bsize
106 * field from the disk label.
107 * For now though just use DEV_BSIZE.
108 */
109 #define bdbtofsb(bn) ((bn) / (BLKDEV_IOSIZE/DEV_BSIZE))
110
111 /*
112 * Mach derived conversion macros
113 */
114 #define pmax_round_page(x) ((((unsigned)(x)) + NBPG - 1) & ~(NBPG-1))
115 #define pmax_trunc_page(x) ((unsigned)(x) & ~(NBPG-1))
116 #define pmax_btop(x) ((unsigned)(x) >> PGSHIFT)
117 #define pmax_ptob(x) ((unsigned)(x) << PGSHIFT)
118
119 #ifdef news3400
120 #define splnet spl2
121 #define splsoftclock spl2
122 #define splbio spl3
123 #define spltty spl4
124 #define splimp spl4
125 #define splclock spl5
126 #define splstatclock spl5
127 #endif /* news3400 */
128
129 #ifdef KERNEL
130 #ifndef LOCORE
131 extern int cpuspeed;
132 #define DELAY(n) { register int N = cpuspeed * (n) / 2; while (--N > 0); }
133 #endif
134 #else /* !KERNEL */
135 #define DELAY(n) { register int N = (n); while (--N > 0); }
136 #endif /* !KERNEL */
137
138 #ifndef LOCORE
139 extern int intrcnt[];
140 extern char *intrnames[];
141 #endif /* !LOCORE */
142
143 #define INTR_CLOCK 0
144 #define INTR_SOFTCLK 1
145 #define INTR_SOFTINT 2
146 #define INTR_AST 3
147 #define INTR_SCSI00 4
148 #define INTR_SCSI01 5
149 #define INTR_SCSI02 6
150 #define INTR_SCSI03 7
151 #define INTR_SCSI04 8
152 #define INTR_SCSI05 9
153 #define INTR_SCSI06 10
154 #define INTR_SCSI07 11
155 #define INTR_SCSI10 12
156 #define INTR_SCSI11 13
157 #define INTR_SCSI12 14
158 #define INTR_SCSI13 15
159 #define INTR_SCSI14 16
160 #define INTR_SCSI15 17
161 #define INTR_SCSI16 18
162 #define INTR_SCSI17 19
163 #define INTR_ETHER0 20
164 #define INTR_ETHER1 21
165 #define INTR_ETHER2 22
166 #define INTR_VME2 23
167 #define INTR_VME4 24
168 #define INTR_RS0 25
169 #define INTR_RS1 26
170 #define INTR_RS2 27
171 #define INTR_RS3 28
172 #define INTR_RS4 29
173 #define INTR_RS5 30
174 #define INTR_RS6 31
175 #define INTR_RS7 32
176 #define INTR_RS8 33
177 #define INTR_RS9 34
178 #define INTR_RS10 35
179 #define INTR_RS11 36
180 #define INTR_PRINTER 37
181 #define INTR_FD 38
182 #define INTR_AUDIO 39
183 #define INTR_KEYBOARD 40
184 #define INTR_MOUSE 41
185 #define INTR_BITMAP 42
186 #define INTR_FDDI 43
187 #define INTR_RENDER 44
188
189 #define NINTRSLOT 45 /* # of intrcnt[] slot */
190
191 #ifndef _SIMPLELOCK_H_
192 #define _SIMPLELOCK_H_
193 /*
194 * A simple spin lock.
195 *
196 * This structure only sets one bit of data, but is sized based on the
197 * minimum word size that can be operated on by the hardware test-and-set
198 * instruction. It is only needed for multiprocessors, as uniprocessors
199 * will always run to completion or a sleep. It is an error to hold one
200 * of these locks while a process is sleeping.
201 */
202 struct simplelock {
203 int lock_data;
204 };
205
206 #if !defined(DEBUG) && NCPUS > 1
207 /*
208 * The simple-lock routines are the primitives out of which the lock
209 * package is built. The machine-dependent code must implement an
210 * atomic test_and_set operation that indivisibly sets the simple lock
211 * to non-zero and returns its old value. It also assumes that the
212 * setting of the lock to zero below is indivisible. Simple locks may
213 * only be used for exclusive locks.
214 */
215 static __inline void
simple_lock_init(lkp)216 simple_lock_init(lkp)
217 struct simplelock *lkp;
218 {
219
220 lkp->lock_data = 0;
221 }
222
223 static __inline void
simple_lock(lkp)224 simple_lock(lkp)
225 __volatile struct simplelock *lkp;
226 {
227
228 while (test_and_set(&lkp->lock_data))
229 continue;
230 }
231
232 static __inline int
simple_lock_try(lkp)233 simple_lock_try(lkp)
234 __volatile struct simplelock *lkp;
235 {
236
237 return (!test_and_set(&lkp->lock_data))
238 }
239
240 static __inline void
241 simple_unlock(lkp)
242 __volatile struct simplelock *lkp;
243 {
244
245 lkp->lock_data = 0;
246 }
247 #endif /* NCPUS > 1 */
248 #endif /* !_SIMPLELOCK_H_ */
249