pgtable_32.h 3.1 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0 */
H
H. Peter Anvin 已提交
2 3
#ifndef _ASM_X86_PGTABLE_32_H
#define _ASM_X86_PGTABLE_32_H
L
Linus Torvalds 已提交
4

5
#include <asm/pgtable_32_types.h>
L
Linus Torvalds 已提交
6 7 8 9 10 11 12 13 14 15 16 17 18

/*
 * The Linux memory management assumes a three-level page table setup. On
 * the i386, we use that, but "fold" the mid level into the top-level page
 * table, so that we physically have the same two-level page table as the
 * i386 mmu expects.
 *
 * This file contains the functions and defines necessary to modify and use
 * the i386 page table tree.
 */
#ifndef __ASSEMBLY__
#include <asm/processor.h>
#include <linux/threads.h>
19
#include <asm/paravirt.h>
L
Linus Torvalds 已提交
20

J
Jiri Slaby 已提交
21
#include <linux/bitops.h>
L
Linus Torvalds 已提交
22 23 24
#include <linux/list.h>
#include <linux/spinlock.h>

25 26 27
struct mm_struct;
struct vm_area_struct;

L
Linus Torvalds 已提交
28
extern pgd_t swapper_pg_dir[1024];
29
extern pgd_t initial_page_table[1024];
30
extern pmd_t initial_pg_pmd[];
L
Linus Torvalds 已提交
31

T
Thomas Gleixner 已提交
32 33
static inline void pgtable_cache_init(void) { }
static inline void check_pgt_cache(void) { }
L
Linus Torvalds 已提交
34
void paging_init(void);
35
void sync_initial_page_table(void);
L
Linus Torvalds 已提交
36 37 38 39

/*
 * Define this if things work differently on an i386 and an i486:
 * it will (on an i486) warn about kernel memory accesses that are
40
 * done without a 'access_ok( ..)'
L
Linus Torvalds 已提交
41
 */
J
Jesper Juhl 已提交
42
#undef TEST_ACCESS_OK
L
Linus Torvalds 已提交
43 44 45 46 47 48 49 50

#ifdef CONFIG_X86_PAE
# include <asm/pgtable-3level.h>
#else
# include <asm/pgtable-2level.h>
#endif

#if defined(CONFIG_HIGHPTE)
51
#define pte_offset_map(dir, address)					\
P
Peter Zijlstra 已提交
52
	((pte_t *)kmap_atomic(pmd_page(*(dir))) +		\
53
	 pte_index((address)))
P
Peter Zijlstra 已提交
54
#define pte_unmap(pte) kunmap_atomic((pte))
L
Linus Torvalds 已提交
55
#else
56 57
#define pte_offset_map(dir, address)					\
	((pte_t *)page_address(pmd_page(*(dir))) + pte_index((address)))
L
Linus Torvalds 已提交
58 59 60
#define pte_unmap(pte) do { } while (0)
#endif

Z
Zachary Amsden 已提交
61
/* Clear a kernel PTE and flush it from the TLB */
62 63 64
#define kpte_clear_flush(ptep, vaddr)		\
do {						\
	pte_clear(&init_mm, (vaddr), (ptep));	\
65
	__flush_tlb_one_kernel((vaddr));		\
Z
Zachary Amsden 已提交
66 67
} while (0)

L
Linus Torvalds 已提交
68 69
#endif /* !__ASSEMBLY__ */

70 71 72 73
/*
 * kern_addr_valid() is (1) for FLATMEM and (0) for
 * SPARSEMEM and DISCONTIGMEM
 */
74
#ifdef CONFIG_FLATMEM
L
Linus Torvalds 已提交
75
#define kern_addr_valid(addr)	(1)
76 77 78
#else
#define kern_addr_valid(kaddr)	(0)
#endif
L
Linus Torvalds 已提交
79

80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
/*
 * This is how much memory in addition to the memory covered up to
 * and including _end we need mapped initially.
 * We need:
 *     (KERNEL_IMAGE_SIZE/4096) / 1024 pages (worst case, non PAE)
 *     (KERNEL_IMAGE_SIZE/4096) / 512 + 4 pages (worst case for PAE)
 *
 * Modulo rounding, each megabyte assigned here requires a kilobyte of
 * memory, which is currently unreclaimed.
 *
 * This should be a multiple of a page.
 *
 * KERNEL_IMAGE_SIZE should be greater than pa(_end)
 * and small than max_low_pfn, otherwise will waste some page table entries
 */
#if PTRS_PER_PMD > 1
#define PAGE_TABLE_SIZE(pages) (((pages) / PTRS_PER_PMD) + PTRS_PER_PGD)
#else
#define PAGE_TABLE_SIZE(pages) ((pages) / PTRS_PER_PGD)
#endif

/*
 * Number of possible pages in the lowmem region.
 *
 * We shift 2 by 31 instead of 1 by 32 to the left in order to avoid a
 * gas warning about overflowing shift count when gas has been compiled
 * with only a host target support using a 32-bit type for internal
 * representation.
 */
109
#define LOWMEM_PAGES ((((_ULL(2)<<31) - __PAGE_OFFSET) >> PAGE_SHIFT))
110

H
H. Peter Anvin 已提交
111
#endif /* _ASM_X86_PGTABLE_32_H */