diff options
Diffstat (limited to 'arch/sparc/kernel/tsb.S')
-rw-r--r-- | arch/sparc/kernel/tsb.S | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/arch/sparc/kernel/tsb.S b/arch/sparc/kernel/tsb.S index d4bdc7a62375..a313e4a9399b 100644 --- a/arch/sparc/kernel/tsb.S +++ b/arch/sparc/kernel/tsb.S | |||
@@ -136,12 +136,43 @@ tsb_miss_page_table_walk_sun4v_fastpath: | |||
136 | nop | 136 | nop |
137 | 137 | ||
138 | /* It is a huge page, use huge page TSB entry address we | 138 | /* It is a huge page, use huge page TSB entry address we |
139 | * calculated above. | 139 | * calculated above. If the huge page TSB has not been |
140 | * allocated, setup a trap stack and call hugetlb_setup() | ||
141 | * to do so, then return from the trap to replay the TLB | ||
142 | * miss. | ||
143 | * | ||
144 | * This is necessary to handle the case of transparent huge | ||
145 | * pages where we don't really have a non-atomic context | ||
146 | * in which to allocate the hugepage TSB hash table. When | ||
147 | * the 'mm' faults in the hugepage for the first time, we | ||
148 | * thus handle it here. This also makes sure that we can | ||
149 | * allocate the TSB hash table on the correct NUMA node. | ||
140 | */ | 150 | */ |
141 | TRAP_LOAD_TRAP_BLOCK(%g7, %g2) | 151 | TRAP_LOAD_TRAP_BLOCK(%g7, %g2) |
142 | ldx [%g7 + TRAP_PER_CPU_TSB_HUGE_TEMP], %g2 | 152 | ldx [%g7 + TRAP_PER_CPU_TSB_HUGE_TEMP], %g1 |
143 | cmp %g2, -1 | 153 | cmp %g1, -1 |
144 | movne %xcc, %g2, %g1 | 154 | bne,pt %xcc, 60f |
155 | nop | ||
156 | |||
157 | 661: rdpr %pstate, %g5 | ||
158 | wrpr %g5, PSTATE_AG | PSTATE_MG, %pstate | ||
159 | .section .sun4v_2insn_patch, "ax" | ||
160 | .word 661b | ||
161 | SET_GL(1) | ||
162 | nop | ||
163 | .previous | ||
164 | |||
165 | rdpr %tl, %g3 | ||
166 | cmp %g3, 1 | ||
167 | bne,pn %xcc, winfix_trampoline | ||
168 | nop | ||
169 | ba,pt %xcc, etrap | ||
170 | rd %pc, %g7 | ||
171 | call hugetlb_setup | ||
172 | add %sp, PTREGS_OFF, %o0 | ||
173 | ba,pt %xcc, rtrap | ||
174 | nop | ||
175 | |||
145 | 60: | 176 | 60: |
146 | #endif | 177 | #endif |
147 | 178 | ||