The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/riscv/include/vmparam.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 1990 The Regents of the University of California.
    3  * All rights reserved.
    4  * Copyright (c) 1994 John S. Dyson
    5  * All rights reserved.
    6  *
    7  * This code is derived from software contributed to Berkeley by
    8  * William Jolitz.
    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  *      from: @(#)vmparam.h     5.9 (Berkeley) 5/12/91
   35  *      from: FreeBSD: src/sys/i386/include/vmparam.h,v 1.33 2000/03/30
   36  * $FreeBSD$
   37  */
   38 
   39 #ifndef _MACHINE_VMPARAM_H_
   40 #define _MACHINE_VMPARAM_H_
   41 
   42 /*
   43  * Virtual memory related constants, all in bytes
   44  */
   45 #ifndef MAXTSIZ
   46 #define MAXTSIZ         (1*1024*1024*1024)      /* max text size */
   47 #endif
   48 #ifndef DFLDSIZ
   49 #define DFLDSIZ         (128*1024*1024)         /* initial data size limit */
   50 #endif
   51 #ifndef MAXDSIZ
   52 #define MAXDSIZ         (1*1024*1024*1024)      /* max data size */
   53 #endif
   54 #ifndef DFLSSIZ
   55 #define DFLSSIZ         (128*1024*1024)         /* initial stack size limit */
   56 #endif
   57 #ifndef MAXSSIZ
   58 #define MAXSSIZ         (1*1024*1024*1024)      /* max stack size */
   59 #endif
   60 #ifndef SGROWSIZ
   61 #define SGROWSIZ        (128*1024)              /* amount to grow stack */
   62 #endif
   63 
   64 /*
   65  * The physical address space is sparsely populated.
   66  */
   67 #define VM_PHYSSEG_SPARSE
   68 
   69 /*
   70  * The number of PHYSSEG entries.
   71  */
   72 #define VM_PHYSSEG_MAX          64
   73 
   74 /*
   75  * Create two free page pools: VM_FREEPOOL_DEFAULT is the default pool
   76  * from which physical pages are allocated and VM_FREEPOOL_DIRECT is
   77  * the pool from which physical pages for small UMA objects are
   78  * allocated.
   79  */
   80 #define VM_NFREEPOOL            2
   81 #define VM_FREEPOOL_DEFAULT     0
   82 #define VM_FREEPOOL_DIRECT      1
   83 
   84 /*
   85  * Create one free page list: VM_FREELIST_DEFAULT is for all physical
   86  * pages.
   87  */
   88 #define VM_NFREELIST            1
   89 #define VM_FREELIST_DEFAULT     0
   90 
   91 /*
   92  * An allocation size of 16MB is supported in order to optimize the
   93  * use of the direct map by UMA.  Specifically, a cache line contains
   94  * at most four TTEs, collectively mapping 16MB of physical memory.
   95  * By reducing the number of distinct 16MB "pages" that are used by UMA,
   96  * the physical memory allocator reduces the likelihood of both 4MB
   97  * page TLB misses and cache misses caused by 4MB page TLB misses.
   98  */
   99 #define VM_NFREEORDER           12
  100 
  101 /*
  102  * Enable superpage reservations: 1 level.
  103  */
  104 #ifndef VM_NRESERVLEVEL
  105 #define VM_NRESERVLEVEL         1
  106 #endif
  107 
  108 /*
  109  * Level 0 reservations consist of 512 pages.
  110  */
  111 #ifndef VM_LEVEL_0_ORDER
  112 #define VM_LEVEL_0_ORDER        9
  113 #endif
  114 
  115 /**
  116  * Address space layout.
  117  *
  118  * RISC-V implements multiple paging modes with different virtual address space
  119  * sizes: SV32, SV39, SV48 and SV57.  Only SV39 and SV48 are supported by
  120  * FreeBSD.  SV39 provides a 512GB virtual address space and uses three-level
  121  * page tables, while SV48 provides a 256TB virtual address space and uses
  122  * four-level page tables.  64-bit RISC-V implementations are required to provide
  123  * at least SV39 mode; locore initially enables SV39 mode while bootstrapping
  124  * page tables, and pmap_bootstrap() optionally switches to SV48 mode.
  125  *
  126  * The address space is split into two regions at each end of the 64-bit address
  127  * space; the lower region is for use by user mode software, while the upper
  128  * region is used for various kernel maps.  The kernel map layout in SV48 mode
  129  * is currently identical to that used in SV39 mode.
  130  *
  131  * SV39 memory map:
  132  * 0x0000000000000000 - 0x0000003fffffffff    256GB user map
  133  * 0x0000004000000000 - 0xffffffbfffffffff    unmappable
  134  * 0xffffffc000000000 - 0xffffffc7ffffffff    32GB kernel map
  135  * 0xffffffc800000000 - 0xffffffcfffffffff    32GB unused
  136  * 0xffffffd000000000 - 0xffffffefffffffff    128GB direct map
  137  * 0xfffffff000000000 - 0xffffffffffffffff    64GB unused
  138  *
  139  * SV48 memory map:
  140  * 0x0000000000000000 - 0x00007fffffffffff    128TB user map
  141  * 0x0000800000000000 - 0xffff7fffffffffff    unmappable
  142  * 0xffff800000000000 - 0xffffffc7ffffffff    127.75TB hole
  143  * 0xffffffc000000000 - 0xffffffc7ffffffff    32GB kernel map
  144  * 0xffffffc800000000 - 0xffffffcfffffffff    32GB unused
  145  * 0xffffffd000000000 - 0xffffffefffffffff    128GB direct map
  146  * 0xfffffff000000000 - 0xffffffffffffffff    64GB unused
  147  *
  148  * The kernel is loaded at the beginning of the kernel map.
  149  *
  150  * We define some interesting address constants:
  151  *
  152  * VM_MIN_ADDRESS and VM_MAX_ADDRESS define the start and end of the entire
  153  * 64 bit address space, mostly just for convenience.
  154  *
  155  * VM_MIN_KERNEL_ADDRESS and VM_MAX_KERNEL_ADDRESS define the start and end of
  156  * mappable kernel virtual address space.
  157  *
  158  * VM_MIN_USER_ADDRESS and VM_MAX_USER_ADDRESS define the start and end of the
  159  * user address space.
  160  */
  161 #define VM_MIN_ADDRESS          (0x0000000000000000UL)
  162 #define VM_MAX_ADDRESS          (0xffffffffffffffffUL)
  163 
  164 #define VM_MIN_KERNEL_ADDRESS   (0xffffffc000000000UL)
  165 #define VM_MAX_KERNEL_ADDRESS   (0xffffffc800000000UL)
  166 
  167 #define DMAP_MIN_ADDRESS        (0xffffffd000000000UL)
  168 #define DMAP_MAX_ADDRESS        (0xfffffff000000000UL)
  169 
  170 #define DMAP_MIN_PHYSADDR       (dmap_phys_base)
  171 #define DMAP_MAX_PHYSADDR       (dmap_phys_max)
  172 
  173 /* True if pa is in the dmap range */
  174 #define PHYS_IN_DMAP(pa)        ((pa) >= DMAP_MIN_PHYSADDR && \
  175     (pa) < DMAP_MAX_PHYSADDR)
  176 /* True if va is in the dmap range */
  177 #define VIRT_IN_DMAP(va)        ((va) >= DMAP_MIN_ADDRESS && \
  178     (va) < (dmap_max_addr))
  179 
  180 #define PMAP_HAS_DMAP   1
  181 #define PHYS_TO_DMAP(pa)                                                \
  182 ({                                                                      \
  183         KASSERT(PHYS_IN_DMAP(pa),                                       \
  184             ("%s: PA out of range, PA: 0x%lx", __func__,                \
  185             (vm_paddr_t)(pa)));                                         \
  186         ((pa) - dmap_phys_base) + DMAP_MIN_ADDRESS;                     \
  187 })
  188 
  189 #define DMAP_TO_PHYS(va)                                                \
  190 ({                                                                      \
  191         KASSERT(VIRT_IN_DMAP(va),                                       \
  192             ("%s: VA out of range, VA: 0x%lx", __func__,                \
  193             (vm_offset_t)(va)));                                        \
  194         ((va) - DMAP_MIN_ADDRESS) + dmap_phys_base;                     \
  195 })
  196 
  197 #define VM_MIN_USER_ADDRESS             (0x0000000000000000UL)
  198 #define VM_MAX_USER_ADDRESS_SV39        (0x0000004000000000UL)
  199 #define VM_MAX_USER_ADDRESS_SV48        (0x0000800000000000UL)
  200 #define VM_MAX_USER_ADDRESS             VM_MAX_USER_ADDRESS_SV48
  201 
  202 #define VM_MINUSER_ADDRESS      (VM_MIN_USER_ADDRESS)
  203 #define VM_MAXUSER_ADDRESS      (VM_MAX_USER_ADDRESS)
  204 
  205 #define KERNBASE                (VM_MIN_KERNEL_ADDRESS)
  206 #define SHAREDPAGE_SV39         (VM_MAX_USER_ADDRESS_SV39 - PAGE_SIZE)
  207 #define SHAREDPAGE_SV48         (VM_MAX_USER_ADDRESS_SV48 - PAGE_SIZE)
  208 #define SHAREDPAGE              SHAREDPAGE_SV48
  209 #define USRSTACK_SV39           SHAREDPAGE_SV39
  210 #define USRSTACK_SV48           SHAREDPAGE_SV48
  211 #define USRSTACK                USRSTACK_SV48
  212 #define PS_STRINGS_SV39         (USRSTACK_SV39 - sizeof(struct ps_strings))
  213 #define PS_STRINGS_SV48         (USRSTACK_SV48 - sizeof(struct ps_strings))
  214 
  215 #define VM_EARLY_DTB_ADDRESS    (VM_MAX_KERNEL_ADDRESS - (2 * L2_SIZE))
  216 
  217 /*
  218  * How many physical pages per kmem arena virtual page.
  219  */
  220 #ifndef VM_KMEM_SIZE_SCALE
  221 #define VM_KMEM_SIZE_SCALE      (1)
  222 #endif
  223 
  224 /*
  225  * Optional ceiling (in bytes) on the size of the kmem arena: 60% of the
  226  * kernel map.
  227  */
  228 #ifndef VM_KMEM_SIZE_MAX
  229 #define VM_KMEM_SIZE_MAX        ((VM_MAX_KERNEL_ADDRESS - \
  230     VM_MIN_KERNEL_ADDRESS + 1) * 3 / 5)
  231 #endif
  232 
  233 /*
  234  * Initial pagein size of beginning of executable file.
  235  */
  236 #ifndef VM_INITIAL_PAGEIN
  237 #define VM_INITIAL_PAGEIN       16
  238 #endif
  239 
  240 #define UMA_MD_SMALL_ALLOC
  241 
  242 #ifndef LOCORE
  243 extern vm_paddr_t dmap_phys_base;
  244 extern vm_paddr_t dmap_phys_max;
  245 extern vm_offset_t dmap_max_addr;
  246 extern vm_offset_t vm_max_kernel_address;
  247 extern vm_offset_t init_pt_va;
  248 #endif
  249 
  250 #define ZERO_REGION_SIZE        (64 * 1024)     /* 64KB */
  251 
  252 #define DEVMAP_MAX_VADDR        VM_MAX_KERNEL_ADDRESS
  253 #define PMAP_MAPDEV_EARLY_SIZE  (L2_SIZE * 2)
  254 
  255 /*
  256  * No non-transparent large page support in the pmap.
  257  */
  258 #define PMAP_HAS_LARGEPAGES     0
  259 
  260 /*
  261  * Need a page dump array for minidump.
  262  */
  263 #define MINIDUMP_PAGE_TRACKING  1
  264 
  265 #endif /* !_MACHINE_VMPARAM_H_ */

Cache object: 654bdbadc45419e0a377b5c9f125a8c2


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.