18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef _ASM_POWERPC_NOHASH_64_PGTABLE_H 38c2ecf20Sopenharmony_ci#define _ASM_POWERPC_NOHASH_64_PGTABLE_H 48c2ecf20Sopenharmony_ci/* 58c2ecf20Sopenharmony_ci * This file contains the functions and defines necessary to modify and use 68c2ecf20Sopenharmony_ci * the ppc64 non-hashed page table. 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/sizes.h> 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <asm/nohash/64/pgtable-4k.h> 128c2ecf20Sopenharmony_ci#include <asm/barrier.h> 138c2ecf20Sopenharmony_ci#include <asm/asm-const.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#define FIRST_USER_ADDRESS 0UL 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci/* 188c2ecf20Sopenharmony_ci * Size of EA range mapped by our pagetables. 198c2ecf20Sopenharmony_ci */ 208c2ecf20Sopenharmony_ci#define PGTABLE_EADDR_SIZE (PTE_INDEX_SIZE + PMD_INDEX_SIZE + \ 218c2ecf20Sopenharmony_ci PUD_INDEX_SIZE + PGD_INDEX_SIZE + PAGE_SHIFT) 228c2ecf20Sopenharmony_ci#define PGTABLE_RANGE (ASM_CONST(1) << PGTABLE_EADDR_SIZE) 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci#define PMD_CACHE_INDEX PMD_INDEX_SIZE 258c2ecf20Sopenharmony_ci#define PUD_CACHE_INDEX PUD_INDEX_SIZE 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci/* 288c2ecf20Sopenharmony_ci * Define the address range of the kernel non-linear virtual area 298c2ecf20Sopenharmony_ci */ 308c2ecf20Sopenharmony_ci#define KERN_VIRT_START ASM_CONST(0x8000000000000000) 318c2ecf20Sopenharmony_ci#define KERN_VIRT_SIZE ASM_CONST(0x0000100000000000) 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci/* 348c2ecf20Sopenharmony_ci * The vmalloc space starts at the beginning of that region, and 358c2ecf20Sopenharmony_ci * occupies a quarter of it on Book3E 368c2ecf20Sopenharmony_ci * (we keep a quarter for the virtual memmap) 378c2ecf20Sopenharmony_ci */ 388c2ecf20Sopenharmony_ci#define VMALLOC_START KERN_VIRT_START 398c2ecf20Sopenharmony_ci#define VMALLOC_SIZE (KERN_VIRT_SIZE >> 2) 408c2ecf20Sopenharmony_ci#define VMALLOC_END (VMALLOC_START + VMALLOC_SIZE) 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci/* 438c2ecf20Sopenharmony_ci * The second half of the kernel virtual space is used for IO mappings, 448c2ecf20Sopenharmony_ci * it's itself carved into the PIO region (ISA and PHB IO space) and 458c2ecf20Sopenharmony_ci * the ioremap space 468c2ecf20Sopenharmony_ci * 478c2ecf20Sopenharmony_ci * ISA_IO_BASE = KERN_IO_START, 64K reserved area 488c2ecf20Sopenharmony_ci * PHB_IO_BASE = ISA_IO_BASE + 64K to ISA_IO_BASE + 2G, PHB IO spaces 498c2ecf20Sopenharmony_ci * IOREMAP_BASE = ISA_IO_BASE + 2G to VMALLOC_START + PGTABLE_RANGE 508c2ecf20Sopenharmony_ci */ 518c2ecf20Sopenharmony_ci#define KERN_IO_START (KERN_VIRT_START + (KERN_VIRT_SIZE >> 1)) 528c2ecf20Sopenharmony_ci#define FULL_IO_SIZE 0x80000000ul 538c2ecf20Sopenharmony_ci#define ISA_IO_BASE (KERN_IO_START) 548c2ecf20Sopenharmony_ci#define ISA_IO_END (KERN_IO_START + 0x10000ul) 558c2ecf20Sopenharmony_ci#define PHB_IO_BASE (ISA_IO_END) 568c2ecf20Sopenharmony_ci#define PHB_IO_END (KERN_IO_START + FULL_IO_SIZE) 578c2ecf20Sopenharmony_ci#define IOREMAP_BASE (PHB_IO_END) 588c2ecf20Sopenharmony_ci#define IOREMAP_START (ioremap_bot) 598c2ecf20Sopenharmony_ci#define IOREMAP_END (KERN_VIRT_START + KERN_VIRT_SIZE - FIXADDR_SIZE) 608c2ecf20Sopenharmony_ci#define FIXADDR_SIZE SZ_32M 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci/* 648c2ecf20Sopenharmony_ci * Region IDs 658c2ecf20Sopenharmony_ci */ 668c2ecf20Sopenharmony_ci#define REGION_SHIFT 60UL 678c2ecf20Sopenharmony_ci#define REGION_MASK (0xfUL << REGION_SHIFT) 688c2ecf20Sopenharmony_ci#define REGION_ID(ea) (((unsigned long)(ea)) >> REGION_SHIFT) 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci#define VMALLOC_REGION_ID (REGION_ID(VMALLOC_START)) 718c2ecf20Sopenharmony_ci#define KERNEL_REGION_ID (REGION_ID(PAGE_OFFSET)) 728c2ecf20Sopenharmony_ci#define USER_REGION_ID (0UL) 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci/* 758c2ecf20Sopenharmony_ci * Defines the address of the vmemap area, in its own region on 768c2ecf20Sopenharmony_ci * after the vmalloc space on Book3E 778c2ecf20Sopenharmony_ci */ 788c2ecf20Sopenharmony_ci#define VMEMMAP_BASE VMALLOC_END 798c2ecf20Sopenharmony_ci#define VMEMMAP_END KERN_IO_START 808c2ecf20Sopenharmony_ci#define vmemmap ((struct page *)VMEMMAP_BASE) 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci/* 848c2ecf20Sopenharmony_ci * Include the PTE bits definitions 858c2ecf20Sopenharmony_ci */ 868c2ecf20Sopenharmony_ci#include <asm/nohash/pte-book3e.h> 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci#define _PAGE_SAO 0 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci#define PTE_RPN_MASK (~((1UL << PTE_RPN_SHIFT) - 1)) 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci/* 938c2ecf20Sopenharmony_ci * _PAGE_CHG_MASK masks of bits that are to be preserved across 948c2ecf20Sopenharmony_ci * pgprot changes. 958c2ecf20Sopenharmony_ci */ 968c2ecf20Sopenharmony_ci#define _PAGE_CHG_MASK (PTE_RPN_MASK | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_SPECIAL) 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci#define H_PAGE_4K_PFN 0 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci#ifndef __ASSEMBLY__ 1018c2ecf20Sopenharmony_ci/* pte_clear moved to later in this file */ 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_cistatic inline pte_t pte_mkwrite(pte_t pte) 1048c2ecf20Sopenharmony_ci{ 1058c2ecf20Sopenharmony_ci return __pte(pte_val(pte) | _PAGE_RW); 1068c2ecf20Sopenharmony_ci} 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_cistatic inline pte_t pte_mkdirty(pte_t pte) 1098c2ecf20Sopenharmony_ci{ 1108c2ecf20Sopenharmony_ci return __pte(pte_val(pte) | _PAGE_DIRTY); 1118c2ecf20Sopenharmony_ci} 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_cistatic inline pte_t pte_mkyoung(pte_t pte) 1148c2ecf20Sopenharmony_ci{ 1158c2ecf20Sopenharmony_ci return __pte(pte_val(pte) | _PAGE_ACCESSED); 1168c2ecf20Sopenharmony_ci} 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_cistatic inline pte_t pte_wrprotect(pte_t pte) 1198c2ecf20Sopenharmony_ci{ 1208c2ecf20Sopenharmony_ci return __pte(pte_val(pte) & ~_PAGE_RW); 1218c2ecf20Sopenharmony_ci} 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_cistatic inline pte_t pte_mkexec(pte_t pte) 1248c2ecf20Sopenharmony_ci{ 1258c2ecf20Sopenharmony_ci return __pte(pte_val(pte) | _PAGE_EXEC); 1268c2ecf20Sopenharmony_ci} 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci#define PMD_BAD_BITS (PTE_TABLE_SIZE-1) 1298c2ecf20Sopenharmony_ci#define PUD_BAD_BITS (PMD_TABLE_SIZE-1) 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_cistatic inline void pmd_set(pmd_t *pmdp, unsigned long val) 1328c2ecf20Sopenharmony_ci{ 1338c2ecf20Sopenharmony_ci *pmdp = __pmd(val); 1348c2ecf20Sopenharmony_ci} 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_cistatic inline void pmd_clear(pmd_t *pmdp) 1378c2ecf20Sopenharmony_ci{ 1388c2ecf20Sopenharmony_ci *pmdp = __pmd(0); 1398c2ecf20Sopenharmony_ci} 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_cistatic inline pte_t pmd_pte(pmd_t pmd) 1428c2ecf20Sopenharmony_ci{ 1438c2ecf20Sopenharmony_ci return __pte(pmd_val(pmd)); 1448c2ecf20Sopenharmony_ci} 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci#define pmd_none(pmd) (!pmd_val(pmd)) 1478c2ecf20Sopenharmony_ci#define pmd_bad(pmd) (!is_kernel_addr(pmd_val(pmd)) \ 1488c2ecf20Sopenharmony_ci || (pmd_val(pmd) & PMD_BAD_BITS)) 1498c2ecf20Sopenharmony_ci#define pmd_present(pmd) (!pmd_none(pmd)) 1508c2ecf20Sopenharmony_ci#define pmd_page_vaddr(pmd) (pmd_val(pmd) & ~PMD_MASKED_BITS) 1518c2ecf20Sopenharmony_ciextern struct page *pmd_page(pmd_t pmd); 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_cistatic inline void pud_set(pud_t *pudp, unsigned long val) 1548c2ecf20Sopenharmony_ci{ 1558c2ecf20Sopenharmony_ci *pudp = __pud(val); 1568c2ecf20Sopenharmony_ci} 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_cistatic inline void pud_clear(pud_t *pudp) 1598c2ecf20Sopenharmony_ci{ 1608c2ecf20Sopenharmony_ci *pudp = __pud(0); 1618c2ecf20Sopenharmony_ci} 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci#define pud_none(pud) (!pud_val(pud)) 1648c2ecf20Sopenharmony_ci#define pud_bad(pud) (!is_kernel_addr(pud_val(pud)) \ 1658c2ecf20Sopenharmony_ci || (pud_val(pud) & PUD_BAD_BITS)) 1668c2ecf20Sopenharmony_ci#define pud_present(pud) (pud_val(pud) != 0) 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_cistatic inline pmd_t *pud_pgtable(pud_t pud) 1698c2ecf20Sopenharmony_ci{ 1708c2ecf20Sopenharmony_ci return (pmd_t *)(pud_val(pud) & ~PUD_MASKED_BITS); 1718c2ecf20Sopenharmony_ci} 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_ciextern struct page *pud_page(pud_t pud); 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_cistatic inline pte_t pud_pte(pud_t pud) 1768c2ecf20Sopenharmony_ci{ 1778c2ecf20Sopenharmony_ci return __pte(pud_val(pud)); 1788c2ecf20Sopenharmony_ci} 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_cistatic inline pud_t pte_pud(pte_t pte) 1818c2ecf20Sopenharmony_ci{ 1828c2ecf20Sopenharmony_ci return __pud(pte_val(pte)); 1838c2ecf20Sopenharmony_ci} 1848c2ecf20Sopenharmony_ci#define pud_write(pud) pte_write(pud_pte(pud)) 1858c2ecf20Sopenharmony_ci#define p4d_write(pgd) pte_write(p4d_pte(p4d)) 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_cistatic inline void p4d_set(p4d_t *p4dp, unsigned long val) 1888c2ecf20Sopenharmony_ci{ 1898c2ecf20Sopenharmony_ci *p4dp = __p4d(val); 1908c2ecf20Sopenharmony_ci} 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci/* Atomic PTE updates */ 1938c2ecf20Sopenharmony_cistatic inline unsigned long pte_update(struct mm_struct *mm, 1948c2ecf20Sopenharmony_ci unsigned long addr, 1958c2ecf20Sopenharmony_ci pte_t *ptep, unsigned long clr, 1968c2ecf20Sopenharmony_ci unsigned long set, 1978c2ecf20Sopenharmony_ci int huge) 1988c2ecf20Sopenharmony_ci{ 1998c2ecf20Sopenharmony_ci unsigned long old = pte_val(*ptep); 2008c2ecf20Sopenharmony_ci *ptep = __pte((old & ~clr) | set); 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_ci /* huge pages use the old page table lock */ 2038c2ecf20Sopenharmony_ci if (!huge) 2048c2ecf20Sopenharmony_ci assert_pte_locked(mm, addr); 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci return old; 2078c2ecf20Sopenharmony_ci} 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_cistatic inline int pte_young(pte_t pte) 2108c2ecf20Sopenharmony_ci{ 2118c2ecf20Sopenharmony_ci return pte_val(pte) & _PAGE_ACCESSED; 2128c2ecf20Sopenharmony_ci} 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_cistatic inline int __ptep_test_and_clear_young(struct mm_struct *mm, 2158c2ecf20Sopenharmony_ci unsigned long addr, pte_t *ptep) 2168c2ecf20Sopenharmony_ci{ 2178c2ecf20Sopenharmony_ci unsigned long old; 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_ci if (!pte_young(*ptep)) 2208c2ecf20Sopenharmony_ci return 0; 2218c2ecf20Sopenharmony_ci old = pte_update(mm, addr, ptep, _PAGE_ACCESSED, 0, 0); 2228c2ecf20Sopenharmony_ci return (old & _PAGE_ACCESSED) != 0; 2238c2ecf20Sopenharmony_ci} 2248c2ecf20Sopenharmony_ci#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG 2258c2ecf20Sopenharmony_ci#define ptep_test_and_clear_young(__vma, __addr, __ptep) \ 2268c2ecf20Sopenharmony_ci({ \ 2278c2ecf20Sopenharmony_ci int __r; \ 2288c2ecf20Sopenharmony_ci __r = __ptep_test_and_clear_young((__vma)->vm_mm, __addr, __ptep); \ 2298c2ecf20Sopenharmony_ci __r; \ 2308c2ecf20Sopenharmony_ci}) 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ci#define __HAVE_ARCH_PTEP_SET_WRPROTECT 2338c2ecf20Sopenharmony_cistatic inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, 2348c2ecf20Sopenharmony_ci pte_t *ptep) 2358c2ecf20Sopenharmony_ci{ 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci if ((pte_val(*ptep) & _PAGE_RW) == 0) 2388c2ecf20Sopenharmony_ci return; 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci pte_update(mm, addr, ptep, _PAGE_RW, 0, 0); 2418c2ecf20Sopenharmony_ci} 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_ci#define __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT 2448c2ecf20Sopenharmony_cistatic inline void huge_ptep_set_wrprotect(struct mm_struct *mm, 2458c2ecf20Sopenharmony_ci unsigned long addr, pte_t *ptep) 2468c2ecf20Sopenharmony_ci{ 2478c2ecf20Sopenharmony_ci if ((pte_val(*ptep) & _PAGE_RW) == 0) 2488c2ecf20Sopenharmony_ci return; 2498c2ecf20Sopenharmony_ci 2508c2ecf20Sopenharmony_ci pte_update(mm, addr, ptep, _PAGE_RW, 0, 1); 2518c2ecf20Sopenharmony_ci} 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci#define __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH 2548c2ecf20Sopenharmony_ci#define ptep_clear_flush_young(__vma, __address, __ptep) \ 2558c2ecf20Sopenharmony_ci({ \ 2568c2ecf20Sopenharmony_ci int __young = __ptep_test_and_clear_young((__vma)->vm_mm, __address, \ 2578c2ecf20Sopenharmony_ci __ptep); \ 2588c2ecf20Sopenharmony_ci __young; \ 2598c2ecf20Sopenharmony_ci}) 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_ci#define __HAVE_ARCH_PTEP_GET_AND_CLEAR 2628c2ecf20Sopenharmony_cistatic inline pte_t ptep_get_and_clear(struct mm_struct *mm, 2638c2ecf20Sopenharmony_ci unsigned long addr, pte_t *ptep) 2648c2ecf20Sopenharmony_ci{ 2658c2ecf20Sopenharmony_ci unsigned long old = pte_update(mm, addr, ptep, ~0UL, 0, 0); 2668c2ecf20Sopenharmony_ci return __pte(old); 2678c2ecf20Sopenharmony_ci} 2688c2ecf20Sopenharmony_ci 2698c2ecf20Sopenharmony_cistatic inline void pte_clear(struct mm_struct *mm, unsigned long addr, 2708c2ecf20Sopenharmony_ci pte_t * ptep) 2718c2ecf20Sopenharmony_ci{ 2728c2ecf20Sopenharmony_ci pte_update(mm, addr, ptep, ~0UL, 0, 0); 2738c2ecf20Sopenharmony_ci} 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_ci 2768c2ecf20Sopenharmony_ci/* Set the dirty and/or accessed bits atomically in a linux PTE */ 2778c2ecf20Sopenharmony_cistatic inline void __ptep_set_access_flags(struct vm_area_struct *vma, 2788c2ecf20Sopenharmony_ci pte_t *ptep, pte_t entry, 2798c2ecf20Sopenharmony_ci unsigned long address, 2808c2ecf20Sopenharmony_ci int psize) 2818c2ecf20Sopenharmony_ci{ 2828c2ecf20Sopenharmony_ci unsigned long bits = pte_val(entry) & 2838c2ecf20Sopenharmony_ci (_PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_RW | _PAGE_EXEC); 2848c2ecf20Sopenharmony_ci 2858c2ecf20Sopenharmony_ci unsigned long old = pte_val(*ptep); 2868c2ecf20Sopenharmony_ci *ptep = __pte(old | bits); 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci flush_tlb_page(vma, address); 2898c2ecf20Sopenharmony_ci} 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_ci#define __HAVE_ARCH_PTE_SAME 2928c2ecf20Sopenharmony_ci#define pte_same(A,B) ((pte_val(A) ^ pte_val(B)) == 0) 2938c2ecf20Sopenharmony_ci 2948c2ecf20Sopenharmony_ci#define pte_ERROR(e) \ 2958c2ecf20Sopenharmony_ci pr_err("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, pte_val(e)) 2968c2ecf20Sopenharmony_ci#define pmd_ERROR(e) \ 2978c2ecf20Sopenharmony_ci pr_err("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pmd_val(e)) 2988c2ecf20Sopenharmony_ci#define pgd_ERROR(e) \ 2998c2ecf20Sopenharmony_ci pr_err("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e)) 3008c2ecf20Sopenharmony_ci 3018c2ecf20Sopenharmony_ci/* Encode and de-code a swap entry */ 3028c2ecf20Sopenharmony_ci#define MAX_SWAPFILES_CHECK() do { \ 3038c2ecf20Sopenharmony_ci BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > SWP_TYPE_BITS); \ 3048c2ecf20Sopenharmony_ci } while (0) 3058c2ecf20Sopenharmony_ci 3068c2ecf20Sopenharmony_ci#define SWP_TYPE_BITS 5 3078c2ecf20Sopenharmony_ci#define __swp_type(x) (((x).val >> _PAGE_BIT_SWAP_TYPE) \ 3088c2ecf20Sopenharmony_ci & ((1UL << SWP_TYPE_BITS) - 1)) 3098c2ecf20Sopenharmony_ci#define __swp_offset(x) ((x).val >> PTE_RPN_SHIFT) 3108c2ecf20Sopenharmony_ci#define __swp_entry(type, offset) ((swp_entry_t) { \ 3118c2ecf20Sopenharmony_ci ((type) << _PAGE_BIT_SWAP_TYPE) \ 3128c2ecf20Sopenharmony_ci | ((offset) << PTE_RPN_SHIFT) }) 3138c2ecf20Sopenharmony_ci 3148c2ecf20Sopenharmony_ci#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val((pte)) }) 3158c2ecf20Sopenharmony_ci#define __swp_entry_to_pte(x) __pte((x).val) 3168c2ecf20Sopenharmony_ci 3178c2ecf20Sopenharmony_ciint map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot); 3188c2ecf20Sopenharmony_civoid unmap_kernel_page(unsigned long va); 3198c2ecf20Sopenharmony_ciextern int __meminit vmemmap_create_mapping(unsigned long start, 3208c2ecf20Sopenharmony_ci unsigned long page_size, 3218c2ecf20Sopenharmony_ci unsigned long phys); 3228c2ecf20Sopenharmony_ciextern void vmemmap_remove_mapping(unsigned long start, 3238c2ecf20Sopenharmony_ci unsigned long page_size); 3248c2ecf20Sopenharmony_ci#endif /* __ASSEMBLY__ */ 3258c2ecf20Sopenharmony_ci 3268c2ecf20Sopenharmony_ci#endif /* _ASM_POWERPC_NOHASH_64_PGTABLE_H */ 327