diff options
Diffstat (limited to 'include/asm-s390/page.h')
| -rw-r--r-- | include/asm-s390/page.h | 49 |
1 files changed, 23 insertions, 26 deletions
diff --git a/include/asm-s390/page.h b/include/asm-s390/page.h index fe7f92b6ae6d..f0f4579eac13 100644 --- a/include/asm-s390/page.h +++ b/include/asm-s390/page.h | |||
| @@ -19,17 +19,34 @@ | |||
| 19 | #define PAGE_DEFAULT_ACC 0 | 19 | #define PAGE_DEFAULT_ACC 0 |
| 20 | #define PAGE_DEFAULT_KEY (PAGE_DEFAULT_ACC << 4) | 20 | #define PAGE_DEFAULT_KEY (PAGE_DEFAULT_ACC << 4) |
| 21 | 21 | ||
| 22 | #define HPAGE_SHIFT 20 | ||
| 23 | #define HPAGE_SIZE (1UL << HPAGE_SHIFT) | ||
| 24 | #define HPAGE_MASK (~(HPAGE_SIZE - 1)) | ||
| 25 | #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) | ||
| 26 | |||
| 27 | #define ARCH_HAS_SETCLEAR_HUGE_PTE | ||
| 28 | #define ARCH_HAS_HUGE_PTE_TYPE | ||
| 29 | #define ARCH_HAS_PREPARE_HUGEPAGE | ||
| 30 | #define ARCH_HAS_HUGEPAGE_CLEAR_FLUSH | ||
| 31 | |||
| 22 | #include <asm/setup.h> | 32 | #include <asm/setup.h> |
| 23 | #ifndef __ASSEMBLY__ | 33 | #ifndef __ASSEMBLY__ |
| 24 | 34 | ||
| 25 | static inline void clear_page(void *page) | 35 | static inline void clear_page(void *page) |
| 26 | { | 36 | { |
| 27 | register unsigned long reg1 asm ("1") = 0; | 37 | if (MACHINE_HAS_PFMF) { |
| 28 | register void *reg2 asm ("2") = page; | 38 | asm volatile( |
| 29 | register unsigned long reg3 asm ("3") = 4096; | 39 | " .insn rre,0xb9af0000,%0,%1" |
| 30 | asm volatile( | 40 | : : "d" (0x10000), "a" (page) : "memory", "cc"); |
| 31 | " mvcl 2,0" | 41 | } else { |
| 32 | : "+d" (reg2), "+d" (reg3) : "d" (reg1) : "memory", "cc"); | 42 | register unsigned long reg1 asm ("1") = 0; |
| 43 | register void *reg2 asm ("2") = page; | ||
| 44 | register unsigned long reg3 asm ("3") = 4096; | ||
| 45 | asm volatile( | ||
| 46 | " mvcl 2,0" | ||
| 47 | : "+d" (reg2), "+d" (reg3) : "d" (reg1) | ||
| 48 | : "memory", "cc"); | ||
| 49 | } | ||
| 33 | } | 50 | } |
| 34 | 51 | ||
| 35 | static inline void copy_page(void *to, void *from) | 52 | static inline void copy_page(void *to, void *from) |
| @@ -108,26 +125,6 @@ page_get_storage_key(unsigned long addr) | |||
| 108 | return skey; | 125 | return skey; |
| 109 | } | 126 | } |
| 110 | 127 | ||
| 111 | extern unsigned long max_pfn; | ||
| 112 | |||
| 113 | static inline int pfn_valid(unsigned long pfn) | ||
| 114 | { | ||
| 115 | unsigned long dummy; | ||
| 116 | int ccode; | ||
| 117 | |||
| 118 | if (pfn >= max_pfn) | ||
| 119 | return 0; | ||
| 120 | |||
| 121 | asm volatile( | ||
| 122 | " lra %0,0(%2)\n" | ||
| 123 | " ipm %1\n" | ||
| 124 | " srl %1,28\n" | ||
| 125 | : "=d" (dummy), "=d" (ccode) | ||
| 126 | : "a" (pfn << PAGE_SHIFT) | ||
| 127 | : "cc"); | ||
| 128 | return !ccode; | ||
| 129 | } | ||
| 130 | |||
| 131 | #endif /* !__ASSEMBLY__ */ | 128 | #endif /* !__ASSEMBLY__ */ |
| 132 | 129 | ||
| 133 | /* to align the pointer to the (next) page boundary */ | 130 | /* to align the pointer to the (next) page boundary */ |
