1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 #ifndef _UVM_UVM_EXTERN_H_
70 #define _UVM_UVM_EXTERN_H_
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87 typedef unsigned int uvm_flag_t;
88 typedef int vm_fault_t;
89
90 typedef int vm_inherit_t;
91 typedef off_t voff_t;
92
93 union vm_map_object;
94 typedef union vm_map_object vm_map_object_t;
95
96 struct vm_map_entry;
97 typedef struct vm_map_entry *vm_map_entry_t;
98
99 struct vm_map;
100 typedef struct vm_map *vm_map_t;
101
102 struct vm_page;
103 typedef struct vm_page *vm_page_t;
104
105
106
107
108
109
110
111
112
113
114 #define UVM_PROT_MASK 0x07
115 #define UVM_PROT_NONE 0x00
116 #define UVM_PROT_ALL 0x07
117 #define UVM_PROT_READ 0x01
118 #define UVM_PROT_WRITE 0x02
119 #define UVM_PROT_EXEC 0x04
120
121
122 #define UVM_PROT_R 0x01
123 #define UVM_PROT_W 0x02
124 #define UVM_PROT_RW 0x03
125 #define UVM_PROT_X 0x04
126 #define UVM_PROT_RX 0x05
127 #define UVM_PROT_WX 0x06
128 #define UVM_PROT_RWX 0x07
129
130
131
132
133 #define UVM_INH_MASK 0x30
134 #define UVM_INH_SHARE 0x00
135 #define UVM_INH_COPY 0x10
136 #define UVM_INH_NONE 0x20
137 #define UVM_INH_DONATE 0x30
138
139
140
141
142
143
144
145 typedef int vm_prot_t;
146
147
148
149
150
151
152
153
154
155 #define VM_PROT_NONE ((vm_prot_t) 0x00)
156
157 #define VM_PROT_READ ((vm_prot_t) 0x01)
158 #define VM_PROT_WRITE ((vm_prot_t) 0x02)
159 #define VM_PROT_EXECUTE ((vm_prot_t) 0x04)
160
161
162
163
164
165 #define VM_PROT_DEFAULT (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE)
166
167
168
169
170
171 #define VM_PROT_ALL (VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE)
172
173
174 #define UVM_ADV_NORMAL 0x0
175 #define UVM_ADV_RANDOM 0x1
176 #define UVM_ADV_SEQUENTIAL 0x2
177
178 #define UVM_ADV_MASK 0x7
179
180
181 #define UVM_FLAG_FIXED 0x010000
182 #define UVM_FLAG_OVERLAY 0x020000
183 #define UVM_FLAG_NOMERGE 0x040000
184 #define UVM_FLAG_COPYONW 0x080000
185 #define UVM_FLAG_AMAPPAD 0x100000
186 #define UVM_FLAG_TRYLOCK 0x200000
187
188
189 #define UVM_PROTECTION(X) ((X) & UVM_PROT_MASK)
190 #define UVM_INHERIT(X) (((X) & UVM_INH_MASK) >> 4)
191 #define UVM_MAXPROTECTION(X) (((X) >> 8) & UVM_PROT_MASK)
192 #define UVM_ADVICE(X) (((X) >> 12) & UVM_ADV_MASK)
193
194 #define UVM_MAPFLAG(PROT,MAXPROT,INH,ADVICE,FLAGS) \
195 ((MAXPROT << 8)|(PROT)|(INH)|((ADVICE) << 12)|(FLAGS))
196
197
198 #define UVM_UNKNOWN_OFFSET ((voff_t) -1)
199
200
201
202
203
204 #define UVM_KMF_NOWAIT 0x1
205 #define UVM_KMF_VALLOC 0x2
206 #define UVM_KMF_CANFAIL 0x4
207 #define UVM_KMF_TRYLOCK UVM_FLAG_TRYLOCK
208
209
210
211
212 #define UVM_PGA_STRAT_NORMAL 0
213 #define UVM_PGA_STRAT_ONLY 1
214 #define UVM_PGA_STRAT_FALLBACK 2
215
216
217
218
219 #define UVM_PGA_USERESERVE 0x0001
220 #define UVM_PGA_ZERO 0x0002
221
222
223
224
225 #define UVM_LK_ENTER 0x00000001
226 #define UVM_LK_EXIT 0x00000002
227
228
229
230
231
232 struct buf;
233 struct core;
234 struct mount;
235 struct pglist;
236 struct proc;
237 struct ucred;
238 struct uio;
239 struct uvm_object;
240 struct vm_anon;
241 struct vm_aref;
242 struct vm_map;
243 struct vmspace;
244 struct pmap;
245 struct vnode;
246 struct pool;
247 struct simplelock;
248
249 extern struct pool *uvm_aiobuf_pool;
250
251
252
253
254
255
256 struct uvmexp {
257
258 int pagesize;
259 int pagemask;
260 int pageshift;
261
262
263 int npages;
264 int free;
265 int active;
266 int inactive;
267 int paging;
268 int wired;
269
270 int zeropages;
271 int reserve_pagedaemon;
272 int reserve_kernel;
273 int anonpages;
274 int vnodepages;
275 int vtextpages;
276
277
278 int freemin;
279 int freetarg;
280 int inactarg;
281 int wiredmax;
282 int anonmin;
283 int vtextmin;
284 int vnodemin;
285 int anonminpct;
286 int vtextminpct;
287 int vnodeminpct;
288
289
290 int nswapdev;
291 int swpages;
292 int swpginuse;
293 int swpgonly;
294 int nswget;
295 int nanon;
296 int nanonneeded;
297 int nfreeanon;
298
299
300 int faults;
301 int traps;
302 int intrs;
303 int swtch;
304 int softs;
305 int syscalls;
306 int pageins;
307
308 int swapins;
309 int swapouts;
310 int pgswapin;
311 int pgswapout;
312 int forks;
313 int forks_ppwait;
314 int forks_sharevm;
315 int pga_zerohit;
316
317 int pga_zeromiss;
318
319 int zeroaborts;
320
321
322
323 int fltnoram;
324 int fltnoanon;
325 int fltpgwait;
326 int fltpgrele;
327 int fltrelck;
328 int fltrelckok;
329 int fltanget;
330 int fltanretry;
331 int fltamcopy;
332 int fltnamap;
333 int fltnomap;
334 int fltlget;
335 int fltget;
336 int flt_anon;
337 int flt_acow;
338 int flt_obj;
339 int flt_prcopy;
340 int flt_przero;
341
342
343 int pdwoke;
344 int pdrevs;
345 int pdswout;
346 int pdfreed;
347 int pdscans;
348 int pdanscan;
349 int pdobscan;
350 int pdreact;
351 int pdbusy;
352 int pdpageouts;
353 int pdpending;
354 int pddeact;
355 int pdreanon;
356 int pdrevnode;
357 int pdrevtext;
358
359 int fpswtch;
360 int kmapent;
361 };
362
363 #ifdef _KERNEL
364 extern struct uvmexp uvmexp;
365 #endif
366
367
368
369
370 #include <sys/vmmeter.h>
371 #include <sys/queue.h>
372 #include <sys/tree.h>
373 #include <uvm/uvm_param.h>
374 #include <sys/lock.h>
375 #include <uvm/uvm_page.h>
376 #include <uvm/uvm_pmap.h>
377 #include <uvm/uvm_map.h>
378 #include <uvm/uvm_fault.h>
379 #include <uvm/uvm_pager.h>
380
381
382
383
384
385
386 struct vmspace {
387 struct vm_map vm_map;
388 int vm_refcnt;
389 caddr_t vm_shm;
390
391 #define vm_startcopy vm_rssize
392 segsz_t vm_rssize;
393 segsz_t vm_swrss;
394 segsz_t vm_tsize;
395 segsz_t vm_dsize;
396 segsz_t vm_dused;
397 segsz_t vm_ssize;
398 caddr_t vm_taddr;
399 caddr_t vm_daddr;
400 caddr_t vm_maxsaddr;
401 caddr_t vm_minsaddr;
402 };
403
404 #ifdef _KERNEL
405
406
407
408
409 extern struct vm_map *exec_map;
410 extern struct vm_map *kernel_map;
411 extern struct vm_map *kmem_map;
412 extern struct vm_map *phys_map;
413
414
415
416
417
418
419
420 #define uvm_km_zalloc(MAP,SIZE) uvm_km_alloc1(MAP,SIZE,0,TRUE)
421 #define uvm_km_alloc(MAP,SIZE) uvm_km_alloc1(MAP,SIZE,0,FALSE)
422
423 #endif
424
425 #ifdef pmap_resident_count
426 #define vm_resident_count(vm) (pmap_resident_count((vm)->vm_map.pmap))
427 #else
428 #define vm_resident_count(vm) ((vm)->vm_rssize)
429 #endif
430
431
432 struct buf;
433 struct loadavg;
434 struct proc;
435 struct pmap;
436 struct vmspace;
437 struct vmtotal;
438 struct mount;
439 struct vnode;
440 struct core;
441
442 #ifdef _KERNEL
443
444
445 void vmapbuf(struct buf *, vsize_t);
446 void vunmapbuf(struct buf *, vsize_t);
447 void cpu_fork(struct proc *, struct proc *, void *, size_t,
448 void (*)(void *), void *);
449
450
451 struct uvm_object *uao_create(vsize_t, int);
452 void uao_detach(struct uvm_object *);
453 void uao_detach_locked(struct uvm_object *);
454 void uao_reference(struct uvm_object *);
455 void uao_reference_locked(struct uvm_object *);
456
457
458 int uvm_fault(vm_map_t, vaddr_t,
459 vm_fault_t, vm_prot_t);
460
461
462
463 #if defined(KGDB)
464 void uvm_chgkprot(caddr_t, size_t, int);
465 #endif
466 void uvm_fork(struct proc *, struct proc *, boolean_t,
467 void *, size_t, void (*)(void *), void *);
468 void uvm_exit(struct proc *);
469 void uvm_init_limits(struct proc *);
470 boolean_t uvm_kernacc(caddr_t, size_t, int);
471 __dead void uvm_scheduler(void);
472
473 int uvm_vslock(struct proc *, caddr_t, size_t,
474 vm_prot_t);
475 void uvm_vsunlock(struct proc *, caddr_t, size_t);
476
477
478
479 void uvm_init(void);
480
481
482
483 int uvm_io(vm_map_t, struct uio *, int);
484
485 #define UVM_IO_FIXPROT 0x01
486
487
488 vaddr_t uvm_km_alloc1(vm_map_t, vsize_t, vsize_t, boolean_t);
489 void uvm_km_free(vm_map_t, vaddr_t, vsize_t);
490 void uvm_km_free_wakeup(vm_map_t, vaddr_t,
491 vsize_t);
492 vaddr_t uvm_km_kmemalloc(vm_map_t, struct uvm_object *,
493 vsize_t, int);
494 struct vm_map *uvm_km_suballoc(vm_map_t, vaddr_t *,
495 vaddr_t *, vsize_t, int,
496 boolean_t, vm_map_t);
497 vaddr_t uvm_km_valloc(vm_map_t, vsize_t);
498 vaddr_t uvm_km_valloc_align(vm_map_t, vsize_t, vsize_t);
499 vaddr_t uvm_km_valloc_wait(vm_map_t, vsize_t);
500 vaddr_t uvm_km_valloc_prefer_wait(vm_map_t, vsize_t,
501 voff_t);
502 vaddr_t uvm_km_alloc_poolpage1(vm_map_t,
503 struct uvm_object *, boolean_t);
504 void uvm_km_free_poolpage1(vm_map_t, vaddr_t);
505
506 void *uvm_km_getpage(boolean_t);
507 void uvm_km_putpage(void *);
508
509
510 #define uvm_map(_m, _a, _sz, _u, _f, _al, _fl) uvm_map_p(_m, _a, _sz, _u, _f, _al, _fl, 0)
511 int uvm_map_p(vm_map_t, vaddr_t *, vsize_t,
512 struct uvm_object *, voff_t, vsize_t,
513 uvm_flag_t, struct proc *);
514 int uvm_map_pageable(vm_map_t, vaddr_t,
515 vaddr_t, boolean_t, int);
516 int uvm_map_pageable_all(vm_map_t, int, vsize_t);
517 boolean_t uvm_map_checkprot(vm_map_t, vaddr_t,
518 vaddr_t, vm_prot_t);
519 int uvm_map_protect(vm_map_t, vaddr_t,
520 vaddr_t, vm_prot_t, boolean_t);
521 struct vmspace *uvmspace_alloc(vaddr_t, vaddr_t,
522 boolean_t);
523 void uvmspace_init(struct vmspace *, struct pmap *,
524 vaddr_t, vaddr_t, boolean_t);
525 void uvmspace_exec(struct proc *, vaddr_t, vaddr_t);
526 struct vmspace *uvmspace_fork(struct vmspace *);
527 void uvmspace_free(struct vmspace *);
528 void uvmspace_share(struct proc *, struct proc *);
529 void uvmspace_unshare(struct proc *);
530
531
532
533 void uvm_meter(void);
534 int uvm_sysctl(int *, u_int, void *, size_t *,
535 void *, size_t, struct proc *);
536 void uvm_total(struct vmtotal *);
537
538
539 int uvm_mmap(vm_map_t, vaddr_t *, vsize_t,
540 vm_prot_t, vm_prot_t, int,
541 caddr_t, voff_t, vsize_t, struct proc *);
542
543
544 struct vm_page *uvm_pagealloc_strat(struct uvm_object *,
545 voff_t, struct vm_anon *, int, int, int);
546 #define uvm_pagealloc(obj, off, anon, flags) \
547 uvm_pagealloc_strat((obj), (off), (anon), (flags), \
548 UVM_PGA_STRAT_NORMAL, 0)
549 vaddr_t uvm_pagealloc_contig(vaddr_t, vaddr_t,
550 vaddr_t, vaddr_t);
551 void uvm_pagerealloc(struct vm_page *,
552 struct uvm_object *, voff_t);
553
554 void uvm_page_physload(paddr_t, paddr_t,
555 paddr_t, paddr_t, int);
556 void uvm_setpagesize(void);
557
558
559 void uvm_aio_biodone1(struct buf *);
560 void uvm_aio_biodone(struct buf *);
561 void uvm_aio_aiodone(struct buf *);
562
563
564 void uvm_pageout(void *);
565 void uvm_aiodone_daemon(void *);
566
567
568 int uvm_pglistalloc(psize_t, paddr_t,
569 paddr_t, paddr_t, paddr_t,
570 struct pglist *, int, int);
571 void uvm_pglistfree(struct pglist *);
572
573
574 void uvm_swap_init(void);
575
576
577 int uvm_coredump(struct proc *, struct vnode *,
578 struct ucred *, struct core *);
579 void uvm_grow(struct proc *, vaddr_t);
580
581
582 void uvm_deallocate(vm_map_t, vaddr_t, vsize_t);
583
584
585 void uvm_vnp_setsize(struct vnode *, voff_t);
586 void uvm_vnp_sync(struct mount *);
587 void uvm_vnp_terminate(struct vnode *);
588
589 boolean_t uvm_vnp_uncache(struct vnode *);
590 struct uvm_object *uvn_attach(void *, vm_prot_t);
591
592
593 void kmeminit_nkmempages(void);
594 void kmeminit(void);
595 extern u_int nkmempages;
596
597 #endif
598
599 #endif