diff options
author | Stuart Menefy <stuart.menefy@st.com> | 2006-11-21 01:38:05 -0500 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2006-12-05 20:45:38 -0500 |
commit | 99a596f93be10001c50894bcab69e458a49a3b8c (patch) | |
tree | 16faf593cc3f7a2c39f3079f0f64f410e530e1c4 /include/asm-sh/pgtable.h | |
parent | 6e4662ff49c6b94e16a47bfddb920576963b5a20 (diff) |
sh: pmd rework.
Remove extra bits from the pmd structure and store a kernel logical
address rather than a physical address. This allows it to be directly
dereferenced. Another piece of wierdness inherited from x86.
Signed-off-by: Stuart Menefy <stuart.menefy@st.com>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'include/asm-sh/pgtable.h')
-rw-r--r-- | include/asm-sh/pgtable.h | 38 |
1 files changed, 11 insertions, 27 deletions
diff --git a/include/asm-sh/pgtable.h b/include/asm-sh/pgtable.h index 22c3d0b3e11a..b1f21e765640 100644 --- a/include/asm-sh/pgtable.h +++ b/include/asm-sh/pgtable.h | |||
@@ -203,26 +203,18 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]; | |||
203 | #ifndef __ASSEMBLY__ | 203 | #ifndef __ASSEMBLY__ |
204 | 204 | ||
205 | #if defined(CONFIG_X2TLB) /* SH-X2 TLB */ | 205 | #if defined(CONFIG_X2TLB) /* SH-X2 TLB */ |
206 | #define _PAGE_TABLE \ | ||
207 | (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY | \ | ||
208 | _PAGE_EXT(_PAGE_EXT_USER_READ | _PAGE_EXT_USER_WRITE)) | ||
209 | |||
210 | #define _KERNPG_TABLE \ | ||
211 | (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_DIRTY | \ | ||
212 | _PAGE_EXT(_PAGE_EXT_KERN_READ | _PAGE_EXT_KERN_WRITE)) | ||
213 | |||
214 | #define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_CACHABLE | \ | 206 | #define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_CACHABLE | \ |
215 | _PAGE_ACCESSED | _PAGE_FLAGS_HARD) | 207 | _PAGE_ACCESSED | _PAGE_FLAGS_HARD) |
216 | 208 | ||
217 | #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | \ | 209 | #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | \ |
218 | _PAGE_CACHABLE | _PAGE_FLAGS_HARD | \ | 210 | _PAGE_CACHABLE | _PAGE_FLAGS_HARD | \ |
219 | _PAGE_EXT(_PAGE_EXT_USER_READ | \ | 211 | _PAGE_EXT(_PAGE_EXT_USER_READ | \ |
220 | _PAGE_EXT_USER_WRITE)) | 212 | _PAGE_EXT_USER_WRITE)) |
221 | 213 | ||
222 | #define PAGE_EXECREAD __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | \ | 214 | #define PAGE_EXECREAD __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | \ |
223 | _PAGE_CACHABLE | _PAGE_FLAGS_HARD | \ | 215 | _PAGE_CACHABLE | _PAGE_FLAGS_HARD | \ |
224 | _PAGE_EXT(_PAGE_EXT_USER_EXEC | \ | 216 | _PAGE_EXT(_PAGE_EXT_USER_EXEC | \ |
225 | _PAGE_EXT_USER_READ)) | 217 | _PAGE_EXT_USER_READ)) |
226 | 218 | ||
227 | #define PAGE_COPY PAGE_EXECREAD | 219 | #define PAGE_COPY PAGE_EXECREAD |
228 | 220 | ||
@@ -237,14 +229,14 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]; | |||
237 | #define PAGE_RWX __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | \ | 229 | #define PAGE_RWX __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED | \ |
238 | _PAGE_CACHABLE | _PAGE_FLAGS_HARD | \ | 230 | _PAGE_CACHABLE | _PAGE_FLAGS_HARD | \ |
239 | _PAGE_EXT(_PAGE_EXT_USER_WRITE | \ | 231 | _PAGE_EXT(_PAGE_EXT_USER_WRITE | \ |
240 | _PAGE_EXT_USER_READ | \ | 232 | _PAGE_EXT_USER_READ | \ |
241 | _PAGE_EXT_USER_EXEC)) | 233 | _PAGE_EXT_USER_EXEC)) |
242 | 234 | ||
243 | #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_CACHABLE | \ | 235 | #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_CACHABLE | \ |
244 | _PAGE_DIRTY | _PAGE_ACCESSED | \ | 236 | _PAGE_DIRTY | _PAGE_ACCESSED | \ |
245 | _PAGE_HW_SHARED | _PAGE_FLAGS_HARD | \ | 237 | _PAGE_HW_SHARED | _PAGE_FLAGS_HARD | \ |
246 | _PAGE_EXT(_PAGE_EXT_KERN_READ | \ | 238 | _PAGE_EXT(_PAGE_EXT_KERN_READ | \ |
247 | _PAGE_EXT_KERN_WRITE | \ | 239 | _PAGE_EXT_KERN_WRITE | \ |
248 | _PAGE_EXT_KERN_EXEC)) | 240 | _PAGE_EXT_KERN_EXEC)) |
249 | 241 | ||
250 | #define PAGE_KERNEL_NOCACHE \ | 242 | #define PAGE_KERNEL_NOCACHE \ |
@@ -252,30 +244,25 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]; | |||
252 | _PAGE_ACCESSED | _PAGE_HW_SHARED | \ | 244 | _PAGE_ACCESSED | _PAGE_HW_SHARED | \ |
253 | _PAGE_FLAGS_HARD | \ | 245 | _PAGE_FLAGS_HARD | \ |
254 | _PAGE_EXT(_PAGE_EXT_KERN_READ | \ | 246 | _PAGE_EXT(_PAGE_EXT_KERN_READ | \ |
255 | _PAGE_EXT_KERN_WRITE | \ | 247 | _PAGE_EXT_KERN_WRITE | \ |
256 | _PAGE_EXT_KERN_EXEC)) | 248 | _PAGE_EXT_KERN_EXEC)) |
257 | 249 | ||
258 | #define PAGE_KERNEL_RO __pgprot(_PAGE_PRESENT | _PAGE_CACHABLE | \ | 250 | #define PAGE_KERNEL_RO __pgprot(_PAGE_PRESENT | _PAGE_CACHABLE | \ |
259 | _PAGE_DIRTY | _PAGE_ACCESSED | \ | 251 | _PAGE_DIRTY | _PAGE_ACCESSED | \ |
260 | _PAGE_HW_SHARED | _PAGE_FLAGS_HARD | \ | 252 | _PAGE_HW_SHARED | _PAGE_FLAGS_HARD | \ |
261 | _PAGE_EXT(_PAGE_EXT_KERN_READ | \ | 253 | _PAGE_EXT(_PAGE_EXT_KERN_READ | \ |
262 | _PAGE_EXT_KERN_EXEC)) | 254 | _PAGE_EXT_KERN_EXEC)) |
263 | 255 | ||
264 | #define PAGE_KERNEL_PCC(slot, type) \ | 256 | #define PAGE_KERNEL_PCC(slot, type) \ |
265 | __pgprot(_PAGE_PRESENT | _PAGE_DIRTY | \ | 257 | __pgprot(_PAGE_PRESENT | _PAGE_DIRTY | \ |
266 | _PAGE_ACCESSED | _PAGE_FLAGS_HARD | \ | 258 | _PAGE_ACCESSED | _PAGE_FLAGS_HARD | \ |
267 | _PAGE_EXT(_PAGE_EXT_KERN_READ | \ | 259 | _PAGE_EXT(_PAGE_EXT_KERN_READ | \ |
268 | _PAGE_EXT_KERN_WRITE | \ | 260 | _PAGE_EXT_KERN_WRITE | \ |
269 | _PAGE_EXT_KERN_EXEC) \ | 261 | _PAGE_EXT_KERN_EXEC) \ |
270 | (slot ? _PAGE_PCC_AREA5 : _PAGE_PCC_AREA6) | \ | 262 | (slot ? _PAGE_PCC_AREA5 : _PAGE_PCC_AREA6) | \ |
271 | (type)) | 263 | (type)) |
272 | 264 | ||
273 | #elif defined(CONFIG_MMU) /* SH-X TLB */ | 265 | #elif defined(CONFIG_MMU) /* SH-X TLB */ |
274 | #define _PAGE_TABLE \ | ||
275 | (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY) | ||
276 | #define _KERNPG_TABLE \ | ||
277 | (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY) | ||
278 | |||
279 | #define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_CACHABLE | \ | 266 | #define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_CACHABLE | \ |
280 | _PAGE_ACCESSED | _PAGE_FLAGS_HARD) | 267 | _PAGE_ACCESSED | _PAGE_FLAGS_HARD) |
281 | 268 | ||
@@ -390,9 +377,9 @@ static inline void set_pte(pte_t *ptep, pte_t pte) | |||
390 | #define pte_clear(mm,addr,xp) do { set_pte_at(mm, addr, xp, __pte(0)); } while (0) | 377 | #define pte_clear(mm,addr,xp) do { set_pte_at(mm, addr, xp, __pte(0)); } while (0) |
391 | 378 | ||
392 | #define pmd_none(x) (!pmd_val(x)) | 379 | #define pmd_none(x) (!pmd_val(x)) |
393 | #define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT) | 380 | #define pmd_present(x) (pmd_val(x)) |
394 | #define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0) | 381 | #define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0) |
395 | #define pmd_bad(x) ((pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE) | 382 | #define pmd_bad(x) (pmd_val(x) & ~PAGE_MASK) |
396 | 383 | ||
397 | #define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT)) | 384 | #define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT)) |
398 | #define pte_page(x) phys_to_page(pte_val(x)&PTE_PHYS_MASK) | 385 | #define pte_page(x) phys_to_page(pte_val(x)&PTE_PHYS_MASK) |
@@ -477,11 +464,8 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | |||
477 | return pte; | 464 | return pte; |
478 | } | 465 | } |
479 | 466 | ||
480 | #define pmd_page_vaddr(pmd) \ | 467 | #define pmd_page_vaddr(pmd) pmd_val(pmd) |
481 | ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK)) | 468 | #define pmd_page(pmd) (virt_to_page(pmd_val(pmd))) |
482 | |||
483 | #define pmd_page(pmd) \ | ||
484 | (phys_to_page(pmd_val(pmd))) | ||
485 | 469 | ||
486 | /* to find an entry in a page-table-directory. */ | 470 | /* to find an entry in a page-table-directory. */ |
487 | #define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1)) | 471 | #define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1)) |