blob: 80d56f094a0dee37c49d329a9693d5fddf381712 [file] [log] [blame]
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001/*
2 * This file contains the 64-bit "server" PowerPC variant
3 * of the low level exception handling including exception
4 * vectors, exception return, part of the slb and stab
5 * handling and other fixed offset specific things.
6 *
7 * This file is meant to be #included from head_64.S due to
Lucas De Marchi25985ed2011-03-30 22:57:33 -03008 * position dependent assembly.
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00009 *
10 * Most of this originates from head_64.S and thus has the same
11 * copyright history.
12 *
13 */
14
Benjamin Herrenschmidt7230c562012-03-06 18:27:59 +110015#include <asm/hw_irq.h>
Benjamin Herrenschmidt8aa34ab2009-07-14 20:52:52 +000016#include <asm/exception-64s.h>
Stephen Rothwell46f52212010-11-18 15:06:17 +000017#include <asm/ptrace.h>
Benjamin Herrenschmidt8aa34ab2009-07-14 20:52:52 +000018
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +000019/*
20 * We layout physical memory as follows:
21 * 0x0000 - 0x00ff : Secondary processor spin code
Michael Neulingc1fb6812012-11-02 17:21:43 +110022 * 0x0100 - 0x17ff : pSeries Interrupt prologs
23 * 0x1800 - 0x4000 : interrupt support common interrupt prologs
24 * 0x4000 - 0x5fff : pSeries interrupts with IR=1,DR=1
25 * 0x6000 - 0x6fff : more interrupt support including for IR=1,DR=1
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +000026 * 0x7000 - 0x7fff : FWNMI data area
Michael Neulingc1fb6812012-11-02 17:21:43 +110027 * 0x8000 - 0x8fff : Initial (CPU0) segment table
28 * 0x9000 - : Early init and support code
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +000029 */
Michael Neuling742415d2012-11-02 17:16:01 +110030 /* Syscall routine is used twice, in reloc-off and reloc-on paths */
31#define SYSCALL_PSERIES_1 \
32BEGIN_FTR_SECTION \
33 cmpdi r0,0x1ebe ; \
34 beq- 1f ; \
35END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE) \
36 mr r9,r13 ; \
37 GET_PACA(r13) ; \
38 mfspr r11,SPRN_SRR0 ; \
390:
40
41#define SYSCALL_PSERIES_2_RFID \
42 mfspr r12,SPRN_SRR1 ; \
43 ld r10,PACAKBASE(r13) ; \
44 LOAD_HANDLER(r10, system_call_entry) ; \
45 mtspr SPRN_SRR0,r10 ; \
46 ld r10,PACAKMSR(r13) ; \
47 mtspr SPRN_SRR1,r10 ; \
48 rfid ; \
49 b . ; /* prevent speculative execution */
50
51#define SYSCALL_PSERIES_3 \
52 /* Fast LE/BE switch system call */ \
531: mfspr r12,SPRN_SRR1 ; \
54 xori r12,r12,MSR_LE ; \
55 mtspr SPRN_SRR1,r12 ; \
56 rfid ; /* return to userspace */ \
57 b . ; \
582: mfspr r12,SPRN_SRR1 ; \
59 andi. r12,r12,MSR_PR ; \
60 bne 0b ; \
61 mtspr SPRN_SRR0,r3 ; \
62 mtspr SPRN_SRR1,r4 ; \
63 mtspr SPRN_SDR1,r5 ; \
64 rfid ; \
65 b . ; /* prevent speculative execution */
66
Michael Neuling4700dfa2012-11-02 17:21:28 +110067#if defined(CONFIG_RELOCATABLE)
68 /*
69 * We can't branch directly; in the direct case we use LR
70 * and system_call_entry restores LR. (We thus need to move
71 * LR to r10 in the RFID case too.)
72 */
73#define SYSCALL_PSERIES_2_DIRECT \
74 mflr r10 ; \
75 ld r12,PACAKBASE(r13) ; \
76 LOAD_HANDLER(r12, system_call_entry_direct) ; \
Michael Neuling6a404802013-02-27 10:45:52 +000077 mtctr r12 ; \
Michael Neuling4700dfa2012-11-02 17:21:28 +110078 mfspr r12,SPRN_SRR1 ; \
79 /* Re-use of r13... No spare regs to do this */ \
80 li r13,MSR_RI ; \
81 mtmsrd r13,1 ; \
82 GET_PACA(r13) ; /* get r13 back */ \
Michael Neuling6a404802013-02-27 10:45:52 +000083 bctr ;
Michael Neuling4700dfa2012-11-02 17:21:28 +110084#else
85 /* We can branch directly */
86#define SYSCALL_PSERIES_2_DIRECT \
87 mfspr r12,SPRN_SRR1 ; \
88 li r10,MSR_RI ; \
89 mtmsrd r10,1 ; /* Set RI (EE=0) */ \
90 b system_call_entry_direct ;
91#endif
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +000092
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +000093/*
94 * This is the start of the interrupt handlers for pSeries
95 * This code runs with relocation off.
96 * Code from here to __end_interrupts gets copied down to real
97 * address 0x100 when we are running a relocatable kernel.
98 * Therefore any relative branches in this section must only
99 * branch to labels in this section.
100 */
101 . = 0x100
102 .globl __start_interrupts
103__start_interrupts:
104
Benjamin Herrenschmidt948cf672011-01-24 18:42:41 +1100105 .globl system_reset_pSeries;
106system_reset_pSeries:
Haren Myneni44e93092012-12-06 21:51:04 +0000107 HMT_MEDIUM_PPR_DISCARD
Benjamin Herrenschmidt948cf672011-01-24 18:42:41 +1100108 SET_SCRATCH0(r13)
109#ifdef CONFIG_PPC_P7_NAP
110BEGIN_FTR_SECTION
111 /* Running native on arch 2.06 or later, check if we are
112 * waking up from nap. We only handle no state loss and
113 * supervisor state loss. We do -not- handle hypervisor
114 * state loss at this time.
115 */
116 mfspr r13,SPRN_SRR1
Paul Mackerras371fefd2011-06-29 00:23:08 +0000117 rlwinm. r13,r13,47-31,30,31
118 beq 9f
119
120 /* waking up from powersave (nap) state */
121 cmpwi cr1,r13,2
Benjamin Herrenschmidt948cf672011-01-24 18:42:41 +1100122 /* Total loss of HV state is fatal, we could try to use the
123 * PIR to locate a PACA, then use an emergency stack etc...
124 * but for now, let's just stay stuck here
125 */
Paul Mackerras371fefd2011-06-29 00:23:08 +0000126 bgt cr1,.
127 GET_PACA(r13)
128
129#ifdef CONFIG_KVM_BOOK3S_64_HV
Paul Mackerrasf0888f72012-02-03 00:54:17 +0000130 li r0,KVM_HWTHREAD_IN_KERNEL
131 stb r0,HSTATE_HWTHREAD_STATE(r13)
132 /* Order setting hwthread_state vs. testing hwthread_req */
133 sync
134 lbz r0,HSTATE_HWTHREAD_REQ(r13)
135 cmpwi r0,0
136 beq 1f
Paul Mackerras371fefd2011-06-29 00:23:08 +0000137 b kvm_start_guest
1381:
139#endif
140
141 beq cr1,2f
142 b .power7_wakeup_noloss
1432: b .power7_wakeup_loss
1449:
Paul Mackerras969391c2011-06-29 00:26:11 +0000145END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
Benjamin Herrenschmidt948cf672011-01-24 18:42:41 +1100146#endif /* CONFIG_PPC_P7_NAP */
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000147 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD,
148 NOTEST, 0x100)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000149
150 . = 0x200
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000151machine_check_pSeries_1:
152 /* This is moved out of line as it can be patched by FW, but
153 * some code path might still want to branch into the original
154 * vector
155 */
Paul Mackerras1707dd12013-02-04 18:10:15 +0000156 HMT_MEDIUM_PPR_DISCARD
157 SET_SCRATCH0(r13) /* save r13 */
158 EXCEPTION_PROLOG_0(PACA_EXMC)
159 b machine_check_pSeries_0
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000160
161 . = 0x300
162 .globl data_access_pSeries
163data_access_pSeries:
Haren Myneni44e93092012-12-06 21:51:04 +0000164 HMT_MEDIUM_PPR_DISCARD
Paul Mackerras673b1892011-04-05 13:59:58 +1000165 SET_SCRATCH0(r13)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000166BEGIN_FTR_SECTION
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000167 b data_access_check_stab
168data_access_not_stab:
169END_MMU_FTR_SECTION_IFCLR(MMU_FTR_SLB)
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000170 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, data_access_common, EXC_STD,
Paul Mackerras697d3892011-12-12 12:36:37 +0000171 KVMTEST, 0x300)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000172
173 . = 0x380
174 .globl data_access_slb_pSeries
175data_access_slb_pSeries:
Haren Myneni44e93092012-12-06 21:51:04 +0000176 HMT_MEDIUM_PPR_DISCARD
Paul Mackerras673b1892011-04-05 13:59:58 +1000177 SET_SCRATCH0(r13)
Paul Mackerras1707dd12013-02-04 18:10:15 +0000178 EXCEPTION_PROLOG_0(PACA_EXSLB)
Paul Mackerras697d3892011-12-12 12:36:37 +0000179 EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST, 0x380)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000180 std r3,PACA_EXSLB+EX_R3(r13)
181 mfspr r3,SPRN_DAR
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000182#ifdef __DISABLED__
183 /* Keep that around for when we re-implement dynamic VSIDs */
184 cmpdi r3,0
185 bge slb_miss_user_pseries
186#endif /* __DISABLED__ */
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000187 mfspr r12,SPRN_SRR1
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000188#ifndef CONFIG_RELOCATABLE
189 b .slb_miss_realmode
190#else
191 /*
192 * We can't just use a direct branch to .slb_miss_realmode
193 * because the distance from here to there depends on where
194 * the kernel ends up being put.
195 */
196 mfctr r11
197 ld r10,PACAKBASE(r13)
198 LOAD_HANDLER(r10, .slb_miss_realmode)
199 mtctr r10
200 bctr
201#endif
202
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000203 STD_EXCEPTION_PSERIES(0x400, 0x400, instruction_access)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000204
205 . = 0x480
206 .globl instruction_access_slb_pSeries
207instruction_access_slb_pSeries:
Haren Myneni44e93092012-12-06 21:51:04 +0000208 HMT_MEDIUM_PPR_DISCARD
Paul Mackerras673b1892011-04-05 13:59:58 +1000209 SET_SCRATCH0(r13)
Paul Mackerras1707dd12013-02-04 18:10:15 +0000210 EXCEPTION_PROLOG_0(PACA_EXSLB)
Paul Mackerrasde56a942011-06-29 00:21:34 +0000211 EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x480)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000212 std r3,PACA_EXSLB+EX_R3(r13)
213 mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000214#ifdef __DISABLED__
215 /* Keep that around for when we re-implement dynamic VSIDs */
216 cmpdi r3,0
217 bge slb_miss_user_pseries
218#endif /* __DISABLED__ */
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000219 mfspr r12,SPRN_SRR1
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000220#ifndef CONFIG_RELOCATABLE
221 b .slb_miss_realmode
222#else
223 mfctr r11
224 ld r10,PACAKBASE(r13)
225 LOAD_HANDLER(r10, .slb_miss_realmode)
226 mtctr r10
227 bctr
228#endif
229
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000230 /* We open code these as we can't have a ". = x" (even with
231 * x = "." within a feature section
232 */
Benjamin Herrenschmidta5d4f3a2011-04-05 14:20:31 +1000233 . = 0x500;
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000234 .globl hardware_interrupt_pSeries;
235 .globl hardware_interrupt_hv;
Benjamin Herrenschmidta5d4f3a2011-04-05 14:20:31 +1000236hardware_interrupt_pSeries:
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000237hardware_interrupt_hv:
Paul Mackerrasa485c702013-04-25 17:51:40 +0000238 HMT_MEDIUM_PPR_DISCARD
Benjamin Herrenschmidta5d4f3a2011-04-05 14:20:31 +1000239 BEGIN_FTR_SECTION
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000240 _MASKABLE_EXCEPTION_PSERIES(0x502, hardware_interrupt,
241 EXC_HV, SOFTEN_TEST_HV)
242 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0x502)
Paul Mackerrasde56a942011-06-29 00:21:34 +0000243 FTR_SECTION_ELSE
244 _MASKABLE_EXCEPTION_PSERIES(0x500, hardware_interrupt,
Paul Mackerras9e368f22011-06-29 00:40:08 +0000245 EXC_STD, SOFTEN_TEST_HV_201)
Paul Mackerrasde56a942011-06-29 00:21:34 +0000246 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x500)
Paul Mackerras969391c2011-06-29 00:26:11 +0000247 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
Benjamin Herrenschmidta5d4f3a2011-04-05 14:20:31 +1000248
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000249 STD_EXCEPTION_PSERIES(0x600, 0x600, alignment)
Paul Mackerrasde56a942011-06-29 00:21:34 +0000250 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x600)
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000251
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000252 STD_EXCEPTION_PSERIES(0x700, 0x700, program_check)
Paul Mackerrasde56a942011-06-29 00:21:34 +0000253 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x700)
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000254
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000255 STD_EXCEPTION_PSERIES(0x800, 0x800, fp_unavailable)
Paul Mackerrasde56a942011-06-29 00:21:34 +0000256 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x800)
Benjamin Herrenschmidta5d4f3a2011-04-05 14:20:31 +1000257
Paul Mackerrasa485c702013-04-25 17:51:40 +0000258 . = 0x900
259 .globl decrementer_pSeries
260decrementer_pSeries:
261 _MASKABLE_EXCEPTION_PSERIES(0x900, decrementer, EXC_STD, SOFTEN_TEST_PR)
262
Paul Mackerrasdabe8592012-07-26 13:56:11 +0000263 STD_EXCEPTION_HV(0x980, 0x982, hdecrementer)
Benjamin Herrenschmidta5d4f3a2011-04-05 14:20:31 +1000264
Ian Munsie1dbdafe2012-11-14 18:49:46 +0000265 MASKABLE_EXCEPTION_PSERIES(0xa00, 0xa00, doorbell_super)
Paul Mackerrasde56a942011-06-29 00:21:34 +0000266 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xa00)
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000267
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000268 STD_EXCEPTION_PSERIES(0xb00, 0xb00, trap_0b)
Paul Mackerrasde56a942011-06-29 00:21:34 +0000269 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xb00)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000270
271 . = 0xc00
272 .globl system_call_pSeries
273system_call_pSeries:
274 HMT_MEDIUM
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000275#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
276 SET_SCRATCH0(r13)
277 GET_PACA(r13)
278 std r9,PACA_EXGEN+EX_R9(r13)
279 std r10,PACA_EXGEN+EX_R10(r13)
280 mfcr r9
281 KVMTEST(0xc00)
282 GET_SCRATCH0(r13)
283#endif
Michael Neuling742415d2012-11-02 17:16:01 +1100284 SYSCALL_PSERIES_1
285 SYSCALL_PSERIES_2_RFID
286 SYSCALL_PSERIES_3
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000287 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xc00)
288
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000289 STD_EXCEPTION_PSERIES(0xd00, 0xd00, single_step)
Paul Mackerrasde56a942011-06-29 00:21:34 +0000290 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xd00)
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000291
292 /* At 0xe??? we have a bunch of hypervisor exceptions, we branch
293 * out of line to handle them
294 */
295 . = 0xe00
Michael Ellermane6a74c62012-07-03 20:29:41 +0000296hv_exception_trampoline:
Paul Mackerras1707dd12013-02-04 18:10:15 +0000297 SET_SCRATCH0(r13)
298 EXCEPTION_PROLOG_0(PACA_EXGEN)
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000299 b h_data_storage_hv
Paul Mackerras1707dd12013-02-04 18:10:15 +0000300
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000301 . = 0xe20
Paul Mackerras1707dd12013-02-04 18:10:15 +0000302 SET_SCRATCH0(r13)
303 EXCEPTION_PROLOG_0(PACA_EXGEN)
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000304 b h_instr_storage_hv
Paul Mackerras1707dd12013-02-04 18:10:15 +0000305
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000306 . = 0xe40
Paul Mackerras1707dd12013-02-04 18:10:15 +0000307 SET_SCRATCH0(r13)
308 EXCEPTION_PROLOG_0(PACA_EXGEN)
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000309 b emulation_assist_hv
Paul Mackerras1707dd12013-02-04 18:10:15 +0000310
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000311 . = 0xe60
Paul Mackerras1707dd12013-02-04 18:10:15 +0000312 SET_SCRATCH0(r13)
313 EXCEPTION_PROLOG_0(PACA_EXGEN)
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000314 b hmi_exception_hv
Paul Mackerras1707dd12013-02-04 18:10:15 +0000315
Ian Munsie655bb3f2012-11-14 18:49:45 +0000316 . = 0xe80
Paul Mackerras1707dd12013-02-04 18:10:15 +0000317 SET_SCRATCH0(r13)
318 EXCEPTION_PROLOG_0(PACA_EXGEN)
Ian Munsie655bb3f2012-11-14 18:49:45 +0000319 b h_doorbell_hv
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000320
321 /* We need to deal with the Altivec unavailable exception
322 * here which is at 0xf20, thus in the middle of the
323 * prolog code of the PerformanceMonitor one. A little
324 * trickery is thus necessary
325 */
Anton Blanchardc86e2ea2009-10-18 01:24:06 +0000326performance_monitor_pSeries_1:
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000327 . = 0xf00
Paul Mackerras1707dd12013-02-04 18:10:15 +0000328 SET_SCRATCH0(r13)
329 EXCEPTION_PROLOG_0(PACA_EXGEN)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000330 b performance_monitor_pSeries
331
Anton Blanchardc86e2ea2009-10-18 01:24:06 +0000332altivec_unavailable_pSeries_1:
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000333 . = 0xf20
Paul Mackerras1707dd12013-02-04 18:10:15 +0000334 SET_SCRATCH0(r13)
335 EXCEPTION_PROLOG_0(PACA_EXGEN)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000336 b altivec_unavailable_pSeries
337
Anton Blanchardc86e2ea2009-10-18 01:24:06 +0000338vsx_unavailable_pSeries_1:
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000339 . = 0xf40
Paul Mackerras1707dd12013-02-04 18:10:15 +0000340 SET_SCRATCH0(r13)
341 EXCEPTION_PROLOG_0(PACA_EXGEN)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000342 b vsx_unavailable_pSeries
343
Michael Neulingd0c0c9a2013-02-13 16:21:38 +0000344 . = 0xf60
345 SET_SCRATCH0(r13)
346 EXCEPTION_PROLOG_0(PACA_EXGEN)
347 b tm_unavailable_pSeries
348
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000349#ifdef CONFIG_CBE_RAS
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000350 STD_EXCEPTION_HV(0x1200, 0x1202, cbe_system_error)
Alexander Graf5ccf55d2011-09-13 04:15:31 +0000351 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1202)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000352#endif /* CONFIG_CBE_RAS */
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000353
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000354 STD_EXCEPTION_PSERIES(0x1300, 0x1300, instruction_breakpoint)
Paul Mackerrasde56a942011-06-29 00:21:34 +0000355 KVM_HANDLER_PR_SKIP(PACA_EXGEN, EXC_STD, 0x1300)
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000356
Michael Neulingb92a66a2012-09-10 00:35:26 +0000357 . = 0x1500
Michael Neuling51cf2b32012-10-31 18:58:36 +0000358 .global denorm_exception_hv
Michael Neulingb92a66a2012-09-10 00:35:26 +0000359denorm_exception_hv:
Haren Myneni44e93092012-12-06 21:51:04 +0000360 HMT_MEDIUM_PPR_DISCARD
Michael Neulingb92a66a2012-09-10 00:35:26 +0000361 mtspr SPRN_SPRG_HSCRATCH0,r13
Paul Mackerras1707dd12013-02-04 18:10:15 +0000362 EXCEPTION_PROLOG_0(PACA_EXGEN)
Michael Neulingb92a66a2012-09-10 00:35:26 +0000363 std r11,PACA_EXGEN+EX_R11(r13)
364 std r12,PACA_EXGEN+EX_R12(r13)
365 mfspr r9,SPRN_SPRG_HSCRATCH0
366 std r9,PACA_EXGEN+EX_R13(r13)
367 mfcr r9
368
369#ifdef CONFIG_PPC_DENORMALISATION
370 mfspr r10,SPRN_HSRR1
371 mfspr r11,SPRN_HSRR0 /* save HSRR0 */
372 andis. r10,r10,(HSRR1_DENORM)@h /* denorm? */
373 addi r11,r11,-4 /* HSRR0 is next instruction */
374 bne+ denorm_assist
375#endif
376
377 EXCEPTION_PROLOG_PSERIES_1(denorm_common, EXC_HV)
378 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x1500)
379
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000380#ifdef CONFIG_CBE_RAS
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000381 STD_EXCEPTION_HV(0x1600, 0x1602, cbe_maintenance)
Alexander Graf5ccf55d2011-09-13 04:15:31 +0000382 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1602)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000383#endif /* CONFIG_CBE_RAS */
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000384
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000385 STD_EXCEPTION_PSERIES(0x1700, 0x1700, altivec_assist)
Paul Mackerrasde56a942011-06-29 00:21:34 +0000386 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x1700)
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000387
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000388#ifdef CONFIG_CBE_RAS
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000389 STD_EXCEPTION_HV(0x1800, 0x1802, cbe_thermal)
Alexander Graf5ccf55d2011-09-13 04:15:31 +0000390 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1802)
Michael Neulingfaab4dd22012-11-02 13:53:36 +1100391#else
392 . = 0x1800
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000393#endif /* CONFIG_CBE_RAS */
394
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000395
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000396/*** Out of line interrupts support ***/
397
Michael Neulingfaab4dd22012-11-02 13:53:36 +1100398 .align 7
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000399 /* moved from 0x200 */
400machine_check_pSeries:
401 .globl machine_check_fwnmi
402machine_check_fwnmi:
Haren Myneni44e93092012-12-06 21:51:04 +0000403 HMT_MEDIUM_PPR_DISCARD
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000404 SET_SCRATCH0(r13) /* save r13 */
Paul Mackerras1707dd12013-02-04 18:10:15 +0000405 EXCEPTION_PROLOG_0(PACA_EXMC)
406machine_check_pSeries_0:
407 EXCEPTION_PROLOG_1(PACA_EXMC, KVMTEST, 0x200)
408 EXCEPTION_PROLOG_PSERIES_1(machine_check_common, EXC_STD)
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000409 KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200)
410
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000411 /* moved from 0x300 */
412data_access_check_stab:
413 GET_PACA(r13)
414 std r9,PACA_EXSLB+EX_R9(r13)
415 std r10,PACA_EXSLB+EX_R10(r13)
416 mfspr r10,SPRN_DAR
417 mfspr r9,SPRN_DSISR
418 srdi r10,r10,60
419 rlwimi r10,r9,16,0x20
Paul Mackerrasde56a942011-06-29 00:21:34 +0000420#ifdef CONFIG_KVM_BOOK3S_PR
Paul Mackerras3c42bf82011-06-29 00:20:58 +0000421 lbz r9,HSTATE_IN_GUEST(r13)
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000422 rlwimi r10,r9,8,0x300
423#endif
424 mfcr r9
425 cmpwi r10,0x2c
426 beq do_stab_bolted_pSeries
427 mtcrf 0x80,r9
428 ld r9,PACA_EXSLB+EX_R9(r13)
429 ld r10,PACA_EXSLB+EX_R10(r13)
430 b data_access_not_stab
431do_stab_bolted_pSeries:
432 std r11,PACA_EXSLB+EX_R11(r13)
433 std r12,PACA_EXSLB+EX_R12(r13)
434 GET_SCRATCH0(r10)
435 std r10,PACA_EXSLB+EX_R13(r13)
436 EXCEPTION_PROLOG_PSERIES_1(.do_stab_bolted, EXC_STD)
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000437
Paul Mackerras697d3892011-12-12 12:36:37 +0000438 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x300)
439 KVM_HANDLER_SKIP(PACA_EXSLB, EXC_STD, 0x380)
Paul Mackerrasde56a942011-06-29 00:21:34 +0000440 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x400)
441 KVM_HANDLER_PR(PACA_EXSLB, EXC_STD, 0x480)
442 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x900)
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000443 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0x982)
444
Michael Neulingb92a66a2012-09-10 00:35:26 +0000445#ifdef CONFIG_PPC_DENORMALISATION
446denorm_assist:
447BEGIN_FTR_SECTION
448/*
449 * To denormalise we need to move a copy of the register to itself.
450 * For POWER6 do that here for all FP regs.
451 */
452 mfmsr r10
453 ori r10,r10,(MSR_FP|MSR_FE0|MSR_FE1)
454 xori r10,r10,(MSR_FE0|MSR_FE1)
455 mtmsrd r10
456 sync
457 fmr 0,0
458 fmr 1,1
459 fmr 2,2
460 fmr 3,3
461 fmr 4,4
462 fmr 5,5
463 fmr 6,6
464 fmr 7,7
465 fmr 8,8
466 fmr 9,9
467 fmr 10,10
468 fmr 11,11
469 fmr 12,12
470 fmr 13,13
471 fmr 14,14
472 fmr 15,15
473 fmr 16,16
474 fmr 17,17
475 fmr 18,18
476 fmr 19,19
477 fmr 20,20
478 fmr 21,21
479 fmr 22,22
480 fmr 23,23
481 fmr 24,24
482 fmr 25,25
483 fmr 26,26
484 fmr 27,27
485 fmr 28,28
486 fmr 29,29
487 fmr 30,30
488 fmr 31,31
489FTR_SECTION_ELSE
490/*
491 * To denormalise we need to move a copy of the register to itself.
492 * For POWER7 do that here for the first 32 VSX registers only.
493 */
494 mfmsr r10
495 oris r10,r10,MSR_VSX@h
496 mtmsrd r10
497 sync
498 XVCPSGNDP(0,0,0)
499 XVCPSGNDP(1,1,1)
500 XVCPSGNDP(2,2,2)
501 XVCPSGNDP(3,3,3)
502 XVCPSGNDP(4,4,4)
503 XVCPSGNDP(5,5,5)
504 XVCPSGNDP(6,6,6)
505 XVCPSGNDP(7,7,7)
506 XVCPSGNDP(8,8,8)
507 XVCPSGNDP(9,9,9)
508 XVCPSGNDP(10,10,10)
509 XVCPSGNDP(11,11,11)
510 XVCPSGNDP(12,12,12)
511 XVCPSGNDP(13,13,13)
512 XVCPSGNDP(14,14,14)
513 XVCPSGNDP(15,15,15)
514 XVCPSGNDP(16,16,16)
515 XVCPSGNDP(17,17,17)
516 XVCPSGNDP(18,18,18)
517 XVCPSGNDP(19,19,19)
518 XVCPSGNDP(20,20,20)
519 XVCPSGNDP(21,21,21)
520 XVCPSGNDP(22,22,22)
521 XVCPSGNDP(23,23,23)
522 XVCPSGNDP(24,24,24)
523 XVCPSGNDP(25,25,25)
524 XVCPSGNDP(26,26,26)
525 XVCPSGNDP(27,27,27)
526 XVCPSGNDP(28,28,28)
527 XVCPSGNDP(29,29,29)
528 XVCPSGNDP(30,30,30)
529 XVCPSGNDP(31,31,31)
530ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206)
531 mtspr SPRN_HSRR0,r11
532 mtcrf 0x80,r9
533 ld r9,PACA_EXGEN+EX_R9(r13)
Haren Myneni44e93092012-12-06 21:51:04 +0000534 RESTORE_PPR_PACA(PACA_EXGEN, r10)
Michael Neulingb92a66a2012-09-10 00:35:26 +0000535 ld r10,PACA_EXGEN+EX_R10(r13)
536 ld r11,PACA_EXGEN+EX_R11(r13)
537 ld r12,PACA_EXGEN+EX_R12(r13)
538 ld r13,PACA_EXGEN+EX_R13(r13)
539 HRFID
540 b .
541#endif
542
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000543 .align 7
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000544 /* moved from 0xe00 */
Paul Mackerras1707dd12013-02-04 18:10:15 +0000545 STD_EXCEPTION_HV_OOL(0xe02, h_data_storage)
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000546 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0xe02)
Paul Mackerras1707dd12013-02-04 18:10:15 +0000547 STD_EXCEPTION_HV_OOL(0xe22, h_instr_storage)
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000548 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe22)
Paul Mackerras1707dd12013-02-04 18:10:15 +0000549 STD_EXCEPTION_HV_OOL(0xe42, emulation_assist)
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000550 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe42)
Paul Mackerras1707dd12013-02-04 18:10:15 +0000551 STD_EXCEPTION_HV_OOL(0xe62, hmi_exception) /* need to flush cache ? */
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000552 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe62)
Paul Mackerras1707dd12013-02-04 18:10:15 +0000553 MASKABLE_EXCEPTION_HV_OOL(0xe82, h_doorbell)
Ian Munsie655bb3f2012-11-14 18:49:45 +0000554 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe82)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000555
556 /* moved from 0xf00 */
Paul Mackerras1707dd12013-02-04 18:10:15 +0000557 STD_EXCEPTION_PSERIES_OOL(0xf00, performance_monitor)
Paul Mackerrasde56a942011-06-29 00:21:34 +0000558 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf00)
Paul Mackerras1707dd12013-02-04 18:10:15 +0000559 STD_EXCEPTION_PSERIES_OOL(0xf20, altivec_unavailable)
Paul Mackerrasde56a942011-06-29 00:21:34 +0000560 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf20)
Paul Mackerras1707dd12013-02-04 18:10:15 +0000561 STD_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable)
Paul Mackerrasde56a942011-06-29 00:21:34 +0000562 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf40)
Michael Neulingd0c0c9a2013-02-13 16:21:38 +0000563 STD_EXCEPTION_PSERIES_OOL(0xf60, tm_unavailable)
564 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf60)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000565
566/*
Ian Munsiefe9e1d52012-11-14 18:49:48 +0000567 * An interrupt came in while soft-disabled. We set paca->irq_happened, then:
568 * - If it was a decrementer interrupt, we bump the dec to max and and return.
569 * - If it was a doorbell we return immediately since doorbells are edge
570 * triggered and won't automatically refire.
571 * - else we hard disable and return.
572 * This is called with r10 containing the value to OR to the paca field.
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000573 */
Benjamin Herrenschmidt7230c562012-03-06 18:27:59 +1100574#define MASKED_INTERRUPT(_H) \
575masked_##_H##interrupt: \
576 std r11,PACA_EXGEN+EX_R11(r13); \
577 lbz r11,PACAIRQHAPPENED(r13); \
578 or r11,r11,r10; \
579 stb r11,PACAIRQHAPPENED(r13); \
Ian Munsiefe9e1d52012-11-14 18:49:48 +0000580 cmpwi r10,PACA_IRQ_DEC; \
581 bne 1f; \
Benjamin Herrenschmidt7230c562012-03-06 18:27:59 +1100582 lis r10,0x7fff; \
583 ori r10,r10,0xffff; \
584 mtspr SPRN_DEC,r10; \
585 b 2f; \
Ian Munsiefe9e1d52012-11-14 18:49:48 +00005861: cmpwi r10,PACA_IRQ_DBELL; \
587 beq 2f; \
588 mfspr r10,SPRN_##_H##SRR1; \
Benjamin Herrenschmidt7230c562012-03-06 18:27:59 +1100589 rldicl r10,r10,48,1; /* clear MSR_EE */ \
590 rotldi r10,r10,16; \
591 mtspr SPRN_##_H##SRR1,r10; \
5922: mtcrf 0x80,r9; \
593 ld r9,PACA_EXGEN+EX_R9(r13); \
594 ld r10,PACA_EXGEN+EX_R10(r13); \
595 ld r11,PACA_EXGEN+EX_R11(r13); \
596 GET_SCRATCH0(r13); \
597 ##_H##rfid; \
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000598 b .
Benjamin Herrenschmidt7230c562012-03-06 18:27:59 +1100599
600 MASKED_INTERRUPT()
601 MASKED_INTERRUPT(H)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000602
Benjamin Herrenschmidt7230c562012-03-06 18:27:59 +1100603/*
604 * Called from arch_local_irq_enable when an interrupt needs
Ian Munsiefe9e1d52012-11-14 18:49:48 +0000605 * to be resent. r3 contains 0x500, 0x900, 0xa00 or 0xe80 to indicate
606 * which kind of interrupt. MSR:EE is already off. We generate a
Benjamin Herrenschmidt7230c562012-03-06 18:27:59 +1100607 * stackframe like if a real interrupt had happened.
608 *
609 * Note: While MSR:EE is off, we need to make sure that _MSR
610 * in the generated frame has EE set to 1 or the exception
611 * handler will not properly re-enable them.
612 */
613_GLOBAL(__replay_interrupt)
614 /* We are going to jump to the exception common code which
615 * will retrieve various register values from the PACA which
616 * we don't give a damn about, so we don't bother storing them.
617 */
618 mfmsr r12
619 mflr r11
620 mfcr r9
621 ori r12,r12,MSR_EE
Ian Munsiefe9e1d52012-11-14 18:49:48 +0000622 cmpwi r3,0x900
623 beq decrementer_common
624 cmpwi r3,0x500
625 beq hardware_interrupt_common
626BEGIN_FTR_SECTION
627 cmpwi r3,0xe80
628 beq h_doorbell_common
629FTR_SECTION_ELSE
630 cmpwi r3,0xa00
631 beq doorbell_super_common
632ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
633 blr
Benjamin Herrenschmidta5d4f3a2011-04-05 14:20:31 +1000634
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000635#ifdef CONFIG_PPC_PSERIES
636/*
637 * Vectors for the FWNMI option. Share common code.
638 */
639 .globl system_reset_fwnmi
640 .align 7
641system_reset_fwnmi:
Haren Myneni44e93092012-12-06 21:51:04 +0000642 HMT_MEDIUM_PPR_DISCARD
Paul Mackerras673b1892011-04-05 13:59:58 +1000643 SET_SCRATCH0(r13) /* save r13 */
Paul Mackerrasb01c8b52011-06-29 00:18:26 +0000644 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD,
645 NOTEST, 0x100)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000646
647#endif /* CONFIG_PPC_PSERIES */
648
649#ifdef __DISABLED__
650/*
651 * This is used for when the SLB miss handler has to go virtual,
652 * which doesn't happen for now anymore but will once we re-implement
653 * dynamic VSIDs for shared page tables
654 */
655slb_miss_user_pseries:
656 std r10,PACA_EXGEN+EX_R10(r13)
657 std r11,PACA_EXGEN+EX_R11(r13)
658 std r12,PACA_EXGEN+EX_R12(r13)
Paul Mackerras673b1892011-04-05 13:59:58 +1000659 GET_SCRATCH0(r10)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000660 ld r11,PACA_EXSLB+EX_R9(r13)
661 ld r12,PACA_EXSLB+EX_R3(r13)
662 std r10,PACA_EXGEN+EX_R13(r13)
663 std r11,PACA_EXGEN+EX_R9(r13)
664 std r12,PACA_EXGEN+EX_R3(r13)
665 clrrdi r12,r13,32
666 mfmsr r10
667 mfspr r11,SRR0 /* save SRR0 */
668 ori r12,r12,slb_miss_user_common@l /* virt addr of handler */
669 ori r10,r10,MSR_IR|MSR_DR|MSR_RI
670 mtspr SRR0,r12
671 mfspr r12,SRR1 /* and SRR1 */
672 mtspr SRR1,r10
673 rfid
674 b . /* prevent spec. execution */
675#endif /* __DISABLED__ */
676
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000677/*
678 * Code from here down to __end_handlers is invoked from the
679 * exception prologs above. Because the prologs assemble the
680 * addresses of these handlers using the LOAD_HANDLER macro,
Michael Neuling61e23902012-11-05 17:10:35 +1100681 * which uses an ori instruction, these handlers must be in
682 * the first 64k of the kernel image.
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000683 */
684
685/*** Common interrupt handlers ***/
686
687 STD_EXCEPTION_COMMON(0x100, system_reset, .system_reset_exception)
688
689 /*
690 * Machine check is different because we use a different
691 * save area: PACA_EXMC instead of PACA_EXGEN.
692 */
693 .align 7
694 .globl machine_check_common
695machine_check_common:
696 EXCEPTION_PROLOG_COMMON(0x200, PACA_EXMC)
697 FINISH_NAP
698 DISABLE_INTS
699 bl .save_nvgprs
700 addi r3,r1,STACK_FRAME_OVERHEAD
701 bl .machine_check_exception
702 b .ret_from_except
703
Benjamin Herrenschmidt7450f6f2012-03-01 10:52:01 +1100704 STD_EXCEPTION_COMMON_ASYNC(0x500, hardware_interrupt, do_IRQ)
705 STD_EXCEPTION_COMMON_ASYNC(0x900, decrementer, .timer_interrupt)
Paul Mackerrasdabe8592012-07-26 13:56:11 +0000706 STD_EXCEPTION_COMMON(0x980, hdecrementer, .hdec_interrupt)
Ian Munsie1dbdafe2012-11-14 18:49:46 +0000707#ifdef CONFIG_PPC_DOORBELL
708 STD_EXCEPTION_COMMON_ASYNC(0xa00, doorbell_super, .doorbell_exception)
709#else
710 STD_EXCEPTION_COMMON_ASYNC(0xa00, doorbell_super, .unknown_exception)
711#endif
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000712 STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception)
713 STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception)
714 STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception)
Michael Neuling278a6cd2012-11-02 14:11:51 +1100715 STD_EXCEPTION_COMMON(0xe40, emulation_assist, .program_check_exception)
716 STD_EXCEPTION_COMMON(0xe60, hmi_exception, .unknown_exception)
Ian Munsie655bb3f2012-11-14 18:49:45 +0000717#ifdef CONFIG_PPC_DOORBELL
718 STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, .doorbell_exception)
719#else
720 STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, .unknown_exception)
721#endif
Benjamin Herrenschmidt7450f6f2012-03-01 10:52:01 +1100722 STD_EXCEPTION_COMMON_ASYNC(0xf00, performance_monitor, .performance_monitor_exception)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000723 STD_EXCEPTION_COMMON(0x1300, instruction_breakpoint, .instruction_breakpoint_exception)
Michael Neulingb92a66a2012-09-10 00:35:26 +0000724 STD_EXCEPTION_COMMON(0x1502, denorm, .unknown_exception)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000725#ifdef CONFIG_ALTIVEC
726 STD_EXCEPTION_COMMON(0x1700, altivec_assist, .altivec_assist_exception)
727#else
728 STD_EXCEPTION_COMMON(0x1700, altivec_assist, .unknown_exception)
729#endif
730#ifdef CONFIG_CBE_RAS
731 STD_EXCEPTION_COMMON(0x1200, cbe_system_error, .cbe_system_error_exception)
732 STD_EXCEPTION_COMMON(0x1600, cbe_maintenance, .cbe_maintenance_exception)
733 STD_EXCEPTION_COMMON(0x1800, cbe_thermal, .cbe_thermal_exception)
734#endif /* CONFIG_CBE_RAS */
735
Michael Neulingc1fb6812012-11-02 17:21:43 +1100736 /*
737 * Relocation-on interrupts: A subset of the interrupts can be delivered
738 * with IR=1/DR=1, if AIL==2 and MSR.HV won't be changed by delivering
739 * it. Addresses are the same as the original interrupt addresses, but
740 * offset by 0xc000000000004000.
741 * It's impossible to receive interrupts below 0x300 via this mechanism.
742 * KVM: None of these traps are from the guest ; anything that escalated
743 * to HV=1 from HV=0 is delivered via real mode handlers.
744 */
745
746 /*
747 * This uses the standard macro, since the original 0x300 vector
748 * only has extra guff for STAB-based processors -- which never
749 * come here.
750 */
751 STD_RELON_EXCEPTION_PSERIES(0x4300, 0x300, data_access)
752 . = 0x4380
753 .globl data_access_slb_relon_pSeries
754data_access_slb_relon_pSeries:
Michael Neulingc1fb6812012-11-02 17:21:43 +1100755 SET_SCRATCH0(r13)
Paul Mackerras1707dd12013-02-04 18:10:15 +0000756 EXCEPTION_PROLOG_0(PACA_EXSLB)
Michael Neulingc1fb6812012-11-02 17:21:43 +1100757 EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x380)
758 std r3,PACA_EXSLB+EX_R3(r13)
759 mfspr r3,SPRN_DAR
760 mfspr r12,SPRN_SRR1
761#ifndef CONFIG_RELOCATABLE
762 b .slb_miss_realmode
763#else
764 /*
765 * We can't just use a direct branch to .slb_miss_realmode
766 * because the distance from here to there depends on where
767 * the kernel ends up being put.
768 */
769 mfctr r11
770 ld r10,PACAKBASE(r13)
771 LOAD_HANDLER(r10, .slb_miss_realmode)
772 mtctr r10
773 bctr
774#endif
775
776 STD_RELON_EXCEPTION_PSERIES(0x4400, 0x400, instruction_access)
777 . = 0x4480
778 .globl instruction_access_slb_relon_pSeries
779instruction_access_slb_relon_pSeries:
Michael Neulingc1fb6812012-11-02 17:21:43 +1100780 SET_SCRATCH0(r13)
Paul Mackerras1707dd12013-02-04 18:10:15 +0000781 EXCEPTION_PROLOG_0(PACA_EXSLB)
Michael Neulingc1fb6812012-11-02 17:21:43 +1100782 EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x480)
783 std r3,PACA_EXSLB+EX_R3(r13)
784 mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */
785 mfspr r12,SPRN_SRR1
786#ifndef CONFIG_RELOCATABLE
787 b .slb_miss_realmode
788#else
789 mfctr r11
790 ld r10,PACAKBASE(r13)
791 LOAD_HANDLER(r10, .slb_miss_realmode)
792 mtctr r10
793 bctr
794#endif
795
796 . = 0x4500
797 .globl hardware_interrupt_relon_pSeries;
798 .globl hardware_interrupt_relon_hv;
799hardware_interrupt_relon_pSeries:
800hardware_interrupt_relon_hv:
801 BEGIN_FTR_SECTION
802 _MASKABLE_RELON_EXCEPTION_PSERIES(0x502, hardware_interrupt, EXC_HV, SOFTEN_TEST_HV)
803 FTR_SECTION_ELSE
804 _MASKABLE_RELON_EXCEPTION_PSERIES(0x500, hardware_interrupt, EXC_STD, SOFTEN_TEST_PR)
Michael Neuling3e96ca72013-04-25 15:30:57 +0000805 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
Michael Neulingc1fb6812012-11-02 17:21:43 +1100806 STD_RELON_EXCEPTION_PSERIES(0x4600, 0x600, alignment)
807 STD_RELON_EXCEPTION_PSERIES(0x4700, 0x700, program_check)
808 STD_RELON_EXCEPTION_PSERIES(0x4800, 0x800, fp_unavailable)
809 MASKABLE_RELON_EXCEPTION_PSERIES(0x4900, 0x900, decrementer)
810 STD_RELON_EXCEPTION_HV(0x4980, 0x982, hdecrementer)
Ian Munsie1dbdafe2012-11-14 18:49:46 +0000811 MASKABLE_RELON_EXCEPTION_PSERIES(0x4a00, 0xa00, doorbell_super)
Michael Neulingc1fb6812012-11-02 17:21:43 +1100812 STD_RELON_EXCEPTION_PSERIES(0x4b00, 0xb00, trap_0b)
813
814 . = 0x4c00
815 .globl system_call_relon_pSeries
816system_call_relon_pSeries:
817 HMT_MEDIUM
818 SYSCALL_PSERIES_1
819 SYSCALL_PSERIES_2_DIRECT
820 SYSCALL_PSERIES_3
821
822 STD_RELON_EXCEPTION_PSERIES(0x4d00, 0xd00, single_step)
823
824 . = 0x4e00
Paul Mackerras1707dd12013-02-04 18:10:15 +0000825 SET_SCRATCH0(r13)
826 EXCEPTION_PROLOG_0(PACA_EXGEN)
Michael Neulingc1fb6812012-11-02 17:21:43 +1100827 b h_data_storage_relon_hv
828
829 . = 0x4e20
Paul Mackerras1707dd12013-02-04 18:10:15 +0000830 SET_SCRATCH0(r13)
831 EXCEPTION_PROLOG_0(PACA_EXGEN)
Michael Neulingc1fb6812012-11-02 17:21:43 +1100832 b h_instr_storage_relon_hv
833
834 . = 0x4e40
Paul Mackerras1707dd12013-02-04 18:10:15 +0000835 SET_SCRATCH0(r13)
836 EXCEPTION_PROLOG_0(PACA_EXGEN)
Michael Neulingc1fb6812012-11-02 17:21:43 +1100837 b emulation_assist_relon_hv
838
Michael Neulingc1fb6812012-11-02 17:21:43 +1100839 . = 0x4e60
Paul Mackerras1707dd12013-02-04 18:10:15 +0000840 SET_SCRATCH0(r13)
841 EXCEPTION_PROLOG_0(PACA_EXGEN)
Michael Neulingc1fb6812012-11-02 17:21:43 +1100842 b hmi_exception_relon_hv
843
Ian Munsie655bb3f2012-11-14 18:49:45 +0000844 . = 0x4e80
Paul Mackerras1707dd12013-02-04 18:10:15 +0000845 SET_SCRATCH0(r13)
846 EXCEPTION_PROLOG_0(PACA_EXGEN)
Ian Munsie655bb3f2012-11-14 18:49:45 +0000847 b h_doorbell_relon_hv
Michael Neulingc1fb6812012-11-02 17:21:43 +1100848
849performance_monitor_relon_pSeries_1:
850 . = 0x4f00
Paul Mackerras1707dd12013-02-04 18:10:15 +0000851 SET_SCRATCH0(r13)
852 EXCEPTION_PROLOG_0(PACA_EXGEN)
Michael Neulingc1fb6812012-11-02 17:21:43 +1100853 b performance_monitor_relon_pSeries
854
855altivec_unavailable_relon_pSeries_1:
856 . = 0x4f20
Paul Mackerras1707dd12013-02-04 18:10:15 +0000857 SET_SCRATCH0(r13)
858 EXCEPTION_PROLOG_0(PACA_EXGEN)
Michael Neulingc1fb6812012-11-02 17:21:43 +1100859 b altivec_unavailable_relon_pSeries
860
861vsx_unavailable_relon_pSeries_1:
862 . = 0x4f40
Paul Mackerras1707dd12013-02-04 18:10:15 +0000863 SET_SCRATCH0(r13)
864 EXCEPTION_PROLOG_0(PACA_EXGEN)
Michael Neulingc1fb6812012-11-02 17:21:43 +1100865 b vsx_unavailable_relon_pSeries
866
Michael Neulingd0c0c9a2013-02-13 16:21:38 +0000867tm_unavailable_relon_pSeries_1:
868 . = 0x4f60
869 SET_SCRATCH0(r13)
870 EXCEPTION_PROLOG_0(PACA_EXGEN)
871 b tm_unavailable_relon_pSeries
872
Michael Neulingc1fb6812012-11-02 17:21:43 +1100873 STD_RELON_EXCEPTION_PSERIES(0x5300, 0x1300, instruction_breakpoint)
874#ifdef CONFIG_PPC_DENORMALISATION
875 . = 0x5500
876 b denorm_exception_hv
877#endif
Michael Neulingc1fb6812012-11-02 17:21:43 +1100878 STD_RELON_EXCEPTION_PSERIES(0x5700, 0x1700, altivec_assist)
Michael Neulingc1fb6812012-11-02 17:21:43 +1100879
880 /* Other future vectors */
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000881 .align 7
Michael Neulingc1fb6812012-11-02 17:21:43 +1100882 .globl __end_interrupts
883__end_interrupts:
884
885 .align 7
886system_call_entry_direct:
887#if defined(CONFIG_RELOCATABLE)
888 /* The first level prologue may have used LR to get here, saving
889 * orig in r10. To save hacking/ifdeffing common code, restore here.
890 */
891 mtlr r10
892#endif
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000893system_call_entry:
894 b system_call_common
895
Benjamin Herrenschmidtfe1952f2012-03-01 12:45:27 +1100896ppc64_runlatch_on_trampoline:
897 b .__ppc64_runlatch_on
898
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000899/*
900 * Here we have detected that the kernel stack pointer is bad.
901 * R9 contains the saved CR, r13 points to the paca,
902 * r10 contains the (bad) kernel stack pointer,
903 * r11 and r12 contain the saved SRR0 and SRR1.
904 * We switch to using an emergency stack, save the registers there,
905 * and call kernel_bad_stack(), which panics.
906 */
907bad_stack:
908 ld r1,PACAEMERGSP(r13)
909 subi r1,r1,64+INT_FRAME_SIZE
910 std r9,_CCR(r1)
911 std r10,GPR1(r1)
912 std r11,_NIP(r1)
913 std r12,_MSR(r1)
914 mfspr r11,SPRN_DAR
915 mfspr r12,SPRN_DSISR
916 std r11,_DAR(r1)
917 std r12,_DSISR(r1)
918 mflr r10
919 mfctr r11
920 mfxer r12
921 std r10,_LINK(r1)
922 std r11,_CTR(r1)
923 std r12,_XER(r1)
924 SAVE_GPR(0,r1)
925 SAVE_GPR(2,r1)
Paul Mackerras1977b502011-05-01 19:46:44 +0000926 ld r10,EX_R3(r3)
927 std r10,GPR3(r1)
928 SAVE_GPR(4,r1)
929 SAVE_4GPRS(5,r1)
930 ld r9,EX_R9(r3)
931 ld r10,EX_R10(r3)
932 SAVE_2GPRS(9,r1)
933 ld r9,EX_R11(r3)
934 ld r10,EX_R12(r3)
935 ld r11,EX_R13(r3)
936 std r9,GPR11(r1)
937 std r10,GPR12(r1)
938 std r11,GPR13(r1)
Paul Mackerras48404f22011-05-01 19:48:20 +0000939BEGIN_FTR_SECTION
940 ld r10,EX_CFAR(r3)
941 std r10,ORIG_GPR3(r1)
942END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
Paul Mackerras1977b502011-05-01 19:46:44 +0000943 SAVE_8GPRS(14,r1)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000944 SAVE_10GPRS(22,r1)
945 lhz r12,PACA_TRAP_SAVE(r13)
946 std r12,_TRAP(r1)
947 addi r11,r1,INT_FRAME_SIZE
948 std r11,0(r1)
949 li r12,0
950 std r12,0(r11)
951 ld r2,PACATOC(r13)
Paul Mackerras1977b502011-05-01 19:46:44 +0000952 ld r11,exception_marker@toc(r2)
953 std r12,RESULT(r1)
954 std r11,STACK_FRAME_OVERHEAD-16(r1)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00009551: addi r3,r1,STACK_FRAME_OVERHEAD
956 bl .kernel_bad_stack
957 b 1b
958
959/*
960 * Here r13 points to the paca, r9 contains the saved CR,
961 * SRR0 and SRR1 are saved in r11 and r12,
962 * r9 - r13 are saved in paca->exgen.
963 */
964 .align 7
965 .globl data_access_common
966data_access_common:
967 mfspr r10,SPRN_DAR
968 std r10,PACA_EXGEN+EX_DAR(r13)
969 mfspr r10,SPRN_DSISR
970 stw r10,PACA_EXGEN+EX_DSISR(r13)
971 EXCEPTION_PROLOG_COMMON(0x300, PACA_EXGEN)
Benjamin Herrenschmidta5464982012-03-07 16:48:45 +1100972 DISABLE_INTS
973 ld r12,_MSR(r1)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000974 ld r3,PACA_EXGEN+EX_DAR(r13)
975 lwz r4,PACA_EXGEN+EX_DSISR(r13)
976 li r5,0x300
Michael Neuling278a6cd2012-11-02 14:11:51 +1100977 b .do_hash_page /* Try to handle as hpte fault */
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000978
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000979 .align 7
Michael Neuling278a6cd2012-11-02 14:11:51 +1100980 .globl h_data_storage_common
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000981h_data_storage_common:
Michael Neuling278a6cd2012-11-02 14:11:51 +1100982 mfspr r10,SPRN_HDAR
983 std r10,PACA_EXGEN+EX_DAR(r13)
984 mfspr r10,SPRN_HDSISR
985 stw r10,PACA_EXGEN+EX_DSISR(r13)
986 EXCEPTION_PROLOG_COMMON(0xe00, PACA_EXGEN)
987 bl .save_nvgprs
Benjamin Herrenschmidta5464982012-03-07 16:48:45 +1100988 DISABLE_INTS
Michael Neuling278a6cd2012-11-02 14:11:51 +1100989 addi r3,r1,STACK_FRAME_OVERHEAD
990 bl .unknown_exception
991 b .ret_from_except
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +1000992
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000993 .align 7
994 .globl instruction_access_common
995instruction_access_common:
996 EXCEPTION_PROLOG_COMMON(0x400, PACA_EXGEN)
Benjamin Herrenschmidta5464982012-03-07 16:48:45 +1100997 DISABLE_INTS
998 ld r12,_MSR(r1)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +0000999 ld r3,_NIP(r1)
1000 andis. r4,r12,0x5820
1001 li r5,0x400
1002 b .do_hash_page /* Try to handle as hpte fault */
1003
Michael Neuling278a6cd2012-11-02 14:11:51 +11001004 STD_EXCEPTION_COMMON(0xe20, h_instr_storage, .unknown_exception)
Benjamin Herrenschmidtb3e6b5d2011-04-05 14:27:11 +10001005
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001006/*
1007 * Here is the common SLB miss user that is used when going to virtual
1008 * mode for SLB misses, that is currently not used
1009 */
1010#ifdef __DISABLED__
1011 .align 7
1012 .globl slb_miss_user_common
1013slb_miss_user_common:
1014 mflr r10
1015 std r3,PACA_EXGEN+EX_DAR(r13)
1016 stw r9,PACA_EXGEN+EX_CCR(r13)
1017 std r10,PACA_EXGEN+EX_LR(r13)
1018 std r11,PACA_EXGEN+EX_SRR0(r13)
1019 bl .slb_allocate_user
1020
1021 ld r10,PACA_EXGEN+EX_LR(r13)
1022 ld r3,PACA_EXGEN+EX_R3(r13)
1023 lwz r9,PACA_EXGEN+EX_CCR(r13)
1024 ld r11,PACA_EXGEN+EX_SRR0(r13)
1025 mtlr r10
1026 beq- slb_miss_fault
1027
1028 andi. r10,r12,MSR_RI /* check for unrecoverable exception */
1029 beq- unrecov_user_slb
1030 mfmsr r10
1031
1032.machine push
1033.machine "power4"
1034 mtcrf 0x80,r9
1035.machine pop
1036
1037 clrrdi r10,r10,2 /* clear RI before setting SRR0/1 */
1038 mtmsrd r10,1
1039
1040 mtspr SRR0,r11
1041 mtspr SRR1,r12
1042
1043 ld r9,PACA_EXGEN+EX_R9(r13)
1044 ld r10,PACA_EXGEN+EX_R10(r13)
1045 ld r11,PACA_EXGEN+EX_R11(r13)
1046 ld r12,PACA_EXGEN+EX_R12(r13)
1047 ld r13,PACA_EXGEN+EX_R13(r13)
1048 rfid
1049 b .
1050
1051slb_miss_fault:
1052 EXCEPTION_PROLOG_COMMON(0x380, PACA_EXGEN)
1053 ld r4,PACA_EXGEN+EX_DAR(r13)
1054 li r5,0
1055 std r4,_DAR(r1)
1056 std r5,_DSISR(r1)
1057 b handle_page_fault
1058
1059unrecov_user_slb:
1060 EXCEPTION_PROLOG_COMMON(0x4200, PACA_EXGEN)
1061 DISABLE_INTS
1062 bl .save_nvgprs
10631: addi r3,r1,STACK_FRAME_OVERHEAD
1064 bl .unrecoverable_exception
1065 b 1b
1066
1067#endif /* __DISABLED__ */
1068
1069
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001070 .align 7
1071 .globl alignment_common
1072alignment_common:
1073 mfspr r10,SPRN_DAR
1074 std r10,PACA_EXGEN+EX_DAR(r13)
1075 mfspr r10,SPRN_DSISR
1076 stw r10,PACA_EXGEN+EX_DSISR(r13)
1077 EXCEPTION_PROLOG_COMMON(0x600, PACA_EXGEN)
1078 ld r3,PACA_EXGEN+EX_DAR(r13)
1079 lwz r4,PACA_EXGEN+EX_DSISR(r13)
1080 std r3,_DAR(r1)
1081 std r4,_DSISR(r1)
1082 bl .save_nvgprs
Benjamin Herrenschmidta3512b22012-05-08 13:38:50 +10001083 DISABLE_INTS
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001084 addi r3,r1,STACK_FRAME_OVERHEAD
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001085 bl .alignment_exception
1086 b .ret_from_except
1087
1088 .align 7
1089 .globl program_check_common
1090program_check_common:
1091 EXCEPTION_PROLOG_COMMON(0x700, PACA_EXGEN)
1092 bl .save_nvgprs
Benjamin Herrenschmidt54321242012-02-13 20:42:18 +00001093 DISABLE_INTS
Michael Ellerman922b9f82012-02-20 21:32:30 +00001094 addi r3,r1,STACK_FRAME_OVERHEAD
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001095 bl .program_check_exception
1096 b .ret_from_except
1097
1098 .align 7
1099 .globl fp_unavailable_common
1100fp_unavailable_common:
1101 EXCEPTION_PROLOG_COMMON(0x800, PACA_EXGEN)
1102 bne 1f /* if from user, just load it up */
1103 bl .save_nvgprs
Benjamin Herrenschmidt9f2f79e2012-03-01 15:47:44 +11001104 DISABLE_INTS
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001105 addi r3,r1,STACK_FRAME_OVERHEAD
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001106 bl .kernel_fp_unavailable_exception
1107 BUG_OPCODE
Michael Neulingbc2a9402013-02-13 16:21:40 +000011081:
1109#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1110BEGIN_FTR_SECTION
1111 /* Test if 2 TM state bits are zero. If non-zero (ie. userspace was in
1112 * transaction), go do TM stuff
1113 */
1114 rldicl. r0, r12, (64-MSR_TS_LG), (64-2)
1115 bne- 2f
1116END_FTR_SECTION_IFSET(CPU_FTR_TM)
1117#endif
1118 bl .load_up_fpu
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001119 b fast_exception_return
Michael Neulingbc2a9402013-02-13 16:21:40 +00001120#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
11212: /* User process was in a transaction */
1122 bl .save_nvgprs
1123 DISABLE_INTS
1124 addi r3,r1,STACK_FRAME_OVERHEAD
1125 bl .fp_unavailable_tm
1126 b .ret_from_except
1127#endif
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001128 .align 7
1129 .globl altivec_unavailable_common
1130altivec_unavailable_common:
1131 EXCEPTION_PROLOG_COMMON(0xf20, PACA_EXGEN)
1132#ifdef CONFIG_ALTIVEC
1133BEGIN_FTR_SECTION
1134 beq 1f
Michael Neulingbc2a9402013-02-13 16:21:40 +00001135#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1136 BEGIN_FTR_SECTION_NESTED(69)
1137 /* Test if 2 TM state bits are zero. If non-zero (ie. userspace was in
1138 * transaction), go do TM stuff
1139 */
1140 rldicl. r0, r12, (64-MSR_TS_LG), (64-2)
1141 bne- 2f
1142 END_FTR_SECTION_NESTED(CPU_FTR_TM, CPU_FTR_TM, 69)
1143#endif
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001144 bl .load_up_altivec
1145 b fast_exception_return
Michael Neulingbc2a9402013-02-13 16:21:40 +00001146#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
11472: /* User process was in a transaction */
1148 bl .save_nvgprs
1149 DISABLE_INTS
1150 addi r3,r1,STACK_FRAME_OVERHEAD
1151 bl .altivec_unavailable_tm
1152 b .ret_from_except
1153#endif
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +000011541:
1155END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
1156#endif
1157 bl .save_nvgprs
Benjamin Herrenschmidt9f2f79e2012-03-01 15:47:44 +11001158 DISABLE_INTS
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001159 addi r3,r1,STACK_FRAME_OVERHEAD
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001160 bl .altivec_unavailable_exception
1161 b .ret_from_except
1162
1163 .align 7
1164 .globl vsx_unavailable_common
1165vsx_unavailable_common:
1166 EXCEPTION_PROLOG_COMMON(0xf40, PACA_EXGEN)
1167#ifdef CONFIG_VSX
1168BEGIN_FTR_SECTION
Benjamin Herrenschmidt7230c562012-03-06 18:27:59 +11001169 beq 1f
Michael Neulingbc2a9402013-02-13 16:21:40 +00001170#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1171 BEGIN_FTR_SECTION_NESTED(69)
1172 /* Test if 2 TM state bits are zero. If non-zero (ie. userspace was in
1173 * transaction), go do TM stuff
1174 */
1175 rldicl. r0, r12, (64-MSR_TS_LG), (64-2)
1176 bne- 2f
1177 END_FTR_SECTION_NESTED(CPU_FTR_TM, CPU_FTR_TM, 69)
1178#endif
Benjamin Herrenschmidt7230c562012-03-06 18:27:59 +11001179 b .load_up_vsx
Michael Neulingbc2a9402013-02-13 16:21:40 +00001180#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
11812: /* User process was in a transaction */
1182 bl .save_nvgprs
1183 DISABLE_INTS
1184 addi r3,r1,STACK_FRAME_OVERHEAD
1185 bl .vsx_unavailable_tm
1186 b .ret_from_except
1187#endif
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +000011881:
1189END_FTR_SECTION_IFSET(CPU_FTR_VSX)
1190#endif
1191 bl .save_nvgprs
Benjamin Herrenschmidt9f2f79e2012-03-01 15:47:44 +11001192 DISABLE_INTS
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001193 addi r3,r1,STACK_FRAME_OVERHEAD
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001194 bl .vsx_unavailable_exception
1195 b .ret_from_except
1196
1197 .align 7
Michael Neulingd0c0c9a2013-02-13 16:21:38 +00001198 .globl tm_unavailable_common
1199tm_unavailable_common:
1200 EXCEPTION_PROLOG_COMMON(0xf60, PACA_EXGEN)
1201 bl .save_nvgprs
Michael Neulingbc2a9402013-02-13 16:21:40 +00001202 DISABLE_INTS
Michael Neulingd0c0c9a2013-02-13 16:21:38 +00001203 addi r3,r1,STACK_FRAME_OVERHEAD
1204 bl .tm_unavailable_exception
1205 b .ret_from_except
1206
1207 .align 7
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001208 .globl __end_handlers
1209__end_handlers:
1210
Benjamin Herrenschmidt61383402013-01-10 17:44:19 +11001211 /* Equivalents to the above handlers for relocation-on interrupt vectors */
Paul Mackerras1707dd12013-02-04 18:10:15 +00001212 STD_RELON_EXCEPTION_HV_OOL(0xe00, h_data_storage)
Benjamin Herrenschmidt61383402013-01-10 17:44:19 +11001213 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe00)
Paul Mackerras1707dd12013-02-04 18:10:15 +00001214 STD_RELON_EXCEPTION_HV_OOL(0xe20, h_instr_storage)
Benjamin Herrenschmidt61383402013-01-10 17:44:19 +11001215 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe20)
Paul Mackerras1707dd12013-02-04 18:10:15 +00001216 STD_RELON_EXCEPTION_HV_OOL(0xe40, emulation_assist)
Benjamin Herrenschmidt61383402013-01-10 17:44:19 +11001217 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe40)
Paul Mackerras1707dd12013-02-04 18:10:15 +00001218 STD_RELON_EXCEPTION_HV_OOL(0xe60, hmi_exception)
Benjamin Herrenschmidt61383402013-01-10 17:44:19 +11001219 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe60)
Paul Mackerras1707dd12013-02-04 18:10:15 +00001220 MASKABLE_RELON_EXCEPTION_HV_OOL(0xe80, h_doorbell)
Benjamin Herrenschmidt61383402013-01-10 17:44:19 +11001221 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe80)
1222
Paul Mackerras1707dd12013-02-04 18:10:15 +00001223 STD_RELON_EXCEPTION_PSERIES_OOL(0xf00, performance_monitor)
1224 STD_RELON_EXCEPTION_PSERIES_OOL(0xf20, altivec_unavailable)
1225 STD_RELON_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable)
Michael Neulingd0c0c9a2013-02-13 16:21:38 +00001226 STD_RELON_EXCEPTION_PSERIES_OOL(0xf60, tm_unavailable)
Benjamin Herrenschmidt61383402013-01-10 17:44:19 +11001227
1228#if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
1229/*
1230 * Data area reserved for FWNMI option.
1231 * This address (0x7000) is fixed by the RPA.
1232 */
1233 .= 0x7000
1234 .globl fwnmi_data_area
1235fwnmi_data_area:
1236
1237 /* pseries and powernv need to keep the whole page from
1238 * 0x7000 to 0x8000 free for use by the firmware
1239 */
1240 . = 0x8000
1241#endif /* defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) */
1242
1243/* Space for CPU0's segment table */
1244 .balign 4096
1245 .globl initial_stab
1246initial_stab:
1247 .space 4096
1248
1249#ifdef CONFIG_PPC_POWERNV
1250_GLOBAL(opal_mc_secondary_handler)
1251 HMT_MEDIUM_PPR_DISCARD
1252 SET_SCRATCH0(r13)
1253 GET_PACA(r13)
1254 clrldi r3,r3,2
1255 tovirt(r3,r3)
1256 std r3,PACA_OPAL_MC_EVT(r13)
1257 ld r13,OPAL_MC_SRR0(r3)
1258 mtspr SPRN_SRR0,r13
1259 ld r13,OPAL_MC_SRR1(r3)
1260 mtspr SPRN_SRR1,r13
1261 ld r3,OPAL_MC_GPR3(r3)
1262 GET_SCRATCH0(r13)
1263 b machine_check_pSeries
1264#endif /* CONFIG_PPC_POWERNV */
1265
1266
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001267/*
Chen Gang087aa032013-03-25 09:31:31 +08001268 * r13 points to the PACA, r9 contains the saved CR,
1269 * r12 contain the saved SRR1, SRR0 is still ready for return
1270 * r3 has the faulting address
1271 * r9 - r13 are saved in paca->exslb.
1272 * r3 is saved in paca->slb_r3
1273 * We assume we aren't going to take any exceptions during this procedure.
1274 */
1275_GLOBAL(slb_miss_realmode)
1276 mflr r10
1277#ifdef CONFIG_RELOCATABLE
1278 mtctr r11
1279#endif
1280
1281 stw r9,PACA_EXSLB+EX_CCR(r13) /* save CR in exc. frame */
1282 std r10,PACA_EXSLB+EX_LR(r13) /* save LR */
1283
1284 bl .slb_allocate_realmode
1285
1286 /* All done -- return from exception. */
1287
1288 ld r10,PACA_EXSLB+EX_LR(r13)
1289 ld r3,PACA_EXSLB+EX_R3(r13)
1290 lwz r9,PACA_EXSLB+EX_CCR(r13) /* get saved CR */
1291
1292 mtlr r10
1293
1294 andi. r10,r12,MSR_RI /* check for unrecoverable exception */
1295 beq- 2f
1296
1297.machine push
1298.machine "power4"
1299 mtcrf 0x80,r9
1300 mtcrf 0x01,r9 /* slb_allocate uses cr0 and cr7 */
1301.machine pop
1302
1303 RESTORE_PPR_PACA(PACA_EXSLB, r9)
1304 ld r9,PACA_EXSLB+EX_R9(r13)
1305 ld r10,PACA_EXSLB+EX_R10(r13)
1306 ld r11,PACA_EXSLB+EX_R11(r13)
1307 ld r12,PACA_EXSLB+EX_R12(r13)
1308 ld r13,PACA_EXSLB+EX_R13(r13)
1309 rfid
1310 b . /* prevent speculative execution */
1311
13122: mfspr r11,SPRN_SRR0
1313 ld r10,PACAKBASE(r13)
1314 LOAD_HANDLER(r10,unrecov_slb)
1315 mtspr SPRN_SRR0,r10
1316 ld r10,PACAKMSR(r13)
1317 mtspr SPRN_SRR1,r10
1318 rfid
1319 b .
1320
1321unrecov_slb:
1322 EXCEPTION_PROLOG_COMMON(0x4100, PACA_EXSLB)
1323 DISABLE_INTS
1324 bl .save_nvgprs
13251: addi r3,r1,STACK_FRAME_OVERHEAD
1326 bl .unrecoverable_exception
1327 b 1b
1328
1329
1330#ifdef CONFIG_PPC_970_NAP
1331power4_fixup_nap:
1332 andc r9,r9,r10
1333 std r9,TI_LOCAL_FLAGS(r11)
1334 ld r10,_LINK(r1) /* make idle task do the */
1335 std r10,_NIP(r1) /* equivalent of a blr */
1336 blr
1337#endif
1338
1339/*
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001340 * Hash table stuff
1341 */
1342 .align 7
1343_STATIC(do_hash_page)
1344 std r3,_DAR(r1)
1345 std r4,_DSISR(r1)
1346
K.Prasad9c7cc232010-03-29 23:59:25 +00001347 andis. r0,r4,0xa410 /* weird error? */
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001348 bne- handle_page_fault /* if not, try to insert a HPTE */
K.Prasad9c7cc232010-03-29 23:59:25 +00001349 andis. r0,r4,DSISR_DABRMATCH@h
1350 bne- handle_dabr_fault
1351
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001352BEGIN_FTR_SECTION
1353 andis. r0,r4,0x0020 /* Is it a segment table fault? */
1354 bne- do_ste_alloc /* If so handle it */
Matt Evans44ae3ab2011-04-06 19:48:50 +00001355END_MMU_FTR_SECTION_IFCLR(MMU_FTR_SLB)
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001356
Stuart Yoder9778b692012-07-05 04:41:35 +00001357 CURRENT_THREAD_INFO(r11, r1)
Paul Mackerras9c1e1052009-08-17 15:17:54 +10001358 lwz r0,TI_PREEMPT(r11) /* If we're in an "NMI" */
1359 andis. r0,r0,NMI_MASK@h /* (i.e. an irq when soft-disabled) */
1360 bne 77f /* then don't call hash_page now */
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001361 /*
1362 * We need to set the _PAGE_USER bit if MSR_PR is set or if we are
1363 * accessing a userspace segment (even from the kernel). We assume
1364 * kernel addresses always have the high bit set.
1365 */
1366 rlwinm r4,r4,32-25+9,31-9,31-9 /* DSISR_STORE -> _PAGE_RW */
1367 rotldi r0,r3,15 /* Move high bit into MSR_PR posn */
1368 orc r0,r12,r0 /* MSR_PR | ~high_bit */
1369 rlwimi r4,r0,32-13,30,30 /* becomes _PAGE_USER access bit */
1370 ori r4,r4,1 /* add _PAGE_PRESENT */
1371 rlwimi r4,r5,22+2,31-2,31-2 /* Set _PAGE_EXEC if trap is 0x400 */
1372
1373 /*
1374 * r3 contains the faulting address
1375 * r4 contains the required access permissions
1376 * r5 contains the trap number
1377 *
Benjamin Herrenschmidt7230c562012-03-06 18:27:59 +11001378 * at return r3 = 0 for success, 1 for page fault, negative for error
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001379 */
1380 bl .hash_page /* build HPTE if possible */
1381 cmpdi r3,0 /* see if hash_page succeeded */
1382
Benjamin Herrenschmidt7230c562012-03-06 18:27:59 +11001383 /* Success */
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001384 beq fast_exc_return_irq /* Return from exception on success */
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001385
Benjamin Herrenschmidt7230c562012-03-06 18:27:59 +11001386 /* Error */
1387 blt- 13f
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001388
Benjamin Herrenschmidta5464982012-03-07 16:48:45 +11001389/* Here we have a page fault that hash_page can't handle. */
1390handle_page_fault:
139111: ld r4,_DAR(r1)
1392 ld r5,_DSISR(r1)
1393 addi r3,r1,STACK_FRAME_OVERHEAD
1394 bl .do_page_fault
1395 cmpdi r3,0
1396 beq+ 12f
1397 bl .save_nvgprs
1398 mr r5,r3
1399 addi r3,r1,STACK_FRAME_OVERHEAD
1400 lwz r4,_DAR(r1)
1401 bl .bad_page_fault
1402 b .ret_from_except
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001403
K.Prasad9c7cc232010-03-29 23:59:25 +00001404/* We have a data breakpoint exception - handle it */
1405handle_dabr_fault:
K.Prasad5aae8a52010-06-15 11:35:19 +05301406 bl .save_nvgprs
K.Prasad9c7cc232010-03-29 23:59:25 +00001407 ld r4,_DAR(r1)
1408 ld r5,_DSISR(r1)
1409 addi r3,r1,STACK_FRAME_OVERHEAD
Michael Neuling9422de32012-12-20 14:06:44 +00001410 bl .do_break
Benjamin Herrenschmidta5464982012-03-07 16:48:45 +1100141112: b .ret_from_except_lite
K.Prasad9c7cc232010-03-29 23:59:25 +00001412
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001413
1414/* We have a page fault that hash_page could handle but HV refused
1415 * the PTE insertion
1416 */
Benjamin Herrenschmidta5464982012-03-07 16:48:45 +1100141713: bl .save_nvgprs
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001418 mr r5,r3
1419 addi r3,r1,STACK_FRAME_OVERHEAD
1420 ld r4,_DAR(r1)
1421 bl .low_hash_fault
1422 b .ret_from_except
1423
Paul Mackerras9c1e1052009-08-17 15:17:54 +10001424/*
1425 * We come here as a result of a DSI at a point where we don't want
1426 * to call hash_page, such as when we are accessing memory (possibly
1427 * user memory) inside a PMU interrupt that occurred while interrupts
1428 * were soft-disabled. We want to invoke the exception handler for
1429 * the access, or panic if there isn't a handler.
1430 */
143177: bl .save_nvgprs
1432 mr r4,r3
1433 addi r3,r1,STACK_FRAME_OVERHEAD
1434 li r5,SIGSEGV
1435 bl .bad_page_fault
1436 b .ret_from_except
1437
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001438 /* here we have a segment miss */
1439do_ste_alloc:
1440 bl .ste_allocate /* try to insert stab entry */
1441 cmpdi r3,0
1442 bne- handle_page_fault
1443 b fast_exception_return
1444
1445/*
1446 * r13 points to the PACA, r9 contains the saved CR,
1447 * r11 and r12 contain the saved SRR0 and SRR1.
1448 * r9 - r13 are saved in paca->exslb.
1449 * We assume we aren't going to take any exceptions during this procedure.
1450 * We assume (DAR >> 60) == 0xc.
1451 */
1452 .align 7
1453_GLOBAL(do_stab_bolted)
1454 stw r9,PACA_EXSLB+EX_CCR(r13) /* save CR in exc. frame */
1455 std r11,PACA_EXSLB+EX_SRR0(r13) /* save SRR0 in exc. frame */
Aneesh Kumar K.Vc60ac562013-03-13 03:34:54 +00001456 mfspr r11,SPRN_DAR /* ea */
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001457
Aneesh Kumar K.Vc60ac562013-03-13 03:34:54 +00001458 /*
1459 * check for bad kernel/user address
1460 * (ea & ~REGION_MASK) >= PGTABLE_RANGE
1461 */
1462 rldicr. r9,r11,4,(63 - 46 - 4)
1463 li r9,0 /* VSID = 0 for bad address */
1464 bne- 0f
1465
1466 /*
1467 * Calculate VSID:
1468 * This is the kernel vsid, we take the top for context from
1469 * the range. context = (MAX_USER_CONTEXT) + ((ea >> 60) - 0xc) + 1
1470 * Here we know that (ea >> 60) == 0xc
1471 */
1472 lis r9,(MAX_USER_CONTEXT + 1)@ha
1473 addi r9,r9,(MAX_USER_CONTEXT + 1)@l
1474
1475 srdi r10,r11,SID_SHIFT
Aneesh Kumar K.Vaf81d782013-03-13 03:34:55 +00001476 rldimi r10,r9,ESID_BITS,0 /* proto vsid */
Aneesh Kumar K.Vc60ac562013-03-13 03:34:54 +00001477 ASM_VSID_SCRAMBLE(r10, r9, 256M)
1478 rldic r9,r10,12,16 /* r9 = vsid << 12 */
1479
14800:
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001481 /* Hash to the primary group */
1482 ld r10,PACASTABVIRT(r13)
Aneesh Kumar K.Vc60ac562013-03-13 03:34:54 +00001483 srdi r11,r11,SID_SHIFT
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001484 rldimi r10,r11,7,52 /* r10 = first ste of the group */
1485
Benjamin Herrenschmidt0ebc4cd2009-06-02 21:17:38 +00001486 /* Search the primary group for a free entry */
14871: ld r11,0(r10) /* Test valid bit of the current ste */
1488 andi. r11,r11,0x80
1489 beq 2f
1490 addi r10,r10,16
1491 andi. r11,r10,0x70
1492 bne 1b
1493
1494 /* Stick for only searching the primary group for now. */
1495 /* At least for now, we use a very simple random castout scheme */
1496 /* Use the TB as a random number ; OR in 1 to avoid entry 0 */
1497 mftb r11
1498 rldic r11,r11,4,57 /* r11 = (r11 << 4) & 0x70 */
1499 ori r11,r11,0x10
1500
1501 /* r10 currently points to an ste one past the group of interest */
1502 /* make it point to the randomly selected entry */
1503 subi r10,r10,128
1504 or r10,r10,r11 /* r10 is the entry to invalidate */
1505
1506 isync /* mark the entry invalid */
1507 ld r11,0(r10)
1508 rldicl r11,r11,56,1 /* clear the valid bit */
1509 rotldi r11,r11,8
1510 std r11,0(r10)
1511 sync
1512
1513 clrrdi r11,r11,28 /* Get the esid part of the ste */
1514 slbie r11
1515
15162: std r9,8(r10) /* Store the vsid part of the ste */
1517 eieio
1518
1519 mfspr r11,SPRN_DAR /* Get the new esid */
1520 clrrdi r11,r11,28 /* Permits a full 32b of ESID */
1521 ori r11,r11,0x90 /* Turn on valid and kp */
1522 std r11,0(r10) /* Put new entry back into the stab */
1523
1524 sync
1525
1526 /* All done -- return from exception. */
1527 lwz r9,PACA_EXSLB+EX_CCR(r13) /* get saved CR */
1528 ld r11,PACA_EXSLB+EX_SRR0(r13) /* get saved SRR0 */
1529
1530 andi. r10,r12,MSR_RI
1531 beq- unrecov_slb
1532
1533 mtcrf 0x80,r9 /* restore CR */
1534
1535 mfmsr r10
1536 clrrdi r10,r10,2
1537 mtmsrd r10,1
1538
1539 mtspr SPRN_SRR0,r11
1540 mtspr SPRN_SRR1,r12
1541 ld r9,PACA_EXSLB+EX_R9(r13)
1542 ld r10,PACA_EXSLB+EX_R10(r13)
1543 ld r11,PACA_EXSLB+EX_R11(r13)
1544 ld r12,PACA_EXSLB+EX_R12(r13)
1545 ld r13,PACA_EXSLB+EX_R13(r13)
1546 rfid
1547 b . /* prevent speculative execution */