pgtable_32.h 3 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0 */
2 3
#ifndef _ASM_X86_PGTABLE_32_H
#define _ASM_X86_PGTABLE_32_H
Linus Torvalds's avatar
Linus Torvalds committed
4

5
#include <asm/pgtable_32_types.h>
Linus Torvalds's avatar
Linus Torvalds committed
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>
Linus Torvalds's avatar
Linus Torvalds committed
20

Jiri Slaby's avatar
Jiri Slaby committed
21
#include <linux/bitops.h>
Linus Torvalds's avatar
Linus Torvalds committed
22 23 24
#include <linux/list.h>
#include <linux/spinlock.h>

25 26 27
struct mm_struct;
struct vm_area_struct;

Linus Torvalds's avatar
Linus Torvalds committed
28
extern pgd_t swapper_pg_dir[1024];
29
extern pgd_t initial_page_table[1024];
30
extern pmd_t initial_pg_pmd[];
Linus Torvalds's avatar
Linus Torvalds committed
31 32

void paging_init(void);
33
void sync_initial_page_table(void);
Linus Torvalds's avatar
Linus Torvalds committed
34 35 36 37

/*
 * Define this if things work differently on an i386 and an i486:
 * it will (on an i486) warn about kernel memory accesses that are
38
 * done without a 'access_ok( ..)'
Linus Torvalds's avatar
Linus Torvalds committed
39
 */
40
#undef TEST_ACCESS_OK
Linus Torvalds's avatar
Linus Torvalds committed
41 42 43 44 45 46 47 48

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

#if defined(CONFIG_HIGHPTE)
49
#define pte_offset_map(dir, address)					\
50
	((pte_t *)kmap_atomic(pmd_page(*(dir))) +		\
51
	 pte_index((address)))
52
#define pte_unmap(pte) kunmap_atomic((pte))
Linus Torvalds's avatar
Linus Torvalds committed
53
#else
54 55
#define pte_offset_map(dir, address)					\
	((pte_t *)page_address(pmd_page(*(dir))) + pte_index((address)))
Linus Torvalds's avatar
Linus Torvalds committed
56 57 58
#define pte_unmap(pte) do { } while (0)
#endif

59
/* Clear a kernel PTE and flush it from the TLB */
60 61 62
#define kpte_clear_flush(ptep, vaddr)		\
do {						\
	pte_clear(&init_mm, (vaddr), (ptep));	\
63
	flush_tlb_one_kernel((vaddr));		\
64 65
} while (0)

Linus Torvalds's avatar
Linus Torvalds committed
66 67
#endif /* !__ASSEMBLY__ */

68 69 70 71
/*
 * kern_addr_valid() is (1) for FLATMEM and (0) for
 * SPARSEMEM and DISCONTIGMEM
 */
72
#ifdef CONFIG_FLATMEM
Linus Torvalds's avatar
Linus Torvalds committed
73
#define kern_addr_valid(addr)	(1)
74 75 76
#else
#define kern_addr_valid(kaddr)	(0)
#endif
Linus Torvalds's avatar
Linus Torvalds committed
77

78 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
/*
 * 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.
 */
107
#define LOWMEM_PAGES ((((_ULL(2)<<31) - __PAGE_OFFSET) >> PAGE_SHIFT))
108

109
#endif /* _ASM_X86_PGTABLE_32_H */