18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com)
48c2ecf20Sopenharmony_ci * Copyright 2003 PathScale, Inc.
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#ifndef __UM_PAGE_H
88c2ecf20Sopenharmony_ci#define __UM_PAGE_H
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include <linux/const.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci/* PAGE_SHIFT determines the page size */
138c2ecf20Sopenharmony_ci#define PAGE_SHIFT	12
148c2ecf20Sopenharmony_ci#define PAGE_SIZE	(_AC(1, UL) << PAGE_SHIFT)
158c2ecf20Sopenharmony_ci#define PAGE_MASK	(~(PAGE_SIZE-1))
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#ifndef __ASSEMBLY__
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_cistruct page;
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#include <linux/pfn.h>
228c2ecf20Sopenharmony_ci#include <linux/types.h>
238c2ecf20Sopenharmony_ci#include <asm/vm-flags.h>
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci/*
268c2ecf20Sopenharmony_ci * These are used to make use of C type-checking..
278c2ecf20Sopenharmony_ci */
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci#define clear_page(page)	memset((void *)(page), 0, PAGE_SIZE)
308c2ecf20Sopenharmony_ci#define copy_page(to,from)	memcpy((void *)(to), (void *)(from), PAGE_SIZE)
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci#define clear_user_page(page, vaddr, pg)	clear_page(page)
338c2ecf20Sopenharmony_ci#define copy_user_page(to, from, vaddr, pg)	copy_page(to, from)
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci#if defined(CONFIG_3_LEVEL_PGTABLES) && !defined(CONFIG_64BIT)
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_citypedef struct { unsigned long pte; } pte_t;
388c2ecf20Sopenharmony_citypedef struct { unsigned long pmd; } pmd_t;
398c2ecf20Sopenharmony_citypedef struct { unsigned long pgd; } pgd_t;
408c2ecf20Sopenharmony_ci#define pte_val(p) ((p).pte)
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci#define pte_get_bits(p, bits) ((p).pte & (bits))
438c2ecf20Sopenharmony_ci#define pte_set_bits(p, bits) ((p).pte |= (bits))
448c2ecf20Sopenharmony_ci#define pte_clear_bits(p, bits) ((p).pte &= ~(bits))
458c2ecf20Sopenharmony_ci#define pte_copy(to, from) ({ (to).pte = (from).pte; })
468c2ecf20Sopenharmony_ci#define pte_is_zero(p) (!((p).pte & ~_PAGE_NEWPAGE))
478c2ecf20Sopenharmony_ci#define pte_set_val(p, phys, prot) \
488c2ecf20Sopenharmony_ci	({ (p).pte = (phys) | pgprot_val(prot); })
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci#define pmd_val(x)	((x).pmd)
518c2ecf20Sopenharmony_ci#define __pmd(x) ((pmd_t) { (x) } )
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_citypedef unsigned long long phys_t;
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci#else
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_citypedef struct { unsigned long pte; } pte_t;
588c2ecf20Sopenharmony_citypedef struct { unsigned long pgd; } pgd_t;
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci#ifdef CONFIG_3_LEVEL_PGTABLES
618c2ecf20Sopenharmony_citypedef struct { unsigned long pmd; } pmd_t;
628c2ecf20Sopenharmony_ci#define pmd_val(x)	((x).pmd)
638c2ecf20Sopenharmony_ci#define __pmd(x) ((pmd_t) { (x) } )
648c2ecf20Sopenharmony_ci#endif
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci#define pte_val(x)	((x).pte)
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci#define pte_get_bits(p, bits) ((p).pte & (bits))
708c2ecf20Sopenharmony_ci#define pte_set_bits(p, bits) ((p).pte |= (bits))
718c2ecf20Sopenharmony_ci#define pte_clear_bits(p, bits) ((p).pte &= ~(bits))
728c2ecf20Sopenharmony_ci#define pte_copy(to, from) ((to).pte = (from).pte)
738c2ecf20Sopenharmony_ci#define pte_is_zero(p) (!((p).pte & ~_PAGE_NEWPAGE))
748c2ecf20Sopenharmony_ci#define pte_set_val(p, phys, prot) (p).pte = (phys | pgprot_val(prot))
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_citypedef unsigned long phys_t;
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ci#endif
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_citypedef struct { unsigned long pgprot; } pgprot_t;
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_citypedef struct page *pgtable_t;
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci#define pgd_val(x)	((x).pgd)
858c2ecf20Sopenharmony_ci#define pgprot_val(x)	((x).pgprot)
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci#define __pte(x) ((pte_t) { (x) } )
888c2ecf20Sopenharmony_ci#define __pgd(x) ((pgd_t) { (x) } )
898c2ecf20Sopenharmony_ci#define __pgprot(x)	((pgprot_t) { (x) } )
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ciextern unsigned long uml_physmem;
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci#define PAGE_OFFSET (uml_physmem)
948c2ecf20Sopenharmony_ci#define KERNELBASE PAGE_OFFSET
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ci#define __va_space (8*1024*1024)
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci#include <mem.h>
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci/* Cast to unsigned long before casting to void * to avoid a warning from
1018c2ecf20Sopenharmony_ci * mmap_kmem about cutting a long long down to a void *.  Not sure that
1028c2ecf20Sopenharmony_ci * casting is the right thing, but 32-bit UML can't have 64-bit virtual
1038c2ecf20Sopenharmony_ci * addresses
1048c2ecf20Sopenharmony_ci */
1058c2ecf20Sopenharmony_ci#define __pa(virt) to_phys((void *) (unsigned long) (virt))
1068c2ecf20Sopenharmony_ci#define __va(phys) to_virt((unsigned long) (phys))
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_ci#define phys_to_pfn(p) ((p) >> PAGE_SHIFT)
1098c2ecf20Sopenharmony_ci#define pfn_to_phys(pfn) PFN_PHYS(pfn)
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_ci#define pfn_valid(pfn) ((pfn) < max_mapnr)
1128c2ecf20Sopenharmony_ci#define virt_addr_valid(v) pfn_valid(phys_to_pfn(__pa(v)))
1138c2ecf20Sopenharmony_ci
1148c2ecf20Sopenharmony_ci#include <asm-generic/memory_model.h>
1158c2ecf20Sopenharmony_ci#include <asm-generic/getorder.h>
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci#endif	/* __ASSEMBLY__ */
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci#ifdef CONFIG_X86_32
1208c2ecf20Sopenharmony_ci#define __HAVE_ARCH_GATE_AREA 1
1218c2ecf20Sopenharmony_ci#endif
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci#endif	/* __UM_PAGE_H */
124