Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com)
0004  * Copyright 2003 PathScale, Inc.
0005  */
0006 
0007 #ifndef __UM_PAGE_H
0008 #define __UM_PAGE_H
0009 
0010 #include <linux/const.h>
0011 
0012 /* PAGE_SHIFT determines the page size */
0013 #define PAGE_SHIFT  12
0014 #define PAGE_SIZE   (_AC(1, UL) << PAGE_SHIFT)
0015 #define PAGE_MASK   (~(PAGE_SIZE-1))
0016 
0017 #ifndef __ASSEMBLY__
0018 
0019 struct page;
0020 
0021 #include <linux/pfn.h>
0022 #include <linux/types.h>
0023 #include <asm/vm-flags.h>
0024 
0025 /*
0026  * These are used to make use of C type-checking..
0027  */
0028 
0029 #define clear_page(page)    memset((void *)(page), 0, PAGE_SIZE)
0030 #define copy_page(to,from)  memcpy((void *)(to), (void *)(from), PAGE_SIZE)
0031 
0032 #define clear_user_page(page, vaddr, pg)    clear_page(page)
0033 #define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
0034 
0035 #if defined(CONFIG_3_LEVEL_PGTABLES) && !defined(CONFIG_64BIT)
0036 
0037 typedef struct { unsigned long pte; } pte_t;
0038 typedef struct { unsigned long pmd; } pmd_t;
0039 typedef struct { unsigned long pgd; } pgd_t;
0040 #define pte_val(p) ((p).pte)
0041 
0042 #define pte_get_bits(p, bits) ((p).pte & (bits))
0043 #define pte_set_bits(p, bits) ((p).pte |= (bits))
0044 #define pte_clear_bits(p, bits) ((p).pte &= ~(bits))
0045 #define pte_copy(to, from) ({ (to).pte = (from).pte; })
0046 #define pte_is_zero(p) (!((p).pte & ~_PAGE_NEWPAGE))
0047 #define pte_set_val(p, phys, prot) \
0048     ({ (p).pte = (phys) | pgprot_val(prot); })
0049 
0050 #define pmd_val(x)  ((x).pmd)
0051 #define __pmd(x) ((pmd_t) { (x) } )
0052 
0053 typedef unsigned long long phys_t;
0054 
0055 #else
0056 
0057 typedef struct { unsigned long pte; } pte_t;
0058 typedef struct { unsigned long pgd; } pgd_t;
0059 
0060 #ifdef CONFIG_3_LEVEL_PGTABLES
0061 typedef struct { unsigned long pmd; } pmd_t;
0062 #define pmd_val(x)  ((x).pmd)
0063 #define __pmd(x) ((pmd_t) { (x) } )
0064 #endif
0065 
0066 #define pte_val(x)  ((x).pte)
0067 
0068 
0069 #define pte_get_bits(p, bits) ((p).pte & (bits))
0070 #define pte_set_bits(p, bits) ((p).pte |= (bits))
0071 #define pte_clear_bits(p, bits) ((p).pte &= ~(bits))
0072 #define pte_copy(to, from) ((to).pte = (from).pte)
0073 #define pte_is_zero(p) (!((p).pte & ~_PAGE_NEWPAGE))
0074 #define pte_set_val(p, phys, prot) (p).pte = (phys | pgprot_val(prot))
0075 
0076 typedef unsigned long phys_t;
0077 
0078 #endif
0079 
0080 typedef struct { unsigned long pgprot; } pgprot_t;
0081 
0082 typedef struct page *pgtable_t;
0083 
0084 #define pgd_val(x)  ((x).pgd)
0085 #define pgprot_val(x)   ((x).pgprot)
0086 
0087 #define __pte(x) ((pte_t) { (x) } )
0088 #define __pgd(x) ((pgd_t) { (x) } )
0089 #define __pgprot(x) ((pgprot_t) { (x) } )
0090 
0091 extern unsigned long uml_physmem;
0092 
0093 #define PAGE_OFFSET (uml_physmem)
0094 #define KERNELBASE PAGE_OFFSET
0095 
0096 #define __va_space (8*1024*1024)
0097 
0098 #include <mem.h>
0099 
0100 /* Cast to unsigned long before casting to void * to avoid a warning from
0101  * mmap_kmem about cutting a long long down to a void *.  Not sure that
0102  * casting is the right thing, but 32-bit UML can't have 64-bit virtual
0103  * addresses
0104  */
0105 #define __pa(virt) uml_to_phys((void *) (unsigned long) (virt))
0106 #define __va(phys) uml_to_virt((unsigned long) (phys))
0107 
0108 #define phys_to_pfn(p) ((p) >> PAGE_SHIFT)
0109 #define pfn_to_phys(pfn) PFN_PHYS(pfn)
0110 
0111 #define pfn_valid(pfn) ((pfn) < max_mapnr)
0112 #define virt_addr_valid(v) pfn_valid(phys_to_pfn(__pa(v)))
0113 
0114 #include <asm-generic/memory_model.h>
0115 #include <asm-generic/getorder.h>
0116 
0117 #endif  /* __ASSEMBLY__ */
0118 
0119 #ifdef CONFIG_X86_32
0120 #define __HAVE_ARCH_GATE_AREA 1
0121 #endif
0122 
0123 #endif  /* __UM_PAGE_H */