diff options
Diffstat (limited to 'include/asm-powerpc/page_64.h')
-rw-r--r-- | include/asm-powerpc/page_64.h | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/include/asm-powerpc/page_64.h b/include/asm-powerpc/page_64.h index 1e6e7846824f..6642c0125001 100644 --- a/include/asm-powerpc/page_64.h +++ b/include/asm-powerpc/page_64.h | |||
@@ -103,8 +103,9 @@ extern unsigned int HPAGE_SHIFT; | |||
103 | #define HTLB_AREA_SIZE (1UL << HTLB_AREA_SHIFT) | 103 | #define HTLB_AREA_SIZE (1UL << HTLB_AREA_SHIFT) |
104 | #define GET_HTLB_AREA(x) ((x) >> HTLB_AREA_SHIFT) | 104 | #define GET_HTLB_AREA(x) ((x) >> HTLB_AREA_SHIFT) |
105 | 105 | ||
106 | #define LOW_ESID_MASK(addr, len) (((1U << (GET_ESID(addr+len-1)+1)) \ | 106 | #define LOW_ESID_MASK(addr, len) \ |
107 | - (1U << GET_ESID(addr))) & 0xffff) | 107 | (((1U << (GET_ESID(min((addr)+(len)-1, 0x100000000UL))+1)) \ |
108 | - (1U << GET_ESID(min((addr), 0x100000000UL)))) & 0xffff) | ||
108 | #define HTLB_AREA_MASK(addr, len) (((1U << (GET_HTLB_AREA(addr+len-1)+1)) \ | 109 | #define HTLB_AREA_MASK(addr, len) (((1U << (GET_HTLB_AREA(addr+len-1)+1)) \ |
109 | - (1U << GET_HTLB_AREA(addr))) & 0xffff) | 110 | - (1U << GET_HTLB_AREA(addr))) & 0xffff) |
110 | 111 | ||
@@ -113,17 +114,21 @@ extern unsigned int HPAGE_SHIFT; | |||
113 | #define ARCH_HAS_SETCLEAR_HUGE_PTE | 114 | #define ARCH_HAS_SETCLEAR_HUGE_PTE |
114 | 115 | ||
115 | #define touches_hugepage_low_range(mm, addr, len) \ | 116 | #define touches_hugepage_low_range(mm, addr, len) \ |
116 | (LOW_ESID_MASK((addr), (len)) & (mm)->context.low_htlb_areas) | 117 | (((addr) < 0x100000000UL) \ |
118 | && (LOW_ESID_MASK((addr), (len)) & (mm)->context.low_htlb_areas)) | ||
117 | #define touches_hugepage_high_range(mm, addr, len) \ | 119 | #define touches_hugepage_high_range(mm, addr, len) \ |
118 | (HTLB_AREA_MASK((addr), (len)) & (mm)->context.high_htlb_areas) | 120 | ((((addr) + (len)) > 0x100000000UL) \ |
121 | && (HTLB_AREA_MASK((addr), (len)) & (mm)->context.high_htlb_areas)) | ||
119 | 122 | ||
120 | #define __within_hugepage_low_range(addr, len, segmask) \ | 123 | #define __within_hugepage_low_range(addr, len, segmask) \ |
121 | ((LOW_ESID_MASK((addr), (len)) | (segmask)) == (segmask)) | 124 | ( (((addr)+(len)) <= 0x100000000UL) \ |
125 | && ((LOW_ESID_MASK((addr), (len)) | (segmask)) == (segmask))) | ||
122 | #define within_hugepage_low_range(addr, len) \ | 126 | #define within_hugepage_low_range(addr, len) \ |
123 | __within_hugepage_low_range((addr), (len), \ | 127 | __within_hugepage_low_range((addr), (len), \ |
124 | current->mm->context.low_htlb_areas) | 128 | current->mm->context.low_htlb_areas) |
125 | #define __within_hugepage_high_range(addr, len, zonemask) \ | 129 | #define __within_hugepage_high_range(addr, len, zonemask) \ |
126 | ((HTLB_AREA_MASK((addr), (len)) | (zonemask)) == (zonemask)) | 130 | ( ((addr) >= 0x100000000UL) \ |
131 | && ((HTLB_AREA_MASK((addr), (len)) | (zonemask)) == (zonemask))) | ||
127 | #define within_hugepage_high_range(addr, len) \ | 132 | #define within_hugepage_high_range(addr, len) \ |
128 | __within_hugepage_high_range((addr), (len), \ | 133 | __within_hugepage_high_range((addr), (len), \ |
129 | current->mm->context.high_htlb_areas) | 134 | current->mm->context.high_htlb_areas) |
@@ -135,9 +140,9 @@ extern unsigned int HPAGE_SHIFT; | |||
135 | 140 | ||
136 | #define in_hugepage_area(context, addr) \ | 141 | #define in_hugepage_area(context, addr) \ |
137 | (cpu_has_feature(CPU_FTR_16M_PAGE) && \ | 142 | (cpu_has_feature(CPU_FTR_16M_PAGE) && \ |
138 | ( ((1 << GET_HTLB_AREA(addr)) & (context).high_htlb_areas) || \ | 143 | ( ( (addr) >= 0x100000000UL) \ |
139 | ( ((addr) < 0x100000000L) && \ | 144 | ? ((1 << GET_HTLB_AREA(addr)) & (context).high_htlb_areas) \ |
140 | ((1 << GET_ESID(addr)) & (context).low_htlb_areas) ) ) ) | 145 | : ((1 << GET_ESID(addr)) & (context).low_htlb_areas) ) ) |
141 | 146 | ||
142 | #else /* !CONFIG_HUGETLB_PAGE */ | 147 | #else /* !CONFIG_HUGETLB_PAGE */ |
143 | 148 | ||