Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / uvm / uvm_param.h @ 14

History | View | Annotate | Download (7.63 KB)

1
/*        $NetBSD: uvm_param.h,v 1.35 2015/09/26 20:28:38 christos Exp $        */
2

    
3
/*
4
 * Copyright (c) 1991, 1993
5
 *        The Regents of the University of California.  All rights reserved.
6
 *
7
 * This code is derived from software contributed to Berkeley by
8
 * The Mach Operating System project at Carnegie-Mellon University.
9
 *
10
 * Redistribution and use in source and binary forms, with or without
11
 * modification, are permitted provided that the following conditions
12
 * are met:
13
 * 1. Redistributions of source code must retain the above copyright
14
 *    notice, this list of conditions and the following disclaimer.
15
 * 2. Redistributions in binary form must reproduce the above copyright
16
 *    notice, this list of conditions and the following disclaimer in the
17
 *    documentation and/or other materials provided with the distribution.
18
 * 3. Neither the name of the University nor the names of its contributors
19
 *    may be used to endorse or promote products derived from this software
20
 *    without specific prior written permission.
21
 *
22
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32
 * SUCH DAMAGE.
33
 *
34
 *        @(#)vm_param.h        8.2 (Berkeley) 1/9/95
35
 *
36
 *
37
 * Copyright (c) 1987, 1990 Carnegie-Mellon University.
38
 * All rights reserved.
39
 *
40
 * Authors: Avadis Tevanian, Jr., Michael Wayne Young
41
 *
42
 * Permission to use, copy, modify and distribute this software and
43
 * its documentation is hereby granted, provided that both the copyright
44
 * notice and this permission notice appear in all copies of the
45
 * software, derivative works or modified versions, and any portions
46
 * thereof, and that both notices appear in supporting documentation.
47
 *
48
 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
49
 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
50
 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
51
 *
52
 * Carnegie Mellon requests users of this software to return to
53
 *
54
 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
55
 *  School of Computer Science
56
 *  Carnegie Mellon University
57
 *  Pittsburgh PA 15213-3890
58
 *
59
 * any improvements or extensions that they make and grant Carnegie the
60
 * rights to redistribute these changes.
61
 */
62

    
63
/*
64
 *        Machine independent virtual memory parameters.
65
 */
66

    
67
#ifndef        _VM_PARAM_
68
#define        _VM_PARAM_
69

    
70
#ifdef _KERNEL_OPT
71
#include "opt_modular.h"
72
#include "opt_uvm.h"
73
#endif
74
#ifdef _KERNEL
75
#include <sys/types.h>
76
#include <machine/vmparam.h>
77
#include <sys/resourcevar.h>
78
#endif
79

    
80
#if defined(_KERNEL)
81

    
82
#if defined(PAGE_SIZE)
83

    
84
/*
85
 * If PAGE_SIZE is defined at this stage, it must be a constant.
86
 */
87

    
88
#if PAGE_SIZE == 0
89
#error Invalid PAGE_SIZE definition
90
#endif
91

    
92
/*
93
 * If the platform does not need to support a variable PAGE_SIZE,
94
 * then provide default values for MIN_PAGE_SIZE and MAX_PAGE_SIZE.
95
 */
96

    
97
#if !defined(MIN_PAGE_SIZE)
98
#define        MIN_PAGE_SIZE        PAGE_SIZE
99
#endif /* ! MIN_PAGE_SIZE */
100

    
101
#if !defined(MAX_PAGE_SIZE)
102
#define        MAX_PAGE_SIZE        PAGE_SIZE
103
#endif /* ! MAX_PAGE_SIZE */
104

    
105
#else /* ! PAGE_SIZE */
106

    
107
/*
108
 * PAGE_SIZE is not a constant; MIN_PAGE_SIZE and MAX_PAGE_SIZE must
109
 * be defined.
110
 */
111

    
112
#if !defined(MIN_PAGE_SIZE)
113
#error MIN_PAGE_SIZE not defined
114
#endif
115

    
116
#if !defined(MAX_PAGE_SIZE)
117
#error MAX_PAGE_SIZE not defined
118
#endif
119

    
120
#endif /* PAGE_SIZE */
121

    
122
/*
123
 * MIN_PAGE_SIZE and MAX_PAGE_SIZE must be constants.
124
 */
125

    
126
#if MIN_PAGE_SIZE == 0
127
#error Invalid MIN_PAGE_SIZE definition
128
#endif
129

    
130
#if MAX_PAGE_SIZE == 0
131
#error Invalid MAX_PAGE_SIZE definition
132
#endif
133

    
134
/*
135
 * If MIN_PAGE_SIZE and MAX_PAGE_SIZE are not equal, then we must use
136
 * non-constant PAGE_SIZE, et al for LKMs.
137
 */
138
#if (MIN_PAGE_SIZE != MAX_PAGE_SIZE)
139
#define        __uvmexp_pagesize
140
#if defined(_LKM) || defined(_MODULE)
141
#undef PAGE_SIZE
142
#undef PAGE_MASK
143
#undef PAGE_SHIFT
144
#endif
145
#endif
146

    
147
/*
148
 * Now provide PAGE_SIZE, PAGE_MASK, and PAGE_SHIFT if we do not
149
 * have ones that are compile-time constants.
150
 */
