Inter-revision diff: patch 11

Comparing v3 (message) to v7 (message)

--- v3
+++ v7
@@ -5,22 +5,30 @@
 
 Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
 ---
- arch/powerpc/include/asm/mmu-hash64.h        |    8 ++++----
+ arch/powerpc/include/asm/mmu-hash64.h        |   42 ++++++++++++++++++++------
  arch/powerpc/include/asm/pgtable-ppc64-4k.h  |    2 +-
  arch/powerpc/include/asm/pgtable-ppc64-64k.h |    2 +-
- arch/powerpc/include/asm/processor.h         |    4 ++--
- arch/powerpc/include/asm/sparsemem.h         |    4 ++--
- 5 files changed, 10 insertions(+), 10 deletions(-)
+ arch/powerpc/include/asm/processor.h         |    4 +--
+ arch/powerpc/include/asm/sparsemem.h         |    4 +--
+ arch/powerpc/kernel/exceptions-64s.S         |    4 ++-
+ arch/powerpc/mm/slb_low.S                    |   12 ++++++++
+ 7 files changed, 54 insertions(+), 16 deletions(-)
 
 diff --git a/arch/powerpc/include/asm/mmu-hash64.h b/arch/powerpc/include/asm/mmu-hash64.h
-index aa0d560..a227ba7 100644
+index 8c5c5a4..5c52691 100644
 --- a/arch/powerpc/include/asm/mmu-hash64.h
 +++ b/arch/powerpc/include/asm/mmu-hash64.h
-@@ -374,16 +374,16 @@ extern void slb_set_size(u16 size);
+@@ -374,17 +374,21 @@ extern void slb_set_size(u16 size);
+  * (head.S) and ASM_VSID_SCRAMBLE (below) are changed accordingly.
   */
  
- #define VSID_MULTIPLIER_256M	ASM_CONST(200730139)	/* 28-bit prime */
+-#define VSID_MULTIPLIER_256M	ASM_CONST(200730139)	/* 28-bit prime */
 -#define VSID_BITS_256M		36
++/*
++ * This should be computed such that protovosid * vsid_mulitplier
++ * doesn't overflow 64 bits. It should also be co-prime to vsid_modulus
++ */
++#define VSID_MULTIPLIER_256M	ASM_CONST(12538073)	/* 24-bit prime */
 +#define VSID_BITS_256M		38
  #define VSID_MODULUS_256M	((1UL<<VSID_BITS_256M)-1)
  
@@ -37,6 +45,43 @@
  
  #define USER_VSID_RANGE	(1UL << (USER_ESID_BITS + SID_SHIFT))
  
+@@ -507,12 +511,32 @@ typedef struct {
+ 	})
+ #endif /* 1 */
+ 
+-/* This is only valid for addresses >= PAGE_OFFSET */
++/*
++ * This is only valid for addresses >= PAGE_OFFSET
++ * The proto-VSID space is divided into two class
++ * User:   0 to 2^(CONTEXT_BITS + USER_ESID_BITS) -1
++ * kernel: 2^(CONTEXT_BITS + USER_ESID_BITS) to 2^(VSID_BITS) - 1
++ *
++ * With KERNEL_START at 0xc000000000000000, the proto vsid for
++ * the kernel ends up with 0xc00000000 (36 bits). With 64TB
++ * support we need to have kernel proto-VSID in the
++ * [2^37 to 2^38 - 1] range due to the increased USER_ESID_BITS.
++ */
+ static inline unsigned long get_kernel_vsid(unsigned long ea, int ssize)
+ {
+-	if (ssize == MMU_SEGSIZE_256M)
+-		return vsid_scramble(ea >> SID_SHIFT, 256M);
+-	return vsid_scramble(ea >> SID_SHIFT_1T, 1T);
++	unsigned long proto_vsid;
++	/*
++	 * We need to make sure proto_vsid for the kernel is
++	 * >= 2^(CONTEXT_BITS + USER_ESID_BITS[_1T])
++	 */
++	if (ssize == MMU_SEGSIZE_256M) {
++		proto_vsid = ea >> SID_SHIFT;
++		proto_vsid |= (1UL << (CONTEXT_BITS + USER_ESID_BITS));
++		return vsid_scramble(proto_vsid, 256M);
++	}
++	proto_vsid = ea >> SID_SHIFT_1T;
++	proto_vsid |= (1UL << (CONTEXT_BITS + USER_ESID_BITS_1T));
++	return vsid_scramble(proto_vsid, 1T);
+ }
+ 
+ /* Returns the segment size indicator for a user address */
 diff --git a/arch/powerpc/include/asm/pgtable-ppc64-4k.h b/arch/powerpc/include/asm/pgtable-ppc64-4k.h
 index 6eefdcf..b3eccf2 100644
 --- a/arch/powerpc/include/asm/pgtable-ppc64-4k.h
@@ -64,7 +109,7 @@
  #ifndef __ASSEMBLY__
  #define PTE_TABLE_SIZE	(sizeof(real_pte_t) << PTE_INDEX_SIZE)
 diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
-index 413a5ea..ac3861b 100644
+index 53b6dfa..00bda2f 100644
 --- a/arch/powerpc/include/asm/processor.h
 +++ b/arch/powerpc/include/asm/processor.h
 @@ -97,8 +97,8 @@ extern struct task_struct *last_task_used_spe;
@@ -93,5 +138,50 @@
  
  #endif /* CONFIG_SPARSEMEM */
  
+diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
+index e894515..d980818 100644
+--- a/arch/powerpc/kernel/exceptions-64s.S
++++ b/arch/powerpc/kernel/exceptions-64s.S
+@@ -959,7 +959,9 @@ _GLOBAL(do_stab_bolted)
+ 	rldimi	r10,r11,7,52	/* r10 = first ste of the group */
+ 
+ 	/* Calculate VSID */
+-	/* This is a kernel address, so protovsid = ESID */
++	/* 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 */
+ 
+diff --git a/arch/powerpc/mm/slb_low.S b/arch/powerpc/mm/slb_low.S
+index f6a2625..1a16ca2 100644
+--- a/arch/powerpc/mm/slb_low.S
++++ b/arch/powerpc/mm/slb_low.S
+@@ -56,6 +56,12 @@ _GLOBAL(slb_allocate_realmode)
+ 	 */
+ _GLOBAL(slb_miss_kernel_load_linear)
+ 	li	r11,0
++	li	r9,0x1
++	/*
++	 * for 1T we shift 12 bits more.  slb_finish_load_1T will do
++	 * the necessary adjustment
++	 */
++	rldimi  r10,r9,(CONTEXT_BITS + USER_ESID_BITS),0
+ BEGIN_FTR_SECTION
+ 	b	slb_finish_load
+ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT)
+@@ -85,6 +91,12 @@ _GLOBAL(slb_miss_kernel_load_vmemmap)
+ 	_GLOBAL(slb_miss_kernel_load_io)
+ 	li	r11,0
+ 6:
++	li	r9,0x1
++	/*
++	 * for 1T we shift 12 bits more.  slb_finish_load_1T will do
++	 * the necessary adjustment
++	 */
++	rldimi  r10,r9,(CONTEXT_BITS + USER_ESID_BITS),0
+ BEGIN_FTR_SECTION
+ 	b	slb_finish_load
+ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT)
 -- 
 1.7.10
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help