[SPARC64]: Fix _PAGE_EXEC handling.
First of all, use the known _PAGE_EXEC_{4U,4V} value instead of loading _PAGE_EXEC from memory. We either know which one to use by context, or we can code patch the test. Next, we need to check executability of a PTE in the generic TSB miss handler. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
92daa77e9a
commit
45f791eb0f
3 changed files with 15 additions and 8 deletions
|
@ -9,18 +9,18 @@
|
||||||
cmp %g4, %g6 ! Compare TAG
|
cmp %g4, %g6 ! Compare TAG
|
||||||
|
|
||||||
/* ITLB ** ICACHE line 2: TSB compare and TLB load */
|
/* ITLB ** ICACHE line 2: TSB compare and TLB load */
|
||||||
sethi %hi(PAGE_EXEC), %g4 ! Setup exec check
|
|
||||||
ldx [%g4 + %lo(PAGE_EXEC)], %g4
|
|
||||||
bne,pn %xcc, tsb_miss_itlb ! Miss
|
bne,pn %xcc, tsb_miss_itlb ! Miss
|
||||||
mov FAULT_CODE_ITLB, %g3
|
mov FAULT_CODE_ITLB, %g3
|
||||||
andcc %g5, %g4, %g0 ! Executable?
|
andcc %g5, _PAGE_EXEC_4U, %g0 ! Executable?
|
||||||
be,pn %xcc, tsb_do_fault
|
be,pn %xcc, tsb_do_fault
|
||||||
nop ! Delay slot, fill me
|
nop ! Delay slot, fill me
|
||||||
|
stxa %g5, [%g0] ASI_ITLB_DATA_IN ! Load TLB
|
||||||
|
retry ! Trap done
|
||||||
nop
|
nop
|
||||||
|
|
||||||
/* ITLB ** ICACHE line 3: */
|
/* ITLB ** ICACHE line 3: */
|
||||||
stxa %g5, [%g0] ASI_ITLB_DATA_IN ! Load TLB
|
nop
|
||||||
retry ! Trap done
|
nop
|
||||||
nop
|
nop
|
||||||
nop
|
nop
|
||||||
nop
|
nop
|
||||||
|
|
|
@ -58,11 +58,9 @@ sun4v_itlb_miss:
|
||||||
/* Load TSB tag/pte into %g2/%g3 and compare the tag. */
|
/* Load TSB tag/pte into %g2/%g3 and compare the tag. */
|
||||||
ldda [%g1] ASI_QUAD_LDD_PHYS_4V, %g2
|
ldda [%g1] ASI_QUAD_LDD_PHYS_4V, %g2
|
||||||
cmp %g2, %g6
|
cmp %g2, %g6
|
||||||
sethi %hi(PAGE_EXEC), %g7
|
|
||||||
ldx [%g7 + %lo(PAGE_EXEC)], %g7
|
|
||||||
bne,a,pn %xcc, tsb_miss_page_table_walk
|
bne,a,pn %xcc, tsb_miss_page_table_walk
|
||||||
mov FAULT_CODE_ITLB, %g3
|
mov FAULT_CODE_ITLB, %g3
|
||||||
andcc %g3, %g7, %g0
|
andcc %g3, _PAGE_EXEC_4V, %g0
|
||||||
be,a,pn %xcc, tsb_do_fault
|
be,a,pn %xcc, tsb_do_fault
|
||||||
mov FAULT_CODE_ITLB, %g3
|
mov FAULT_CODE_ITLB, %g3
|
||||||
|
|
||||||
|
|
|
@ -103,6 +103,15 @@ tsb_dtlb_load:
|
||||||
mov %g5, %g3
|
mov %g5, %g3
|
||||||
|
|
||||||
tsb_itlb_load:
|
tsb_itlb_load:
|
||||||
|
/* Executable bit must be set. */
|
||||||
|
661: andcc %g5, _PAGE_EXEC_4U, %g0
|
||||||
|
.section .sun4v_1insn_patch, "ax"
|
||||||
|
.word 661b
|
||||||
|
andcc %g5, _PAGE_EXEC_4V, %g0
|
||||||
|
.previous
|
||||||
|
|
||||||
|
be,pn %xcc, tsb_do_fault
|
||||||
|
nop
|
||||||
|
|
||||||
661: stxa %g5, [%g0] ASI_ITLB_DATA_IN
|
661: stxa %g5, [%g0] ASI_ITLB_DATA_IN
|
||||||
retry
|
retry
|
||||||
|
|
Loading…
Reference in a new issue