151
#if !defined(PAGE_SIZE)
152
extern const int *const uvmexp_pagesize;
153
extern const int *const uvmexp_pagemask;
154
extern const int *const uvmexp_pageshift;
155
#define        PAGE_SIZE        (*uvmexp_pagesize)        /* size of page */
156
#define        PAGE_MASK        (*uvmexp_pagemask)        /* size of page - 1 */
157
#define        PAGE_SHIFT        (*uvmexp_pageshift)        /* bits to shift for pages */
158
#endif /* PAGE_SIZE */
159

    
160
#endif /* _KERNEL */
161

    
162
/*
163
 * CTL_VM identifiers
164
 */
165
#define        VM_METER        1                /* struct vmmeter */
166
#define        VM_LOADAVG        2                /* struct loadavg */
167
#define        VM_UVMEXP        3                /* struct uvmexp */
168
#define        VM_NKMEMPAGES        4                /* kmem_map pages */
169
#define        VM_UVMEXP2        5                /* struct uvmexp_sysctl */
170
#define        VM_ANONMIN        6
171
#define        VM_EXECMIN        7
172
#define        VM_FILEMIN        8
173
#define        VM_MAXSLP        9
174
#define        VM_USPACE        10
175
#define        VM_ANONMAX        11
176
#define        VM_EXECMAX        12
177
#define        VM_FILEMAX        13
178
#define        VM_MINADDRESS        14
179
#define        VM_MAXADDRESS        15
180
#define        VM_PROC                16                /* process information */
181

    
182
#define        VM_MAXID        17                /* number of valid vm ids */
183

    
184
#define VM_PROC_MAP        1                /* struct kinfo_vmentry */
185

    
186
#define        CTL_VM_NAMES { \
187
        { 0, 0 }, \
188
        { "vmmeter", CTLTYPE_STRUCT }, \
189
        { "loadavg", CTLTYPE_STRUCT }, \
190
        { "uvmexp", CTLTYPE_STRUCT }, \
191
        { "nkmempages", CTLTYPE_INT }, \
192
        { "uvmexp2", CTLTYPE_STRUCT }, \
193
        { "anonmin", CTLTYPE_INT }, \
194
        { "execmin", CTLTYPE_INT }, \
195
        { "filemin", CTLTYPE_INT }, \
196
        { "maxslp", CTLTYPE_INT }, \
197
        { "uspace", CTLTYPE_INT }, \
198
        { "anonmax", CTLTYPE_INT }, \
199
        { "execmax", CTLTYPE_INT }, \
200
        { "filemax", CTLTYPE_INT }, \
201
        { "minaddress", CTLTYPE_LONG }, \
202
        { "maxaddress", CTLTYPE_LONG }, \
203
        { "proc", CTLTYPE_STRUCT }, \
204
}
205

    
206
#ifndef ASSEMBLER
207
/*
208
 *        Convert addresses to pages and vice versa.
209
 *        No rounding is used.
210
 */
211
#ifdef _KERNEL
212
#define        atop(x)                (((paddr_t)(x)) >> PAGE_SHIFT)
213
#define        ptoa(x)                (((paddr_t)(x)) << PAGE_SHIFT)
214

    
215
/*
216
 * Round off or truncate to the nearest page.  These will work
217
 * for either addresses or counts (i.e., 1 byte rounds to 1 page).
218
 */
219
#define        round_page(x)        (((x) + PAGE_MASK) & ~PAGE_MASK)
220
#define        trunc_page(x)        ((x) & ~PAGE_MASK)
221

    
222
#ifndef VM_DEFAULT_ADDRESS_BOTTOMUP
223
#define VM_DEFAULT_ADDRESS_BOTTOMUP(da, sz) \
224
    round_page((vaddr_t)(da) + (vsize_t)maxdmap)
225
#endif
226

    
227
#ifndef VM_DEFAULT_ADDRESS_TOPDOWN
228
#define VM_DEFAULT_ADDRESS_TOPDOWN(da, sz) \
229
    trunc_page(VM_MAXUSER_ADDRESS - MAXSSIZ - (sz))
230
#endif
231

    
232
extern int                ubc_nwins;        /* number of UBC mapping windows */
233
extern int                ubc_winshift;        /* shift for a UBC mapping window */
234
extern u_int                uvm_emap_size;        /* size of emap */
235

    
236
#else
237
/* out-of-kernel versions of round_page and trunc_page */
238
#if !defined(__minix)
239
#define        round_page(x) \
240
        ((((vaddr_t)(x) + (vm_page_size - 1)) / vm_page_size) * \
241
            vm_page_size)
242
#define        trunc_page(x) \
243
        ((((vaddr_t)(x)) / vm_page_size) * vm_page_size)
244
#else
245
/* LSC: Minix always uses the same definition of those. */
246
#define        round_page(x)        (((x) + PAGE_MASK) & ~PAGE_MASK)
247
#define        trunc_page(x)        ((x) & ~PAGE_MASK)
248
#endif /* !defined(__minix) */
249

    
250
#endif /* _KERNEL */
251

    
252
/*
253
 * typedefs, necessary for standard UVM headers.
254
 */
255

    
256
typedef unsigned int uvm_flag_t;
257

    
258
typedef int vm_inherit_t;        /* XXX: inheritance codes */
259
typedef off_t voff_t;                /* XXX: offset within a uvm_object */
260
typedef voff_t pgoff_t;                /* XXX: number of pages within a uvm object */
261

    
262
#endif /* ASSEMBLER */
263
#endif /* _VM_PARAM_ */