diff options
Diffstat (limited to 'arch/sparc64/kernel/tsb.S')
-rw-r--r-- | arch/sparc64/kernel/tsb.S | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/arch/sparc64/kernel/tsb.S b/arch/sparc64/kernel/tsb.S index 44b9e6fed09f..50752c518773 100644 --- a/arch/sparc64/kernel/tsb.S +++ b/arch/sparc64/kernel/tsb.S | |||
@@ -36,6 +36,15 @@ tsb_miss_itlb: | |||
36 | nop | 36 | nop |
37 | 37 | ||
38 | tsb_miss_page_table_walk: | 38 | tsb_miss_page_table_walk: |
39 | /* This clobbers %g1 and %g6, preserve them... */ | ||
40 | mov %g1, %g5 | ||
41 | mov %g6, %g2 | ||
42 | |||
43 | TRAP_LOAD_PGD_PHYS | ||
44 | |||
45 | mov %g2, %g6 | ||
46 | mov %g5, %g1 | ||
47 | |||
39 | USER_PGTABLE_WALK_TL1(%g4, %g7, %g5, %g2, tsb_do_fault) | 48 | USER_PGTABLE_WALK_TL1(%g4, %g7, %g5, %g2, tsb_do_fault) |
40 | 49 | ||
41 | tsb_reload: | 50 | tsb_reload: |
@@ -112,15 +121,20 @@ winfix_trampoline: | |||
112 | * %o0: page table physical address | 121 | * %o0: page table physical address |
113 | * %o1: TSB address | 122 | * %o1: TSB address |
114 | */ | 123 | */ |
124 | .align 32 | ||
115 | .globl tsb_context_switch | 125 | .globl tsb_context_switch |
116 | tsb_context_switch: | 126 | tsb_context_switch: |
117 | wrpr %g0, PSTATE_MG | PSTATE_RMO | PSTATE_PEF | PSTATE_PRIV, %pstate | 127 | rdpr %pstate, %o5 |
128 | wrpr %o5, PSTATE_IE, %pstate | ||
118 | 129 | ||
119 | /* Set page table base alternate global. */ | 130 | ldub [%g6 + TI_CPU], %o3 |
120 | mov %o0, %g7 | 131 | sethi %hi(trap_block), %o4 |
132 | sllx %o3, TRAP_BLOCK_SZ_SHIFT, %o3 | ||
133 | or %o4, %lo(trap_block), %o4 | ||
134 | add %o4, %o3, %o4 | ||
135 | stx %o0, [%o4 + TRAP_PER_CPU_PGD_PADDR] | ||
121 | 136 | ||
122 | /* XXX can this happen? */ | 137 | brgez %o1, 9f |
123 | brz,pn %o1, 9f | ||
124 | nop | 138 | nop |
125 | 139 | ||
126 | /* Lock TSB into D-TLB. */ | 140 | /* Lock TSB into D-TLB. */ |
@@ -163,7 +177,7 @@ tsb_context_switch: | |||
163 | membar #Sync | 177 | membar #Sync |
164 | 178 | ||
165 | 9: | 179 | 9: |
166 | wrpr %g0, PSTATE_RMO | PSTATE_PEF | PSTATE_PRIV | PSTATE_IE, %pstate | 180 | wrpr %o5, %pstate |
167 | 181 | ||
168 | retl | 182 | retl |
169 | mov %o2, %o0 | 183 | mov %o2, %o0 |