1251876Speter/* SPDX-License-Identifier: GPL-2.0 */ 2251876Speter#ifndef _ASM_X86_PAGE_H 3251876Speter#define _ASM_X86_PAGE_H 4251876Speter 5251876Speter#include <linux/types.h> 6251876Speter 7251876Speter#ifdef __KERNEL__ 8251876Speter 9251876Speter#include <asm/page_types.h> 10251876Speter 11251876Speter#ifdef CONFIG_X86_64 12251876Speter#include <asm/page_64.h> 13251876Speter#else 14251876Speter#include <asm/page_32.h> 15251876Speter#endif /* CONFIG_X86_64 */ 16251876Speter 17251876Speter#ifndef __ASSEMBLY__ 18251876Speter 19251876Speterstruct page; 20251876Speter 21251876Speter#include <linux/range.h> 22251876Speterextern struct range pfn_mapped[]; 23251876Speterextern int nr_pfn_mapped; 24251876Speter 25251876Speterstatic inline void clear_user_page(void *page, unsigned long vaddr, 26251876Speter struct page *pg) 27251876Speter{ 28251876Speter clear_page(page); 29251876Speter} 30251876Speter 31251876Speterstatic inline void copy_user_page(void *to, void *from, unsigned long vaddr, 32251876Speter struct page *topage) 33251876Speter{ 34251876Speter copy_page(to, from); 35251876Speter} 36251876Speter 37251876Speter#define vma_alloc_zeroed_movable_folio(vma, vaddr) \ 38251876Speter vma_alloc_folio(GFP_HIGHUSER_MOVABLE | __GFP_ZERO, 0, vma, vaddr, false) 39251876Speter 40251876Speter#ifndef __pa 41251876Speter#define __pa(x) __phys_addr((unsigned long)(x)) 42251876Speter#endif 43251876Speter 44251876Speter#define __pa_nodebug(x) __phys_addr_nodebug((unsigned long)(x)) 45251876Speter/* __pa_symbol should be used for C visible symbols. 46251876Speter This seems to be the official gcc blessed way to do such arithmetic. */ 47251876Speter/* 48251876Speter * We need __phys_reloc_hide() here because gcc may assume that there is no 49251876Speter * overflow during __pa() calculation and can optimize it unexpectedly. 50251876Speter * Newer versions of gcc provide -fno-strict-overflow switch to handle this 51251876Speter * case properly. Once all supported versions of gcc understand it, we can 52251876Speter * remove this Voodoo magic stuff. (i.e. once gcc3.x is deprecated) 53251876Speter */ 54251876Speter#define __pa_symbol(x) \ 55251876Speter __phys_addr_symbol(__phys_reloc_hide((unsigned long)(x))) 56251876Speter 57251876Speter#ifndef __va 58251876Speter#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) 59251876Speter#endif 60251876Speter 61251876Speter#define __boot_va(x) __va(x) 62251876Speter#define __boot_pa(x) __pa(x) 63251876Speter 64251876Speter/* 65251876Speter * virt_to_page(kaddr) returns a valid pointer if and only if 66251876Speter * virt_addr_valid(kaddr) returns true. 67251876Speter */ 68251876Speter#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) 69251876Speterextern bool __virt_addr_valid(unsigned long kaddr); 70251876Speter#define virt_addr_valid(kaddr) __virt_addr_valid((unsigned long) (kaddr)) 71251876Speter 72251876Speterstatic __always_inline void *pfn_to_kaddr(unsigned long pfn) 73251876Speter{ 74251876Speter return __va(pfn << PAGE_SHIFT); 75251876Speter} 76251876Speter 77251876Speterstatic __always_inline u64 __canonical_address(u64 vaddr, u8 vaddr_bits) 78251876Speter{ 79251876Speter return ((s64)vaddr << (64 - vaddr_bits)) >> (64 - vaddr_bits); 80251876Speter} 81251876Speter 82251876Speterstatic __always_inline u64 __is_canonical_address(u64 vaddr, u8 vaddr_bits) 83251876Speter{ 84251876Speter return __canonical_address(vaddr, vaddr_bits) == vaddr; 85251876Speter} 86251876Speter 87251876Speter#endif /* __ASSEMBLY__ */ 88251876Speter 89251876Speter#include <asm-generic/memory_model.h> 90251876Speter#include <asm-generic/getorder.h> 91251876Speter 92251876Speter#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA 93251876Speter 94251876Speter#endif /* __KERNEL__ */ 95251876Speter#endif /* _ASM_X86_PAGE_H */ 96251876Speter