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 ---