exceptions-64e.S (0c2472de23aea5ce9139a3e887191925759d1259) | exceptions-64e.S (3db8aa10de9a478b3086db7894e0266def3d77af) |
---|---|
1/* SPDX-License-Identifier: GPL-2.0-or-later */ 2/* 3 * Boot code and exception vectors for Book3E processors 4 * 5 * Copyright (C) 2007 Ben. Herrenschmidt (benh@kernel.crashing.org), IBM Corp. 6 */ 7 8#include <linux/threads.h> --- 49 unchanged lines hidden (view full) --- 58 59#define SPECIAL_EXC_STORE(reg, name) \ 60 std reg, (SPECIAL_EXC_##name * 8 + SPECIAL_EXC_FRAME_OFFS)(r1) 61 62#define SPECIAL_EXC_LOAD(reg, name) \ 63 ld reg, (SPECIAL_EXC_##name * 8 + SPECIAL_EXC_FRAME_OFFS)(r1) 64 65special_reg_save: | 1/* SPDX-License-Identifier: GPL-2.0-or-later */ 2/* 3 * Boot code and exception vectors for Book3E processors 4 * 5 * Copyright (C) 2007 Ben. Herrenschmidt (benh@kernel.crashing.org), IBM Corp. 6 */ 7 8#include <linux/threads.h> --- 49 unchanged lines hidden (view full) --- 58 59#define SPECIAL_EXC_STORE(reg, name) \ 60 std reg, (SPECIAL_EXC_##name * 8 + SPECIAL_EXC_FRAME_OFFS)(r1) 61 62#define SPECIAL_EXC_LOAD(reg, name) \ 63 ld reg, (SPECIAL_EXC_##name * 8 + SPECIAL_EXC_FRAME_OFFS)(r1) 64 65special_reg_save: |
66 lbz r9,PACAIRQHAPPENED(r13) 67 RECONCILE_IRQ_STATE(r3,r4) 68 | |
69 /* 70 * We only need (or have stack space) to save this stuff if 71 * we interrupted the kernel. 72 */ 73 ld r3,_MSR(r1) 74 andi. r3,r3,MSR_PR 75 bnelr 76 --- 37 unchanged lines hidden (view full) --- 114 mfspr r10,SPRN_MAS8 115 SPECIAL_EXC_STORE(r10,MAS8) 116 117 /* MAS5/8 could have inappropriate values if we interrupted KVM code */ 118 li r10,0 119 mtspr SPRN_MAS5,r10 120 mtspr SPRN_MAS8,r10 121END_FTR_SECTION_IFSET(CPU_FTR_EMB_HV) | 66 /* 67 * We only need (or have stack space) to save this stuff if 68 * we interrupted the kernel. 69 */ 70 ld r3,_MSR(r1) 71 andi. r3,r3,MSR_PR 72 bnelr 73 --- 37 unchanged lines hidden (view full) --- 111 mfspr r10,SPRN_MAS8 112 SPECIAL_EXC_STORE(r10,MAS8) 113 114 /* MAS5/8 could have inappropriate values if we interrupted KVM code */ 115 li r10,0 116 mtspr SPRN_MAS5,r10 117 mtspr SPRN_MAS8,r10 118END_FTR_SECTION_IFSET(CPU_FTR_EMB_HV) |
122 SPECIAL_EXC_STORE(r9,IRQHAPPENED) 123 | |
124 mfspr r10,SPRN_DEAR 125 SPECIAL_EXC_STORE(r10,DEAR) 126 mfspr r10,SPRN_ESR 127 SPECIAL_EXC_STORE(r10,ESR) 128 | 119 mfspr r10,SPRN_DEAR 120 SPECIAL_EXC_STORE(r10,DEAR) 121 mfspr r10,SPRN_ESR 122 SPECIAL_EXC_STORE(r10,ESR) 123 |
129 lbz r10,PACAIRQSOFTMASK(r13) 130 SPECIAL_EXC_STORE(r10,SOFTE) | |
131 ld r10,_NIP(r1) 132 SPECIAL_EXC_STORE(r10,CSRR0) 133 ld r10,_MSR(r1) 134 SPECIAL_EXC_STORE(r10,CSRR1) 135 136 blr 137 138ret_from_level_except: --- 50 unchanged lines hidden (view full) --- 189 mtspr SPRN_MAS7,r10 190BEGIN_FTR_SECTION 191 SPECIAL_EXC_LOAD(r10,MAS5) 192 mtspr SPRN_MAS5,r10 193 SPECIAL_EXC_LOAD(r10,MAS8) 194 mtspr SPRN_MAS8,r10 195END_FTR_SECTION_IFSET(CPU_FTR_EMB_HV) 196 | 124 ld r10,_NIP(r1) 125 SPECIAL_EXC_STORE(r10,CSRR0) 126 ld r10,_MSR(r1) 127 SPECIAL_EXC_STORE(r10,CSRR1) 128 129 blr 130 131ret_from_level_except: --- 50 unchanged lines hidden (view full) --- 182 mtspr SPRN_MAS7,r10 183BEGIN_FTR_SECTION 184 SPECIAL_EXC_LOAD(r10,MAS5) 185 mtspr SPRN_MAS5,r10 186 SPECIAL_EXC_LOAD(r10,MAS8) 187 mtspr SPRN_MAS8,r10 188END_FTR_SECTION_IFSET(CPU_FTR_EMB_HV) 189 |
197 lbz r6,PACAIRQSOFTMASK(r13) 198 ld r5,SOFTE(r1) 199 200 /* Interrupts had better not already be enabled... */ 201 tweqi r6,IRQS_ENABLED 202 203 andi. r6,r5,IRQS_DISABLED 204 bne 1f 205 206 TRACE_ENABLE_INTS 207 stb r5,PACAIRQSOFTMASK(r13) 2081: 209 /* 210 * Restore PACAIRQHAPPENED rather than setting it based on 211 * the return MSR[EE], since we could have interrupted 212 * interrupt replay or other inconsistent transitory 213 * states that must remain that way. 214 */ 215 SPECIAL_EXC_LOAD(r10,IRQHAPPENED) 216 stb r10,PACAIRQHAPPENED(r13) 217 | |
218 SPECIAL_EXC_LOAD(r10,DEAR) 219 mtspr SPRN_DEAR,r10 220 SPECIAL_EXC_LOAD(r10,ESR) 221 mtspr SPRN_ESR,r10 222 223 stdcx. r0,0,r1 /* to clear the reservation */ 224 225 REST_4GPRS(2, r1) --- 335 unchanged lines hidden (view full) --- 561/* Critical Input Interrupt */ 562 START_EXCEPTION(critical_input); 563 CRIT_EXCEPTION_PROLOG(0x100, BOOKE_INTERRUPT_CRITICAL, 564 PROLOG_ADDITION_NONE) 565 EXCEPTION_COMMON_CRIT(0x100) 566 bl special_reg_save 567 CHECK_NAPPING(); 568 addi r3,r1,STACK_FRAME_OVERHEAD | 190 SPECIAL_EXC_LOAD(r10,DEAR) 191 mtspr SPRN_DEAR,r10 192 SPECIAL_EXC_LOAD(r10,ESR) 193 mtspr SPRN_ESR,r10 194 195 stdcx. r0,0,r1 /* to clear the reservation */ 196 197 REST_4GPRS(2, r1) --- 335 unchanged lines hidden (view full) --- 533/* Critical Input Interrupt */ 534 START_EXCEPTION(critical_input); 535 CRIT_EXCEPTION_PROLOG(0x100, BOOKE_INTERRUPT_CRITICAL, 536 PROLOG_ADDITION_NONE) 537 EXCEPTION_COMMON_CRIT(0x100) 538 bl special_reg_save 539 CHECK_NAPPING(); 540 addi r3,r1,STACK_FRAME_OVERHEAD |
569 bl unknown_exception | 541 bl unknown_nmi_exception |
570 b ret_from_crit_except 571 572/* Machine Check Interrupt */ 573 START_EXCEPTION(machine_check); 574 MC_EXCEPTION_PROLOG(0x000, BOOKE_INTERRUPT_MACHINE_CHECK, 575 PROLOG_ADDITION_NONE) 576 EXCEPTION_COMMON_MC(0x000) 577 bl special_reg_save --- 119 unchanged lines hidden (view full) --- 697 PROLOG_ADDITION_NONE) 698 EXCEPTION_COMMON_CRIT(0x9f0) 699 bl special_reg_save 700 CHECK_NAPPING(); 701 addi r3,r1,STACK_FRAME_OVERHEAD 702#ifdef CONFIG_BOOKE_WDT 703 bl WatchdogException 704#else | 542 b ret_from_crit_except 543 544/* Machine Check Interrupt */ 545 START_EXCEPTION(machine_check); 546 MC_EXCEPTION_PROLOG(0x000, BOOKE_INTERRUPT_MACHINE_CHECK, 547 PROLOG_ADDITION_NONE) 548 EXCEPTION_COMMON_MC(0x000) 549 bl special_reg_save --- 119 unchanged lines hidden (view full) --- 669 PROLOG_ADDITION_NONE) 670 EXCEPTION_COMMON_CRIT(0x9f0) 671 bl special_reg_save 672 CHECK_NAPPING(); 673 addi r3,r1,STACK_FRAME_OVERHEAD 674#ifdef CONFIG_BOOKE_WDT 675 bl WatchdogException 676#else |
705 bl unknown_exception | 677 bl unknown_nmi_exception |
706#endif 707 b ret_from_crit_except 708 709/* System Call Interrupt */ 710 START_EXCEPTION(system_call) 711 mr r9,r13 /* keep a copy of userland r13 */ 712 mfspr r11,SPRN_SRR0 /* get return address */ 713 mfspr r12,SPRN_SRR1 /* get previous MSR */ --- 167 unchanged lines hidden (view full) --- 881/* Doorbell critical Interrupt */ 882 START_EXCEPTION(doorbell_crit); 883 CRIT_EXCEPTION_PROLOG(0x2a0, BOOKE_INTERRUPT_DOORBELL_CRITICAL, 884 PROLOG_ADDITION_NONE) 885 EXCEPTION_COMMON_CRIT(0x2a0) 886 bl special_reg_save 887 CHECK_NAPPING(); 888 addi r3,r1,STACK_FRAME_OVERHEAD | 678#endif 679 b ret_from_crit_except 680 681/* System Call Interrupt */ 682 START_EXCEPTION(system_call) 683 mr r9,r13 /* keep a copy of userland r13 */ 684 mfspr r11,SPRN_SRR0 /* get return address */ 685 mfspr r12,SPRN_SRR1 /* get previous MSR */ --- 167 unchanged lines hidden (view full) --- 853/* Doorbell critical Interrupt */ 854 START_EXCEPTION(doorbell_crit); 855 CRIT_EXCEPTION_PROLOG(0x2a0, BOOKE_INTERRUPT_DOORBELL_CRITICAL, 856 PROLOG_ADDITION_NONE) 857 EXCEPTION_COMMON_CRIT(0x2a0) 858 bl special_reg_save 859 CHECK_NAPPING(); 860 addi r3,r1,STACK_FRAME_OVERHEAD |
889 bl unknown_exception | 861 bl unknown_nmi_exception |
890 b ret_from_crit_except 891 892/* 893 * Guest doorbell interrupt 894 * This general exception use GSRRx save/restore registers 895 */ 896 START_EXCEPTION(guest_doorbell); 897 GDBELL_EXCEPTION_PROLOG(0x2c0, BOOKE_INTERRUPT_GUEST_DBELL, --- 7 unchanged lines hidden (view full) --- 905/* Guest Doorbell critical Interrupt */ 906 START_EXCEPTION(guest_doorbell_crit); 907 CRIT_EXCEPTION_PROLOG(0x2e0, BOOKE_INTERRUPT_GUEST_DBELL_CRIT, 908 PROLOG_ADDITION_NONE) 909 EXCEPTION_COMMON_CRIT(0x2e0) 910 bl special_reg_save 911 CHECK_NAPPING(); 912 addi r3,r1,STACK_FRAME_OVERHEAD | 862 b ret_from_crit_except 863 864/* 865 * Guest doorbell interrupt 866 * This general exception use GSRRx save/restore registers 867 */ 868 START_EXCEPTION(guest_doorbell); 869 GDBELL_EXCEPTION_PROLOG(0x2c0, BOOKE_INTERRUPT_GUEST_DBELL, --- 7 unchanged lines hidden (view full) --- 877/* Guest Doorbell critical Interrupt */ 878 START_EXCEPTION(guest_doorbell_crit); 879 CRIT_EXCEPTION_PROLOG(0x2e0, BOOKE_INTERRUPT_GUEST_DBELL_CRIT, 880 PROLOG_ADDITION_NONE) 881 EXCEPTION_COMMON_CRIT(0x2e0) 882 bl special_reg_save 883 CHECK_NAPPING(); 884 addi r3,r1,STACK_FRAME_OVERHEAD |
913 bl unknown_exception | 885 bl unknown_nmi_exception |
914 b ret_from_crit_except 915 916/* Hypervisor call */ 917 START_EXCEPTION(hypercall); 918 NORMAL_EXCEPTION_PROLOG(0x310, BOOKE_INTERRUPT_HV_SYSCALL, 919 PROLOG_ADDITION_NONE) 920 EXCEPTION_COMMON(0x310) 921 addi r3,r1,STACK_FRAME_OVERHEAD --- 660 unchanged lines hidden --- | 886 b ret_from_crit_except 887 888/* Hypervisor call */ 889 START_EXCEPTION(hypercall); 890 NORMAL_EXCEPTION_PROLOG(0x310, BOOKE_INTERRUPT_HV_SYSCALL, 891 PROLOG_ADDITION_NONE) 892 EXCEPTION_COMMON(0x310) 893 addi r3,r1,STACK_FRAME_OVERHEAD --- 660 unchanged lines hidden --- |