0001
0002
0003
0004
0005
0006
0007
0008
0009 .type __spitfire_access_error,#function
0010 __spitfire_access_error:
0011
0012
0013
0014 stxa %g0, [%g0] ASI_ESTATE_ERROR_EN
0015 membar #Sync
0016
0017 mov UDBE_UE, %g1
0018 ldxa [%g0] ASI_AFSR, %g4 ! Get AFSR
0019
0020
0021
0022
0023
0024 __spitfire_cee_trap_continue:
0025 ldxa [%g0] ASI_AFAR, %g5 ! Get AFAR
0026
0027 rdpr %tt, %g3
0028 and %g3, 0x1ff, %g3 ! Paranoia
0029 sllx %g3, SFSTAT_TRAP_TYPE_SHIFT, %g3
0030 or %g4, %g3, %g4
0031 rdpr %tl, %g3
0032 cmp %g3, 1
0033 mov 1, %g3
0034 bleu %xcc, 1f
0035 sllx %g3, SFSTAT_TL_GT_ONE_SHIFT, %g3
0036
0037 or %g4, %g3, %g4
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052 1: ldxa [%g0] ASI_UDBH_ERROR_R, %g3
0053 and %g3, 0x3ff, %g7 ! Paranoia
0054 sllx %g7, SFSTAT_UDBH_SHIFT, %g7
0055 or %g4, %g7, %g4
0056 andcc %g3, %g1, %g3 ! UDBE_UE or UDBE_CE
0057 be,pn %xcc, 1f
0058 nop
0059 stxa %g3, [%g0] ASI_UDB_ERROR_W
0060 membar #Sync
0061
0062 1: mov 0x18, %g3
0063 ldxa [%g3] ASI_UDBL_ERROR_R, %g3
0064 and %g3, 0x3ff, %g7 ! Paranoia
0065 sllx %g7, SFSTAT_UDBL_SHIFT, %g7
0066 or %g4, %g7, %g4
0067 andcc %g3, %g1, %g3 ! UDBE_UE or UDBE_CE
0068 be,pn %xcc, 1f
0069 nop
0070 mov 0x18, %g7
0071 stxa %g3, [%g7] ASI_UDB_ERROR_W
0072 membar #Sync
0073
0074 1:
0075
0076
0077 stxa %g4, [%g0] ASI_AFSR
0078 membar #Sync
0079
0080 rdpr %tl, %g2
0081 cmp %g2, 1
0082 rdpr %pil, %g2
0083 bleu,pt %xcc, 1f
0084 wrpr %g0, PIL_NORMAL_MAX, %pil
0085
0086 ba,pt %xcc, etraptl1
0087 rd %pc, %g7
0088
0089 ba,a,pt %xcc, 2f
0090 nop
0091
0092 1: ba,pt %xcc, etrap_irq
0093 rd %pc, %g7
0094
0095 2:
0096 #ifdef CONFIG_TRACE_IRQFLAGS
0097 call trace_hardirqs_off
0098 nop
0099 #endif
0100 mov %l4, %o1
0101 mov %l5, %o2
0102 call spitfire_access_error
0103 add %sp, PTREGS_OFF, %o0
0104 ba,a,pt %xcc, rtrap
0105 .size __spitfire_access_error,.-__spitfire_access_error
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133 .type __spitfire_cee_trap,#function
0134 __spitfire_cee_trap:
0135 ldxa [%g0] ASI_AFSR, %g4 ! Get AFSR
0136 mov 1, %g3
0137 sllx %g3, SFAFSR_UE_SHIFT, %g3
0138 andcc %g4, %g3, %g0 ! Check for UE
0139 bne,pn %xcc, __spitfire_access_error
0140 nop
0141
0142
0143
0144
0145
0146
0147 ldxa [%g0] ASI_ESTATE_ERROR_EN, %g3
0148 andn %g3, ESTATE_ERR_CE, %g3
0149 stxa %g3, [%g0] ASI_ESTATE_ERROR_EN
0150 membar #Sync
0151
0152
0153 ba,pt %xcc, __spitfire_cee_trap_continue
0154 mov UDBE_CE, %g1
0155 .size __spitfire_cee_trap,.-__spitfire_cee_trap
0156
0157 .type __spitfire_data_access_exception_tl1,#function
0158 __spitfire_data_access_exception_tl1:
0159 rdpr %pstate, %g4
0160 wrpr %g4, PSTATE_MG|PSTATE_AG, %pstate
0161 mov TLB_SFSR, %g3
0162 mov DMMU_SFAR, %g5
0163 ldxa [%g3] ASI_DMMU, %g4 ! Get SFSR
0164 ldxa [%g5] ASI_DMMU, %g5 ! Get SFAR
0165 stxa %g0, [%g3] ASI_DMMU ! Clear SFSR.FaultValid bit
0166 membar #Sync
0167 rdpr %tt, %g3
0168 cmp %g3, 0x80 ! first win spill/fill trap
0169 blu,pn %xcc, 1f
0170 cmp %g3, 0xff ! last win spill/fill trap
0171 bgu,pn %xcc, 1f
0172 nop
0173 ba,pt %xcc, winfix_dax
0174 rdpr %tpc, %g3
0175 1: sethi %hi(109f), %g7
0176 ba,pt %xcc, etraptl1
0177 109: or %g7, %lo(109b), %g7
0178 mov %l4, %o1
0179 mov %l5, %o2
0180 call spitfire_data_access_exception_tl1
0181 add %sp, PTREGS_OFF, %o0
0182 ba,a,pt %xcc, rtrap
0183 .size __spitfire_data_access_exception_tl1,.-__spitfire_data_access_exception_tl1
0184
0185 .type __spitfire_data_access_exception,#function
0186 __spitfire_data_access_exception:
0187 rdpr %pstate, %g4
0188 wrpr %g4, PSTATE_MG|PSTATE_AG, %pstate
0189 mov TLB_SFSR, %g3
0190 mov DMMU_SFAR, %g5
0191 ldxa [%g3] ASI_DMMU, %g4 ! Get SFSR
0192 ldxa [%g5] ASI_DMMU, %g5 ! Get SFAR
0193 stxa %g0, [%g3] ASI_DMMU ! Clear SFSR.FaultValid bit
0194 membar #Sync
0195 sethi %hi(109f), %g7
0196 ba,pt %xcc, etrap
0197 109: or %g7, %lo(109b), %g7
0198 mov %l4, %o1
0199 mov %l5, %o2
0200 call spitfire_data_access_exception
0201 add %sp, PTREGS_OFF, %o0
0202 ba,a,pt %xcc, rtrap
0203 .size __spitfire_data_access_exception,.-__spitfire_data_access_exception
0204
0205 .type __spitfire_insn_access_exception_tl1,#function
0206 __spitfire_insn_access_exception_tl1:
0207 rdpr %pstate, %g4
0208 wrpr %g4, PSTATE_MG|PSTATE_AG, %pstate
0209 mov TLB_SFSR, %g3
0210 ldxa [%g3] ASI_IMMU, %g4 ! Get SFSR
0211 rdpr %tpc, %g5 ! IMMU has no SFAR, use TPC
0212 stxa %g0, [%g3] ASI_IMMU ! Clear FaultValid bit
0213 membar #Sync
0214 sethi %hi(109f), %g7
0215 ba,pt %xcc, etraptl1
0216 109: or %g7, %lo(109b), %g7
0217 mov %l4, %o1
0218 mov %l5, %o2
0219 call spitfire_insn_access_exception_tl1
0220 add %sp, PTREGS_OFF, %o0
0221 ba,a,pt %xcc, rtrap
0222 .size __spitfire_insn_access_exception_tl1,.-__spitfire_insn_access_exception_tl1
0223
0224 .type __spitfire_insn_access_exception,#function
0225 __spitfire_insn_access_exception:
0226 rdpr %pstate, %g4
0227 wrpr %g4, PSTATE_MG|PSTATE_AG, %pstate
0228 mov TLB_SFSR, %g3
0229 ldxa [%g3] ASI_IMMU, %g4 ! Get SFSR
0230 rdpr %tpc, %g5 ! IMMU has no SFAR, use TPC
0231 stxa %g0, [%g3] ASI_IMMU ! Clear FaultValid bit
0232 membar #Sync
0233 sethi %hi(109f), %g7
0234 ba,pt %xcc, etrap
0235 109: or %g7, %lo(109b), %g7
0236 mov %l4, %o1
0237 mov %l5, %o2
0238 call spitfire_insn_access_exception
0239 add %sp, PTREGS_OFF, %o0
0240 ba,a,pt %xcc, rtrap
0241 .size __spitfire_insn_access_exception,.-__spitfire_insn_access_exception