powerpc: Update kernel VSID range
This patch change the kernel VSID range so that we limit VSID_BITS to 37. This enables us to support 64TB with 65 bit VA (37+28). Without this patch we have boot hangs on platforms that only support 65 bit VA. With this patch we now have proto vsid generated as below: We first generate a 37-bit "proto-VSID". Proto-VSIDs are generated from mmu context id and effective segment id of the address. For user processes max context id is limited to ((1ul << 19) - 5) for kernel space, we use the top 4 context ids to map address as below 0x7fffc - [ 0xc000000000000000 - 0xc0003fffffffffff ] 0x7fffd - [ 0xd000000000000000 - 0xd0003fffffffffff ] 0x7fffe - [ 0xe000000000000000 - 0xe0003fffffffffff ] 0x7ffff - [ 0xf000000000000000 - 0xf0003fffffffffff ] Acked-by: Paul Mackerras <paulus@samba.org> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Tested-by: Geoff Levand <geoff@infradead.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> CC: <stable@vger.kernel.org> [v3.8]
This commit is contained in:

committed by
Benjamin Herrenschmidt

parent
e39d1a4714
commit
c60ac5693c
@@ -1452,20 +1452,36 @@ do_ste_alloc:
|
||||
_GLOBAL(do_stab_bolted)
|
||||
stw r9,PACA_EXSLB+EX_CCR(r13) /* save CR in exc. frame */
|
||||
std r11,PACA_EXSLB+EX_SRR0(r13) /* save SRR0 in exc. frame */
|
||||
mfspr r11,SPRN_DAR /* ea */
|
||||
|
||||
/*
|
||||
* check for bad kernel/user address
|
||||
* (ea & ~REGION_MASK) >= PGTABLE_RANGE
|
||||
*/
|
||||
rldicr. r9,r11,4,(63 - 46 - 4)
|
||||
li r9,0 /* VSID = 0 for bad address */
|
||||
bne- 0f
|
||||
|
||||
/*
|
||||
* Calculate VSID:
|
||||
* This is the kernel vsid, we take the top for context from
|
||||
* the range. context = (MAX_USER_CONTEXT) + ((ea >> 60) - 0xc) + 1
|
||||
* Here we know that (ea >> 60) == 0xc
|
||||
*/
|
||||
lis r9,(MAX_USER_CONTEXT + 1)@ha
|
||||
addi r9,r9,(MAX_USER_CONTEXT + 1)@l
|
||||
|
||||
srdi r10,r11,SID_SHIFT
|
||||
rldimi r10,r9,USER_ESID_BITS,0 /* proto vsid */
|
||||
ASM_VSID_SCRAMBLE(r10, r9, 256M)
|
||||
rldic r9,r10,12,16 /* r9 = vsid << 12 */
|
||||
|
||||
0:
|
||||
/* Hash to the primary group */
|
||||
ld r10,PACASTABVIRT(r13)
|
||||
mfspr r11,SPRN_DAR
|
||||
srdi r11,r11,28
|
||||
srdi r11,r11,SID_SHIFT
|
||||
rldimi r10,r11,7,52 /* r10 = first ste of the group */
|
||||
|
||||
/* Calculate VSID */
|
||||
/* This is a kernel address, so protovsid = ESID | 1 << 37 */
|
||||
li r9,0x1
|
||||
rldimi r11,r9,(CONTEXT_BITS + USER_ESID_BITS),0
|
||||
ASM_VSID_SCRAMBLE(r11, r9, 256M)
|
||||
rldic r9,r11,12,16 /* r9 = vsid << 12 */
|
||||
|
||||
/* Search the primary group for a free entry */
|
||||
1: ld r11,0(r10) /* Test valid bit of the current ste */
|
||||
andi. r11,r11,0x80
|
||||
|
Reference in New Issue
Block a user