linux/arch/x86/include/asm/pgtable.h
<<
>>
Prefs
   1#ifndef _ASM_X86_PGTABLE_H
   2#define _ASM_X86_PGTABLE_H
   3
   4#include <asm/page.h>
   5#include <asm/e820.h>
   6
   7#include <asm/pgtable_types.h>
   8
   9/*
  10 * Macro to mark a page protection value as UC-
  11 */
  12#define pgprot_noncached(prot)                                          \
  13        ((boot_cpu_data.x86 > 3)                                        \
  14         ? (__pgprot(pgprot_val(prot) |                                 \
  15                     cachemode2protval(_PAGE_CACHE_MODE_UC_MINUS)))     \
  16         : (prot))
  17
  18#ifndef __ASSEMBLY__
  19#include <asm/x86_init.h>
  20
  21void ptdump_walk_pgd_level(struct seq_file *m, pgd_t *pgd);
  22void ptdump_walk_pgd_level_checkwx(void);
  23
  24#ifdef CONFIG_DEBUG_WX
  25#define debug_checkwx() ptdump_walk_pgd_level_checkwx()
  26#else
  27#define debug_checkwx() do { } while (0)
  28#endif
  29
  30/*
  31 * ZERO_PAGE is a global shared page that is always zero: used
  32 * for zero-mapped memory areas etc..
  33 */
  34extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]
  35        __visible;
  36#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
  37
  38extern spinlock_t pgd_lock;
  39extern struct list_head pgd_list;
  40
  41extern struct mm_struct *pgd_page_get_mm(struct page *page);
  42
  43#ifdef CONFIG_PARAVIRT
  44#include <asm/paravirt.h>
  45#else  /* !CONFIG_PARAVIRT */
  46#define set_pte(ptep, pte)              native_set_pte(ptep, pte)
  47#define set_pte_at(mm, addr, ptep, pte) native_set_pte_at(mm, addr, ptep, pte)
  48#define set_pmd_at(mm, addr, pmdp, pmd) native_set_pmd_at(mm, addr, pmdp, pmd)
  49
  50#define set_pte_atomic(ptep, pte)                                       \
  51        native_set_pte_atomic(ptep, pte)
  52
  53#define set_pmd(pmdp, pmd)              native_set_pmd(pmdp, pmd)
  54
  55#ifndef __PAGETABLE_PUD_FOLDED
  56#define set_pgd(pgdp, pgd)              native_set_pgd(pgdp, pgd)
  57#define pgd_clear(pgd)                  native_pgd_clear(pgd)
  58#endif
  59
  60#ifndef set_pud
  61# define set_pud(pudp, pud)             native_set_pud(pudp, pud)
  62#endif
  63
  64#ifndef __PAGETABLE_PMD_FOLDED
  65#define pud_clear(pud)                  native_pud_clear(pud)
  66#endif
  67
  68#define pte_clear(mm, addr, ptep)       native_pte_clear(mm, addr, ptep)
  69#define pmd_clear(pmd)                  native_pmd_clear(pmd)
  70
  71#define pte_update(mm, addr, ptep)              do { } while (0)
  72
  73#define pgd_val(x)      native_pgd_val(x)
  74#define __pgd(x)        native_make_pgd(x)
  75
  76#ifndef __PAGETABLE_PUD_FOLDED
  77#define pud_val(x)      native_pud_val(x)
  78#define __pud(x)        native_make_pud(x)
  79#endif
  80
  81#ifndef __PAGETABLE_PMD_FOLDED
  82#define pmd_val(x)      native_pmd_val(x)
  83#define __pmd(x)        native_make_pmd(x)
  84#endif
  85
  86#define pte_val(x)      native_pte_val(x)
  87#define __pte(x)        native_make_pte(x)
  88
  89#define arch_end_context_switch(prev)   do {} while(0)
  90
  91#endif  /* CONFIG_PARAVIRT */
  92
  93/*
  94 * The following only work if pte_present() is true.
  95 * Undefined behaviour if not..
  96 */
  97static inline int pte_dirty(pte_t pte)
  98{
  99        return pte_flags(pte) & _PAGE_DIRTY;
 100}
 101
 102
 103static inline u32 read_pkru(void)
 104{
 105        if (boot_cpu_has(X86_FEATURE_OSPKE))
 106                return __read_pkru();
 107        return 0;
 108}
 109
 110static inline void write_pkru(u32 pkru)
 111{
 112        if (boot_cpu_has(X86_FEATURE_OSPKE))
 113                __write_pkru(pkru);
 114}
 115
 116static inline int pte_young(pte_t pte)
 117{
 118        return pte_flags(pte) & _PAGE_ACCESSED;
 119}
 120
 121static inline int pmd_dirty(pmd_t pmd)
 122{
 123        return pmd_flags(pmd) & _PAGE_DIRTY;
 124}
 125
 126static inline int pmd_young(pmd_t pmd)
 127{
 128        return pmd_flags(pmd) & _PAGE_ACCESSED;
 129}
 130
 131static inline int pte_write(pte_t pte)
 132{
 133        return pte_flags(pte) & _PAGE_RW;
 134}
 135
 136static inline int pte_huge(pte_t pte)
 137{
 138        return pte_flags(pte) & _PAGE_PSE;
 139}
 140
 141static inline int pte_global(pte_t pte)
 142{
 143        return pte_flags(pte) & _PAGE_GLOBAL;
 144}
 145
 146static inline int pte_exec(pte_t pte)
 147{
 148        return !(pte_flags(pte) & _PAGE_NX);
 149}
 150
 151static inline int pte_special(pte_t pte)
 152{
 153        return pte_flags(pte) & _PAGE_SPECIAL;
 154}
 155
 156static inline unsigned long pte_pfn(pte_t pte)
 157{
 158        return (pte_val(pte) & PTE_PFN_MASK) >> PAGE_SHIFT;
 159}
 160
 161static inline unsigned long pmd_pfn(pmd_t pmd)
 162{
 163        return (pmd_val(pmd) & pmd_pfn_mask(pmd)) >> PAGE_SHIFT;
 164}
 165
 166static inline unsigned long pud_pfn(pud_t pud)
 167{
 168        return (pud_val(pud) & pud_pfn_mask(pud)) >> PAGE_SHIFT;
 169}
 170
 171#define pte_page(pte)   pfn_to_page(pte_pfn(pte))
 172
 173static inline int pmd_large(pmd_t pte)
 174{
 175        return pmd_flags(pte) & _PAGE_PSE;
 176}
 177
 178#ifdef CONFIG_TRANSPARENT_HUGEPAGE
 179static inline int pmd_trans_huge(pmd_t pmd)
 180{
 181        return (pmd_val(pmd) & (_PAGE_PSE|_PAGE_DEVMAP)) == _PAGE_PSE;
 182}
 183
 184static inline int has_transparent_hugepage(void)
 185{
 186        return cpu_has_pse;
 187}
 188
 189#ifdef __HAVE_ARCH_PTE_DEVMAP
 190static inline int pmd_devmap(pmd_t pmd)
 191{
 192        return !!(pmd_val(pmd) & _PAGE_DEVMAP);
 193}
 194#endif
 195#endif /* CONFIG_TRANSPARENT_HUGEPAGE */
 196
 197static inline pte_t pte_set_flags(pte_t pte, pteval_t set)
 198{
 199        pteval_t v = native_pte_val(pte);
 200
 201        return native_make_pte(v | set);
 202}
 203
 204static inline pte_t pte_clear_flags(pte_t pte, pteval_t clear)
 205{
 206        pteval_t v = native_pte_val(pte);
 207
 208        return native_make_pte(v & ~clear);
 209}
 210
 211static inline pte_t pte_mkclean(pte_t pte)
 212{
 213        return pte_clear_flags(pte, _PAGE_DIRTY);
 214}
 215
 216static inline pte_t pte_mkold(pte_t pte)
 217{
 218        return pte_clear_flags(pte, _PAGE_ACCESSED);
 219}
 220
 221static inline pte_t pte_wrprotect(pte_t pte)
 222{
 223        return pte_clear_flags(pte, _PAGE_RW);
 224}
 225
 226static inline pte_t pte_mkexec(pte_t pte)
 227{
 228        return pte_clear_flags(pte, _PAGE_NX);
 229}
 230
 231static inline pte_t pte_mkdirty(pte_t pte)
 232{
 233        return pte_set_flags(pte, _PAGE_DIRTY | _PAGE_SOFT_DIRTY);
 234}
 235
 236static inline pte_t pte_mkyoung(pte_t pte)
 237{
 238        return pte_set_flags(pte, _PAGE_ACCESSED);
 239}
 240
 241static inline pte_t pte_mkwrite(pte_t pte)
 242{
 243        return pte_set_flags(pte, _PAGE_RW);
 244}
 245
 246static inline pte_t pte_mkhuge(pte_t pte)
 247{
 248        return pte_set_flags(pte, _PAGE_PSE);
 249}
 250
 251static inline pte_t pte_clrhuge(pte_t pte)
 252{
 253        return pte_clear_flags(pte, _PAGE_PSE);
 254}
 255
 256static inline pte_t pte_mkglobal(pte_t pte)
 257{
 258        return pte_set_flags(pte, _PAGE_GLOBAL);
 259}
 260
 261static inline pte_t pte_clrglobal(pte_t pte)
 262{
 263        return pte_clear_flags(pte, _PAGE_GLOBAL);
 264}
 265
 266static inline pte_t pte_mkspecial(pte_t pte)
 267{
 268        return pte_set_flags(pte, _PAGE_SPECIAL);
 269}
 270
 271static inline pte_t pte_mkdevmap(pte_t pte)
 272{
 273        return pte_set_flags(pte, _PAGE_SPECIAL|_PAGE_DEVMAP);
 274}
 275
 276static inline pmd_t pmd_set_flags(pmd_t pmd, pmdval_t set)
 277{
 278        pmdval_t v = native_pmd_val(pmd);
 279
 280        return __pmd(v | set);
 281}
 282
 283static inline pmd_t pmd_clear_flags(pmd_t pmd, pmdval_t clear)
 284{
 285        pmdval_t v = native_pmd_val(pmd);
 286
 287        return __pmd(v & ~clear);
 288}
 289
 290static inline pmd_t pmd_mkold(pmd_t pmd)
 291{
 292        return pmd_clear_flags(pmd, _PAGE_ACCESSED);
 293}
 294
 295static inline pmd_t pmd_mkclean(pmd_t pmd)
 296{
 297        return pmd_clear_flags(pmd, _PAGE_DIRTY);
 298}
 299
 300static inline pmd_t pmd_wrprotect(pmd_t pmd)
 301{
 302        return pmd_clear_flags(pmd, _PAGE_RW);
 303}
 304
 305static inline pmd_t pmd_mkdirty(pmd_t pmd)
 306{
 307        return pmd_set_flags(pmd, _PAGE_DIRTY | _PAGE_SOFT_DIRTY);
 308}
 309
 310static inline pmd_t pmd_mkdevmap(pmd_t pmd)
 311{
 312        return pmd_set_flags(pmd, _PAGE_DEVMAP);
 313}
 314
 315static inline pmd_t pmd_mkhuge(pmd_t pmd)
 316{
 317        return pmd_set_flags(pmd, _PAGE_PSE);
 318}
 319
 320static inline pmd_t pmd_mkyoung(pmd_t pmd)
 321{
 322        return pmd_set_flags(pmd, _PAGE_ACCESSED);
 323}
 324
 325static inline pmd_t pmd_mkwrite(pmd_t pmd)
 326{
 327        return pmd_set_flags(pmd, _PAGE_RW);
 328}
 329
 330static inline pmd_t pmd_mknotpresent(pmd_t pmd)
 331{
 332        return pmd_clear_flags(pmd, _PAGE_PRESENT | _PAGE_PROTNONE);
 333}
 334
 335#ifdef CONFIG_HAVE_ARCH_SOFT_DIRTY
 336static inline int pte_soft_dirty(pte_t pte)
 337{
 338        return pte_flags(pte) & _PAGE_SOFT_DIRTY;
 339}
 340
 341static inline int pmd_soft_dirty(pmd_t pmd)
 342{
 343        return pmd_flags(pmd) & _PAGE_SOFT_DIRTY;
 344}
 345
 346static inline pte_t pte_mksoft_dirty(pte_t pte)
 347{
 348        return pte_set_flags(pte, _PAGE_SOFT_DIRTY);
 349}
 350
 351static inline pmd_t pmd_mksoft_dirty(pmd_t pmd)
 352{
 353        return pmd_set_flags(pmd, _PAGE_SOFT_DIRTY);
 354}
 355
 356static inline pte_t pte_clear_soft_dirty(pte_t pte)
 357{
 358        return pte_clear_flags(pte, _PAGE_SOFT_DIRTY);
 359}
 360
 361static inline pmd_t pmd_clear_soft_dirty(pmd_t pmd)
 362{
 363        return pmd_clear_flags(pmd, _PAGE_SOFT_DIRTY);
 364}
 365
 366#endif /* CONFIG_HAVE_ARCH_SOFT_DIRTY */
 367
 368/*
 369 * Mask out unsupported bits in a present pgprot.  Non-present pgprots
 370 * can use those bits for other purposes, so leave them be.
 371 */
 372static inline pgprotval_t massage_pgprot(pgprot_t pgprot)
 373{
 374        pgprotval_t protval = pgprot_val(pgprot);
 375
 376        if (protval & _PAGE_PRESENT)
 377                protval &= __supported_pte_mask;
 378
 379        return protval;
 380}
 381
 382static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot)
 383{
 384        return __pte(((phys_addr_t)page_nr << PAGE_SHIFT) |
 385                     massage_pgprot(pgprot));
 386}
 387
 388static inline pmd_t pfn_pmd(unsigned long page_nr, pgprot_t pgprot)
 389{
 390        return __pmd(((phys_addr_t)page_nr << PAGE_SHIFT) |
 391                     massage_pgprot(pgprot));
 392}
 393
 394static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
 395{
 396        pteval_t val = pte_val(pte);
 397
 398        /*
 399         * Chop off the NX bit (if present), and add the NX portion of
 400         * the newprot (if present):
 401         */
 402        val &= _PAGE_CHG_MASK;
 403        val |= massage_pgprot(newprot) & ~_PAGE_CHG_MASK;
 404
 405        return __pte(val);
 406}
 407
 408static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
 409{
 410        pmdval_t val = pmd_val(pmd);
 411
 412        val &= _HPAGE_CHG_MASK;
 413        val |= massage_pgprot(newprot) & ~_HPAGE_CHG_MASK;
 414
 415        return __pmd(val);
 416}
 417
 418/* mprotect needs to preserve PAT bits when updating vm_page_prot */
 419#define pgprot_modify pgprot_modify
 420static inline pgprot_t pgprot_modify(pgprot_t oldprot, pgprot_t newprot)
 421{
 422        pgprotval_t preservebits = pgprot_val(oldprot) & _PAGE_CHG_MASK;
 423        pgprotval_t addbits = pgprot_val(newprot);
 424        return __pgprot(preservebits | addbits);
 425}
 426
 427#define pte_pgprot(x) __pgprot(pte_flags(x))
 428#define pmd_pgprot(x) __pgprot(pmd_flags(x))
 429#define pud_pgprot(x) __pgprot(pud_flags(x))
 430
 431#define canon_pgprot(p) __pgprot(massage_pgprot(p))
 432
 433static inline int is_new_memtype_allowed(u64 paddr, unsigned long size,
 434                                         enum page_cache_mode pcm,
 435                                         enum page_cache_mode new_pcm)
 436{
 437        /*
 438         * PAT type is always WB for untracked ranges, so no need to check.
 439         */
 440        if (x86_platform.is_untracked_pat_range(paddr, paddr + size))
 441                return 1;
 442
 443        /*
 444         * Certain new memtypes are not allowed with certain
 445         * requested memtype:
 446         * - request is uncached, return cannot be write-back
 447         * - request is write-combine, return cannot be write-back
 448         * - request is write-through, return cannot be write-back
 449         * - request is write-through, return cannot be write-combine
 450         */
 451        if ((pcm == _PAGE_CACHE_MODE_UC_MINUS &&
 452             new_pcm == _PAGE_CACHE_MODE_WB) ||
 453            (pcm == _PAGE_CACHE_MODE_WC &&
 454             new_pcm == _PAGE_CACHE_MODE_WB) ||
 455            (pcm == _PAGE_CACHE_MODE_WT &&
 456             new_pcm == _PAGE_CACHE_MODE_WB) ||
 457            (pcm == _PAGE_CACHE_MODE_WT &&
 458             new_pcm == _PAGE_CACHE_MODE_WC)) {
 459                return 0;
 460        }
 461
 462        return 1;
 463}
 464
 465pmd_t *populate_extra_pmd(unsigned long vaddr);
 466pte_t *populate_extra_pte(unsigned long vaddr);
 467#endif  /* __ASSEMBLY__ */
 468
 469#ifdef CONFIG_X86_32
 470# include <asm/pgtable_32.h>
 471#else
 472# include <asm/pgtable_64.h>
 473#endif
 474
 475#ifndef __ASSEMBLY__
 476#include <linux/mm_types.h>
 477#include <linux/mmdebug.h>
 478#include <linux/log2.h>
 479
 480static inline int pte_none(pte_t pte)
 481{
 482        return !pte.pte;
 483}
 484
 485#define __HAVE_ARCH_PTE_SAME
 486static inline int pte_same(pte_t a, pte_t b)
 487{
 488        return a.pte == b.pte;
 489}
 490
 491static inline int pte_present(pte_t a)
 492{
 493        return pte_flags(a) & (_PAGE_PRESENT | _PAGE_PROTNONE);
 494}
 495
 496#ifdef __HAVE_ARCH_PTE_DEVMAP
 497static inline int pte_devmap(pte_t a)
 498{
 499        return (pte_flags(a) & _PAGE_DEVMAP) == _PAGE_DEVMAP;
 500}
 501#endif
 502
 503#define pte_accessible pte_accessible
 504static inline bool pte_accessible(struct mm_struct *mm, pte_t a)
 505{
 506        if (pte_flags(a) & _PAGE_PRESENT)
 507                return true;
 508
 509        if ((pte_flags(a) & _PAGE_PROTNONE) &&
 510                        mm_tlb_flush_pending(mm))
 511                return true;
 512
 513        return false;
 514}
 515
 516static inline int pte_hidden(pte_t pte)
 517{
 518        return pte_flags(pte) & _PAGE_HIDDEN;
 519}
 520
 521static inline int pmd_present(pmd_t pmd)
 522{
 523        /*
 524         * Checking for _PAGE_PSE is needed too because
 525         * split_huge_page will temporarily clear the present bit (but
 526         * the _PAGE_PSE flag will remain set at all times while the
 527         * _PAGE_PRESENT bit is clear).
 528         */
 529        return pmd_flags(pmd) & (_PAGE_PRESENT | _PAGE_PROTNONE | _PAGE_PSE);
 530}
 531
 532#ifdef CONFIG_NUMA_BALANCING
 533/*
 534 * These work without NUMA balancing but the kernel does not care. See the
 535 * comment in include/asm-generic/pgtable.h
 536 */
 537static inline int pte_protnone(pte_t pte)
 538{
 539        return (pte_flags(pte) & (_PAGE_PROTNONE | _PAGE_PRESENT))
 540                == _PAGE_PROTNONE;
 541}
 542
 543static inline int pmd_protnone(pmd_t pmd)
 544{
 545        return (pmd_flags(pmd) & (_PAGE_PROTNONE | _PAGE_PRESENT))
 546                == _PAGE_PROTNONE;
 547}
 548#endif /* CONFIG_NUMA_BALANCING */
 549
 550static inline int pmd_none(pmd_t pmd)
 551{
 552        /* Only check low word on 32-bit platforms, since it might be
 553           out of sync with upper half. */
 554        return (unsigned long)native_pmd_val(pmd) == 0;
 555}
 556
 557static inline unsigned long pmd_page_vaddr(pmd_t pmd)
 558{
 559        return (unsigned long)__va(pmd_val(pmd) & pmd_pfn_mask(pmd));
 560}
 561
 562/*
 563 * Currently stuck as a macro due to indirect forward reference to
 564 * linux/mmzone.h's __section_mem_map_addr() definition:
 565 */
 566#define pmd_page(pmd)           \
 567        pfn_to_page((pmd_val(pmd) & pmd_pfn_mask(pmd)) >> PAGE_SHIFT)
 568
 569/*
 570 * the pmd page can be thought of an array like this: pmd_t[PTRS_PER_PMD]
 571 *
 572 * this macro returns the index of the entry in the pmd page which would
 573 * control the given virtual address
 574 */
 575static inline unsigned long pmd_index(unsigned long address)
 576{
 577        return (address >> PMD_SHIFT) & (PTRS_PER_PMD - 1);
 578}
 579
 580/*
 581 * Conversion functions: convert a page and protection to a page entry,
 582 * and a page entry and page directory to the page they refer to.
 583 *
 584 * (Currently stuck as a macro because of indirect forward reference
 585 * to linux/mm.h:page_to_nid())
 586 */
 587#define mk_pte(page, pgprot)   pfn_pte(page_to_pfn(page), (pgprot))
 588
 589/*
 590 * the pte page can be thought of an array like this: pte_t[PTRS_PER_PTE]
 591 *
 592 * this function returns the index of the entry in the pte page which would
 593 * control the given virtual address
 594 */
 595static inline unsigned long pte_index(unsigned long address)
 596{
 597        return (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1);
 598}
 599
 600static inline pte_t *pte_offset_kernel(pmd_t *pmd, unsigned long address)
 601{
 602        return (pte_t *)pmd_page_vaddr(*pmd) + pte_index(address);
 603}
 604
 605static inline int pmd_bad(pmd_t pmd)
 606{
 607        return (pmd_flags(pmd) & ~_PAGE_USER) != _KERNPG_TABLE;
 608}
 609
 610static inline unsigned long pages_to_mb(unsigned long npg)
 611{
 612        return npg >> (20 - PAGE_SHIFT);
 613}
 614
 615#if CONFIG_PGTABLE_LEVELS > 2
 616static inline int pud_none(pud_t pud)
 617{
 618        return native_pud_val(pud) == 0;
 619}
 620
 621static inline int pud_present(pud_t pud)
 622{
 623        return pud_flags(pud) & _PAGE_PRESENT;
 624}
 625
 626static inline unsigned long pud_page_vaddr(pud_t pud)
 627{
 628        return (unsigned long)__va(pud_val(pud) & pud_pfn_mask(pud));
 629}
 630
 631/*
 632 * Currently stuck as a macro due to indirect forward reference to
 633 * linux/mmzone.h's __section_mem_map_addr() definition:
 634 */
 635#define pud_page(pud)           \
 636        pfn_to_page((pud_val(pud) & pud_pfn_mask(pud)) >> PAGE_SHIFT)
 637
 638/* Find an entry in the second-level page table.. */
 639static inline pmd_t *pmd_offset(pud_t *pud, unsigned long address)
 640{
 641        return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(address);
 642}
 643
 644static inline int pud_large(pud_t pud)
 645{
 646        return (pud_val(pud) & (_PAGE_PSE | _PAGE_PRESENT)) ==
 647                (_PAGE_PSE | _PAGE_PRESENT);
 648}
 649
 650static inline int pud_bad(pud_t pud)
 651{
 652        return (pud_flags(pud) & ~(_KERNPG_TABLE | _PAGE_USER)) != 0;
 653}
 654#else
 655static inline int pud_large(pud_t pud)
 656{
 657        return 0;
 658}
 659#endif  /* CONFIG_PGTABLE_LEVELS > 2 */
 660
 661#if CONFIG_PGTABLE_LEVELS > 3
 662static inline int pgd_present(pgd_t pgd)
 663{
 664        return pgd_flags(pgd) & _PAGE_PRESENT;
 665}
 666
 667static inline unsigned long pgd_page_vaddr(pgd_t pgd)
 668{
 669        return (unsigned long)__va((unsigned long)pgd_val(pgd) & PTE_PFN_MASK);
 670}
 671
 672/*
 673 * Currently stuck as a macro due to indirect forward reference to
 674 * linux/mmzone.h's __section_mem_map_addr() definition:
 675 */
 676#define pgd_page(pgd)           pfn_to_page(pgd_val(pgd) >> PAGE_SHIFT)
 677
 678/* to find an entry in a page-table-directory. */
 679static inline unsigned long pud_index(unsigned long address)
 680{
 681        return (address >> PUD_SHIFT) & (PTRS_PER_PUD - 1);
 682}
 683
 684static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address)
 685{
 686        return (pud_t *)pgd_page_vaddr(*pgd) + pud_index(address);
 687}
 688
 689static inline int pgd_bad(pgd_t pgd)
 690{
 691        return (pgd_flags(pgd) & ~_PAGE_USER) != _KERNPG_TABLE;
 692}
 693
 694static inline int pgd_none(pgd_t pgd)
 695{
 696        return !native_pgd_val(pgd);
 697}
 698#endif  /* CONFIG_PGTABLE_LEVELS > 3 */
 699
 700#endif  /* __ASSEMBLY__ */
 701
 702/*
 703 * the pgd page can be thought of an array like this: pgd_t[PTRS_PER_PGD]
 704 *
 705 * this macro returns the index of the entry in the pgd page which would
 706 * control the given virtual address
 707 */
 708#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1))
 709
 710/*
 711 * pgd_offset() returns a (pgd_t *)
 712 * pgd_index() is used get the offset into the pgd page's array of pgd_t's;
 713 */
 714#define pgd_offset(mm, address) ((mm)->pgd + pgd_index((address)))
 715/*
 716 * a shortcut which implies the use of the kernel's pgd, instead
 717 * of a process's
 718 */
 719#define pgd_offset_k(address) pgd_offset(&init_mm, (address))
 720
 721
 722#define KERNEL_PGD_BOUNDARY     pgd_index(PAGE_OFFSET)
 723#define KERNEL_PGD_PTRS         (PTRS_PER_PGD - KERNEL_PGD_BOUNDARY)
 724
 725#ifndef __ASSEMBLY__
 726
 727extern int direct_gbpages;
 728void init_mem_mapping(void);
 729void early_alloc_pgt_buf(void);
 730
 731/* local pte updates need not use xchg for locking */
 732static inline pte_t native_local_ptep_get_and_clear(pte_t *ptep)
 733{
 734        pte_t res = *ptep;
 735
 736        /* Pure native function needs no input for mm, addr */
 737        native_pte_clear(NULL, 0, ptep);
 738        return res;
 739}
 740
 741static inline pmd_t native_local_pmdp_get_and_clear(pmd_t *pmdp)
 742{
 743        pmd_t res = *pmdp;
 744
 745        native_pmd_clear(pmdp);
 746        return res;
 747}
 748
 749static inline void native_set_pte_at(struct mm_struct *mm, unsigned long addr,
 750                                     pte_t *ptep , pte_t pte)
 751{
 752        native_set_pte(ptep, pte);
 753}
 754
 755static inline void native_set_pmd_at(struct mm_struct *mm, unsigned long addr,
 756                                     pmd_t *pmdp , pmd_t pmd)
 757{
 758        native_set_pmd(pmdp, pmd);
 759}
 760
 761#ifndef CONFIG_PARAVIRT
 762/*
 763 * Rules for using pte_update - it must be called after any PTE update which
 764 * has not been done using the set_pte / clear_pte interfaces.  It is used by
 765 * shadow mode hypervisors to resynchronize the shadow page tables.  Kernel PTE
 766 * updates should either be sets, clears, or set_pte_atomic for P->P
 767 * transitions, which means this hook should only be called for user PTEs.
 768 * This hook implies a P->P protection or access change has taken place, which
 769 * requires a subsequent TLB flush.
 770 */
 771#define pte_update(mm, addr, ptep)              do { } while (0)
 772#endif
 773
 774/*
 775 * We only update the dirty/accessed state if we set
 776 * the dirty bit by hand in the kernel, since the hardware
 777 * will do the accessed bit for us, and we don't want to
 778 * race with other CPU's that might be updating the dirty
 779 * bit at the same time.
 780 */
 781struct vm_area_struct;
 782
 783#define  __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
 784extern int ptep_set_access_flags(struct vm_area_struct *vma,
 785                                 unsigned long address, pte_t *ptep,
 786                                 pte_t entry, int dirty);
 787
 788#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
 789extern int ptep_test_and_clear_young(struct vm_area_struct *vma,
 790                                     unsigned long addr, pte_t *ptep);
 791
 792#define __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH
 793extern int ptep_clear_flush_young(struct vm_area_struct *vma,
 794                                  unsigned long address, pte_t *ptep);
 795
 796#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
 797static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
 798                                       pte_t *ptep)
 799{
 800        pte_t pte = native_ptep_get_and_clear(ptep);
 801        pte_update(mm, addr, ptep);
 802        return pte;
 803}
 804
 805#define __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL
 806static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm,
 807                                            unsigned long addr, pte_t *ptep,
 808                                            int full)
 809{
 810        pte_t pte;
 811        if (full) {
 812                /*
 813                 * Full address destruction in progress; paravirt does not
 814                 * care about updates and native needs no locking
 815                 */
 816                pte = native_local_ptep_get_and_clear(ptep);
 817        } else {
 818                pte = ptep_get_and_clear(mm, addr, ptep);
 819        }
 820        return pte;
 821}
 822
 823#define __HAVE_ARCH_PTEP_SET_WRPROTECT
 824static inline void ptep_set_wrprotect(struct mm_struct *mm,
 825                                      unsigned long addr, pte_t *ptep)
 826{
 827        clear_bit(_PAGE_BIT_RW, (unsigned long *)&ptep->pte);
 828        pte_update(mm, addr, ptep);
 829}
 830
 831#define flush_tlb_fix_spurious_fault(vma, address) do { } while (0)
 832
 833#define mk_pmd(page, pgprot)   pfn_pmd(page_to_pfn(page), (pgprot))
 834
 835#define  __HAVE_ARCH_PMDP_SET_ACCESS_FLAGS
 836extern int pmdp_set_access_flags(struct vm_area_struct *vma,
 837                                 unsigned long address, pmd_t *pmdp,
 838                                 pmd_t entry, int dirty);
 839
 840#define __HAVE_ARCH_PMDP_TEST_AND_CLEAR_YOUNG
 841extern int pmdp_test_and_clear_young(struct vm_area_struct *vma,
 842                                     unsigned long addr, pmd_t *pmdp);
 843
 844#define __HAVE_ARCH_PMDP_CLEAR_YOUNG_FLUSH
 845extern int pmdp_clear_flush_young(struct vm_area_struct *vma,
 846                                  unsigned long address, pmd_t *pmdp);
 847
 848
 849#define __HAVE_ARCH_PMD_WRITE
 850static inline int pmd_write(pmd_t pmd)
 851{
 852        return pmd_flags(pmd) & _PAGE_RW;
 853}
 854
 855#define __HAVE_ARCH_PMDP_HUGE_GET_AND_CLEAR
 856static inline pmd_t pmdp_huge_get_and_clear(struct mm_struct *mm, unsigned long addr,
 857                                       pmd_t *pmdp)
 858{
 859        return native_pmdp_get_and_clear(pmdp);
 860}
 861
 862#define __HAVE_ARCH_PMDP_SET_WRPROTECT
 863static inline void pmdp_set_wrprotect(struct mm_struct *mm,
 864                                      unsigned long addr, pmd_t *pmdp)
 865{
 866        clear_bit(_PAGE_BIT_RW, (unsigned long *)pmdp);
 867}
 868
 869/*
 870 * clone_pgd_range(pgd_t *dst, pgd_t *src, int count);
 871 *
 872 *  dst - pointer to pgd range anwhere on a pgd page
 873 *  src - ""
 874 *  count - the number of pgds to copy.
 875 *
 876 * dst and src can be on the same page, but the range must not overlap,
 877 * and must not cross a page boundary.
 878 */
 879static inline void clone_pgd_range(pgd_t *dst, pgd_t *src, int count)
 880{
 881       memcpy(dst, src, count * sizeof(pgd_t));
 882}
 883
 884#define PTE_SHIFT ilog2(PTRS_PER_PTE)
 885static inline int page_level_shift(enum pg_level level)
 886{
 887        return (PAGE_SHIFT - PTE_SHIFT) + level * PTE_SHIFT;
 888}
 889static inline unsigned long page_level_size(enum pg_level level)
 890{
 891        return 1UL << page_level_shift(level);
 892}
 893static inline unsigned long page_level_mask(enum pg_level level)
 894{
 895        return ~(page_level_size(level) - 1);
 896}
 897
 898/*
 899 * The x86 doesn't have any external MMU info: the kernel page
 900 * tables contain all the necessary information.
 901 */
 902static inline void update_mmu_cache(struct vm_area_struct *vma,
 903                unsigned long addr, pte_t *ptep)
 904{
 905}
 906static inline void update_mmu_cache_pmd(struct vm_area_struct *vma,
 907                unsigned long addr, pmd_t *pmd)
 908{
 909}
 910
 911#ifdef CONFIG_HAVE_ARCH_SOFT_DIRTY
 912static inline pte_t pte_swp_mksoft_dirty(pte_t pte)
 913{
 914        return pte_set_flags(pte, _PAGE_SWP_SOFT_DIRTY);
 915}
 916
 917static inline int pte_swp_soft_dirty(pte_t pte)
 918{
 919        return pte_flags(pte) & _PAGE_SWP_SOFT_DIRTY;
 920}
 921
 922static inline pte_t pte_swp_clear_soft_dirty(pte_t pte)
 923{
 924        return pte_clear_flags(pte, _PAGE_SWP_SOFT_DIRTY);
 925}
 926#endif
 927
 928#define PKRU_AD_BIT 0x1
 929#define PKRU_WD_BIT 0x2
 930#define PKRU_BITS_PER_PKEY 2
 931
 932static inline bool __pkru_allows_read(u32 pkru, u16 pkey)
 933{
 934        int pkru_pkey_bits = pkey * PKRU_BITS_PER_PKEY;
 935        return !(pkru & (PKRU_AD_BIT << pkru_pkey_bits));
 936}
 937
 938static inline bool __pkru_allows_write(u32 pkru, u16 pkey)
 939{
 940        int pkru_pkey_bits = pkey * PKRU_BITS_PER_PKEY;
 941        /*
 942         * Access-disable disables writes too so we need to check
 943         * both bits here.
 944         */
 945        return !(pkru & ((PKRU_AD_BIT|PKRU_WD_BIT) << pkru_pkey_bits));
 946}
 947
 948static inline u16 pte_flags_pkey(unsigned long pte_flags)
 949{
 950#ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS
 951        /* ifdef to avoid doing 59-bit shift on 32-bit values */
 952        return (pte_flags & _PAGE_PKEY_MASK) >> _PAGE_BIT_PKEY_BIT0;
 953#else
 954        return 0;
 955#endif
 956}
 957
 958#include <asm-generic/pgtable.h>
 959#endif  /* __ASSEMBLY__ */
 960
 961#endif /* _ASM_X86_PGTABLE_H */
 962