aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Ellerman <mpe@ellerman.id.au>2016-09-30 05:43:18 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2016-10-03 22:06:36 -0400
commitda2bc4644c75d992427c45c5ade3bdf18ca1b52d (patch)
tree412a6767cf27d5fd6e09f3a85cc17efcab35bf2f
parent5045ea37377ce8cca6890d32b127ad6770e6dce5 (diff)
powerpc/64s: Add new exception vector macros
Create arch/powerpc/include/asm/head-64.h with macros that specify an exception vector (name, type, location), which will be used to label and lay out exceptions into the object file. Naming is moved out of exception-64s.h, which is used to specify the implementation of exception handlers. objdump of generated code in exception vectors is unchanged except for names. Alignment directives scattered around are annoying, but done this way so that disassembly can verify identical instruction generation before and after patch. These get cleaned up in future patch. We change the way KVMTEST works, explicitly passing EXC_HV or EXC_STD rather than overloading the trap number. This removes the need to have SOFTEN values for the overloaded trap numbers, eg. 0x502. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-rw-r--r--arch/powerpc/include/asm/exception-64s.h135
-rw-r--r--arch/powerpc/include/asm/head-64.h163
-rw-r--r--arch/powerpc/kernel/exceptions-64s.S597
3 files changed, 504 insertions, 391 deletions
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h
index 5032a80e8f6a..72f2b1e3f343 100644
--- a/arch/powerpc/include/asm/exception-64s.h
+++ b/arch/powerpc/include/asm/exception-64s.h
@@ -34,6 +34,7 @@
34 * exception handlers (including pSeries LPAR) and iSeries LPAR 34 * exception handlers (including pSeries LPAR) and iSeries LPAR
35 * implementations as possible. 35 * implementations as possible.
36 */ 36 */
37#include <asm/head-64.h>
37 38
38#define EX_R9 0 39#define EX_R9 0
39#define EX_R10 8 40#define EX_R10 8
@@ -191,10 +192,10 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
191 EXCEPTION_PROLOG_1(area, extra, vec); \ 192 EXCEPTION_PROLOG_1(area, extra, vec); \
192 EXCEPTION_PROLOG_PSERIES_1(label, h); 193 EXCEPTION_PROLOG_PSERIES_1(label, h);
193 194
194#define __KVMTEST(n) \ 195#define __KVMTEST(h, n) \
195 lbz r10,HSTATE_IN_GUEST(r13); \ 196 lbz r10,HSTATE_IN_GUEST(r13); \
196 cmpwi r10,0; \ 197 cmpwi r10,0; \
197 bne do_kvm_##n 198 bne do_kvm_##h##n
198 199
199#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE 200#ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
200/* 201/*
@@ -207,8 +208,7 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
207#define kvmppc_interrupt kvmppc_interrupt_pr 208#define kvmppc_interrupt kvmppc_interrupt_pr
208#endif 209#endif
209 210
210#define __KVM_HANDLER(area, h, n) \ 211#define __KVM_HANDLER_PROLOG(area, n) \
211do_kvm_##n: \
212 BEGIN_FTR_SECTION_NESTED(947) \ 212 BEGIN_FTR_SECTION_NESTED(947) \
213 ld r10,area+EX_CFAR(r13); \ 213 ld r10,area+EX_CFAR(r13); \
214 std r10,HSTATE_CFAR(r13); \ 214 std r10,HSTATE_CFAR(r13); \
@@ -221,21 +221,23 @@ do_kvm_##n: \
221 stw r9,HSTATE_SCRATCH1(r13); \ 221 stw r9,HSTATE_SCRATCH1(r13); \
222 ld r9,area+EX_R9(r13); \ 222 ld r9,area+EX_R9(r13); \
223 std r12,HSTATE_SCRATCH0(r13); \ 223 std r12,HSTATE_SCRATCH0(r13); \
224
225#define __KVM_HANDLER(area, h, n) \
226 __KVM_HANDLER_PROLOG(area, n) \
224 li r12,n; \ 227 li r12,n; \
225 b kvmppc_interrupt 228 b kvmppc_interrupt
226 229
227#define __KVM_HANDLER_SKIP(area, h, n) \ 230#define __KVM_HANDLER_SKIP(area, h, n) \
228do_kvm_##n: \
229 cmpwi r10,KVM_GUEST_MODE_SKIP; \ 231 cmpwi r10,KVM_GUEST_MODE_SKIP; \
230 ld r10,area+EX_R10(r13); \ 232 ld r10,area+EX_R10(r13); \
231 beq 89f; \ 233 beq 89f; \
232 stw r9,HSTATE_SCRATCH1(r13); \ 234 stw r9,HSTATE_SCRATCH1(r13); \
233 BEGIN_FTR_SECTION_NESTED(948) \ 235 BEGIN_FTR_SECTION_NESTED(948) \
234 ld r9,area+EX_PPR(r13); \ 236 ld r9,area+EX_PPR(r13); \
235 std r9,HSTATE_PPR(r13); \ 237 std r9,HSTATE_PPR(r13); \
236 END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,948); \ 238 END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,948); \
237 ld r9,area+EX_R9(r13); \ 239 ld r9,area+EX_R9(r13); \
238 std r12,HSTATE_SCRATCH0(r13); \ 240 std r12,HSTATE_SCRATCH0(r13); \
239 li r12,n; \ 241 li r12,n; \
240 b kvmppc_interrupt; \ 242 b kvmppc_interrupt; \
24189: mtocrf 0x80,r9; \ 24389: mtocrf 0x80,r9; \
@@ -243,12 +245,12 @@ do_kvm_##n: \
243 b kvmppc_skip_##h##interrupt 245 b kvmppc_skip_##h##interrupt
244 246
245#ifdef CONFIG_KVM_BOOK3S_64_HANDLER 247#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
246#define KVMTEST(n) __KVMTEST(n) 248#define KVMTEST(h, n) __KVMTEST(h, n)
247#define KVM_HANDLER(area, h, n) __KVM_HANDLER(area, h, n) 249#define KVM_HANDLER(area, h, n) __KVM_HANDLER(area, h, n)
248#define KVM_HANDLER_SKIP(area, h, n) __KVM_HANDLER_SKIP(area, h, n) 250#define KVM_HANDLER_SKIP(area, h, n) __KVM_HANDLER_SKIP(area, h, n)
249 251
250#else 252#else
251#define KVMTEST(n) 253#define KVMTEST(h, n)
252#define KVM_HANDLER(area, h, n) 254#define KVM_HANDLER(area, h, n)
253#define KVM_HANDLER_SKIP(area, h, n) 255#define KVM_HANDLER_SKIP(area, h, n)
254#endif 256#endif
@@ -332,94 +334,79 @@ do_kvm_##n: \
332/* 334/*
333 * Exception vectors. 335 * Exception vectors.
334 */ 336 */
335#define STD_EXCEPTION_PSERIES(vec, label) \ 337#define STD_EXCEPTION_PSERIES(vec, label) \
336 . = vec; \
337 .globl label##_pSeries; \
338label##_pSeries: \
339 SET_SCRATCH0(r13); /* save r13 */ \ 338 SET_SCRATCH0(r13); /* save r13 */ \
340 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ 339 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label, \
341 EXC_STD, KVMTEST, vec) 340 EXC_STD, KVMTEST_PR, vec); \
342 341
343/* Version of above for when we have to branch out-of-line */ 342/* Version of above for when we have to branch out-of-line */
343#define __OOL_EXCEPTION(vec, label, hdlr) \
344 SET_SCRATCH0(r13) \
345 EXCEPTION_PROLOG_0(PACA_EXGEN) \
346 b hdlr;
347
344#define STD_EXCEPTION_PSERIES_OOL(vec, label) \ 348#define STD_EXCEPTION_PSERIES_OOL(vec, label) \
345 .globl label##_pSeries; \ 349 EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_PR, vec); \
346label##_pSeries: \ 350 EXCEPTION_PROLOG_PSERIES_1(label, EXC_STD)
347 EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST, vec); \ 351
348 EXCEPTION_PROLOG_PSERIES_1(label##_common, EXC_STD) 352#define STD_EXCEPTION_HV(loc, vec, label) \
349
350#define STD_EXCEPTION_HV(loc, vec, label) \
351 . = loc; \
352 .globl label##_hv; \
353label##_hv: \
354 SET_SCRATCH0(r13); /* save r13 */ \ 353 SET_SCRATCH0(r13); /* save r13 */ \
355 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ 354 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, label, \
356 EXC_HV, KVMTEST, vec) 355 EXC_HV, KVMTEST_HV, vec);
357 356
358/* Version of above for when we have to branch out-of-line */ 357#define STD_EXCEPTION_HV_OOL(vec, label) \
359#define STD_EXCEPTION_HV_OOL(vec, label) \ 358 EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_HV, vec); \
360 .globl label##_hv; \ 359 EXCEPTION_PROLOG_PSERIES_1(label, EXC_HV)
361label##_hv: \
362 EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST, vec); \
363 EXCEPTION_PROLOG_PSERIES_1(label##_common, EXC_HV)
364 360
365#define STD_RELON_EXCEPTION_PSERIES(loc, vec, label) \ 361#define STD_RELON_EXCEPTION_PSERIES(loc, vec, label) \
366 . = loc; \
367 .globl label##_relon_pSeries; \
368label##_relon_pSeries: \
369 /* No guest interrupts come through here */ \ 362 /* No guest interrupts come through here */ \
370 SET_SCRATCH0(r13); /* save r13 */ \ 363 SET_SCRATCH0(r13); /* save r13 */ \
371 EXCEPTION_RELON_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ 364 EXCEPTION_RELON_PROLOG_PSERIES(PACA_EXGEN, label, EXC_STD, NOTEST, vec);
372 EXC_STD, NOTEST, vec)
373 365
374#define STD_RELON_EXCEPTION_PSERIES_OOL(vec, label) \ 366#define STD_RELON_EXCEPTION_PSERIES_OOL(vec, label) \
375 .globl label##_relon_pSeries; \
376label##_relon_pSeries: \
377 EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, vec); \ 367 EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, vec); \
378 EXCEPTION_RELON_PROLOG_PSERIES_1(label##_common, EXC_STD) 368 EXCEPTION_RELON_PROLOG_PSERIES_1(label, EXC_STD)
379 369
380#define STD_RELON_EXCEPTION_HV(loc, vec, label) \ 370#define STD_RELON_EXCEPTION_HV(loc, vec, label) \
381 . = loc; \
382 .globl label##_relon_hv; \
383label##_relon_hv: \
384 /* No guest interrupts come through here */ \ 371 /* No guest interrupts come through here */ \
385 SET_SCRATCH0(r13); /* save r13 */ \ 372 SET_SCRATCH0(r13); /* save r13 */ \
386 EXCEPTION_RELON_PROLOG_PSERIES(PACA_EXGEN, label##_common, \ 373 EXCEPTION_RELON_PROLOG_PSERIES(PACA_EXGEN, label, EXC_HV, NOTEST, vec);
387 EXC_HV, NOTEST, vec)
388 374
389#define STD_RELON_EXCEPTION_HV_OOL(vec, label) \ 375#define STD_RELON_EXCEPTION_HV_OOL(vec, label) \
390 .globl label##_relon_hv; \
391label##_relon_hv: \
392 EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, vec); \ 376 EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, vec); \
393 EXCEPTION_RELON_PROLOG_PSERIES_1(label##_common, EXC_HV) 377 EXCEPTION_RELON_PROLOG_PSERIES_1(label, EXC_HV)
394 378
395/* This associate vector numbers with bits in paca->irq_happened */ 379/* This associate vector numbers with bits in paca->irq_happened */
396#define SOFTEN_VALUE_0x500 PACA_IRQ_EE 380#define SOFTEN_VALUE_0x500 PACA_IRQ_EE
397#define SOFTEN_VALUE_0x502 PACA_IRQ_EE
398#define SOFTEN_VALUE_0x900 PACA_IRQ_DEC 381#define SOFTEN_VALUE_0x900 PACA_IRQ_DEC
399#define SOFTEN_VALUE_0x982 PACA_IRQ_DEC 382#define SOFTEN_VALUE_0x980 PACA_IRQ_DEC
400#define SOFTEN_VALUE_0xa00 PACA_IRQ_DBELL 383#define SOFTEN_VALUE_0xa00 PACA_IRQ_DBELL
401#define SOFTEN_VALUE_0xe80 PACA_IRQ_DBELL 384#define SOFTEN_VALUE_0xe80 PACA_IRQ_DBELL
402#define SOFTEN_VALUE_0xe82 PACA_IRQ_DBELL
403#define SOFTEN_VALUE_0xe60 PACA_IRQ_HMI 385#define SOFTEN_VALUE_0xe60 PACA_IRQ_HMI
404#define SOFTEN_VALUE_0xe62 PACA_IRQ_HMI
405#define SOFTEN_VALUE_0xea0 PACA_IRQ_EE 386#define SOFTEN_VALUE_0xea0 PACA_IRQ_EE
406#define SOFTEN_VALUE_0xea2 PACA_IRQ_EE
407 387
408#define __SOFTEN_TEST(h, vec) \ 388#define __SOFTEN_TEST(h, vec) \
409 lbz r10,PACASOFTIRQEN(r13); \ 389 lbz r10,PACASOFTIRQEN(r13); \
410 cmpwi r10,0; \ 390 cmpwi r10,0; \
411 li r10,SOFTEN_VALUE_##vec; \ 391 li r10,SOFTEN_VALUE_##vec; \
412 beq masked_##h##interrupt 392 beq masked_##h##interrupt
393
413#define _SOFTEN_TEST(h, vec) __SOFTEN_TEST(h, vec) 394#define _SOFTEN_TEST(h, vec) __SOFTEN_TEST(h, vec)
414 395
415#define SOFTEN_TEST_PR(vec) \ 396#define SOFTEN_TEST_PR(vec) \
416 KVMTEST(vec); \ 397 KVMTEST(EXC_STD, vec); \
417 _SOFTEN_TEST(EXC_STD, vec) 398 _SOFTEN_TEST(EXC_STD, vec)
418 399
419#define SOFTEN_TEST_HV(vec) \ 400#define SOFTEN_TEST_HV(vec) \
420 KVMTEST(vec); \ 401 KVMTEST(EXC_HV, vec); \
421 _SOFTEN_TEST(EXC_HV, vec) 402 _SOFTEN_TEST(EXC_HV, vec)
422 403
404#define KVMTEST_PR(vec) \
405 KVMTEST(EXC_STD, vec)
406
407#define KVMTEST_HV(vec) \
408 KVMTEST(EXC_HV, vec)
409
423#define SOFTEN_NOTEST_PR(vec) _SOFTEN_TEST(EXC_STD, vec) 410#define SOFTEN_NOTEST_PR(vec) _SOFTEN_TEST(EXC_STD, vec)
424#define SOFTEN_NOTEST_HV(vec) _SOFTEN_TEST(EXC_HV, vec) 411#define SOFTEN_NOTEST_HV(vec) _SOFTEN_TEST(EXC_HV, vec)
425 412
@@ -427,58 +414,47 @@ label##_relon_hv: \
427 SET_SCRATCH0(r13); /* save r13 */ \ 414 SET_SCRATCH0(r13); /* save r13 */ \
428 EXCEPTION_PROLOG_0(PACA_EXGEN); \ 415 EXCEPTION_PROLOG_0(PACA_EXGEN); \
429 __EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec); \ 416 __EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec); \
430 EXCEPTION_PROLOG_PSERIES_1(label##_common, h); 417 EXCEPTION_PROLOG_PSERIES_1(label, h);
431 418
432#define _MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) \ 419#define _MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) \
433 __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra) 420 __MASKABLE_EXCEPTION_PSERIES(vec, label, h, extra)
434 421
435#define MASKABLE_EXCEPTION_PSERIES(loc, vec, label) \ 422#define MASKABLE_EXCEPTION_PSERIES(loc, vec, label) \
436 . = loc; \
437 .globl label##_pSeries; \
438label##_pSeries: \
439 _MASKABLE_EXCEPTION_PSERIES(vec, label, \ 423 _MASKABLE_EXCEPTION_PSERIES(vec, label, \
440 EXC_STD, SOFTEN_TEST_PR) 424 EXC_STD, SOFTEN_TEST_PR)
441 425
426#define MASKABLE_EXCEPTION_PSERIES_OOL(vec, label) \
427 EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_TEST_PR, vec); \
428 EXCEPTION_PROLOG_PSERIES_1(label, EXC_STD)
429
442#define MASKABLE_EXCEPTION_HV(loc, vec, label) \ 430#define MASKABLE_EXCEPTION_HV(loc, vec, label) \
443 . = loc; \
444 .globl label##_hv; \
445label##_hv: \
446 _MASKABLE_EXCEPTION_PSERIES(vec, label, \ 431 _MASKABLE_EXCEPTION_PSERIES(vec, label, \
447 EXC_HV, SOFTEN_TEST_HV) 432 EXC_HV, SOFTEN_TEST_HV)
448 433
449#define MASKABLE_EXCEPTION_HV_OOL(vec, label) \ 434#define MASKABLE_EXCEPTION_HV_OOL(vec, label) \
450 .globl label##_hv; \
451label##_hv: \
452 EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_TEST_HV, vec); \ 435 EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_TEST_HV, vec); \
453 EXCEPTION_PROLOG_PSERIES_1(label##_common, EXC_HV); 436 EXCEPTION_PROLOG_PSERIES_1(label, EXC_HV)
454 437
455#define __MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra) \ 438#define __MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra) \
456 SET_SCRATCH0(r13); /* save r13 */ \ 439 SET_SCRATCH0(r13); /* save r13 */ \
457 EXCEPTION_PROLOG_0(PACA_EXGEN); \ 440 EXCEPTION_PROLOG_0(PACA_EXGEN); \
458 __EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec); \ 441 __EXCEPTION_PROLOG_1(PACA_EXGEN, extra, vec); \
459 EXCEPTION_RELON_PROLOG_PSERIES_1(label##_common, h); 442 EXCEPTION_RELON_PROLOG_PSERIES_1(label, h)
460#define _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra) \ 443
444#define _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra) \
461 __MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra) 445 __MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, h, extra)
462 446
463#define MASKABLE_RELON_EXCEPTION_PSERIES(loc, vec, label) \ 447#define MASKABLE_RELON_EXCEPTION_PSERIES(loc, vec, label) \
464 . = loc; \
465 .globl label##_relon_pSeries; \
466label##_relon_pSeries: \
467 _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, \ 448 _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, \
468 EXC_STD, SOFTEN_NOTEST_PR) 449 EXC_STD, SOFTEN_NOTEST_PR)
469 450
470#define MASKABLE_RELON_EXCEPTION_HV(loc, vec, label) \ 451#define MASKABLE_RELON_EXCEPTION_HV(loc, vec, label) \
471 . = loc; \
472 .globl label##_relon_hv; \
473label##_relon_hv: \
474 _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, \ 452 _MASKABLE_RELON_EXCEPTION_PSERIES(vec, label, \
475 EXC_HV, SOFTEN_NOTEST_HV) 453 EXC_HV, SOFTEN_NOTEST_HV)
476 454
477#define MASKABLE_RELON_EXCEPTION_HV_OOL(vec, label) \ 455#define MASKABLE_RELON_EXCEPTION_HV_OOL(vec, label) \
478 .globl label##_relon_hv; \
479label##_relon_hv: \
480 EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_NOTEST_HV, vec); \ 456 EXCEPTION_PROLOG_1(PACA_EXGEN, SOFTEN_NOTEST_HV, vec); \
481 EXCEPTION_PROLOG_PSERIES_1(label##_common, EXC_HV); 457 EXCEPTION_PROLOG_PSERIES_1(label, EXC_HV)
482 458
483/* 459/*
484 * Our exception common code can be passed various "additions" 460 * Our exception common code can be passed various "additions"
@@ -504,9 +480,6 @@ BEGIN_FTR_SECTION \
504END_FTR_SECTION_IFSET(CPU_FTR_CTRL) 480END_FTR_SECTION_IFSET(CPU_FTR_CTRL)
505 481
506#define EXCEPTION_COMMON(trap, label, hdlr, ret, additions) \ 482#define EXCEPTION_COMMON(trap, label, hdlr, ret, additions) \
507 .align 7; \
508 .globl label##_common; \
509label##_common: \
510 EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN); \ 483 EXCEPTION_PROLOG_COMMON(trap, PACA_EXGEN); \
511 /* Volatile regs are potentially clobbered here */ \ 484 /* Volatile regs are potentially clobbered here */ \
512 additions; \ 485 additions; \
diff --git a/arch/powerpc/include/asm/head-64.h b/arch/powerpc/include/asm/head-64.h
new file mode 100644
index 000000000000..358c25c80c62
--- /dev/null
+++ b/arch/powerpc/include/asm/head-64.h
@@ -0,0 +1,163 @@
1#ifndef _ASM_POWERPC_HEAD_64_H
2#define _ASM_POWERPC_HEAD_64_H
3
4#include <asm/cache.h>
5
6#define EXC_REAL_BEGIN(name, start, end) \
7 . = start ; \
8 .global exc_real_##start##_##name ; \
9exc_real_##start##_##name:
10
11#define EXC_REAL_END(name, start, end)
12
13#define EXC_VIRT_BEGIN(name, start, end) \
14 . = start ; \
15 .global exc_virt_##start##_##name ; \
16exc_virt_##start##_##name:
17
18#define EXC_VIRT_END(name, start, end)
19
20#define EXC_COMMON_BEGIN(name) \
21 .global name; \
22name:
23
24#define TRAMP_REAL_BEGIN(name) \
25 .global name ; \
26name:
27
28#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
29#define TRAMP_KVM_BEGIN(name) \
30 TRAMP_REAL_BEGIN(name)
31#else
32#define TRAMP_KVM_BEGIN(name)
33#endif
34
35#define EXC_REAL_NONE(start, end)
36
37#define EXC_VIRT_NONE(start, end)
38
39
40#define EXC_REAL(name, start, end) \
41 EXC_REAL_BEGIN(name, start, end); \
42 STD_EXCEPTION_PSERIES(start, name##_common); \
43 EXC_REAL_END(name, start, end);
44
45#define EXC_VIRT(name, start, end, realvec) \
46 EXC_VIRT_BEGIN(name, start, end); \
47 STD_RELON_EXCEPTION_PSERIES(start, realvec, name##_common); \
48 EXC_VIRT_END(name, start, end);
49
50#define EXC_REAL_MASKABLE(name, start, end) \
51 EXC_REAL_BEGIN(name, start, end); \
52 MASKABLE_EXCEPTION_PSERIES(start, start, name##_common); \
53 EXC_REAL_END(name, start, end);
54
55#define EXC_VIRT_MASKABLE(name, start, end, realvec) \
56 EXC_VIRT_BEGIN(name, start, end); \
57 MASKABLE_RELON_EXCEPTION_PSERIES(start, realvec, name##_common); \
58 EXC_VIRT_END(name, start, end);
59
60#define EXC_REAL_HV(name, start, end) \
61 EXC_REAL_BEGIN(name, start, end); \
62 STD_EXCEPTION_HV(start, start, name##_common); \
63 EXC_REAL_END(name, start, end);
64
65#define EXC_VIRT_HV(name, start, end, realvec) \
66 EXC_VIRT_BEGIN(name, start, end); \
67 STD_RELON_EXCEPTION_HV(start, realvec, name##_common); \
68 EXC_VIRT_END(name, start, end);
69
70#define __EXC_REAL_OOL(name, start, end) \
71 EXC_REAL_BEGIN(name, start, end); \
72 __OOL_EXCEPTION(start, label, tramp_real_##name); \
73 EXC_REAL_END(name, start, end);
74
75#define __TRAMP_REAL_REAL_OOL(name, vec) \
76 TRAMP_REAL_BEGIN(tramp_real_##name); \
77 STD_EXCEPTION_PSERIES_OOL(vec, name##_common); \
78
79#define __EXC_REAL_OOL_MASKABLE(name, start, end) \
80 __EXC_REAL_OOL(name, start, end);
81
82#define __TRAMP_REAL_REAL_OOL_MASKABLE(name, vec) \
83 TRAMP_REAL_BEGIN(tramp_real_##name); \
84 MASKABLE_EXCEPTION_PSERIES_OOL(vec, name##_common); \
85
86#define __EXC_REAL_OOL_HV_DIRECT(name, start, end, handler) \
87 EXC_REAL_BEGIN(name, start, end); \
88 __OOL_EXCEPTION(start, label, handler); \
89 EXC_REAL_END(name, start, end);
90
91#define __EXC_REAL_OOL_HV(name, start, end) \
92 __EXC_REAL_OOL(name, start, end);
93
94#define __TRAMP_REAL_REAL_OOL_HV(name, vec) \
95 TRAMP_REAL_BEGIN(tramp_real_##name); \
96 STD_EXCEPTION_HV_OOL(vec, name##_common); \
97
98#define __EXC_REAL_OOL_MASKABLE_HV(name, start, end) \
99 __EXC_REAL_OOL(name, start, end);
100
101#define __TRAMP_REAL_REAL_OOL_MASKABLE_HV(name, vec) \
102 TRAMP_REAL_BEGIN(tramp_real_##name); \
103 MASKABLE_EXCEPTION_HV_OOL(vec, name##_common); \
104
105#define __EXC_VIRT_OOL(name, start, end) \
106 EXC_VIRT_BEGIN(name, start, end); \
107 __OOL_EXCEPTION(start, label, tramp_virt_##name); \
108 EXC_VIRT_END(name, start, end);
109
110#define __TRAMP_REAL_VIRT_OOL(name, realvec) \
111 TRAMP_REAL_BEGIN(tramp_virt_##name); \
112 STD_RELON_EXCEPTION_PSERIES_OOL(realvec, name##_common); \
113
114#define __EXC_VIRT_OOL_MASKABLE(name, start, end) \
115 __EXC_VIRT_OOL(name, start, end);
116
117#define __TRAMP_REAL_VIRT_OOL_MASKABLE(name, realvec) \
118 TRAMP_REAL_BEGIN(tramp_virt_##name); \
119 MASKABLE_RELON_EXCEPTION_PSERIES_OOL(realvec, name##_common); \
120
121#define __EXC_VIRT_OOL_HV(name, start, end) \
122 __EXC_VIRT_OOL(name, start, end);
123
124#define __TRAMP_REAL_VIRT_OOL_HV(name, realvec) \
125 TRAMP_REAL_BEGIN(tramp_virt_##name); \
126 STD_RELON_EXCEPTION_HV_OOL(realvec, name##_common); \
127
128#define __EXC_VIRT_OOL_MASKABLE_HV(name, start, end) \
129 __EXC_VIRT_OOL(name, start, end);
130
131#define __TRAMP_REAL_VIRT_OOL_MASKABLE_HV(name, realvec) \
132 TRAMP_REAL_BEGIN(tramp_virt_##name); \
133 MASKABLE_RELON_EXCEPTION_HV_OOL(realvec, name##_common); \
134
135#define TRAMP_KVM(area, n) \
136 TRAMP_KVM_BEGIN(do_kvm_##n); \
137 KVM_HANDLER(area, EXC_STD, n); \
138
139#define TRAMP_KVM_SKIP(area, n) \
140 TRAMP_KVM_BEGIN(do_kvm_##n); \
141 KVM_HANDLER_SKIP(area, EXC_STD, n); \
142
143#define TRAMP_KVM_HV(area, n) \
144 TRAMP_KVM_BEGIN(do_kvm_H##n); \
145 KVM_HANDLER(area, EXC_HV, n + 0x2); \
146
147#define TRAMP_KVM_HV_SKIP(area, n) \
148 TRAMP_KVM_BEGIN(do_kvm_H##n); \
149 KVM_HANDLER_SKIP(area, EXC_HV, n + 0x2); \
150
151#define EXC_COMMON(name, realvec, hdlr) \
152 EXC_COMMON_BEGIN(name); \
153 STD_EXCEPTION_COMMON(realvec, name, hdlr); \
154
155#define EXC_COMMON_ASYNC(name, realvec, hdlr) \
156 EXC_COMMON_BEGIN(name); \
157 STD_EXCEPTION_COMMON_ASYNC(realvec, name, hdlr); \
158
159#define EXC_COMMON_HV(name, realvec, hdlr) \
160 EXC_COMMON_BEGIN(name); \
161 STD_EXCEPTION_COMMON(realvec + 0x2, name, hdlr); \
162
163#endif /* _ASM_POWERPC_HEAD_64_H */
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index 23018162d749..52d22891f6a4 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -16,6 +16,7 @@
16#include <asm/exception-64s.h> 16#include <asm/exception-64s.h>
17#include <asm/ptrace.h> 17#include <asm/ptrace.h>
18#include <asm/cpuidle.h> 18#include <asm/cpuidle.h>
19#include <asm/head-64.h>
19 20
20/* 21/*
21 * We layout physical memory as follows: 22 * We layout physical memory as follows:
@@ -89,8 +90,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE) \
89 .globl __start_interrupts 90 .globl __start_interrupts
90__start_interrupts: 91__start_interrupts:
91 92
92 .globl system_reset_pSeries; 93EXC_REAL_BEGIN(system_reset, 0x100, 0x200)
93system_reset_pSeries:
94 SET_SCRATCH0(r13) 94 SET_SCRATCH0(r13)
95#ifdef CONFIG_PPC_P7_NAP 95#ifdef CONFIG_PPC_P7_NAP
96BEGIN_FTR_SECTION 96BEGIN_FTR_SECTION
@@ -131,9 +131,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
131#endif /* CONFIG_PPC_P7_NAP */ 131#endif /* CONFIG_PPC_P7_NAP */
132 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD, 132 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD,
133 NOTEST, 0x100) 133 NOTEST, 0x100)
134EXC_REAL_END(system_reset, 0x100, 0x200)
134 135
135 . = 0x200 136EXC_REAL_BEGIN(machine_check, 0x200, 0x300)
136machine_check_pSeries_1:
137 /* This is moved out of line as it can be patched by FW, but 137 /* This is moved out of line as it can be patched by FW, but
138 * some code path might still want to branch into the original 138 * some code path might still want to branch into the original
139 * vector 139 * vector
@@ -153,20 +153,14 @@ BEGIN_FTR_SECTION
153FTR_SECTION_ELSE 153FTR_SECTION_ELSE
154 b machine_check_pSeries_0 154 b machine_check_pSeries_0
155ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE) 155ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
156EXC_REAL_END(machine_check, 0x200, 0x300)
156 157
157 . = 0x300 158EXC_REAL(data_access, 0x300, 0x380)
158 .globl data_access_pSeries
159data_access_pSeries:
160 SET_SCRATCH0(r13)
161 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, data_access_common, EXC_STD,
162 KVMTEST, 0x300)
163 159
164 . = 0x380 160EXC_REAL_BEGIN(data_access_slb, 0x380, 0x400)
165 .globl data_access_slb_pSeries
166data_access_slb_pSeries:
167 SET_SCRATCH0(r13) 161 SET_SCRATCH0(r13)
168 EXCEPTION_PROLOG_0(PACA_EXSLB) 162 EXCEPTION_PROLOG_0(PACA_EXSLB)
169 EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST, 0x380) 163 EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x380)
170 std r3,PACA_EXSLB+EX_R3(r13) 164 std r3,PACA_EXSLB+EX_R3(r13)
171 mfspr r3,SPRN_DAR 165 mfspr r3,SPRN_DAR
172 mfspr r12,SPRN_SRR1 166 mfspr r12,SPRN_SRR1
@@ -184,15 +178,14 @@ data_access_slb_pSeries:
184 mtctr r10 178 mtctr r10
185 bctr 179 bctr
186#endif 180#endif
181EXC_REAL_END(data_access_slb, 0x380, 0x400)
187 182
188 STD_EXCEPTION_PSERIES(0x400, instruction_access) 183EXC_REAL(instruction_access, 0x400, 0x480)
189 184
190 . = 0x480 185EXC_REAL_BEGIN(instruction_access_slb, 0x480, 0x500)
191 .globl instruction_access_slb_pSeries
192instruction_access_slb_pSeries:
193 SET_SCRATCH0(r13) 186 SET_SCRATCH0(r13)
194 EXCEPTION_PROLOG_0(PACA_EXSLB) 187 EXCEPTION_PROLOG_0(PACA_EXSLB)
195 EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST, 0x480) 188 EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x480)
196 std r3,PACA_EXSLB+EX_R3(r13) 189 std r3,PACA_EXSLB+EX_R3(r13)
197 mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */ 190 mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */
198 mfspr r12,SPRN_SRR1 191 mfspr r12,SPRN_SRR1
@@ -205,50 +198,52 @@ instruction_access_slb_pSeries:
205 mtctr r10 198 mtctr r10
206 bctr 199 bctr
207#endif 200#endif
201EXC_REAL_END(instruction_access_slb, 0x480, 0x500)
208 202
209 /* We open code these as we can't have a ". = x" (even with 203 /* We open code these as we can't have a ". = x" (even with
210 * x = "." within a feature section 204 * x = "." within a feature section
211 */ 205 */
212 . = 0x500; 206EXC_REAL_BEGIN(hardware_interrupt, 0x500, 0x600)
213 .globl hardware_interrupt_pSeries;
214 .globl hardware_interrupt_hv; 207 .globl hardware_interrupt_hv;
215hardware_interrupt_pSeries:
216hardware_interrupt_hv: 208hardware_interrupt_hv:
217 BEGIN_FTR_SECTION 209 BEGIN_FTR_SECTION
218 _MASKABLE_EXCEPTION_PSERIES(0x502, hardware_interrupt, 210 _MASKABLE_EXCEPTION_PSERIES(0x500, hardware_interrupt_common,
219 EXC_HV, SOFTEN_TEST_HV) 211 EXC_HV, SOFTEN_TEST_HV)
212do_kvm_H0x500:
220 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0x502) 213 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0x502)
221 FTR_SECTION_ELSE 214 FTR_SECTION_ELSE
222 _MASKABLE_EXCEPTION_PSERIES(0x500, hardware_interrupt, 215 _MASKABLE_EXCEPTION_PSERIES(0x500, hardware_interrupt_common,
223 EXC_STD, SOFTEN_TEST_PR) 216 EXC_STD, SOFTEN_TEST_PR)
217do_kvm_0x500:
224 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x500) 218 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x500)
225 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206) 219 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
220EXC_REAL_END(hardware_interrupt, 0x500, 0x600)
221
222EXC_REAL(alignment, 0x600, 0x700)
223
224TRAMP_KVM(PACA_EXGEN, 0x600)
225
226EXC_REAL(program_check, 0x700, 0x800)
226 227
227 STD_EXCEPTION_PSERIES(0x600, alignment) 228TRAMP_KVM(PACA_EXGEN, 0x700)
228 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x600)
229 229
230 STD_EXCEPTION_PSERIES(0x700, program_check) 230EXC_REAL(fp_unavailable, 0x800, 0x900)
231 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x700)
232 231
233 STD_EXCEPTION_PSERIES(0x800, fp_unavailable) 232TRAMP_KVM(PACA_EXGEN, 0x800)
234 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x800)
235 233
236 . = 0x900 234EXC_REAL_MASKABLE(decrementer, 0x900, 0x980)
237 .globl decrementer_pSeries
238decrementer_pSeries:
239 _MASKABLE_EXCEPTION_PSERIES(0x900, decrementer, EXC_STD, SOFTEN_TEST_PR)
240 235
241 STD_EXCEPTION_HV(0x980, 0x982, hdecrementer) 236EXC_REAL_HV(hdecrementer, 0x980, 0xa00)
242 237
243 MASKABLE_EXCEPTION_PSERIES(0xa00, 0xa00, doorbell_super) 238EXC_REAL_MASKABLE(doorbell_super, 0xa00, 0xb00)
244 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xa00)
245 239
246 STD_EXCEPTION_PSERIES(0xb00, trap_0b) 240TRAMP_KVM(PACA_EXGEN, 0xa00)
247 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xb00)
248 241
249 . = 0xc00 242EXC_REAL(trap_0b, 0xb00, 0xc00)
250 .globl system_call_pSeries 243
251system_call_pSeries: 244TRAMP_KVM(PACA_EXGEN, 0xb00)
245
246EXC_REAL_BEGIN(system_call, 0xc00, 0xd00)
252 /* 247 /*
253 * If CONFIG_KVM_BOOK3S_64_HANDLER is set, save the PPR (on systems 248 * If CONFIG_KVM_BOOK3S_64_HANDLER is set, save the PPR (on systems
254 * that support it) before changing to HMT_MEDIUM. That allows the KVM 249 * that support it) before changing to HMT_MEDIUM. That allows the KVM
@@ -265,7 +260,7 @@ system_call_pSeries:
265 std r10,PACA_EXGEN+EX_R10(r13) 260 std r10,PACA_EXGEN+EX_R10(r13)
266 OPT_SAVE_REG_TO_PACA(PACA_EXGEN+EX_PPR, r9, CPU_FTR_HAS_PPR); 261 OPT_SAVE_REG_TO_PACA(PACA_EXGEN+EX_PPR, r9, CPU_FTR_HAS_PPR);
267 mfcr r9 262 mfcr r9
268 KVMTEST(0xc00) 263 KVMTEST_PR(0xc00)
269 GET_SCRATCH0(r13) 264 GET_SCRATCH0(r13)
270#else 265#else
271 HMT_MEDIUM; 266 HMT_MEDIUM;
@@ -273,96 +268,59 @@ system_call_pSeries:
273 SYSCALL_PSERIES_1 268 SYSCALL_PSERIES_1
274 SYSCALL_PSERIES_2_RFID 269 SYSCALL_PSERIES_2_RFID
275 SYSCALL_PSERIES_3 270 SYSCALL_PSERIES_3
276 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xc00) 271EXC_REAL_END(system_call, 0xc00, 0xd00)
272
273TRAMP_KVM(PACA_EXGEN, 0xc00)
274
275EXC_REAL(single_step, 0xd00, 0xe00)
276
277TRAMP_KVM(PACA_EXGEN, 0xd00)
277 278
278 STD_EXCEPTION_PSERIES(0xd00, single_step)
279 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xd00)
280 279
281 /* At 0xe??? we have a bunch of hypervisor exceptions, we branch 280 /* At 0xe??? we have a bunch of hypervisor exceptions, we branch
282 * out of line to handle them 281 * out of line to handle them
283 */ 282 */
284 . = 0xe00 283__EXC_REAL_OOL_HV(h_data_storage, 0xe00, 0xe20)
285hv_data_storage_trampoline:
286 SET_SCRATCH0(r13)
287 EXCEPTION_PROLOG_0(PACA_EXGEN)
288 b h_data_storage_hv
289 284
290 . = 0xe20 285__EXC_REAL_OOL_HV(h_instr_storage, 0xe20, 0xe40)
291hv_instr_storage_trampoline:
292 SET_SCRATCH0(r13)
293 EXCEPTION_PROLOG_0(PACA_EXGEN)
294 b h_instr_storage_hv
295 286
296 . = 0xe40 287__EXC_REAL_OOL_HV(emulation_assist, 0xe40, 0xe60)
297emulation_assist_trampoline:
298 SET_SCRATCH0(r13)
299 EXCEPTION_PROLOG_0(PACA_EXGEN)
300 b emulation_assist_hv
301 288
302 . = 0xe60 289__EXC_REAL_OOL_HV_DIRECT(hmi_exception, 0xe60, 0xe80, hmi_exception_early)
303hv_exception_trampoline:
304 SET_SCRATCH0(r13)
305 EXCEPTION_PROLOG_0(PACA_EXGEN)
306 b hmi_exception_early
307 290
308 . = 0xe80 291__EXC_REAL_OOL_MASKABLE_HV(h_doorbell, 0xe80, 0xea0)
309hv_doorbell_trampoline:
310 SET_SCRATCH0(r13)
311 EXCEPTION_PROLOG_0(PACA_EXGEN)
312 b h_doorbell_hv
313 292
314 . = 0xea0 293__EXC_REAL_OOL_MASKABLE_HV(h_virt_irq, 0xea0, 0xec0)
315hv_virt_irq_trampoline:
316 SET_SCRATCH0(r13)
317 EXCEPTION_PROLOG_0(PACA_EXGEN)
318 b h_virt_irq_hv
319 294
320 /* We need to deal with the Altivec unavailable exception 295EXC_REAL_NONE(0xec0, 0xf00)
321 * here which is at 0xf20, thus in the middle of the
322 * prolog code of the PerformanceMonitor one. A little
323 * trickery is thus necessary
324 */
325 . = 0xf00
326performance_monitor_pseries_trampoline:
327 SET_SCRATCH0(r13)
328 EXCEPTION_PROLOG_0(PACA_EXGEN)
329 b performance_monitor_pSeries
330 296
331 . = 0xf20 297__EXC_REAL_OOL(performance_monitor, 0xf00, 0xf20)
332altivec_unavailable_pseries_trampoline:
333 SET_SCRATCH0(r13)
334 EXCEPTION_PROLOG_0(PACA_EXGEN)
335 b altivec_unavailable_pSeries
336 298
337 . = 0xf40 299__EXC_REAL_OOL(altivec_unavailable, 0xf20, 0xf40)
338vsx_unavailable_pseries_trampoline:
339 SET_SCRATCH0(r13)
340 EXCEPTION_PROLOG_0(PACA_EXGEN)
341 b vsx_unavailable_pSeries
342 300
343 . = 0xf60 301__EXC_REAL_OOL(vsx_unavailable, 0xf40, 0xf60)
344facility_unavailable_trampoline: 302
345 SET_SCRATCH0(r13) 303__EXC_REAL_OOL(facility_unavailable, 0xf60, 0xf80)
346 EXCEPTION_PROLOG_0(PACA_EXGEN) 304
347 b facility_unavailable_pSeries 305__EXC_REAL_OOL_HV(h_facility_unavailable, 0xf80, 0xfa0)
306
307EXC_REAL_NONE(0xfa0, 0x1200)
348 308
349 . = 0xf80
350hv_facility_unavailable_trampoline:
351 SET_SCRATCH0(r13)
352 EXCEPTION_PROLOG_0(PACA_EXGEN)
353 b hv_facility_unavailable_hv
354 309
355#ifdef CONFIG_CBE_RAS 310#ifdef CONFIG_CBE_RAS
356 STD_EXCEPTION_HV(0x1200, 0x1202, cbe_system_error) 311EXC_REAL_HV(cbe_system_error, 0x1200, 0x1300)
357 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1202) 312
358#endif /* CONFIG_CBE_RAS */ 313TRAMP_KVM_HV_SKIP(PACA_EXGEN, 0x1200)
314
315#else /* CONFIG_CBE_RAS */
316EXC_REAL_NONE(0x1200, 0x1300)
317#endif
359 318
360 STD_EXCEPTION_PSERIES(0x1300, instruction_breakpoint) 319EXC_REAL(instruction_breakpoint, 0x1300, 0x1400)
361 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x1300)
362 320
363 . = 0x1500 321TRAMP_KVM_SKIP(PACA_EXGEN, 0x1300)
364 .global denorm_exception_hv 322
365denorm_exception_hv: 323EXC_REAL_BEGIN(denorm_exception_hv, 0x1500, 0x1600)
366 mtspr SPRN_SPRG_HSCRATCH0,r13 324 mtspr SPRN_SPRG_HSCRATCH0,r13
367 EXCEPTION_PROLOG_0(PACA_EXGEN) 325 EXCEPTION_PROLOG_0(PACA_EXGEN)
368 EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, 0x1500) 326 EXCEPTION_PROLOG_1(PACA_EXGEN, NOTEST, 0x1500)
@@ -375,31 +333,41 @@ denorm_exception_hv:
375 bne+ denorm_assist 333 bne+ denorm_assist
376#endif 334#endif
377 335
378 KVMTEST(0x1500) 336 KVMTEST_PR(0x1500)
379 EXCEPTION_PROLOG_PSERIES_1(denorm_common, EXC_HV) 337 EXCEPTION_PROLOG_PSERIES_1(denorm_common, EXC_HV)
380 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x1500) 338EXC_REAL_END(denorm_exception_hv, 0x1500, 0x1600)
339
340TRAMP_KVM_SKIP(PACA_EXGEN, 0x1500)
381 341
382#ifdef CONFIG_CBE_RAS 342#ifdef CONFIG_CBE_RAS
383 STD_EXCEPTION_HV(0x1600, 0x1602, cbe_maintenance) 343EXC_REAL_HV(cbe_maintenance, 0x1600, 0x1700)
384 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1602)
385#endif /* CONFIG_CBE_RAS */
386 344
387 STD_EXCEPTION_PSERIES(0x1700, altivec_assist) 345TRAMP_KVM_HV_SKIP(PACA_EXGEN, 0x1600)
388 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x1700) 346
347#else /* CONFIG_CBE_RAS */
348EXC_REAL_NONE(0x1600, 0x1700)
349#endif
350
351EXC_REAL(altivec_assist, 0x1700, 0x1800)
352
353TRAMP_KVM(PACA_EXGEN, 0x1700)
389 354
390#ifdef CONFIG_CBE_RAS 355#ifdef CONFIG_CBE_RAS
391 STD_EXCEPTION_HV(0x1800, 0x1802, cbe_thermal) 356EXC_REAL_HV(cbe_thermal, 0x1800, 0x1900)
392 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1802) 357
393#else 358TRAMP_KVM_HV_SKIP(PACA_EXGEN, 0x1800)
359
360#else /* CONFIG_CBE_RAS */
361EXC_REAL_NONE(0x1800, 0x1900)
394 . = 0x1800 362 . = 0x1800
395#endif /* CONFIG_CBE_RAS */ 363#endif
396 364
397 365
398/*** Out of line interrupts support ***/ 366/*** Out of line interrupts support ***/
399 367
400 .align 7
401 /* moved from 0x200 */ 368 /* moved from 0x200 */
402machine_check_powernv_early: 369 .align 7;
370TRAMP_REAL_BEGIN(machine_check_powernv_early)
403BEGIN_FTR_SECTION 371BEGIN_FTR_SECTION
404 EXCEPTION_PROLOG_1(PACA_EXMC, NOTEST, 0x200) 372 EXCEPTION_PROLOG_1(PACA_EXMC, NOTEST, 0x200)
405 /* 373 /*
@@ -471,13 +439,13 @@ BEGIN_FTR_SECTION
471 b . /* prevent speculative execution */ 439 b . /* prevent speculative execution */
472END_FTR_SECTION_IFSET(CPU_FTR_HVMODE) 440END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
473 441
474machine_check_pSeries: 442TRAMP_REAL_BEGIN(machine_check_pSeries)
475 .globl machine_check_fwnmi 443 .globl machine_check_fwnmi
476machine_check_fwnmi: 444machine_check_fwnmi:
477 SET_SCRATCH0(r13) /* save r13 */ 445 SET_SCRATCH0(r13) /* save r13 */
478 EXCEPTION_PROLOG_0(PACA_EXMC) 446 EXCEPTION_PROLOG_0(PACA_EXMC)
479machine_check_pSeries_0: 447machine_check_pSeries_0:
480 EXCEPTION_PROLOG_1(PACA_EXMC, KVMTEST, 0x200) 448 EXCEPTION_PROLOG_1(PACA_EXMC, KVMTEST_PR, 0x200)
481 /* 449 /*
482 * The following is essentially EXCEPTION_PROLOG_PSERIES_1 with the 450 * The following is essentially EXCEPTION_PROLOG_PSERIES_1 with the
483 * difference that MSR_RI is not enabled, because PACA_EXMC is being 451 * difference that MSR_RI is not enabled, because PACA_EXMC is being
@@ -494,16 +462,17 @@ machine_check_pSeries_0:
494 rfid 462 rfid
495 b . /* prevent speculative execution */ 463 b . /* prevent speculative execution */
496 464
497 KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200) 465
498 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x300) 466TRAMP_KVM_SKIP(PACA_EXMC, 0x200)
499 KVM_HANDLER_SKIP(PACA_EXSLB, EXC_STD, 0x380) 467TRAMP_KVM_SKIP(PACA_EXGEN, 0x300)
500 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x400) 468TRAMP_KVM_SKIP(PACA_EXSLB, 0x380)
501 KVM_HANDLER(PACA_EXSLB, EXC_STD, 0x480) 469TRAMP_KVM(PACA_EXGEN, 0x400)
502 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x900) 470TRAMP_KVM(PACA_EXSLB, 0x480)
503 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0x982) 471TRAMP_KVM(PACA_EXGEN, 0x900)
472TRAMP_KVM_HV(PACA_EXGEN, 0x980)
504 473
505#ifdef CONFIG_PPC_DENORMALISATION 474#ifdef CONFIG_PPC_DENORMALISATION
506denorm_assist: 475TRAMP_REAL_BEGIN(denorm_assist)
507BEGIN_FTR_SECTION 476BEGIN_FTR_SECTION
508/* 477/*
509 * To denormalise we need to move a copy of the register to itself. 478 * To denormalise we need to move a copy of the register to itself.
@@ -568,32 +537,39 @@ END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
568 537
569 .align 7 538 .align 7
570 /* moved from 0xe00 */ 539 /* moved from 0xe00 */
571 STD_EXCEPTION_HV_OOL(0xe02, h_data_storage) 540__TRAMP_REAL_REAL_OOL_HV(h_data_storage, 0xe00)
572 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0xe02) 541TRAMP_KVM_HV_SKIP(PACA_EXGEN, 0xe00)
573 STD_EXCEPTION_HV_OOL(0xe22, h_instr_storage) 542
574 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe22) 543__TRAMP_REAL_REAL_OOL_HV(h_instr_storage, 0xe20)
575 STD_EXCEPTION_HV_OOL(0xe42, emulation_assist) 544TRAMP_KVM_HV(PACA_EXGEN, 0xe20)
576 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe42) 545
577 MASKABLE_EXCEPTION_HV_OOL(0xe62, hmi_exception) 546__TRAMP_REAL_REAL_OOL_HV(emulation_assist, 0xe40)
578 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe62) 547TRAMP_KVM_HV(PACA_EXGEN, 0xe40)
579 548
580 MASKABLE_EXCEPTION_HV_OOL(0xe82, h_doorbell) 549__TRAMP_REAL_REAL_OOL_MASKABLE_HV(hmi_exception, 0xe60)
581 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe82) 550TRAMP_KVM_HV(PACA_EXGEN, 0xe60)
582 551
583 MASKABLE_EXCEPTION_HV_OOL(0xea2, h_virt_irq) 552__TRAMP_REAL_REAL_OOL_MASKABLE_HV(h_doorbell, 0xe80)
584 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xea2) 553TRAMP_KVM_HV(PACA_EXGEN, 0xe80)
554
555__TRAMP_REAL_REAL_OOL_MASKABLE_HV(h_virt_irq, 0xea0)
556TRAMP_KVM_HV(PACA_EXGEN, 0xea0)
585 557
586 /* moved from 0xf00 */ 558 /* moved from 0xf00 */
587 STD_EXCEPTION_PSERIES_OOL(0xf00, performance_monitor) 559__TRAMP_REAL_REAL_OOL(performance_monitor, 0xf00)
588 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xf00) 560TRAMP_KVM(PACA_EXGEN, 0xf00)
589 STD_EXCEPTION_PSERIES_OOL(0xf20, altivec_unavailable) 561
590 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xf20) 562__TRAMP_REAL_REAL_OOL(altivec_unavailable, 0xf20)
591 STD_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable) 563TRAMP_KVM(PACA_EXGEN, 0xf20)
592 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xf40) 564
593 STD_EXCEPTION_PSERIES_OOL(0xf60, facility_unavailable) 565__TRAMP_REAL_REAL_OOL(vsx_unavailable, 0xf40)
594 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xf60) 566TRAMP_KVM(PACA_EXGEN, 0xf40)
595 STD_EXCEPTION_HV_OOL(0xf82, hv_facility_unavailable) 567
596 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xf82) 568__TRAMP_REAL_REAL_OOL(facility_unavailable, 0xf60)
569TRAMP_KVM(PACA_EXGEN, 0xf60)
570
571__TRAMP_REAL_REAL_OOL_HV(h_facility_unavailable, 0xf80)
572TRAMP_KVM_HV(PACA_EXGEN, 0xf80)
597 573
598/* 574/*
599 * An interrupt came in while soft-disabled. We set paca->irq_happened, then: 575 * An interrupt came in while soft-disabled. We set paca->irq_happened, then:
@@ -676,9 +652,8 @@ ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
676/* 652/*
677 * Vectors for the FWNMI option. Share common code. 653 * Vectors for the FWNMI option. Share common code.
678 */ 654 */
679 .globl system_reset_fwnmi
680 .align 7 655 .align 7
681system_reset_fwnmi: 656TRAMP_REAL_BEGIN(system_reset_fwnmi)
682 SET_SCRATCH0(r13) /* save r13 */ 657 SET_SCRATCH0(r13) /* save r13 */
683 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD, 658 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD,
684 NOTEST, 0x100) 659 NOTEST, 0x100)
@@ -686,7 +661,7 @@ system_reset_fwnmi:
686#endif /* CONFIG_PPC_PSERIES */ 661#endif /* CONFIG_PPC_PSERIES */
687 662
688#ifdef CONFIG_KVM_BOOK3S_64_HANDLER 663#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
689kvmppc_skip_interrupt: 664TRAMP_REAL_BEGIN(kvmppc_skip_interrupt)
690 /* 665 /*
691 * Here all GPRs are unchanged from when the interrupt happened 666 * Here all GPRs are unchanged from when the interrupt happened
692 * except for r13, which is saved in SPRG_SCRATCH0. 667 * except for r13, which is saved in SPRG_SCRATCH0.
@@ -698,7 +673,7 @@ kvmppc_skip_interrupt:
698 rfid 673 rfid
699 b . 674 b .
700 675
701kvmppc_skip_Hinterrupt: 676TRAMP_REAL_BEGIN(kvmppc_skip_Hinterrupt)
702 /* 677 /*
703 * Here all GPRs are unchanged from when the interrupt happened 678 * Here all GPRs are unchanged from when the interrupt happened
704 * except for r13, which is saved in SPRG_SCRATCH0. 679 * except for r13, which is saved in SPRG_SCRATCH0.
@@ -720,34 +695,50 @@ kvmppc_skip_Hinterrupt:
720 695
721/*** Common interrupt handlers ***/ 696/*** Common interrupt handlers ***/
722 697
723 STD_EXCEPTION_COMMON(0x100, system_reset, system_reset_exception) 698 .align 7;
699EXC_COMMON(system_reset_common, 0x100, system_reset_exception)
700 .align 7;
701EXC_COMMON_ASYNC(hardware_interrupt_common, 0x500, do_IRQ)
702 .align 7;
703EXC_COMMON_ASYNC(decrementer_common, 0x900, timer_interrupt)
704 .align 7;
705EXC_COMMON(hdecrementer_common, 0x980, hdec_interrupt)
724 706
725 STD_EXCEPTION_COMMON_ASYNC(0x500, hardware_interrupt, do_IRQ) 707 .align 7;
726 STD_EXCEPTION_COMMON_ASYNC(0x900, decrementer, timer_interrupt)
727 STD_EXCEPTION_COMMON(0x980, hdecrementer, hdec_interrupt)
728#ifdef CONFIG_PPC_DOORBELL 708#ifdef CONFIG_PPC_DOORBELL
729 STD_EXCEPTION_COMMON_ASYNC(0xa00, doorbell_super, doorbell_exception) 709EXC_COMMON_ASYNC(doorbell_super_common, 0xa00, doorbell_exception)
730#else 710#else
731 STD_EXCEPTION_COMMON_ASYNC(0xa00, doorbell_super, unknown_exception) 711EXC_COMMON_ASYNC(doorbell_super_common, 0xa00, unknown_exception)
732#endif 712#endif
733 STD_EXCEPTION_COMMON(0xb00, trap_0b, unknown_exception) 713 .align 7;
734 STD_EXCEPTION_COMMON(0xd00, single_step, single_step_exception) 714EXC_COMMON(trap_0b_common, 0xb00, unknown_exception)
735 STD_EXCEPTION_COMMON(0xe00, trap_0e, unknown_exception) 715 .align 7;
736 STD_EXCEPTION_COMMON(0xe40, emulation_assist, emulation_assist_interrupt) 716EXC_COMMON(single_step_common, 0xd00, single_step_exception)
737 STD_EXCEPTION_COMMON_ASYNC(0xe60, hmi_exception, handle_hmi_exception) 717 .align 7;
718EXC_COMMON(trap_0e_common, 0xe00, unknown_exception)
719 .align 7;
720EXC_COMMON(emulation_assist_common, 0xe40, emulation_assist_interrupt)
721 .align 7;
722EXC_COMMON_ASYNC(hmi_exception_common, 0xe60, handle_hmi_exception)
723 .align 7;
738#ifdef CONFIG_PPC_DOORBELL 724#ifdef CONFIG_PPC_DOORBELL
739 STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, doorbell_exception) 725EXC_COMMON_ASYNC(h_doorbell_common, 0xe80, doorbell_exception)
740#else 726#else
741 STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, unknown_exception) 727EXC_COMMON_ASYNC(h_doorbell_common, 0xe80, unknown_exception)
742#endif 728#endif
743 STD_EXCEPTION_COMMON_ASYNC(0xea0, h_virt_irq, do_IRQ) 729 .align 7;
744 STD_EXCEPTION_COMMON_ASYNC(0xf00, performance_monitor, performance_monitor_exception) 730EXC_COMMON_ASYNC(h_virt_irq_common, 0xea0, do_IRQ)
745 STD_EXCEPTION_COMMON(0x1300, instruction_breakpoint, instruction_breakpoint_exception) 731 .align 7;
746 STD_EXCEPTION_COMMON(0x1502, denorm, unknown_exception) 732EXC_COMMON_ASYNC(performance_monitor_common, 0xf00, performance_monitor_exception)
733 .align 7;
734EXC_COMMON(instruction_breakpoint_common, 0x1300, instruction_breakpoint_exception)
735 .align 7;
736EXC_COMMON_HV(denorm_common, 0x1500, unknown_exception)
737 .align 7;
747#ifdef CONFIG_ALTIVEC 738#ifdef CONFIG_ALTIVEC
748 STD_EXCEPTION_COMMON(0x1700, altivec_assist, altivec_assist_exception) 739EXC_COMMON(altivec_assist_common, 0x1700, altivec_assist_exception)
749#else 740#else
750 STD_EXCEPTION_COMMON(0x1700, altivec_assist, unknown_exception) 741EXC_COMMON(altivec_assist_common, 0x1700, unknown_exception)
751#endif 742#endif
752 743
753 /* 744 /*
@@ -765,10 +756,12 @@ kvmppc_skip_Hinterrupt:
765 * only has extra guff for STAB-based processors -- which never 756 * only has extra guff for STAB-based processors -- which never
766 * come here. 757 * come here.
767 */ 758 */
768 STD_RELON_EXCEPTION_PSERIES(0x4300, 0x300, data_access) 759EXC_VIRT_NONE(0x4100, 0x4200)
769 . = 0x4380 760EXC_VIRT_NONE(0x4200, 0x4300)
770 .globl data_access_slb_relon_pSeries 761
771data_access_slb_relon_pSeries: 762EXC_VIRT(data_access, 0x4300, 0x4380, 0x300)
763
764EXC_VIRT_BEGIN(data_access_slb, 0x4380, 0x4400)
772 SET_SCRATCH0(r13) 765 SET_SCRATCH0(r13)
773 EXCEPTION_PROLOG_0(PACA_EXSLB) 766 EXCEPTION_PROLOG_0(PACA_EXSLB)
774 EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x380) 767 EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x380)
@@ -789,11 +782,11 @@ data_access_slb_relon_pSeries:
789 mtctr r10 782 mtctr r10
790 bctr 783 bctr
791#endif 784#endif
785EXC_VIRT_END(data_access_slb, 0x4380, 0x4400)
792 786
793 STD_RELON_EXCEPTION_PSERIES(0x4400, 0x400, instruction_access) 787EXC_VIRT(instruction_access, 0x4400, 0x4480, 0x400)
794 . = 0x4480 788
795 .globl instruction_access_slb_relon_pSeries 789EXC_VIRT_BEGIN(instruction_access_slb, 0x4480, 0x4500)
796instruction_access_slb_relon_pSeries:
797 SET_SCRATCH0(r13) 790 SET_SCRATCH0(r13)
798 EXCEPTION_PROLOG_0(PACA_EXSLB) 791 EXCEPTION_PROLOG_0(PACA_EXSLB)
799 EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x480) 792 EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x480)
@@ -809,100 +802,86 @@ instruction_access_slb_relon_pSeries:
809 mtctr r10 802 mtctr r10
810 bctr 803 bctr
811#endif 804#endif
805EXC_VIRT_END(instruction_access_slb, 0x4480, 0x4500)
812 806
813 . = 0x4500 807EXC_VIRT_BEGIN(hardware_interrupt, 0x4500, 0x4600)
814 .globl hardware_interrupt_relon_pSeries;
815 .globl hardware_interrupt_relon_hv; 808 .globl hardware_interrupt_relon_hv;
816hardware_interrupt_relon_pSeries:
817hardware_interrupt_relon_hv: 809hardware_interrupt_relon_hv:
818 BEGIN_FTR_SECTION 810 BEGIN_FTR_SECTION
819 _MASKABLE_RELON_EXCEPTION_PSERIES(0x502, hardware_interrupt, EXC_HV, SOFTEN_TEST_HV) 811 _MASKABLE_RELON_EXCEPTION_PSERIES(0x500, hardware_interrupt_common, EXC_HV, SOFTEN_TEST_HV)
820 FTR_SECTION_ELSE 812 FTR_SECTION_ELSE
821 _MASKABLE_RELON_EXCEPTION_PSERIES(0x500, hardware_interrupt, EXC_STD, SOFTEN_TEST_PR) 813 _MASKABLE_RELON_EXCEPTION_PSERIES(0x500, hardware_interrupt_common, EXC_STD, SOFTEN_TEST_PR)
822 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE) 814 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE)
823 STD_RELON_EXCEPTION_PSERIES(0x4600, 0x600, alignment) 815EXC_VIRT_END(hardware_interrupt, 0x4500, 0x4600)
824 STD_RELON_EXCEPTION_PSERIES(0x4700, 0x700, program_check) 816
825 STD_RELON_EXCEPTION_PSERIES(0x4800, 0x800, fp_unavailable) 817EXC_VIRT(alignment, 0x4600, 0x4700, 0x600)
826 MASKABLE_RELON_EXCEPTION_PSERIES(0x4900, 0x900, decrementer) 818EXC_VIRT(program_check, 0x4700, 0x4800, 0x700)
827 STD_RELON_EXCEPTION_HV(0x4980, 0x982, hdecrementer) 819EXC_VIRT(fp_unavailable, 0x4800, 0x4900, 0x800)
828 MASKABLE_RELON_EXCEPTION_PSERIES(0x4a00, 0xa00, doorbell_super) 820EXC_VIRT_MASKABLE(decrementer, 0x4900, 0x4980, 0x900)
829 STD_RELON_EXCEPTION_PSERIES(0x4b00, 0xb00, trap_0b) 821EXC_VIRT_HV(hdecrementer, 0x4980, 0x4a00, 0x980)
830 822EXC_VIRT_MASKABLE(doorbell_super, 0x4a00, 0x4b00, 0xa00)
831 . = 0x4c00 823EXC_VIRT(trap_0b, 0x4b00, 0x4c00, 0xb00)
832 .globl system_call_relon_pSeries 824
833system_call_relon_pSeries: 825EXC_VIRT_BEGIN(system_call, 0x4c00, 0x4d00)
834 HMT_MEDIUM 826 HMT_MEDIUM
835 SYSCALL_PSERIES_1 827 SYSCALL_PSERIES_1
836 SYSCALL_PSERIES_2_DIRECT 828 SYSCALL_PSERIES_2_DIRECT
837 SYSCALL_PSERIES_3 829 SYSCALL_PSERIES_3
830EXC_VIRT_END(system_call, 0x4c00, 0x4d00)
838 831
839 STD_RELON_EXCEPTION_PSERIES(0x4d00, 0xd00, single_step) 832EXC_VIRT(single_step, 0x4d00, 0x4e00, 0xd00)
840 833
841 . = 0x4e00 834EXC_VIRT_BEGIN(unused, 0x4e00, 0x4e20)
842 b . /* Can't happen, see v2.07 Book III-S section 6.5 */ 835 b . /* Can't happen, see v2.07 Book III-S section 6.5 */
836EXC_VIRT_END(unused, 0x4e00, 0x4e20)
843 837
844 . = 0x4e20 838EXC_VIRT_BEGIN(unused, 0x4e20, 0x4e40)
845 b . /* Can't happen, see v2.07 Book III-S section 6.5 */ 839 b . /* Can't happen, see v2.07 Book III-S section 6.5 */
840EXC_VIRT_END(unused, 0x4e20, 0x4e40)
846 841
847 . = 0x4e40 842__EXC_VIRT_OOL_HV(emulation_assist, 0x4e40, 0x4e60)
848emulation_assist_relon_trampoline:
849 SET_SCRATCH0(r13)
850 EXCEPTION_PROLOG_0(PACA_EXGEN)
851 b emulation_assist_relon_hv
852 843
853 . = 0x4e60 844EXC_VIRT_BEGIN(unused, 0x4e60, 0x4e80)
854 b . /* Can't happen, see v2.07 Book III-S section 6.5 */ 845 b . /* Can't happen, see v2.07 Book III-S section 6.5 */
846EXC_VIRT_END(unused, 0x4e60, 0x4e80)
855 847
856 . = 0x4e80 848__EXC_VIRT_OOL_MASKABLE_HV(h_doorbell, 0x4e80, 0x4ea0)
857h_doorbell_relon_trampoline:
858 SET_SCRATCH0(r13)
859 EXCEPTION_PROLOG_0(PACA_EXGEN)
860 b h_doorbell_relon_hv
861 849
862 . = 0x4ea0 850__EXC_VIRT_OOL_MASKABLE_HV(h_virt_irq, 0x4ea0, 0x4ec0)
863h_virt_irq_relon_trampoline:
864 SET_SCRATCH0(r13)
865 EXCEPTION_PROLOG_0(PACA_EXGEN)
866 b h_virt_irq_relon_hv
867 851
868 . = 0x4f00 852EXC_VIRT_NONE(0x4ec0, 0x4f00)
869performance_monitor_relon_pseries_trampoline:
870 SET_SCRATCH0(r13)
871 EXCEPTION_PROLOG_0(PACA_EXGEN)
872 b performance_monitor_relon_pSeries
873 853
874 . = 0x4f20 854__EXC_VIRT_OOL(performance_monitor, 0x4f00, 0x4f20)
875altivec_unavailable_relon_pseries_trampoline:
876 SET_SCRATCH0(r13)
877 EXCEPTION_PROLOG_0(PACA_EXGEN)
878 b altivec_unavailable_relon_pSeries
879 855
880 . = 0x4f40 856__EXC_VIRT_OOL(altivec_unavailable, 0x4f20, 0x4f40)
881vsx_unavailable_relon_pseries_trampoline:
882 SET_SCRATCH0(r13)
883 EXCEPTION_PROLOG_0(PACA_EXGEN)
884 b vsx_unavailable_relon_pSeries
885 857
886 . = 0x4f60 858__EXC_VIRT_OOL(vsx_unavailable, 0x4f40, 0x4f60)
887facility_unavailable_relon_trampoline:
888 SET_SCRATCH0(r13)
889 EXCEPTION_PROLOG_0(PACA_EXGEN)
890 b facility_unavailable_relon_pSeries
891 859
892 . = 0x4f80 860__EXC_VIRT_OOL(facility_unavailable, 0x4f60, 0x4f80)
893hv_facility_unavailable_relon_trampoline: 861
894 SET_SCRATCH0(r13) 862__EXC_VIRT_OOL_HV(h_facility_unavailable, 0x4f80, 0x4fa0)
895 EXCEPTION_PROLOG_0(PACA_EXGEN) 863
896 b hv_facility_unavailable_relon_hv 864EXC_VIRT_NONE(0x4fa0, 0x5200)
865
866EXC_VIRT_NONE(0x5200, 0x5300)
867
868EXC_VIRT(instruction_breakpoint, 0x5300, 0x5400, 0x1300)
897 869
898 STD_RELON_EXCEPTION_PSERIES(0x5300, 0x1300, instruction_breakpoint)
899#ifdef CONFIG_PPC_DENORMALISATION 870#ifdef CONFIG_PPC_DENORMALISATION
900 . = 0x5500 871EXC_VIRT_BEGIN(denorm_exception, 0x5500, 0x5600)
901 b denorm_exception_hv 872 b exc_real_0x1500_denorm_exception_hv
873EXC_VIRT_END(denorm_exception, 0x5500, 0x5600)
874#else
875EXC_VIRT_NONE(0x5500, 0x5600)
902#endif 876#endif
903 STD_RELON_EXCEPTION_PSERIES(0x5700, 0x1700, altivec_assist)
904 877
905ppc64_runlatch_on_trampoline: 878EXC_VIRT_NONE(0x5600, 0x5700)
879
880EXC_VIRT(altivec_assist, 0x5700, 0x5800, 0x1700)
881
882EXC_VIRT_NONE(0x5800, 0x5900)
883
884TRAMP_REAL_BEGIN(ppc64_runlatch_on_trampoline)
906 b __ppc64_runlatch_on 885 b __ppc64_runlatch_on
907 886
908/* 887/*
@@ -911,8 +890,7 @@ ppc64_runlatch_on_trampoline:
911 * r9 - r13 are saved in paca->exgen. 890 * r9 - r13 are saved in paca->exgen.
912 */ 891 */
913 .align 7 892 .align 7
914 .globl data_access_common 893EXC_COMMON_BEGIN(data_access_common)
915data_access_common:
916 mfspr r10,SPRN_DAR 894 mfspr r10,SPRN_DAR
917 std r10,PACA_EXGEN+EX_DAR(r13) 895 std r10,PACA_EXGEN+EX_DAR(r13)
918 mfspr r10,SPRN_DSISR 896 mfspr r10,SPRN_DSISR
@@ -932,8 +910,7 @@ MMU_FTR_SECTION_ELSE
932ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX) 910ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
933 911
934 .align 7 912 .align 7
935 .globl h_data_storage_common 913EXC_COMMON_BEGIN(h_data_storage_common)
936h_data_storage_common:
937 mfspr r10,SPRN_HDAR 914 mfspr r10,SPRN_HDAR
938 std r10,PACA_EXGEN+EX_DAR(r13) 915 std r10,PACA_EXGEN+EX_DAR(r13)
939 mfspr r10,SPRN_HDSISR 916 mfspr r10,SPRN_HDSISR
@@ -946,8 +923,7 @@ h_data_storage_common:
946 b ret_from_except 923 b ret_from_except
947 924
948 .align 7 925 .align 7
949 .globl instruction_access_common 926EXC_COMMON_BEGIN(instruction_access_common)
950instruction_access_common:
951 EXCEPTION_PROLOG_COMMON(0x400, PACA_EXGEN) 927 EXCEPTION_PROLOG_COMMON(0x400, PACA_EXGEN)
952 RECONCILE_IRQ_STATE(r10, r11) 928 RECONCILE_IRQ_STATE(r10, r11)
953 ld r12,_MSR(r1) 929 ld r12,_MSR(r1)
@@ -962,16 +938,15 @@ MMU_FTR_SECTION_ELSE
962 b handle_page_fault 938 b handle_page_fault
963ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX) 939ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
964 940
965 STD_EXCEPTION_COMMON(0xe20, h_instr_storage, unknown_exception) 941 .align 7
942EXC_COMMON(h_instr_storage_common, 0xe20, unknown_exception)
966 943
967 /* 944 /*
968 * Machine check is different because we use a different 945 * Machine check is different because we use a different
969 * save area: PACA_EXMC instead of PACA_EXGEN. 946 * save area: PACA_EXMC instead of PACA_EXGEN.
970 */ 947 */
971 .align 7 948 .align 7
972 .globl machine_check_common 949EXC_COMMON_BEGIN(machine_check_common)
973machine_check_common:
974
975 mfspr r10,SPRN_DAR 950 mfspr r10,SPRN_DAR
976 std r10,PACA_EXMC+EX_DAR(r13) 951 std r10,PACA_EXMC+EX_DAR(r13)
977 mfspr r10,SPRN_DSISR 952 mfspr r10,SPRN_DSISR
@@ -992,8 +967,7 @@ machine_check_common:
992 b ret_from_except 967 b ret_from_except
993 968
994 .align 7 969 .align 7
995 .globl alignment_common 970EXC_COMMON_BEGIN(alignment_common)
996alignment_common:
997 mfspr r10,SPRN_DAR 971 mfspr r10,SPRN_DAR
998 std r10,PACA_EXGEN+EX_DAR(r13) 972 std r10,PACA_EXGEN+EX_DAR(r13)
999 mfspr r10,SPRN_DSISR 973 mfspr r10,SPRN_DSISR
@@ -1010,8 +984,7 @@ alignment_common:
1010 b ret_from_except 984 b ret_from_except
1011 985
1012 .align 7 986 .align 7
1013 .globl program_check_common 987EXC_COMMON_BEGIN(program_check_common)
1014program_check_common:
1015 EXCEPTION_PROLOG_COMMON(0x700, PACA_EXGEN) 988 EXCEPTION_PROLOG_COMMON(0x700, PACA_EXGEN)
1016 bl save_nvgprs 989 bl save_nvgprs
1017 RECONCILE_IRQ_STATE(r10, r11) 990 RECONCILE_IRQ_STATE(r10, r11)
@@ -1020,8 +993,7 @@ program_check_common:
1020 b ret_from_except 993 b ret_from_except
1021 994
1022 .align 7 995 .align 7
1023 .globl fp_unavailable_common 996EXC_COMMON_BEGIN(fp_unavailable_common)
1024fp_unavailable_common:
1025 EXCEPTION_PROLOG_COMMON(0x800, PACA_EXGEN) 997 EXCEPTION_PROLOG_COMMON(0x800, PACA_EXGEN)
1026 bne 1f /* if from user, just load it up */ 998 bne 1f /* if from user, just load it up */
1027 bl save_nvgprs 999 bl save_nvgprs
@@ -1049,9 +1021,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_TM)
1049 bl fp_unavailable_tm 1021 bl fp_unavailable_tm
1050 b ret_from_except 1022 b ret_from_except
1051#endif 1023#endif
1024
1052 .align 7 1025 .align 7
1053 .globl altivec_unavailable_common 1026EXC_COMMON_BEGIN(altivec_unavailable_common)
1054altivec_unavailable_common:
1055 EXCEPTION_PROLOG_COMMON(0xf20, PACA_EXGEN) 1027 EXCEPTION_PROLOG_COMMON(0xf20, PACA_EXGEN)
1056#ifdef CONFIG_ALTIVEC 1028#ifdef CONFIG_ALTIVEC
1057BEGIN_FTR_SECTION 1029BEGIN_FTR_SECTION
@@ -1085,8 +1057,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
1085 b ret_from_except 1057 b ret_from_except
1086 1058
1087 .align 7 1059 .align 7
1088 .globl vsx_unavailable_common 1060EXC_COMMON_BEGIN(vsx_unavailable_common)
1089vsx_unavailable_common:
1090 EXCEPTION_PROLOG_COMMON(0xf40, PACA_EXGEN) 1061 EXCEPTION_PROLOG_COMMON(0xf40, PACA_EXGEN)
1091#ifdef CONFIG_VSX 1062#ifdef CONFIG_VSX
1092BEGIN_FTR_SECTION 1063BEGIN_FTR_SECTION
@@ -1119,15 +1090,14 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX)
1119 b ret_from_except 1090 b ret_from_except
1120 1091
1121 /* Equivalents to the above handlers for relocation-on interrupt vectors */ 1092 /* Equivalents to the above handlers for relocation-on interrupt vectors */
1122 STD_RELON_EXCEPTION_HV_OOL(0xe40, emulation_assist) 1093__TRAMP_REAL_VIRT_OOL_HV(emulation_assist, 0xe40)
1123 MASKABLE_RELON_EXCEPTION_HV_OOL(0xe80, h_doorbell) 1094__TRAMP_REAL_VIRT_OOL_MASKABLE_HV(h_doorbell, 0xe80)
1124 MASKABLE_RELON_EXCEPTION_HV_OOL(0xea0, h_virt_irq) 1095__TRAMP_REAL_VIRT_OOL_MASKABLE_HV(h_virt_irq, 0xea0)
1125 1096__TRAMP_REAL_VIRT_OOL(performance_monitor, 0xf00)
1126 STD_RELON_EXCEPTION_PSERIES_OOL(0xf00, performance_monitor) 1097__TRAMP_REAL_VIRT_OOL(altivec_unavailable, 0xf20)
1127 STD_RELON_EXCEPTION_PSERIES_OOL(0xf20, altivec_unavailable) 1098__TRAMP_REAL_VIRT_OOL(vsx_unavailable, 0xf40)
1128 STD_RELON_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable) 1099__TRAMP_REAL_VIRT_OOL(facility_unavailable, 0xf60)
1129 STD_RELON_EXCEPTION_PSERIES_OOL(0xf60, facility_unavailable) 1100__TRAMP_REAL_VIRT_OOL_HV(h_facility_unavailable, 0xf80)
1130 STD_RELON_EXCEPTION_HV_OOL(0xf80, hv_facility_unavailable)
1131 1101
1132 /* 1102 /*
1133 * The __end_interrupts marker must be past the out-of-line (OOL) 1103 * The __end_interrupts marker must be past the out-of-line (OOL)
@@ -1155,18 +1125,24 @@ fwnmi_data_area:
1155 . = 0x8000 1125 . = 0x8000
1156#endif /* defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) */ 1126#endif /* defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) */
1157 1127
1158 STD_EXCEPTION_COMMON(0xf60, facility_unavailable, facility_unavailable_exception) 1128 .align 7;
1159 STD_EXCEPTION_COMMON(0xf80, hv_facility_unavailable, facility_unavailable_exception) 1129EXC_COMMON(facility_unavailable_common, 0xf60, facility_unavailable_exception)
1130 .align 7;
1131EXC_COMMON(h_facility_unavailable_common, 0xf80, facility_unavailable_exception)
1160 1132
1161#ifdef CONFIG_CBE_RAS 1133#ifdef CONFIG_CBE_RAS
1162 STD_EXCEPTION_COMMON(0x1200, cbe_system_error, cbe_system_error_exception) 1134 .align 7;
1163 STD_EXCEPTION_COMMON(0x1600, cbe_maintenance, cbe_maintenance_exception) 1135EXC_COMMON(cbe_system_error_common, 0x1200, cbe_system_error_exception)
1164 STD_EXCEPTION_COMMON(0x1800, cbe_thermal, cbe_thermal_exception) 1136 .align 7;
1137EXC_COMMON(cbe_maintenance_common, 0x1600, cbe_maintenance_exception)
1138 .align 7;
1139EXC_COMMON(cbe_thermal_common, 0x1800, cbe_thermal_exception)
1165#endif /* CONFIG_CBE_RAS */ 1140#endif /* CONFIG_CBE_RAS */
1166 1141
1167 .globl hmi_exception_early 1142
1168hmi_exception_early: 1143 .align 7;
1169 EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST, 0xe62) 1144EXC_COMMON_BEGIN(hmi_exception_early)
1145 EXCEPTION_PROLOG_1(PACA_EXGEN, KVMTEST_HV, 0xe60)
1170 mr r10,r1 /* Save r1 */ 1146 mr r10,r1 /* Save r1 */
1171 ld r1,PACAEMERGSP(r13) /* Use emergency stack */ 1147 ld r1,PACAEMERGSP(r13) /* Use emergency stack */
1172 subi r1,r1,INT_FRAME_SIZE /* alloc stack frame */ 1148 subi r1,r1,INT_FRAME_SIZE /* alloc stack frame */
@@ -1212,7 +1188,7 @@ hmi_exception_early:
1212hmi_exception_after_realmode: 1188hmi_exception_after_realmode:
1213 SET_SCRATCH0(r13) 1189 SET_SCRATCH0(r13)
1214 EXCEPTION_PROLOG_0(PACA_EXGEN) 1190 EXCEPTION_PROLOG_0(PACA_EXGEN)
1215 b hmi_exception_hv 1191 b tramp_real_hmi_exception
1216 1192
1217 1193
1218#define MACHINE_CHECK_HANDLER_WINDUP \ 1194#define MACHINE_CHECK_HANDLER_WINDUP \
@@ -1251,8 +1227,7 @@ hmi_exception_after_realmode:
1251 * ME=1, MMU (IR=0 and DR=0) off and using MC emergency stack. 1227 * ME=1, MMU (IR=0 and DR=0) off and using MC emergency stack.
1252 */ 1228 */
1253 .align 7 1229 .align 7
1254 .globl machine_check_handle_early 1230EXC_COMMON_BEGIN(machine_check_handle_early)
1255machine_check_handle_early:
1256 std r0,GPR0(r1) /* Save r0 */ 1231 std r0,GPR0(r1) /* Save r0 */
1257 EXCEPTION_PROLOG_COMMON_3(0x200) 1232 EXCEPTION_PROLOG_COMMON_3(0x200)
1258 bl save_nvgprs 1233 bl save_nvgprs
@@ -1378,7 +1353,7 @@ machine_check_handle_early:
1378 MACHINE_CHECK_HANDLER_WINDUP 1353 MACHINE_CHECK_HANDLER_WINDUP
1379 b machine_check_pSeries 1354 b machine_check_pSeries
1380 1355
1381unrecover_mce: 1356EXC_COMMON_BEGIN(unrecover_mce)
1382 /* Invoke machine_check_exception to print MCE event and panic. */ 1357 /* Invoke machine_check_exception to print MCE event and panic. */
1383 addi r3,r1,STACK_FRAME_OVERHEAD 1358 addi r3,r1,STACK_FRAME_OVERHEAD
1384 bl machine_check_exception 1359 bl machine_check_exception
@@ -1389,6 +1364,7 @@ unrecover_mce:
13891: addi r3,r1,STACK_FRAME_OVERHEAD 13641: addi r3,r1,STACK_FRAME_OVERHEAD
1390 bl unrecoverable_exception 1365 bl unrecoverable_exception
1391 b 1b 1366 b 1b
1367
1392/* 1368/*
1393 * r13 points to the PACA, r9 contains the saved CR, 1369 * r13 points to the PACA, r9 contains the saved CR,
1394 * r12 contain the saved SRR1, SRR0 is still ready for return 1370 * r12 contain the saved SRR1, SRR0 is still ready for return
@@ -1398,7 +1374,7 @@ unrecover_mce:
1398 * cr6.eq is set for a D-SLB miss, clear for a I-SLB miss 1374 * cr6.eq is set for a D-SLB miss, clear for a I-SLB miss
1399 * We assume we aren't going to take any exceptions during this procedure. 1375 * We assume we aren't going to take any exceptions during this procedure.
1400 */ 1376 */
1401slb_miss_realmode: 1377EXC_COMMON_BEGIN(slb_miss_realmode)
1402 mflr r10 1378 mflr r10
1403#ifdef CONFIG_RELOCATABLE 1379#ifdef CONFIG_RELOCATABLE
1404 mtctr r11 1380 mtctr r11
@@ -1451,14 +1427,6 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_TYPE_RADIX)
1451 rfid 1427 rfid
1452 b . 1428 b .
1453 1429
1454unrecov_slb:
1455 EXCEPTION_PROLOG_COMMON(0x4100, PACA_EXSLB)
1456 RECONCILE_IRQ_STATE(r10, r11)
1457 bl save_nvgprs
14581: addi r3,r1,STACK_FRAME_OVERHEAD
1459 bl unrecoverable_exception
1460 b 1b
1461
14628: mfspr r11,SPRN_SRR0 14308: mfspr r11,SPRN_SRR0
1463 LOAD_HANDLER(r10,bad_addr_slb) 1431 LOAD_HANDLER(r10,bad_addr_slb)
1464 mtspr SPRN_SRR0,r10 1432 mtspr SPRN_SRR0,r10
@@ -1467,7 +1435,16 @@ unrecov_slb:
1467 rfid 1435 rfid
1468 b . 1436 b .
1469 1437
1470bad_addr_slb: 1438EXC_COMMON_BEGIN(unrecov_slb)
1439 EXCEPTION_PROLOG_COMMON(0x4100, PACA_EXSLB)
1440 RECONCILE_IRQ_STATE(r10, r11)
1441 bl save_nvgprs
14421: addi r3,r1,STACK_FRAME_OVERHEAD
1443 bl unrecoverable_exception
1444 b 1b
1445
1446
1447EXC_COMMON_BEGIN(bad_addr_slb)
1471 EXCEPTION_PROLOG_COMMON(0x380, PACA_EXSLB) 1448 EXCEPTION_PROLOG_COMMON(0x380, PACA_EXSLB)
1472 RECONCILE_IRQ_STATE(r10, r11) 1449 RECONCILE_IRQ_STATE(r10, r11)
1473 ld r3, PACA_EXSLB+EX_DAR(r13) 1450 ld r3, PACA_EXSLB+EX_DAR(r13)
@@ -1481,7 +1458,7 @@ bad_addr_slb:
1481 b ret_from_except 1458 b ret_from_except
1482 1459
1483#ifdef CONFIG_PPC_970_NAP 1460#ifdef CONFIG_PPC_970_NAP
1484power4_fixup_nap: 1461TRAMP_REAL_BEGIN(power4_fixup_nap)
1485 andc r9,r9,r10 1462 andc r9,r9,r10
1486 std r9,TI_LOCAL_FLAGS(r11) 1463 std r9,TI_LOCAL_FLAGS(r11)
1487 ld r10,_LINK(r1) /* make idle task do the */ 1464 ld r10,_LINK(r1) /* make idle task do the */