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/i386/include/pmap_pae.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  * SPDX-License-Identifier: BSD-3-Clause
    3  *
    4  * Copyright (c) 1991 Regents of the University of California.
    5  * All rights reserved.
    6  *
    7  * Copyright (c) 2018 The FreeBSD Foundation
    8  * All rights reserved.
    9  *
   10  * This code is derived from software contributed to Berkeley by
   11  * the Systems Programming Group of the University of Utah Computer
   12  * Science Department and William Jolitz of UUNET Technologies Inc.
   13  *
   14  * Portions of this software were developed by
   15  * Konstantin Belousov <kib@FreeBSD.org> under sponsorship from
   16  * the FreeBSD Foundation.
   17  *
   18  * Redistribution and use in source and binary forms, with or without
   19  * modification, are permitted provided that the following conditions
   20  * are met:
   21  * 1. Redistributions of source code must retain the above copyright
   22  *    notice, this list of conditions and the following disclaimer.
   23  * 2. Redistributions in binary form must reproduce the above copyright
   24  *    notice, this list of conditions and the following disclaimer in the
   25  *    documentation and/or other materials provided with the distribution.
   26  * 3. Neither the name of the University nor the names of its contributors
   27  *    may be used to endorse or promote products derived from this software
   28  *    without specific prior written permission.
   29  *
   30  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   31  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   32  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   33  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   34  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   35  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   36  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   37  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   38  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   39  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   40  * SUCH DAMAGE.
   41  *
   42  * Derived from hp300 version by Mike Hibler, this version by William
   43  * Jolitz uses a recursive map [a pde points to the page directory] to
   44  * map the page tables using the pagetables themselves. This is done to
   45  * reduce the impact on kernel virtual memory for lots of sparse address
   46  * space, and to reduce the cost of memory to each process.
   47  *
   48  *      from: hp300: @(#)pmap.h 7.2 (Berkeley) 12/16/90
   49  *      from: @(#)pmap.h        7.4 (Berkeley) 5/12/91
   50  * $FreeBSD$
   51  */
   52 
   53 #ifndef _MACHINE_PMAP_PAE_H
   54 #define _MACHINE_PMAP_PAE_H
   55 
   56 #define NTRPPTD         2               /* Number of PTDs for trampoline
   57                                            mapping */
   58 #define LOWPTDI         2               /* low memory map pde */
   59 #define KERNPTDI        4               /* start of kernel text pde */
   60 
   61 #define NPGPTD          4               /* Num of pages for page directory */
   62 #define NPGPTD_SHIFT    9
   63 #undef  PDRSHIFT
   64 #define PDRSHIFT        PDRSHIFT_PAE
   65 #undef  NBPDR
   66 #define NBPDR           (1 << PDRSHIFT_PAE)     /* bytes/page dir */
   67 
   68 #define PG_FRAME        PG_FRAME_PAE
   69 #define PG_PS_FRAME     PG_PS_FRAME_PAE
   70 
   71 /*
   72  * Size of Kernel address space.  This is the number of page table pages
   73  * (4MB each) to use for the kernel.  256 pages == 1 Gigabyte.
   74  * This **MUST** be a multiple of 4 (eg: 252, 256, 260, etc).
   75  * For PAE, the page table page unit size is 2MB.  This means that 512 pages
   76  * is 1 Gigabyte.  Double everything.  It must be a multiple of 8 for PAE.
   77  */
   78 #define KVA_PAGES       (512*4)
   79 
   80 /*
   81  * The initial number of kernel page table pages that are constructed
   82  * by pmap_cold() must be sufficient to map vm_page_array.  That number can
   83  * be calculated as follows:
   84  *     max_phys / PAGE_SIZE * sizeof(struct vm_page) / NBPDR
   85  * PAE:      max_phys 16G, sizeof(vm_page) 76, NBPDR 2M, 152 page table pages.
   86  * PAE_TABLES: max_phys 4G,  sizeof(vm_page) 68, NBPDR 2M, 36 page table pages.
   87  * Non-PAE:  max_phys 4G,  sizeof(vm_page) 68, NBPDR 4M, 18 page table pages.
   88  */
   89 #ifndef NKPT
   90 #define NKPT            240
   91 #endif
   92 
   93 typedef uint64_t pdpt_entry_t;
   94 typedef uint64_t pd_entry_t;
   95 typedef uint64_t pt_entry_t;
   96 
   97 #define PTESHIFT        (3)
   98 #define PDESHIFT        (3)
   99 
  100 #define pde_cmpset(pdep, old, new)      atomic_cmpset_64_i586(pdep, old, new)
  101 #define pte_load_store(ptep, pte)       atomic_swap_64_i586(ptep, pte)
  102 #define pte_load_clear(ptep)            atomic_swap_64_i586(ptep, 0)
  103 #define pte_store(ptep, pte)            atomic_store_rel_64_i586(ptep, pte)
  104 #define pte_store_zero(ptep, pte)               \
  105 do {                                            \
  106         uint32_t *p;                            \
  107                                                 \
  108         MPASS((*ptep & PG_V) == 0);             \
  109         p = (void *)ptep;                       \
  110         *(p + 1) = (uint32_t)(pte >> 32);       \
  111         __compiler_membar();                    \
  112         *p = (uint32_t)pte;                     \
  113 } while (0)
  114 #define pte_load(ptep)                  atomic_load_acq_64_i586(ptep)
  115 
  116 extern pdpt_entry_t *IdlePDPT;
  117 extern pt_entry_t pg_nx;
  118 extern pd_entry_t *IdlePTD_pae; /* physical address of "Idle" state directory */
  119 
  120 /*
  121  * KPTmap is a linear mapping of the kernel page table.  It differs from the
  122  * recursive mapping in two ways: (1) it only provides access to kernel page
  123  * table pages, and not user page table pages, and (2) it provides access to
  124  * a kernel page table page after the corresponding virtual addresses have
  125  * been promoted to a 2/4MB page mapping.
  126  *
  127  * KPTmap is first initialized by pmap_cold() to support just NPKT page table
  128  * pages.  Later, it is reinitialized by pmap_bootstrap() to allow for
  129  * expansion of the kernel page table.
  130  */
  131 extern pt_entry_t *KPTmap_pae;
  132 
  133 #endif

Cache object: 8a1d3916fa8e80b0b5eb2e5c30458e94


[ 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.