File indexing completed on 2025-05-11 08:23:58
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include <bspopts.h>
0016 #include <bsp/vectors.h>
0017 #include <libcpu/powerpc-utility.h>
0018
0019 #define LT(cr) ((cr)*4+0)
0020 #define GT(cr) ((cr)*4+1)
0021 #define EQ(cr) ((cr)*4+2)
0022
0023
0024 #define STW_R1_R13(off) ((((36<<10)|(r1<<5)|(r13))<<16) | ((off)&0xffff))
0025
0026 #define FRAME_REGISTER r14
0027 #define VECTOR_REGISTER r4
0028 #define SCRATCH_REGISTER_0 r5
0029 #define SCRATCH_REGISTER_1 r6
0030 #define SCRATCH_REGISTER_2 r7
0031
0032 #define FRAME_OFFSET( r) GPR14_OFFSET( r)
0033 #define VECTOR_OFFSET( r) GPR4_OFFSET( r)
0034 #define SCRATCH_REGISTER_0_OFFSET( r) GPR5_OFFSET( r)
0035 #define SCRATCH_REGISTER_1_OFFSET( r) GPR6_OFFSET( r)
0036 #define SCRATCH_REGISTER_2_OFFSET( r) GPR7_OFFSET( r)
0037
0038 #define CR_TYPE 2
0039 #define CR_MSR 3
0040 #define CR_LOCK 4
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077 .macro PPC_EXC_MIN_PROLOG_ASYNC _NAME _VEC _PRI _FLVR
0078
0079 .global ppc_exc_min_prolog_async_\_NAME
0080 ppc_exc_min_prolog_async_\_NAME:
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101 stw r1, ppc_exc_lock_\_PRI@sdarel(r13)
0102
0103
0104
0105
0106 stw VECTOR_REGISTER, ppc_exc_vector_register_\_PRI@sdarel(r13)
0107
0108
0109 li VECTOR_REGISTER, ( \_VEC | 0xffff8000 )
0110
0111
0112
0113
0114
0115 .int ppc_exc_wrap_\_FLVR
0116
0117 .endm
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129 .macro PPC_EXC_MIN_PROLOG_SYNC _NAME _VEC _PRI _FLVR
0130
0131 .global ppc_exc_min_prolog_sync_\_NAME
0132 ppc_exc_min_prolog_sync_\_NAME:
0133 stwu r1, -EXCEPTION_FRAME_END(r1)
0134 stw VECTOR_REGISTER, VECTOR_OFFSET(r1)
0135 li VECTOR_REGISTER, \_VEC
0136
0137
0138
0139
0140
0141 .int ppc_exc_wrap_nopush_\_FLVR
0142
0143 .endm
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159 .macro TEST_1ST_OPCODE_crit _REG
0160
0161 lwz \_REG, SRR0_FRAME_OFFSET(FRAME_REGISTER)
0162 lwz \_REG, 0(\_REG)
0163
0164
0165
0166 subis \_REG, \_REG, STW_R1_R13(0)@h
0167
0168
0169
0170
0171 cmplwi cr0, \_REG, ppc_exc_lock_std@sdarel
0172
0173 .endm
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184 .macro TEST_LOCK_std _FLVR
0185
0186 creqv EQ(CR_LOCK), EQ(CR_LOCK), EQ(CR_LOCK)
0187 .endm
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205 .macro TEST_LOCK_crit _FLVR
0206
0207
0208
0209 GET_INTERRUPT_MASK mask=SCRATCH_REGISTER_1
0210
0211 andis. SCRATCH_REGISTER_1, SCRATCH_REGISTER_1, MSR_CE@h
0212 beq TEST_LOCK_crit_done_\_FLVR
0213
0214
0215
0216
0217
0218 TEST_1ST_OPCODE_crit _REG=SCRATCH_REGISTER_0
0219
0220
0221
0222
0223
0224
0225
0226
0227 lwz SCRATCH_REGISTER_1, ppc_exc_lock_std@sdarel(r13)
0228 cmplwi CR_LOCK, SCRATCH_REGISTER_1, 0
0229
0230
0231 TEST_LOCK_crit_done_\_FLVR:
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242 crandc EQ(CR_LOCK), EQ(CR_LOCK), EQ(cr0)
0243
0244 .endm
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262 .macro TEST_LOCK_mchk _SRR0 _FLVR
0263
0264 crxor EQ(CR_LOCK), EQ(CR_LOCK), EQ(CR_LOCK)
0265
0266 .endm
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281 .macro RECOVER_CHECK_std _FLVR
0282
0283 #ifndef PPC_EXC_CONFIG_BOOKE_ONLY
0284
0285
0286 lwz SCRATCH_REGISTER_0, SRR1_FRAME_OFFSET(FRAME_REGISTER)
0287 lwz SCRATCH_REGISTER_1, ppc_exc_msr_bits@sdarel(r13)
0288 xor SCRATCH_REGISTER_1, SCRATCH_REGISTER_1, SCRATCH_REGISTER_0
0289 andi. SCRATCH_REGISTER_0, SCRATCH_REGISTER_1, MSR_RI
0290
0291 recover_check_twiddle_std_\_FLVR:
0292
0293
0294 bne recover_check_twiddle_std_\_FLVR
0295
0296 #endif
0297
0298 .endm
0299
0300
0301 .macro RECOVER_CHECK_crit _FLVR
0302
0303
0304
0305 .endm
0306
0307
0308 .macro RECOVER_CHECK_mchk _FLVR
0309
0310 #ifndef PPC_EXC_CONFIG_BOOKE_ONLY
0311
0312
0313 lwz SCRATCH_REGISTER_0, SRR1_FRAME_OFFSET(FRAME_REGISTER)
0314 lwz SCRATCH_REGISTER_1, ppc_exc_msr_bits@sdarel(r13)
0315 xor SCRATCH_REGISTER_1, SCRATCH_REGISTER_1, SCRATCH_REGISTER_0
0316 andi. SCRATCH_REGISTER_0, SCRATCH_REGISTER_1, MSR_RI
0317
0318 recover_check_twiddle_mchk_\_FLVR:
0319
0320
0321 bne recover_check_twiddle_mchk_\_FLVR
0322
0323 #endif
0324
0325 .endm
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392 .macro WRAP _FLVR _PRI _SRR0 _SRR1 _RFI
0393
0394 .global ppc_exc_wrap_\_FLVR
0395 ppc_exc_wrap_\_FLVR:
0396
0397
0398 stwu r1, -EXCEPTION_FRAME_END(r1)
0399
0400 .global ppc_exc_wrap_nopush_\_FLVR
0401 ppc_exc_wrap_nopush_\_FLVR:
0402
0403
0404 stw FRAME_REGISTER, FRAME_OFFSET(r1)
0405
0406 wrap_no_save_frame_register_\_FLVR:
0407
0408
0409
0410
0411
0412
0413
0414
0415 mr FRAME_REGISTER, r1
0416
0417
0418 stw SCRATCH_REGISTER_0, SCRATCH_REGISTER_0_OFFSET(FRAME_REGISTER)
0419 stw SCRATCH_REGISTER_1, SCRATCH_REGISTER_1_OFFSET(FRAME_REGISTER)
0420 stw SCRATCH_REGISTER_2, SCRATCH_REGISTER_2_OFFSET(FRAME_REGISTER)
0421
0422
0423 mfcr SCRATCH_REGISTER_0
0424 stw SCRATCH_REGISTER_0, EXC_CR_OFFSET(FRAME_REGISTER)
0425
0426
0427 cmpwi CR_TYPE, VECTOR_REGISTER, 0
0428
0429 #if defined(PPC_MULTILIB_FPU) || defined(PPC_MULTILIB_ALTIVEC)
0430
0431 mfmsr SCRATCH_REGISTER_0
0432 #ifdef PPC_MULTILIB_FPU
0433 ori SCRATCH_REGISTER_0, SCRATCH_REGISTER_0, MSR_FP
0434 #endif
0435 #ifdef PPC_MULTILIB_ALTIVEC
0436 oris SCRATCH_REGISTER_0, SCRATCH_REGISTER_0, MSR_VE >> 16
0437 #endif
0438 mtmsr SCRATCH_REGISTER_0
0439 isync
0440 #endif
0441
0442
0443
0444
0445
0446
0447
0448 bge CR_TYPE, wrap_save_non_volatile_regs_\_FLVR
0449
0450
0451
0452
0453
0454
0455
0456
0457
0458 GET_SELF_CPU_CONTROL SCRATCH_REGISTER_2
0459 lwz SCRATCH_REGISTER_0, PER_CPU_ISR_NEST_LEVEL@l(SCRATCH_REGISTER_2)
0460 lwz SCRATCH_REGISTER_1, PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL(SCRATCH_REGISTER_2)
0461 addi SCRATCH_REGISTER_0, SCRATCH_REGISTER_0, 1
0462 addi SCRATCH_REGISTER_1, SCRATCH_REGISTER_1, 1
0463 stw SCRATCH_REGISTER_0, PER_CPU_ISR_NEST_LEVEL@l(SCRATCH_REGISTER_2)
0464 stw SCRATCH_REGISTER_1, PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL(SCRATCH_REGISTER_2)
0465
0466
0467
0468
0469
0470
0471
0472 li SCRATCH_REGISTER_0, 0
0473 stw SCRATCH_REGISTER_0, ppc_exc_lock_\_PRI@sdarel(r13)
0474
0475
0476 mfspr SCRATCH_REGISTER_0, SPRG1
0477 cmpw SCRATCH_REGISTER_0, r1
0478 blt wrap_stack_switch_\_FLVR
0479 mfspr SCRATCH_REGISTER_1, SPRG2
0480 cmpw SCRATCH_REGISTER_1, r1
0481 blt wrap_stack_switch_done_\_FLVR
0482
0483 wrap_stack_switch_\_FLVR:
0484
0485 mr r1, SCRATCH_REGISTER_0
0486
0487 wrap_stack_switch_done_\_FLVR:
0488
0489
0490
0491
0492
0493
0494 lwz SCRATCH_REGISTER_2, ppc_exc_vector_register_\_PRI@sdarel(r13)
0495
0496
0497 stw SCRATCH_REGISTER_2, VECTOR_OFFSET(FRAME_REGISTER)
0498
0499 wrap_disable_thread_dispatching_done_\_FLVR:
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511 mfspr SCRATCH_REGISTER_0, \_SRR0
0512 stw SCRATCH_REGISTER_0, SRR0_FRAME_OFFSET(FRAME_REGISTER)
0513
0514
0515 mfspr SCRATCH_REGISTER_0, \_SRR1
0516 stw SCRATCH_REGISTER_0, SRR1_FRAME_OFFSET(FRAME_REGISTER)
0517
0518
0519 mfctr SCRATCH_REGISTER_0
0520 stw SCRATCH_REGISTER_0, EXC_CTR_OFFSET(FRAME_REGISTER)
0521
0522
0523 mfxer SCRATCH_REGISTER_0
0524 stw SCRATCH_REGISTER_0, EXC_XER_OFFSET(FRAME_REGISTER)
0525
0526
0527 mflr SCRATCH_REGISTER_0
0528 stw SCRATCH_REGISTER_0, EXC_LR_OFFSET(FRAME_REGISTER)
0529
0530
0531 stw r0, GPR0_OFFSET(FRAME_REGISTER)
0532 stw r3, GPR3_OFFSET(FRAME_REGISTER)
0533 stw r8, GPR8_OFFSET(FRAME_REGISTER)
0534 stw r9, GPR9_OFFSET(FRAME_REGISTER)
0535 stw r10, GPR10_OFFSET(FRAME_REGISTER)
0536 stw r11, GPR11_OFFSET(FRAME_REGISTER)
0537 stw r12, GPR12_OFFSET(FRAME_REGISTER)
0538
0539
0540 stw r2, GPR2_OFFSET(FRAME_REGISTER)
0541
0542
0543 stw VECTOR_REGISTER, EXCEPTION_NUMBER_OFFSET(FRAME_REGISTER)
0544
0545 #ifndef PPC_EXC_CONFIG_BOOKE_ONLY
0546
0547
0548 lwz SCRATCH_REGISTER_0, ppc_exc_msr_bits@sdarel(r13)
0549
0550
0551
0552
0553
0554 cmpwi CR_MSR, SCRATCH_REGISTER_0, 0
0555 bne CR_MSR, wrap_change_msr_\_FLVR
0556
0557 wrap_change_msr_done_\_FLVR:
0558
0559 #endif
0560
0561 #if defined(__ALTIVEC__) && !defined(PPC_MULTILIB_ALTIVEC)
0562 LA SCRATCH_REGISTER_0, _CPU_save_altivec_volatile
0563 mtctr SCRATCH_REGISTER_0
0564 addi r3, FRAME_REGISTER, EXC_VEC_OFFSET
0565 bctrl
0566
0567
0568
0569 li SCRATCH_REGISTER_0, 0
0570 mtvrsave SCRATCH_REGISTER_0
0571
0572
0573
0574 vxor 0, 0, 0
0575 mtvscr 0
0576
0577
0578
0579 lwz VECTOR_REGISTER, EXCEPTION_NUMBER_OFFSET(FRAME_REGISTER)
0580 #endif
0581
0582 #ifdef PPC_MULTILIB_ALTIVEC
0583 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(0)
0584 stvx v0, FRAME_REGISTER, SCRATCH_REGISTER_0
0585 mfvscr v0
0586 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(1)
0587 stvx v1, FRAME_REGISTER, SCRATCH_REGISTER_0
0588 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(2)
0589 stvx v2, FRAME_REGISTER, SCRATCH_REGISTER_0
0590 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(3)
0591 stvx v3, FRAME_REGISTER, SCRATCH_REGISTER_0
0592 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(4)
0593 stvx v4, FRAME_REGISTER, SCRATCH_REGISTER_0
0594 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(5)
0595 stvx v5, FRAME_REGISTER, SCRATCH_REGISTER_0
0596 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(6)
0597 stvx v6, FRAME_REGISTER, SCRATCH_REGISTER_0
0598 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(7)
0599 stvx v7, FRAME_REGISTER, SCRATCH_REGISTER_0
0600 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(8)
0601 stvx v8, FRAME_REGISTER, SCRATCH_REGISTER_0
0602 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(9)
0603 stvx v9, FRAME_REGISTER, SCRATCH_REGISTER_0
0604 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(0)
0605 stvx v10, FRAME_REGISTER, SCRATCH_REGISTER_0
0606 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(11)
0607 stvx v11, FRAME_REGISTER, SCRATCH_REGISTER_0
0608 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(12)
0609 stvx v12, FRAME_REGISTER, SCRATCH_REGISTER_0
0610 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(13)
0611 stvx v13, FRAME_REGISTER, SCRATCH_REGISTER_0
0612 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(14)
0613 stvx v14, FRAME_REGISTER, SCRATCH_REGISTER_0
0614 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(15)
0615 stvx v15, FRAME_REGISTER, SCRATCH_REGISTER_0
0616 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(16)
0617 stvx v16, FRAME_REGISTER, SCRATCH_REGISTER_0
0618 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(17)
0619 stvx v17, FRAME_REGISTER, SCRATCH_REGISTER_0
0620 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(18)
0621 stvx v18, FRAME_REGISTER, SCRATCH_REGISTER_0
0622 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(19)
0623 stvx v19, FRAME_REGISTER, SCRATCH_REGISTER_0
0624 li SCRATCH_REGISTER_0, PPC_EXC_VSCR_OFFSET
0625 stvewx v0, r1, SCRATCH_REGISTER_0
0626 #endif
0627
0628 #ifdef PPC_MULTILIB_FPU
0629 stfd f0, PPC_EXC_FR_OFFSET(0)(FRAME_REGISTER)
0630 mffs f0
0631 stfd f1, PPC_EXC_FR_OFFSET(1)(FRAME_REGISTER)
0632 stfd f2, PPC_EXC_FR_OFFSET(2)(FRAME_REGISTER)
0633 stfd f3, PPC_EXC_FR_OFFSET(3)(FRAME_REGISTER)
0634 stfd f4, PPC_EXC_FR_OFFSET(4)(FRAME_REGISTER)
0635 stfd f5, PPC_EXC_FR_OFFSET(5)(FRAME_REGISTER)
0636 stfd f6, PPC_EXC_FR_OFFSET(6)(FRAME_REGISTER)
0637 stfd f7, PPC_EXC_FR_OFFSET(7)(FRAME_REGISTER)
0638 stfd f8, PPC_EXC_FR_OFFSET(8)(FRAME_REGISTER)
0639 stfd f9, PPC_EXC_FR_OFFSET(9)(FRAME_REGISTER)
0640 stfd f10, PPC_EXC_FR_OFFSET(10)(FRAME_REGISTER)
0641 stfd f11, PPC_EXC_FR_OFFSET(11)(FRAME_REGISTER)
0642 stfd f12, PPC_EXC_FR_OFFSET(12)(FRAME_REGISTER)
0643 stfd f13, PPC_EXC_FR_OFFSET(13)(FRAME_REGISTER)
0644 stfd f0, PPC_EXC_FPSCR_OFFSET(FRAME_REGISTER)
0645 #endif
0646
0647
0648
0649
0650
0651
0652
0653
0654
0655
0656
0657 rlwinm SCRATCH_REGISTER_1, VECTOR_REGISTER, 2, 25, 29
0658
0659
0660 LA SCRATCH_REGISTER_0, ppc_exc_handler_table
0661
0662
0663 lwzx SCRATCH_REGISTER_0, SCRATCH_REGISTER_0, SCRATCH_REGISTER_1
0664
0665
0666
0667
0668
0669
0670
0671 addi r3, FRAME_REGISTER, FRAME_LINK_SPACE
0672
0673
0674
0675
0676
0677
0678
0679
0680 rlwinm VECTOR_REGISTER, VECTOR_REGISTER, 0, 27, 31
0681
0682
0683 mtctr SCRATCH_REGISTER_0
0684 bctrl
0685
0686
0687 cmpwi r3, 0
0688 bne wrap_call_global_handler_\_FLVR
0689
0690 wrap_handler_done_\_FLVR:
0691
0692
0693 RECOVER_CHECK_\_PRI _FLVR=\_FLVR
0694
0695
0696
0697
0698
0699
0700
0701
0702 bge CR_TYPE, wrap_restore_non_volatile_regs_\_FLVR
0703
0704
0705
0706
0707
0708 mr r1, FRAME_REGISTER
0709
0710
0711
0712
0713
0714
0715
0716
0717
0718 GET_SELF_CPU_CONTROL SCRATCH_REGISTER_2
0719 lwz SCRATCH_REGISTER_0, PER_CPU_ISR_NEST_LEVEL@l(SCRATCH_REGISTER_2)
0720 lwz SCRATCH_REGISTER_1, PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL(SCRATCH_REGISTER_2)
0721 subi SCRATCH_REGISTER_0, SCRATCH_REGISTER_0, 1
0722 subic. SCRATCH_REGISTER_1, SCRATCH_REGISTER_1, 1
0723 stw SCRATCH_REGISTER_0, PER_CPU_ISR_NEST_LEVEL@l(SCRATCH_REGISTER_2)
0724 stw SCRATCH_REGISTER_1, PER_CPU_THREAD_DISPATCH_DISABLE_LEVEL(SCRATCH_REGISTER_2)
0725
0726
0727 bne wrap_thread_dispatching_done_\_FLVR
0728
0729
0730 TEST_LOCK_\_PRI _FLVR=\_FLVR
0731
0732
0733 bne CR_LOCK, wrap_thread_dispatching_done_\_FLVR
0734
0735
0736 LA SCRATCH_REGISTER_0, ppc_exc_wrapup
0737
0738
0739 addi r3, FRAME_REGISTER, FRAME_LINK_SPACE
0740
0741
0742 mtctr SCRATCH_REGISTER_0
0743 bctrl
0744
0745 wrap_thread_dispatching_done_\_FLVR:
0746
0747 #if defined(__ALTIVEC__) && !defined(PPC_MULTILIB_ALTIVEC)
0748 LA SCRATCH_REGISTER_0, _CPU_load_altivec_volatile
0749 mtctr SCRATCH_REGISTER_0
0750 addi r3, FRAME_REGISTER, EXC_VEC_OFFSET
0751 bctrl
0752 #endif
0753
0754 #ifdef PPC_MULTILIB_ALTIVEC
0755 li SCRATCH_REGISTER_0, PPC_EXC_MIN_VSCR_OFFSET
0756 lvewx v0, r1, SCRATCH_REGISTER_0
0757 mtvscr v0
0758 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(0)
0759 lvx v0, FRAME_REGISTER, SCRATCH_REGISTER_0
0760 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(1)
0761 lvx v1, FRAME_REGISTER, SCRATCH_REGISTER_0
0762 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(2)
0763 lvx v2, FRAME_REGISTER, SCRATCH_REGISTER_0
0764 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(3)
0765 lvx v3, FRAME_REGISTER, SCRATCH_REGISTER_0
0766 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(4)
0767 lvx v4, FRAME_REGISTER, SCRATCH_REGISTER_0
0768 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(5)
0769 lvx v5, FRAME_REGISTER, SCRATCH_REGISTER_0
0770 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(6)
0771 lvx v6, FRAME_REGISTER, SCRATCH_REGISTER_0
0772 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(7)
0773 lvx v7, FRAME_REGISTER, SCRATCH_REGISTER_0
0774 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(8)
0775 lvx v8, FRAME_REGISTER, SCRATCH_REGISTER_0
0776 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(9)
0777 lvx v9, FRAME_REGISTER, SCRATCH_REGISTER_0
0778 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(0)
0779 lvx v10, FRAME_REGISTER, SCRATCH_REGISTER_0
0780 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(11)
0781 lvx v11, FRAME_REGISTER, SCRATCH_REGISTER_0
0782 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(12)
0783 lvx v12, FRAME_REGISTER, SCRATCH_REGISTER_0
0784 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(13)
0785 lvx v13, FRAME_REGISTER, SCRATCH_REGISTER_0
0786 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(14)
0787 lvx v14, FRAME_REGISTER, SCRATCH_REGISTER_0
0788 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(15)
0789 lvx v15, FRAME_REGISTER, SCRATCH_REGISTER_0
0790 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(16)
0791 lvx v16, FRAME_REGISTER, SCRATCH_REGISTER_0
0792 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(17)
0793 lvx v17, FRAME_REGISTER, SCRATCH_REGISTER_0
0794 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(18)
0795 lvx v18, FRAME_REGISTER, SCRATCH_REGISTER_0
0796 li SCRATCH_REGISTER_0, PPC_EXC_VR_OFFSET(19)
0797 lvx v19, FRAME_REGISTER, SCRATCH_REGISTER_0
0798 #endif
0799
0800 #ifdef PPC_MULTILIB_FPU
0801 lfd f0, PPC_EXC_FPSCR_OFFSET(FRAME_REGISTER)
0802 mtfsf 0xff, f0
0803 lfd f0, PPC_EXC_FR_OFFSET(0)(FRAME_REGISTER)
0804 lfd f1, PPC_EXC_FR_OFFSET(1)(FRAME_REGISTER)
0805 lfd f2, PPC_EXC_FR_OFFSET(2)(FRAME_REGISTER)
0806 lfd f3, PPC_EXC_FR_OFFSET(3)(FRAME_REGISTER)
0807 lfd f4, PPC_EXC_FR_OFFSET(4)(FRAME_REGISTER)
0808 lfd f5, PPC_EXC_FR_OFFSET(5)(FRAME_REGISTER)
0809 lfd f6, PPC_EXC_FR_OFFSET(6)(FRAME_REGISTER)
0810 lfd f7, PPC_EXC_FR_OFFSET(7)(FRAME_REGISTER)
0811 lfd f8, PPC_EXC_FR_OFFSET(8)(FRAME_REGISTER)
0812 lfd f9, PPC_EXC_FR_OFFSET(9)(FRAME_REGISTER)
0813 lfd f10, PPC_EXC_FR_OFFSET(10)(FRAME_REGISTER)
0814 lfd f11, PPC_EXC_FR_OFFSET(11)(FRAME_REGISTER)
0815 lfd f12, PPC_EXC_FR_OFFSET(12)(FRAME_REGISTER)
0816 lfd f13, PPC_EXC_FR_OFFSET(13)(FRAME_REGISTER)
0817 #endif
0818
0819 #ifndef PPC_EXC_CONFIG_BOOKE_ONLY
0820
0821
0822 bne CR_MSR, wrap_restore_msr_\_FLVR
0823
0824 wrap_restore_msr_done_\_FLVR:
0825
0826 #endif
0827
0828
0829
0830
0831
0832
0833
0834 lwz FRAME_REGISTER, FRAME_OFFSET(r1)
0835
0836
0837 lwz SCRATCH_REGISTER_0, EXC_XER_OFFSET(r1)
0838 lwz SCRATCH_REGISTER_1, EXC_CTR_OFFSET(r1)
0839 mtxer SCRATCH_REGISTER_0
0840 mtctr SCRATCH_REGISTER_1
0841
0842
0843 lwz SCRATCH_REGISTER_0, EXC_CR_OFFSET(r1)
0844 lwz SCRATCH_REGISTER_1, EXC_LR_OFFSET(r1)
0845 mtcr SCRATCH_REGISTER_0
0846 mtlr SCRATCH_REGISTER_1
0847
0848
0849 lwz r0, GPR0_OFFSET(r1)
0850 lwz r3, GPR3_OFFSET(r1)
0851 lwz r8, GPR8_OFFSET(r1)
0852 lwz r9, GPR9_OFFSET(r1)
0853 lwz r10, GPR10_OFFSET(r1)
0854 lwz r11, GPR11_OFFSET(r1)
0855 lwz r12, GPR12_OFFSET(r1)
0856
0857
0858 lwz r2, GPR2_OFFSET(r1)
0859
0860
0861 lwz VECTOR_REGISTER, VECTOR_OFFSET(r1)
0862
0863
0864
0865
0866
0867 INTERRUPT_DISABLE SCRATCH_REGISTER_1, SCRATCH_REGISTER_0
0868
0869
0870 lwz SCRATCH_REGISTER_0, SRR0_FRAME_OFFSET(r1)
0871 lwz SCRATCH_REGISTER_1, SRR1_FRAME_OFFSET(r1)
0872 lwz SCRATCH_REGISTER_2, SCRATCH_REGISTER_2_OFFSET(r1)
0873 mtspr \_SRR0, SCRATCH_REGISTER_0
0874 lwz SCRATCH_REGISTER_0, SCRATCH_REGISTER_0_OFFSET(r1)
0875 mtspr \_SRR1, SCRATCH_REGISTER_1
0876 lwz SCRATCH_REGISTER_1, SCRATCH_REGISTER_1_OFFSET(r1)
0877
0878
0879
0880
0881
0882
0883 lwz r1, 0(r1)
0884
0885
0886 \_RFI
0887
0888 #ifndef PPC_EXC_CONFIG_BOOKE_ONLY
0889
0890 wrap_change_msr_\_FLVR:
0891
0892 mfmsr SCRATCH_REGISTER_1
0893 or SCRATCH_REGISTER_1, SCRATCH_REGISTER_1, SCRATCH_REGISTER_0
0894 mtmsr SCRATCH_REGISTER_1
0895 msync
0896 isync
0897 b wrap_change_msr_done_\_FLVR
0898
0899 wrap_restore_msr_\_FLVR:
0900
0901 lwz SCRATCH_REGISTER_0, ppc_exc_msr_bits@sdarel(r13)
0902 mfmsr SCRATCH_REGISTER_1
0903 andc SCRATCH_REGISTER_1, SCRATCH_REGISTER_1, SCRATCH_REGISTER_0
0904 mtmsr SCRATCH_REGISTER_1
0905 msync
0906 isync
0907 b wrap_restore_msr_done_\_FLVR
0908
0909 #endif
0910
0911 wrap_save_non_volatile_regs_\_FLVR:
0912
0913
0914 lwz SCRATCH_REGISTER_1, 0(FRAME_REGISTER)
0915
0916
0917 stw r13, GPR13_OFFSET(FRAME_REGISTER)
0918
0919
0920 stw SCRATCH_REGISTER_1, GPR1_OFFSET(FRAME_REGISTER)
0921
0922
0923
0924
0925 #ifndef __SPE__
0926 stmw r15, GPR15_OFFSET(FRAME_REGISTER)
0927 #else
0928 stw r15, GPR15_OFFSET(FRAME_REGISTER)
0929 stw r16, GPR16_OFFSET(FRAME_REGISTER)
0930 stw r17, GPR17_OFFSET(FRAME_REGISTER)
0931 stw r18, GPR18_OFFSET(FRAME_REGISTER)
0932 stw r19, GPR19_OFFSET(FRAME_REGISTER)
0933 stw r20, GPR20_OFFSET(FRAME_REGISTER)
0934 stw r21, GPR21_OFFSET(FRAME_REGISTER)
0935 stw r22, GPR22_OFFSET(FRAME_REGISTER)
0936 stw r23, GPR23_OFFSET(FRAME_REGISTER)
0937 stw r24, GPR24_OFFSET(FRAME_REGISTER)
0938 stw r25, GPR25_OFFSET(FRAME_REGISTER)
0939 stw r26, GPR26_OFFSET(FRAME_REGISTER)
0940 stw r27, GPR27_OFFSET(FRAME_REGISTER)
0941 stw r28, GPR28_OFFSET(FRAME_REGISTER)
0942 stw r29, GPR29_OFFSET(FRAME_REGISTER)
0943 stw r30, GPR30_OFFSET(FRAME_REGISTER)
0944 stw r31, GPR31_OFFSET(FRAME_REGISTER)
0945 #endif
0946
0947 #ifdef PPC_MULTILIB_ALTIVEC
0948 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(20)
0949 stvx v20, FRAME_REGISTER, SCRATCH_REGISTER_1
0950 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(21)
0951 stvx v21, FRAME_REGISTER, SCRATCH_REGISTER_1
0952 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(22)
0953 stvx v22, FRAME_REGISTER, SCRATCH_REGISTER_1
0954 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(23)
0955 stvx v23, FRAME_REGISTER, SCRATCH_REGISTER_1
0956 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(24)
0957 stvx v24, FRAME_REGISTER, SCRATCH_REGISTER_1
0958 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(25)
0959 stvx v25, FRAME_REGISTER, SCRATCH_REGISTER_1
0960 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(26)
0961 stvx v26, FRAME_REGISTER, SCRATCH_REGISTER_1
0962 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(27)
0963 stvx v27, FRAME_REGISTER, SCRATCH_REGISTER_1
0964 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(28)
0965 stvx v28, FRAME_REGISTER, SCRATCH_REGISTER_1
0966 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(29)
0967 stvx v29, FRAME_REGISTER, SCRATCH_REGISTER_1
0968 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(30)
0969 stvx v30, FRAME_REGISTER, SCRATCH_REGISTER_1
0970 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(31)
0971 stvx v31, FRAME_REGISTER, SCRATCH_REGISTER_1
0972 mfvrsave SCRATCH_REGISTER_1
0973 stw SCRATCH_REGISTER_1, PPC_EXC_VRSAVE_OFFSET(FRAME_REGISTER)
0974 #endif
0975
0976 #ifdef PPC_MULTILIB_FPU
0977 stfd f14, PPC_EXC_FR_OFFSET(14)(FRAME_REGISTER)
0978 stfd f15, PPC_EXC_FR_OFFSET(15)(FRAME_REGISTER)
0979 stfd f16, PPC_EXC_FR_OFFSET(16)(FRAME_REGISTER)
0980 stfd f17, PPC_EXC_FR_OFFSET(17)(FRAME_REGISTER)
0981 stfd f18, PPC_EXC_FR_OFFSET(18)(FRAME_REGISTER)
0982 stfd f19, PPC_EXC_FR_OFFSET(19)(FRAME_REGISTER)
0983 stfd f20, PPC_EXC_FR_OFFSET(20)(FRAME_REGISTER)
0984 stfd f21, PPC_EXC_FR_OFFSET(21)(FRAME_REGISTER)
0985 stfd f22, PPC_EXC_FR_OFFSET(22)(FRAME_REGISTER)
0986 stfd f23, PPC_EXC_FR_OFFSET(23)(FRAME_REGISTER)
0987 stfd f24, PPC_EXC_FR_OFFSET(24)(FRAME_REGISTER)
0988 stfd f25, PPC_EXC_FR_OFFSET(25)(FRAME_REGISTER)
0989 stfd f26, PPC_EXC_FR_OFFSET(26)(FRAME_REGISTER)
0990 stfd f27, PPC_EXC_FR_OFFSET(27)(FRAME_REGISTER)
0991 stfd f28, PPC_EXC_FR_OFFSET(28)(FRAME_REGISTER)
0992 stfd f29, PPC_EXC_FR_OFFSET(29)(FRAME_REGISTER)
0993 stfd f30, PPC_EXC_FR_OFFSET(30)(FRAME_REGISTER)
0994 stfd f31, PPC_EXC_FR_OFFSET(31)(FRAME_REGISTER)
0995 #endif
0996
0997 b wrap_disable_thread_dispatching_done_\_FLVR
0998
0999 wrap_restore_non_volatile_regs_\_FLVR:
1000
1001
1002 lwz SCRATCH_REGISTER_0, GPR1_OFFSET(r1)
1003
1004
1005 lwz r13, GPR13_OFFSET(r1)
1006
1007
1008
1009
1010 #ifndef __SPE__
1011 lmw r15, GPR15_OFFSET(r1)
1012 #else
1013 lwz r15, GPR15_OFFSET(FRAME_REGISTER)
1014 lwz r16, GPR16_OFFSET(FRAME_REGISTER)
1015 lwz r17, GPR17_OFFSET(FRAME_REGISTER)
1016 lwz r18, GPR18_OFFSET(FRAME_REGISTER)
1017 lwz r19, GPR19_OFFSET(FRAME_REGISTER)
1018 lwz r20, GPR20_OFFSET(FRAME_REGISTER)
1019 lwz r21, GPR21_OFFSET(FRAME_REGISTER)
1020 lwz r22, GPR22_OFFSET(FRAME_REGISTER)
1021 lwz r23, GPR23_OFFSET(FRAME_REGISTER)
1022 lwz r24, GPR24_OFFSET(FRAME_REGISTER)
1023 lwz r25, GPR25_OFFSET(FRAME_REGISTER)
1024 lwz r26, GPR26_OFFSET(FRAME_REGISTER)
1025 lwz r27, GPR27_OFFSET(FRAME_REGISTER)
1026 lwz r28, GPR28_OFFSET(FRAME_REGISTER)
1027 lwz r29, GPR29_OFFSET(FRAME_REGISTER)
1028 lwz r30, GPR30_OFFSET(FRAME_REGISTER)
1029 lwz r31, GPR31_OFFSET(FRAME_REGISTER)
1030 #endif
1031
1032
1033 stw SCRATCH_REGISTER_0, 0(r1)
1034
1035 #ifdef PPC_MULTILIB_ALTIVEC
1036 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(20)
1037 lvx v20, FRAME_REGISTER, SCRATCH_REGISTER_1
1038 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(21)
1039 lvx v21, FRAME_REGISTER, SCRATCH_REGISTER_1
1040 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(22)
1041 lvx v22, FRAME_REGISTER, SCRATCH_REGISTER_1
1042 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(23)
1043 lvx v23, FRAME_REGISTER, SCRATCH_REGISTER_1
1044 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(24)
1045 lvx v24, FRAME_REGISTER, SCRATCH_REGISTER_1
1046 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(25)
1047 lvx v25, FRAME_REGISTER, SCRATCH_REGISTER_1
1048 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(26)
1049 lvx v26, FRAME_REGISTER, SCRATCH_REGISTER_1
1050 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(27)
1051 lvx v27, FRAME_REGISTER, SCRATCH_REGISTER_1
1052 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(28)
1053 lvx v28, FRAME_REGISTER, SCRATCH_REGISTER_1
1054 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(29)
1055 lvx v29, FRAME_REGISTER, SCRATCH_REGISTER_1
1056 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(30)
1057 lvx v30, FRAME_REGISTER, SCRATCH_REGISTER_1
1058 li SCRATCH_REGISTER_1, PPC_EXC_VR_OFFSET(31)
1059 lvx v31, FRAME_REGISTER, SCRATCH_REGISTER_1
1060 lwz SCRATCH_REGISTER_1, PPC_EXC_VRSAVE_OFFSET(FRAME_REGISTER)
1061 mtvrsave SCRATCH_REGISTER_1
1062 #endif
1063
1064 #ifdef PPC_MULTILIB_FPU
1065 lfd f14, PPC_EXC_FR_OFFSET(14)(FRAME_REGISTER)
1066 lfd f15, PPC_EXC_FR_OFFSET(15)(FRAME_REGISTER)
1067 lfd f16, PPC_EXC_FR_OFFSET(16)(FRAME_REGISTER)
1068 lfd f17, PPC_EXC_FR_OFFSET(17)(FRAME_REGISTER)
1069 lfd f18, PPC_EXC_FR_OFFSET(18)(FRAME_REGISTER)
1070 lfd f19, PPC_EXC_FR_OFFSET(19)(FRAME_REGISTER)
1071 lfd f20, PPC_EXC_FR_OFFSET(20)(FRAME_REGISTER)
1072 lfd f21, PPC_EXC_FR_OFFSET(21)(FRAME_REGISTER)
1073 lfd f22, PPC_EXC_FR_OFFSET(22)(FRAME_REGISTER)
1074 lfd f23, PPC_EXC_FR_OFFSET(23)(FRAME_REGISTER)
1075 lfd f24, PPC_EXC_FR_OFFSET(24)(FRAME_REGISTER)
1076 lfd f25, PPC_EXC_FR_OFFSET(25)(FRAME_REGISTER)
1077 lfd f26, PPC_EXC_FR_OFFSET(26)(FRAME_REGISTER)
1078 lfd f27, PPC_EXC_FR_OFFSET(27)(FRAME_REGISTER)
1079 lfd f28, PPC_EXC_FR_OFFSET(28)(FRAME_REGISTER)
1080 lfd f29, PPC_EXC_FR_OFFSET(29)(FRAME_REGISTER)
1081 lfd f30, PPC_EXC_FR_OFFSET(30)(FRAME_REGISTER)
1082 lfd f31, PPC_EXC_FR_OFFSET(31)(FRAME_REGISTER)
1083 #endif
1084
1085 b wrap_thread_dispatching_done_\_FLVR
1086
1087 wrap_call_global_handler_\_FLVR:
1088
1089
1090 addi r3, FRAME_REGISTER, FRAME_LINK_SPACE
1091
1092 #ifndef PPC_EXC_CONFIG_USE_FIXED_HANDLER
1093
1094
1095 LW SCRATCH_REGISTER_0, globalExceptHdl
1096
1097
1098 cmpwi SCRATCH_REGISTER_0, 0
1099 beq wrap_handler_done_\_FLVR
1100
1101
1102 mtctr SCRATCH_REGISTER_0
1103 bctrl
1104
1105 #else
1106
1107
1108 bl C_exception_handler
1109
1110 #endif
1111
1112 b wrap_handler_done_\_FLVR
1113
1114 .endm