Commit 7cb710c9a617384cd0ed30638f3acc00125690fc
Committed by
Ralf Baechle
1 parent
aa32374aaa
Exists in
master
and in
4 other branches
[MIPS] Fix non-linear memory mapping on MIPS
Fix the non-linear memory mapping done via remap_file_pages() -- it didn't work on any MIPS CPU because the page offset clashing with _PAGE_FILE and some other page protection bits which should have been left zeros for this kind of pages. Signed-off-by: Konstantin Baydarov <kbaidarov@ru.mvista.com> Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Showing 2 changed files with 31 additions and 27 deletions Side-by-side Diff
include/asm-mips/pgtable-32.h
| ... | ... | @@ -177,16 +177,18 @@ |
| 177 | 177 | ((swp_entry_t) { ((type) << 10) | ((offset) << 15) }) |
| 178 | 178 | |
| 179 | 179 | /* |
| 180 | - * Bits 0, 1, 2, 9 and 10 are taken, split up the 27 bits of offset | |
| 181 | - * into this range: | |
| 180 | + * Bits 0, 4, 8, and 9 are taken, split up 28 bits of offset into this range: | |
| 182 | 181 | */ |
| 183 | -#define PTE_FILE_MAX_BITS 27 | |
| 182 | +#define PTE_FILE_MAX_BITS 28 | |
| 184 | 183 | |
| 185 | -#define pte_to_pgoff(_pte) \ | |
| 186 | - ((((_pte).pte >> 3) & 0x3f ) + (((_pte).pte >> 11) << 8 )) | |
| 184 | +#define pte_to_pgoff(_pte) ((((_pte).pte >> 1 ) & 0x07) | \ | |
| 185 | + (((_pte).pte >> 2 ) & 0x38) | \ | |
| 186 | + (((_pte).pte >> 10) << 6 )) | |
| 187 | 187 | |
| 188 | -#define pgoff_to_pte(off) \ | |
| 189 | - ((pte_t) { (((off) & 0x3f) << 3) + (((off) >> 8) << 11) + _PAGE_FILE }) | |
| 188 | +#define pgoff_to_pte(off) ((pte_t) { (((off) & 0x07) << 1 ) | \ | |
| 189 | + (((off) & 0x38) << 2 ) | \ | |
| 190 | + (((off) >> 6 ) << 10) | \ | |
| 191 | + _PAGE_FILE }) | |
| 190 | 192 | |
| 191 | 193 | #else |
| 192 | 194 | |
| 193 | 195 | |
| 194 | 196 | |
| 195 | 197 | |
| 196 | 198 | |
| 197 | 199 | |
| ... | ... | @@ -203,24 +205,29 @@ |
| 203 | 205 | ((swp_entry_t) { ((type) << 8) | ((offset) << 13) }) |
| 204 | 206 | #endif /* defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32) */ |
| 205 | 207 | |
| 208 | +#if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32) | |
| 206 | 209 | /* |
| 207 | - * Bits 0, 1, 2, 7 and 8 are taken, split up the 27 bits of offset | |
| 208 | - * into this range: | |
| 210 | + * Bits 0 and 1 of pte_high are taken, use the rest for the page offset... | |
| 209 | 211 | */ |
| 210 | -#define PTE_FILE_MAX_BITS 27 | |
| 212 | +#define PTE_FILE_MAX_BITS 30 | |
| 211 | 213 | |
| 212 | -#if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32_R1) | |
| 213 | - /* fixme */ | |
| 214 | -#define pte_to_pgoff(_pte) (((_pte).pte_high >> 6) + ((_pte).pte_high & 0x3f)) | |
| 215 | -#define pgoff_to_pte(off) \ | |
| 216 | - ((pte_t){(((off) & 0x3f) + ((off) << 6) + _PAGE_FILE)}) | |
| 214 | +#define pte_to_pgoff(_pte) ((_pte).pte_high >> 2) | |
| 215 | +#define pgoff_to_pte(off) ((pte_t) { _PAGE_FILE, (off) << 2 }) | |
| 217 | 216 | |
| 218 | 217 | #else |
| 219 | -#define pte_to_pgoff(_pte) \ | |
| 220 | - ((((_pte).pte >> 3) & 0x1f ) + (((_pte).pte >> 9) << 6 )) | |
| 218 | +/* | |
| 219 | + * Bits 0, 4, 6, and 7 are taken, split up 28 bits of offset into this range: | |
| 220 | + */ | |
| 221 | +#define PTE_FILE_MAX_BITS 28 | |
| 221 | 222 | |
| 222 | -#define pgoff_to_pte(off) \ | |
| 223 | - ((pte_t) { (((off) & 0x1f) << 3) + (((off) >> 6) << 9) + _PAGE_FILE }) | |
| 223 | +#define pte_to_pgoff(_pte) ((((_pte).pte >> 1) & 0x7) | \ | |
| 224 | + (((_pte).pte >> 2) & 0x8) | \ | |
| 225 | + (((_pte).pte >> 8) << 4)) | |
| 226 | + | |
| 227 | +#define pgoff_to_pte(off) ((pte_t) { (((off) & 0x7) << 1) | \ | |
| 228 | + (((off) & 0x8) << 2) | \ | |
| 229 | + (((off) >> 4) << 8) | \ | |
| 230 | + _PAGE_FILE }) | |
| 224 | 231 | #endif |
| 225 | 232 | |
| 226 | 233 | #endif |
include/asm-mips/pgtable-64.h
| ... | ... | @@ -224,16 +224,13 @@ |
| 224 | 224 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) |
| 225 | 225 | |
| 226 | 226 | /* |
| 227 | - * Bits 0, 1, 2, 7 and 8 are taken, split up the 32 bits of offset | |
| 228 | - * into this range: | |
| 227 | + * Bits 0, 4, 6, and 7 are taken. Let's leave bits 1, 2, 3, and 5 alone to | |
| 228 | + * make things easier, and only use the upper 56 bits for the page offset... | |
| 229 | 229 | */ |
| 230 | -#define PTE_FILE_MAX_BITS 32 | |
| 230 | +#define PTE_FILE_MAX_BITS 56 | |
| 231 | 231 | |
| 232 | -#define pte_to_pgoff(_pte) \ | |
| 233 | - ((((_pte).pte >> 3) & 0x1f ) + (((_pte).pte >> 9) << 6 )) | |
| 234 | - | |
| 235 | -#define pgoff_to_pte(off) \ | |
| 236 | - ((pte_t) { (((off) & 0x1f) << 3) + (((off) >> 6) << 9) + _PAGE_FILE }) | |
| 232 | +#define pte_to_pgoff(_pte) ((_pte).pte >> 8) | |
| 233 | +#define pgoff_to_pte(off) ((pte_t) { ((off) << 8) | _PAGE_FILE }) | |
| 237 | 234 | |
| 238 | 235 | #endif /* _ASM_PGTABLE_64_H */ |