parisc: fix usage of 32bit PTE page table entries on 32bit kernels
authorHelge Deller <deller@gmx.de>
Sun, 18 Jan 2009 18:16:16 +0000 (19:16 +0100)
committerKyle McMartin <kyle@mcmartin.ca>
Tue, 31 Mar 2009 02:51:33 +0000 (02:51 +0000)
commit48d27cb2299c0b2fc4d551bddb6a1005828dc0c6
tree3f1d8df3a8a417264053425e706e4acce64116a9
parent15f7176eb1cccec0a332541285ee752b935c1c85
parisc: fix usage of 32bit PTE page table entries on 32bit kernels

This patch fixes a long outstanding bug on 32bit parisc linux kernels
which prevented us from using 32bit PTE table entries (instead of 64bit
entries of which 32bit were unused).

The problem was caused by this assembler statement in the L2_ptep
macro in arch/parisc/kernel/entry.S:447:
EXTR \va,31-ASM_PGDIR_SHIFT,ASM_BITS_PER_PGD,\index
which expanded to
extrw,u r8,9,11,r1
and which has undefined behavior since the length value (11) extends
beyond the leftmost bit (11-1 > 9).
Interestingly PA2.0 processors seem to don't care and just zero-extend
the value, while PA1.1 processors don't.

Fix this problem by detecting an address space overflow with ASM_BITS_PER_PGD
and adjusting it accordingly. To prevent such problems in the future,
some compile time sanity checks in arch/parisc/mm/init.c were added.

Since the page table now only consumes half of it's old size, we can
use the freed memory to harmonize 32- and 64bit kernels and let both
map 16MB for the initial page table.

Signed-off-by: Helge Deller <deller@gmx.de>
Signed-off-by: Kyle McMartin <kyle@mcmartin.ca>
arch/parisc/include/asm/page.h
arch/parisc/include/asm/pgtable.h
arch/parisc/mm/init.c