1f2f4bf5aSAlex Dewar /* SPDX-License-Identifier: GPL-2.0 */ 28ede0bdbSAl Viro /* 38ede0bdbSAl Viro * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com) 48ede0bdbSAl Viro * Copyright 2003 PathScale, Inc. 58ede0bdbSAl Viro */ 68ede0bdbSAl Viro 78ede0bdbSAl Viro #ifndef __UM_PAGE_H 88ede0bdbSAl Viro #define __UM_PAGE_H 98ede0bdbSAl Viro 108ede0bdbSAl Viro #include <linux/const.h> 118ede0bdbSAl Viro 128ede0bdbSAl Viro /* PAGE_SHIFT determines the page size */ 138ede0bdbSAl Viro #define PAGE_SHIFT 12 148ede0bdbSAl Viro #define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) 158ede0bdbSAl Viro #define PAGE_MASK (~(PAGE_SIZE-1)) 168ede0bdbSAl Viro 178ede0bdbSAl Viro #ifndef __ASSEMBLY__ 188ede0bdbSAl Viro 198ede0bdbSAl Viro struct page; 208ede0bdbSAl Viro 2116da3068SDan Williams #include <linux/pfn.h> 228ede0bdbSAl Viro #include <linux/types.h> 23ab785c1dSAl Viro #include <asm/vm-flags.h> 248ede0bdbSAl Viro 258ede0bdbSAl Viro /* 268ede0bdbSAl Viro * These are used to make use of C type-checking.. 278ede0bdbSAl Viro */ 288ede0bdbSAl Viro 298ede0bdbSAl Viro #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) 308ede0bdbSAl Viro #define copy_page(to,from) memcpy((void *)(to), (void *)(from), PAGE_SIZE) 318ede0bdbSAl Viro 328ede0bdbSAl Viro #define clear_user_page(page, vaddr, pg) clear_page(page) 338ede0bdbSAl Viro #define copy_user_page(to, from, vaddr, pg) copy_page(to, from) 348ede0bdbSAl Viro 358ede0bdbSAl Viro #if defined(CONFIG_3_LEVEL_PGTABLES) && !defined(CONFIG_64BIT) 368ede0bdbSAl Viro 37012a4163SNicolai Stange typedef struct { unsigned long pte; } pte_t; 388ede0bdbSAl Viro typedef struct { unsigned long pmd; } pmd_t; 398ede0bdbSAl Viro typedef struct { unsigned long pgd; } pgd_t; 40012a4163SNicolai Stange #define pte_val(p) ((p).pte) 418ede0bdbSAl Viro 42012a4163SNicolai Stange #define pte_get_bits(p, bits) ((p).pte & (bits)) 43012a4163SNicolai Stange #define pte_set_bits(p, bits) ((p).pte |= (bits)) 44012a4163SNicolai Stange #define pte_clear_bits(p, bits) ((p).pte &= ~(bits)) 45012a4163SNicolai Stange #define pte_copy(to, from) ({ (to).pte = (from).pte; }) 46012a4163SNicolai Stange #define pte_is_zero(p) (!((p).pte & ~_PAGE_NEWPAGE)) 47012a4163SNicolai Stange #define pte_set_val(p, phys, prot) \ 48012a4163SNicolai Stange ({ (p).pte = (phys) | pgprot_val(prot); }) 498ede0bdbSAl Viro 508ede0bdbSAl Viro #define pmd_val(x) ((x).pmd) 518ede0bdbSAl Viro #define __pmd(x) ((pmd_t) { (x) } ) 528ede0bdbSAl Viro 538ede0bdbSAl Viro typedef unsigned long long phys_t; 548ede0bdbSAl Viro 558ede0bdbSAl Viro #else 568ede0bdbSAl Viro 578ede0bdbSAl Viro typedef struct { unsigned long pte; } pte_t; 588ede0bdbSAl Viro typedef struct { unsigned long pgd; } pgd_t; 598ede0bdbSAl Viro 608ede0bdbSAl Viro #ifdef CONFIG_3_LEVEL_PGTABLES 618ede0bdbSAl Viro typedef struct { unsigned long pmd; } pmd_t; 628ede0bdbSAl Viro #define pmd_val(x) ((x).pmd) 638ede0bdbSAl Viro #define __pmd(x) ((pmd_t) { (x) } ) 648ede0bdbSAl Viro #endif 658ede0bdbSAl Viro 668ede0bdbSAl Viro #define pte_val(x) ((x).pte) 678ede0bdbSAl Viro 688ede0bdbSAl Viro 698ede0bdbSAl Viro #define pte_get_bits(p, bits) ((p).pte & (bits)) 708ede0bdbSAl Viro #define pte_set_bits(p, bits) ((p).pte |= (bits)) 718ede0bdbSAl Viro #define pte_clear_bits(p, bits) ((p).pte &= ~(bits)) 728ede0bdbSAl Viro #define pte_copy(to, from) ((to).pte = (from).pte) 738ede0bdbSAl Viro #define pte_is_zero(p) (!((p).pte & ~_PAGE_NEWPAGE)) 748ede0bdbSAl Viro #define pte_set_val(p, phys, prot) (p).pte = (phys | pgprot_val(prot)) 758ede0bdbSAl Viro 768ede0bdbSAl Viro typedef unsigned long phys_t; 778ede0bdbSAl Viro 788ede0bdbSAl Viro #endif 798ede0bdbSAl Viro 808ede0bdbSAl Viro typedef struct { unsigned long pgprot; } pgprot_t; 818ede0bdbSAl Viro 828ede0bdbSAl Viro typedef struct page *pgtable_t; 838ede0bdbSAl Viro 848ede0bdbSAl Viro #define pgd_val(x) ((x).pgd) 858ede0bdbSAl Viro #define pgprot_val(x) ((x).pgprot) 868ede0bdbSAl Viro 878ede0bdbSAl Viro #define __pte(x) ((pte_t) { (x) } ) 888ede0bdbSAl Viro #define __pgd(x) ((pgd_t) { (x) } ) 898ede0bdbSAl Viro #define __pgprot(x) ((pgprot_t) { (x) } ) 908ede0bdbSAl Viro 918ede0bdbSAl Viro extern unsigned long uml_physmem; 928ede0bdbSAl Viro 938ede0bdbSAl Viro #define PAGE_OFFSET (uml_physmem) 948ede0bdbSAl Viro #define KERNELBASE PAGE_OFFSET 958ede0bdbSAl Viro 968ede0bdbSAl Viro #define __va_space (8*1024*1024) 978ede0bdbSAl Viro 9837185b33SAl Viro #include <mem.h> 998ede0bdbSAl Viro 1008ede0bdbSAl Viro /* Cast to unsigned long before casting to void * to avoid a warning from 1018ede0bdbSAl Viro * mmap_kmem about cutting a long long down to a void *. Not sure that 1028ede0bdbSAl Viro * casting is the right thing, but 32-bit UML can't have 64-bit virtual 1038ede0bdbSAl Viro * addresses 1048ede0bdbSAl Viro */ 105*097da1a4SGuenter Roeck #define __pa(virt) uml_to_phys((void *) (unsigned long) (virt)) 106*097da1a4SGuenter Roeck #define __va(phys) uml_to_virt((unsigned long) (phys)) 1078ede0bdbSAl Viro 10816da3068SDan Williams #define phys_to_pfn(p) ((p) >> PAGE_SHIFT) 10916da3068SDan Williams #define pfn_to_phys(pfn) PFN_PHYS(pfn) 1108ede0bdbSAl Viro 1118ede0bdbSAl Viro #define virt_addr_valid(v) pfn_valid(phys_to_pfn(__pa(v))) 1128ede0bdbSAl Viro 1138ede0bdbSAl Viro #include <asm-generic/memory_model.h> 1145b17e1cdSArnd Bergmann #include <asm-generic/getorder.h> 1158ede0bdbSAl Viro 1168ede0bdbSAl Viro #endif /* __ASSEMBLY__ */ 117a6c19dfeSAndy Lutomirski 118a6c19dfeSAndy Lutomirski #ifdef CONFIG_X86_32 119a6c19dfeSAndy Lutomirski #define __HAVE_ARCH_GATE_AREA 1 120a6c19dfeSAndy Lutomirski #endif 121a6c19dfeSAndy Lutomirski 1228ede0bdbSAl Viro #endif /* __UM_PAGE_H */ 123