Commit 7cb710c9a617384cd0ed30638f3acc00125690fc

Authored by Sergei Shtylyov
Committed by Ralf Baechle
1 parent aa32374aaa

[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 */