Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  * This file contains the 64-bit "server" PowerPC variant
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  * of the low level exception handling including exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5)  * vectors, exception return, part of the slb and stab
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)  * handling and other fixed offset specific things.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8)  * This file is meant to be #included from head_64.S due to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9)  * position dependent assembly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11)  * Most of this originates from head_64.S and thus has the same
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12)  * copyright history.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) #include <asm/hw_irq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) #include <asm/exception-64s.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) #include <asm/ptrace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) #include <asm/cpuidle.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) #include <asm/head-64.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) #include <asm/feature-fixups.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) #include <asm/kup.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) /* PACA save area offsets (exgen, exmc, etc) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) #define EX_R9		0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) #define EX_R10		8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) #define EX_R11		16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) #define EX_R12		24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29) #define EX_R13		32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) #define EX_DAR		40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) #define EX_DSISR	48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) #define EX_CCR		52
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) #define EX_CFAR		56
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) #define EX_PPR		64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) #define EX_CTR		72
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) .if EX_SIZE != 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) 	.error "EX_SIZE is wrong"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) .endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41)  * Following are fixed section helper macros.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43)  * EXC_REAL_BEGIN/END  - real, unrelocated exception vectors
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44)  * EXC_VIRT_BEGIN/END  - virt (AIL), unrelocated exception vectors
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45)  * TRAMP_REAL_BEGIN    - real, unrelocated helpers (virt may call these)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46)  * TRAMP_VIRT_BEGIN    - virt, unreloc helpers (in practice, real can use)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47)  * EXC_COMMON          - After switching to virtual, relocated mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) #define EXC_REAL_BEGIN(name, start, size)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) 	FIXED_SECTION_ENTRY_BEGIN_LOCATION(real_vectors, exc_real_##start##_##name, start, size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) #define EXC_REAL_END(name, start, size)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) 	FIXED_SECTION_ENTRY_END_LOCATION(real_vectors, exc_real_##start##_##name, start, size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) #define EXC_VIRT_BEGIN(name, start, size)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) 	FIXED_SECTION_ENTRY_BEGIN_LOCATION(virt_vectors, exc_virt_##start##_##name, start, size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) #define EXC_VIRT_END(name, start, size)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) 	FIXED_SECTION_ENTRY_END_LOCATION(virt_vectors, exc_virt_##start##_##name, start, size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) #define EXC_COMMON_BEGIN(name)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) 	USE_TEXT_SECTION();					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) 	.balign IFETCH_ALIGN_BYTES;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) 	.global name;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) 	_ASM_NOKPROBE_SYMBOL(name);				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) 	DEFINE_FIXED_SYMBOL(name);				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) name:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) #define TRAMP_REAL_BEGIN(name)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) 	FIXED_SECTION_ENTRY_BEGIN(real_trampolines, name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) #define TRAMP_VIRT_BEGIN(name)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) 	FIXED_SECTION_ENTRY_BEGIN(virt_trampolines, name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) #define EXC_REAL_NONE(start, size)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) 	FIXED_SECTION_ENTRY_BEGIN_LOCATION(real_vectors, exc_real_##start##_##unused, start, size); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) 	FIXED_SECTION_ENTRY_END_LOCATION(real_vectors, exc_real_##start##_##unused, start, size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) #define EXC_VIRT_NONE(start, size)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) 	FIXED_SECTION_ENTRY_BEGIN_LOCATION(virt_vectors, exc_virt_##start##_##unused, start, size); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) 	FIXED_SECTION_ENTRY_END_LOCATION(virt_vectors, exc_virt_##start##_##unused, start, size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85)  * We're short on space and time in the exception prolog, so we can't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86)  * use the normal LOAD_REG_IMMEDIATE macro to load the address of label.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87)  * Instead we get the base of the kernel from paca->kernelbase and or in the low
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88)  * part of label. This requires that the label be within 64KB of kernelbase, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89)  * that kernelbase be 64K aligned.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) #define LOAD_HANDLER(reg, label)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) 	ld	reg,PACAKBASE(r13);	/* get high part of &label */	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) 	ori	reg,reg,FIXED_SYMBOL_ABS_ADDR(label)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) #define __LOAD_HANDLER(reg, label)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) 	ld	reg,PACAKBASE(r13);					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) 	ori	reg,reg,(ABS_ADDR(label))@l
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100)  * Branches from unrelocated code (e.g., interrupts) to labels outside
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101)  * head-y require >64K offsets.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) #define __LOAD_FAR_HANDLER(reg, label)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) 	ld	reg,PACAKBASE(r13);					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) 	ori	reg,reg,(ABS_ADDR(label))@l;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) 	addis	reg,reg,(ABS_ADDR(label))@h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109)  * Branch to label using its 0xC000 address. This results in instruction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110)  * address suitable for MSR[IR]=0 or 1, which allows relocation to be turned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111)  * on using mtmsr rather than rfid.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113)  * This could set the 0xc bits for !RELOCATABLE as an immediate, rather than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114)  * load KBASE for a slight optimisation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) #define BRANCH_TO_C000(reg, label)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) 	__LOAD_FAR_HANDLER(reg, label);					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) 	mtctr	reg;							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) 	bctr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122)  * Interrupt code generation macros
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) #define IVEC		.L_IVEC_\name\()	/* Interrupt vector address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) #define IHSRR		.L_IHSRR_\name\()	/* Sets SRR or HSRR registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) #define IHSRR_IF_HVMODE	.L_IHSRR_IF_HVMODE_\name\() /* HSRR if HV else SRR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) #define IAREA		.L_IAREA_\name\()	/* PACA save area */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) #define IVIRT		.L_IVIRT_\name\()	/* Has virt mode entry point */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) #define IISIDE		.L_IISIDE_\name\()	/* Uses SRR0/1 not DAR/DSISR */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) #define IDAR		.L_IDAR_\name\()	/* Uses DAR (or SRR0) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) #define IDSISR		.L_IDSISR_\name\()	/* Uses DSISR (or SRR1) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) #define ISET_RI		.L_ISET_RI_\name\()	/* Run common code w/ MSR[RI]=1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) #define IBRANCH_TO_COMMON	.L_IBRANCH_TO_COMMON_\name\() /* ENTRY branch to common */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) #define IREALMODE_COMMON	.L_IREALMODE_COMMON_\name\() /* Common runs in realmode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) #define IMASK		.L_IMASK_\name\()	/* IRQ soft-mask bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) #define IKVM_SKIP	.L_IKVM_SKIP_\name\()	/* Generate KVM skip handler */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) #define IKVM_REAL	.L_IKVM_REAL_\name\()	/* Real entry tests KVM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) #define __IKVM_REAL(name)	.L_IKVM_REAL_ ## name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) #define IKVM_VIRT	.L_IKVM_VIRT_\name\()	/* Virt entry tests KVM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) #define ISTACK		.L_ISTACK_\name\()	/* Set regular kernel stack */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) #define __ISTACK(name)	.L_ISTACK_ ## name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) #define IRECONCILE	.L_IRECONCILE_\name\()	/* Do RECONCILE_IRQ_STATE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) #define IKUAP		.L_IKUAP_\name\()	/* Do KUAP lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) #define INT_DEFINE_BEGIN(n)						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) .macro int_define_ ## n name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) #define INT_DEFINE_END(n)						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) .endm ;									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) int_define_ ## n n ;							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) do_define_int n
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) .macro do_define_int name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) 	.ifndef IVEC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) 		.error "IVEC not defined"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) 	.ifndef IHSRR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 		IHSRR=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) 	.ifndef IHSRR_IF_HVMODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) 		IHSRR_IF_HVMODE=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) 	.ifndef IAREA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) 		IAREA=PACA_EXGEN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) 	.ifndef IVIRT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) 		IVIRT=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) 	.ifndef IISIDE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) 		IISIDE=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) 	.ifndef IDAR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) 		IDAR=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) 	.ifndef IDSISR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) 		IDSISR=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) 	.ifndef ISET_RI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) 		ISET_RI=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 	.ifndef IBRANCH_TO_COMMON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) 		IBRANCH_TO_COMMON=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) 	.ifndef IREALMODE_COMMON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) 		IREALMODE_COMMON=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) 		.if ! IBRANCH_TO_COMMON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) 			.error "IREALMODE_COMMON=1 but IBRANCH_TO_COMMON=0"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) 		.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) 	.ifndef IMASK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) 		IMASK=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) 	.ifndef IKVM_SKIP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) 		IKVM_SKIP=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) 	.ifndef IKVM_REAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) 		IKVM_REAL=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) 	.ifndef IKVM_VIRT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) 		IKVM_VIRT=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 	.ifndef ISTACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) 		ISTACK=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) 	.ifndef IRECONCILE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) 		IRECONCILE=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) 	.ifndef IKUAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) 		IKUAP=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217)  * All interrupts which set HSRR registers, as well as SRESET and MCE and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218)  * syscall when invoked with "sc 1" switch to MSR[HV]=1 (HVMODE) to be taken,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219)  * so they all generally need to test whether they were taken in guest context.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221)  * Note: SRESET and MCE may also be sent to the guest by the hypervisor, and be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222)  * taken with MSR[HV]=0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224)  * Interrupts which set SRR registers (with the above exceptions) do not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225)  * elevate to MSR[HV]=1 mode, though most can be taken when running with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226)  * MSR[HV]=1  (e.g., bare metal kernel and userspace). So these interrupts do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227)  * not need to test whether a guest is running because they get delivered to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228)  * the guest directly, including nested HV KVM guests.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230)  * The exception is PR KVM, where the guest runs with MSR[PR]=1 and the host
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231)  * runs with MSR[HV]=0, so the host takes all interrupts on behalf of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232)  * guest. PR KVM runs with LPCR[AIL]=0 which causes interrupts to always be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233)  * delivered to the real-mode entry point, therefore such interrupts only test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234)  * KVM in their real mode handlers, and only when PR KVM is possible.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236)  * Interrupts that are taken in MSR[HV]=0 and escalate to MSR[HV]=1 are always
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237)  * delivered in real-mode when the MMU is in hash mode because the MMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238)  * registers are not set appropriately to translate host addresses. In nested
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239)  * radix mode these can be delivered in virt-mode as the host translations are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240)  * used implicitly (see: effective LPID, effective PID).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244)  * If an interrupt is taken while a guest is running, it is immediately routed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245)  * to KVM to handle. If both HV and PR KVM arepossible, KVM interrupts go first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246)  * to kvmppc_interrupt_hv, which handles the PR guest case.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) #define kvmppc_interrupt kvmppc_interrupt_hv
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) #define kvmppc_interrupt kvmppc_interrupt_pr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) .macro KVMTEST name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) 	lbz	r10,HSTATE_IN_GUEST(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 	cmpwi	r10,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) 	bne	\name\()_kvm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) .macro GEN_KVM name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) 	.balign IFETCH_ALIGN_BYTES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) \name\()_kvm:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) 	.if IKVM_SKIP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 	cmpwi	r10,KVM_GUEST_MODE_SKIP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) 	beq	89f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) 	ld	r10,IAREA+EX_CFAR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) 	std	r10,HSTATE_CFAR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) 	ld	r10,IAREA+EX_CTR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) 	mtctr	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) 	ld	r10,IAREA+EX_PPR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) 	std	r10,HSTATE_PPR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) 	ld	r11,IAREA+EX_R11(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) 	ld	r12,IAREA+EX_R12(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) 	std	r12,HSTATE_SCRATCH0(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 	sldi	r12,r9,32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) 	ld	r9,IAREA+EX_R9(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) 	ld	r10,IAREA+EX_R10(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) 	/* HSRR variants have the 0x2 bit added to their trap number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) 	.if IHSRR_IF_HVMODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) 	BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) 	ori	r12,r12,(IVEC + 0x2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) 	FTR_SECTION_ELSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 	ori	r12,r12,(IVEC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 	ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 	.elseif IHSRR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) 	ori	r12,r12,(IVEC+ 0x2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 	ori	r12,r12,(IVEC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) 	b	kvmppc_interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) 	.if IKVM_SKIP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) 89:	mtocrf	0x80,r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) 	ld	r10,IAREA+EX_CTR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) 	mtctr	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) 	ld	r9,IAREA+EX_R9(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 	ld	r10,IAREA+EX_R10(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) 	ld	r11,IAREA+EX_R11(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) 	ld	r12,IAREA+EX_R12(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) 	.if IHSRR_IF_HVMODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) 	BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) 	b	kvmppc_skip_Hinterrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) 	FTR_SECTION_ELSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) 	b	kvmppc_skip_interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) 	ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) 	.elseif IHSRR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 	b	kvmppc_skip_Hinterrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 	b	kvmppc_skip_interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) .macro KVMTEST name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) .macro GEN_KVM name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329)  * This is the BOOK3S interrupt entry code macro.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331)  * This can result in one of several things happening:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332)  * - Branch to the _common handler, relocated, in virtual mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333)  *   These are normal interrupts (synchronous and asynchronous) handled by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334)  *   the kernel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335)  * - Branch to KVM, relocated but real mode interrupts remain in real mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336)  *   These occur when HSTATE_IN_GUEST is set. The interrupt may be caused by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337)  *   / intended for host or guest kernel, but KVM must always be involved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338)  *   because the machine state is set for guest execution.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339)  * - Branch to the masked handler, unrelocated.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340)  *   These occur when maskable asynchronous interrupts are taken with the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341)  *   irq_soft_mask set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342)  * - Branch to an "early" handler in real mode but relocated.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343)  *   This is done if early=1. MCE and HMI use these to handle errors in real
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344)  *   mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345)  * - Fall through and continue executing in real, unrelocated mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346)  *   This is done if early=2.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) .macro GEN_BRANCH_TO_COMMON name, virt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) 	.if IREALMODE_COMMON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) 	LOAD_HANDLER(r10, \name\()_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) 	mtctr	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) 	bctr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	.if \virt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) #ifndef CONFIG_RELOCATABLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 	b	\name\()_common_virt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) 	LOAD_HANDLER(r10, \name\()_common_virt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 	mtctr	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 	bctr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) 	LOAD_HANDLER(r10, \name\()_common_real)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) 	mtctr	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) 	bctr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) .macro GEN_INT_ENTRY name, virt, ool=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) 	SET_SCRATCH0(r13)			/* save r13 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) 	GET_PACA(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) 	std	r9,IAREA+EX_R9(r13)		/* save r9 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) 	mfspr	r9,SPRN_PPR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) 	HMT_MEDIUM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) 	std	r10,IAREA+EX_R10(r13)		/* save r10 - r12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) 	mfspr	r10,SPRN_CFAR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383) 	.if \ool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) 	.if !\virt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) 	b	tramp_real_\name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) 	.pushsection .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) 	TRAMP_REAL_BEGIN(tramp_real_\name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) 	b	tramp_virt_\name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) 	.pushsection .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) 	TRAMP_VIRT_BEGIN(tramp_virt_\name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 	std	r9,IAREA+EX_PPR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 	std	r10,IAREA+EX_CFAR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 	INTERRUPT_TO_KERNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) 	mfctr	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) 	std	r10,IAREA+EX_CTR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) 	mfcr	r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) 	std	r11,IAREA+EX_R11(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) 	std	r12,IAREA+EX_R12(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) 	 * DAR/DSISR, SCRATCH0 must be read before setting MSR[RI],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) 	 * because a d-side MCE will clobber those registers so is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) 	 * not recoverable if they are live.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 	GET_SCRATCH0(r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) 	std	r10,IAREA+EX_R13(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 	.if IDAR && !IISIDE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) 	.if IHSRR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) 	mfspr	r10,SPRN_HDAR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 	mfspr	r10,SPRN_DAR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 	std	r10,IAREA+EX_DAR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) 	.if IDSISR && !IISIDE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 	.if IHSRR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 	mfspr	r10,SPRN_HDSISR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) 	mfspr	r10,SPRN_DSISR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) 	stw	r10,IAREA+EX_DSISR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) 	.if IHSRR_IF_HVMODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) 	BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) 	mfspr	r11,SPRN_HSRR0		/* save HSRR0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) 	mfspr	r12,SPRN_HSRR1		/* and HSRR1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 	FTR_SECTION_ELSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) 	mfspr	r11,SPRN_SRR0		/* save SRR0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) 	mfspr	r12,SPRN_SRR1		/* and SRR1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 	ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 	.elseif IHSRR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) 	mfspr	r11,SPRN_HSRR0		/* save HSRR0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) 	mfspr	r12,SPRN_HSRR1		/* and HSRR1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) 	mfspr	r11,SPRN_SRR0		/* save SRR0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) 	mfspr	r12,SPRN_SRR1		/* and SRR1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) 	.if IBRANCH_TO_COMMON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) 	GEN_BRANCH_TO_COMMON \name \virt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) 	.if \ool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) 	.popsection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458)  * __GEN_COMMON_ENTRY is required to receive the branch from interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459)  * entry, except in the case of the real-mode handlers which require
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460)  * __GEN_REALMODE_COMMON_ENTRY.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462)  * This switches to virtual mode and sets MSR[RI].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) .macro __GEN_COMMON_ENTRY name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) DEFINE_FIXED_SYMBOL(\name\()_common_real)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) \name\()_common_real:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 	.if IKVM_REAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 		KVMTEST \name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 	ld	r10,PACAKMSR(r13)	/* get MSR value for kernel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 	/* MSR[RI] is clear iff using SRR regs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) 	.if IHSRR_IF_HVMODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 	BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 	xori	r10,r10,MSR_RI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) 	END_FTR_SECTION_IFCLR(CPU_FTR_HVMODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) 	.elseif ! IHSRR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 	xori	r10,r10,MSR_RI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) 	mtmsrd	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) 	.if IVIRT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) 	.if IKVM_VIRT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 	b	1f /* skip the virt test coming from real */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 	.balign IFETCH_ALIGN_BYTES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) DEFINE_FIXED_SYMBOL(\name\()_common_virt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) \name\()_common_virt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 	.if IKVM_VIRT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 		KVMTEST \name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) 	.endif /* IVIRT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498)  * Don't switch to virt mode. Used for early MCE and HMI handlers that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499)  * want to run in real mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) .macro __GEN_REALMODE_COMMON_ENTRY name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) DEFINE_FIXED_SYMBOL(\name\()_common_real)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) \name\()_common_real:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) 	.if IKVM_REAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) 		KVMTEST \name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) .macro __GEN_COMMON_BODY name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 	.if IMASK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) 		.if ! ISTACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 		.error "No support for masked interrupt to use custom stack"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) 		.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 		/* If coming from user, skip soft-mask tests. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 		andi.	r10,r12,MSR_PR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 		bne	2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 		/* Kernel code running below __end_interrupts is implicitly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 		 * soft-masked */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) 		LOAD_HANDLER(r10, __end_interrupts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 		cmpld	r11,r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 		li	r10,IMASK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 		blt-	1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 		/* Test the soft mask state against our interrupt's bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 		lbz	r10,PACAIRQSOFTMASK(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) 1:		andi.	r10,r10,IMASK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 		/* Associate vector numbers with bits in paca->irq_happened */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) 		.if IVEC == 0x500 || IVEC == 0xea0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) 		li	r10,PACA_IRQ_EE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) 		.elseif IVEC == 0x900
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) 		li	r10,PACA_IRQ_DEC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) 		.elseif IVEC == 0xa00 || IVEC == 0xe80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) 		li	r10,PACA_IRQ_DBELL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536) 		.elseif IVEC == 0xe60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 		li	r10,PACA_IRQ_HMI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 		.elseif IVEC == 0xf00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 		li	r10,PACA_IRQ_PMI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 		.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 		.abort "Bad maskable vector"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 		.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) 		.if IHSRR_IF_HVMODE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) 		BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) 		bne	masked_Hinterrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) 		FTR_SECTION_ELSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) 		bne	masked_interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) 		ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) 		.elseif IHSRR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) 		bne	masked_Hinterrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 		.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) 		bne	masked_interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 		.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 	.if ISTACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 	andi.	r10,r12,MSR_PR		/* See if coming from user	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) 2:	mr	r10,r1			/* Save r1			*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) 	subi	r1,r1,INT_FRAME_SIZE	/* alloc frame on kernel stack	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) 	beq-	100f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 	ld	r1,PACAKSAVE(r13)	/* kernel stack to use		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 100:	tdgei	r1,-INT_FRAME_SIZE	/* trap if r1 is in userspace	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) 	EMIT_BUG_ENTRY 100b,__FILE__,__LINE__,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) 	std	r9,_CCR(r1)		/* save CR in stackframe	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) 	std	r11,_NIP(r1)		/* save SRR0 in stackframe	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) 	std	r12,_MSR(r1)		/* save SRR1 in stackframe	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) 	std	r10,0(r1)		/* make stack chain pointer	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) 	std	r0,GPR0(r1)		/* save r0 in stackframe	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 	std	r10,GPR1(r1)		/* save r1 in stackframe	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) 	.if ISET_RI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 	li	r10,MSR_RI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 	mtmsrd	r10,1			/* Set MSR_RI */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) 	.if ISTACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) 	.if IKUAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) 	kuap_save_amr_and_lock r9, r10, cr1, cr0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 	beq	101f			/* if from kernel mode		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) 	ACCOUNT_CPU_USER_ENTRY(r13, r9, r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 	ld	r9,IAREA+EX_PPR(r13)	/* Read PPR from paca		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) 	std	r9,_PPR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 101:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) 	.if IKUAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) 	kuap_save_amr_and_lock r9, r10, cr1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) 	/* Save original regs values from save area to stack frame. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 	ld	r9,IAREA+EX_R9(r13)	/* move r9, r10 to stackframe	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 	ld	r10,IAREA+EX_R10(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) 	std	r9,GPR9(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 	std	r10,GPR10(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 	ld	r9,IAREA+EX_R11(r13)	/* move r11 - r13 to stackframe	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) 	ld	r10,IAREA+EX_R12(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 	ld	r11,IAREA+EX_R13(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 	std	r9,GPR11(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) 	std	r10,GPR12(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 	std	r11,GPR13(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) 	SAVE_NVGPRS(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 	.if IDAR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 	.if IISIDE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 	ld	r10,_NIP(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) 	ld	r10,IAREA+EX_DAR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) 	std	r10,_DAR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 	.if IDSISR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) 	.if IISIDE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) 	ld	r10,_MSR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 	lis	r11,DSISR_SRR1_MATCH_64S@h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) 	and	r10,r10,r11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) 	lwz	r10,IAREA+EX_DSISR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) 	std	r10,_DSISR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) 	ld	r10,IAREA+EX_CFAR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632) 	std	r10,ORIG_GPR3(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633) END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) 	ld	r10,IAREA+EX_CTR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 	std	r10,_CTR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) 	std	r2,GPR2(r1)		/* save r2 in stackframe	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) 	SAVE_4GPRS(3, r1)		/* save r3 - r6 in stackframe   */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 	SAVE_2GPRS(7, r1)		/* save r7, r8 in stackframe	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) 	mflr	r9			/* Get LR, later save to stack	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 	ld	r2,PACATOC(r13)		/* get kernel TOC into r2	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) 	std	r9,_LINK(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) 	lbz	r10,PACAIRQSOFTMASK(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 	mfspr	r11,SPRN_XER		/* save XER in stackframe	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 	std	r10,SOFTE(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) 	std	r11,_XER(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 	li	r9,IVEC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 	std	r9,_TRAP(r1)		/* set trap number		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) 	li	r10,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) 	ld	r11,exception_marker@toc(r2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 	std	r10,RESULT(r1)		/* clear regs->result		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 	std	r11,STACK_FRAME_OVERHEAD-16(r1) /* mark the frame	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 	.if ISTACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 	ACCOUNT_STOLEN_TIME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) 	.if IRECONCILE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 	RECONCILE_IRQ_STATE(r10, r11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663)  * On entry r13 points to the paca, r9-r13 are saved in the paca,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664)  * r9 contains the saved CR, r11 and r12 contain the saved SRR0 and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665)  * SRR1, and relocation is on.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667)  * If stack=0, then the stack is already set in r1, and r1 is saved in r10.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668)  * PPR save and CPU accounting is not done for the !stack case (XXX why not?)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) .macro GEN_COMMON name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 	__GEN_COMMON_ENTRY \name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) 	__GEN_COMMON_BODY \name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676)  * Restore all registers including H/SRR0/1 saved in a stack frame of a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677)  * standard exception.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) .macro EXCEPTION_RESTORE_REGS hsrr=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) 	/* Move original SRR0 and SRR1 into the respective regs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) 	ld	r9,_MSR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) 	.if \hsrr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) 	mtspr	SPRN_HSRR1,r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) 	mtspr	SPRN_SRR1,r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 	ld	r9,_NIP(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) 	.if \hsrr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) 	mtspr	SPRN_HSRR0,r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) 	mtspr	SPRN_SRR0,r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) 	ld	r9,_CTR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) 	mtctr	r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) 	ld	r9,_XER(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 	mtxer	r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 	ld	r9,_LINK(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 	mtlr	r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 	ld	r9,_CCR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) 	mtcr	r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) 	REST_8GPRS(2, r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) 	REST_4GPRS(10, r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) 	REST_GPR(0, r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) 	/* restore original r1. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 	ld	r1,GPR1(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) #define RUNLATCH_ON				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) BEGIN_FTR_SECTION				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 	ld	r3, PACA_THREAD_INFO(r13);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 	ld	r4,TI_LOCAL_FLAGS(r3);		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 	andi.	r0,r4,_TLF_RUNLATCH;		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 	beql	ppc64_runlatch_on_trampoline;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) END_FTR_SECTION_IFSET(CPU_FTR_CTRL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717)  * When the idle code in power4_idle puts the CPU into NAP mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718)  * it has to do so in a loop, and relies on the external interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719)  * and decrementer interrupt entry code to get it out of the loop.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720)  * It sets the _TLF_NAPPING bit in current_thread_info()->local_flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721)  * to signal that it is in the loop and needs help to get out.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723) #ifdef CONFIG_PPC_970_NAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) #define FINISH_NAP				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) BEGIN_FTR_SECTION				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) 	ld	r11, PACA_THREAD_INFO(r13);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) 	ld	r9,TI_LOCAL_FLAGS(r11);		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 	andi.	r10,r9,_TLF_NAPPING;		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 	bnel	power4_fixup_nap;		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) #define FINISH_NAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736)  * There are a few constraints to be concerned with.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737)  * - Real mode exceptions code/data must be located at their physical location.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738)  * - Virtual mode exceptions must be mapped at their 0xc000... location.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739)  * - Fixed location code must not call directly beyond the __end_interrupts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740)  *   area when built with CONFIG_RELOCATABLE. LOAD_HANDLER / bctr sequence
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741)  *   must be used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742)  * - LOAD_HANDLER targets must be within first 64K of physical 0 /
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743)  *   virtual 0xc00...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744)  * - Conditional branch targets must be within +/-32K of caller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746)  * "Virtual exceptions" run with relocation on (MSR_IR=1, MSR_DR=1), and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747)  * therefore don't have to run in physically located code or rfid to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748)  * virtual mode kernel code. However on relocatable kernels they do have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749)  * to branch to KERNELBASE offset because the rest of the kernel (outside
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750)  * the exception vectors) may be located elsewhere.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752)  * Virtual exceptions correspond with physical, except their entry points
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753)  * are offset by 0xc000000000000000 and also tend to get an added 0x4000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754)  * offset applied. Virtual exceptions are enabled with the Alternate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755)  * Interrupt Location (AIL) bit set in the LPCR. However this does not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756)  * guarantee they will be delivered virtually. Some conditions (see the ISA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757)  * cause exceptions to be delivered in real mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759)  * The scv instructions are a special case. They get a 0x3000 offset applied.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760)  * scv exceptions have unique reentrancy properties, see below.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762)  * It's impossible to receive interrupts below 0x300 via AIL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764)  * KVM: None of the virtual exceptions are from the guest. Anything that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765)  * escalated to HV=1 from HV=0 is delivered via real mode handlers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768)  * We layout physical memory as follows:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769)  * 0x0000 - 0x00ff : Secondary processor spin code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770)  * 0x0100 - 0x18ff : Real mode pSeries interrupt vectors
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771)  * 0x1900 - 0x2fff : Real mode trampolines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772)  * 0x3000 - 0x58ff : Relon (IR=1,DR=1) mode pSeries interrupt vectors
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773)  * 0x5900 - 0x6fff : Relon mode trampolines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774)  * 0x7000 - 0x7fff : FWNMI data area
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775)  * 0x8000 -   .... : Common interrupt handlers, remaining early
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776)  *                   setup code, rest of kernel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778)  * We could reclaim 0x4000-0x42ff for real mode trampolines if the space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779)  * is necessary. Until then it's more consistent to explicitly put VIRT_NONE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780)  * vectors there.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) OPEN_FIXED_SECTION(real_vectors,        0x0100, 0x1900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) OPEN_FIXED_SECTION(real_trampolines,    0x1900, 0x3000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) OPEN_FIXED_SECTION(virt_vectors,        0x3000, 0x5900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) OPEN_FIXED_SECTION(virt_trampolines,    0x5900, 0x7000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) #ifdef CONFIG_PPC_POWERNV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 	.globl start_real_trampolines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 	.globl end_real_trampolines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 	.globl start_virt_trampolines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) 	.globl end_virt_trampolines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) #if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796)  * Data area reserved for FWNMI option.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797)  * This address (0x7000) is fixed by the RPA.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798)  * pseries and powernv need to keep the whole page from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799)  * 0x7000 to 0x8000 free for use by the firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) ZERO_FIXED_SECTION(fwnmi_page,          0x7000, 0x8000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) OPEN_TEXT_SECTION(0x8000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) OPEN_TEXT_SECTION(0x7000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) USE_FIXED_SECTION(real_vectors)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810)  * This is the start of the interrupt handlers for pSeries
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811)  * This code runs with relocation off.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812)  * Code from here to __end_interrupts gets copied down to real
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813)  * address 0x100 when we are running a relocatable kernel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814)  * Therefore any relative branches in this section must only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815)  * branch to labels in this section.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 	.globl __start_interrupts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) __start_interrupts:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821)  * Interrupt 0x3000 - System Call Vectored Interrupt (syscall).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822)  * This is a synchronous interrupt invoked with the "scv" instruction. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823)  * system call does not alter the HV bit, so it is directed to the OS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825)  * Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826)  * scv instructions enter the kernel without changing EE, RI, ME, or HV.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827)  * In particular, this means we can take a maskable interrupt at any point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828)  * in the scv handler, which is unlike any other interrupt. This is solved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829)  * by treating the instruction addresses below __end_interrupts as being
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830)  * soft-masked.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832)  * AIL-0 mode scv exceptions go to 0x17000-0x17fff, but we set AIL-3 and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833)  * ensure scv is never executed with relocation off, which means AIL-0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834)  * should never happen.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836)  * Before leaving the below __end_interrupts text, at least of the following
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837)  * must be true:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838)  * - MSR[PR]=1 (i.e., return to userspace)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839)  * - MSR_EE|MSR_RI is set (no reentrant exceptions)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840)  * - Standard kernel environment is set up (stack, paca, etc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842)  * Call convention:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844)  * syscall register convention is in Documentation/powerpc/syscall64-abi.rst
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) EXC_VIRT_BEGIN(system_call_vectored, 0x3000, 0x1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) 	/* SCV 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) 	mr	r9,r13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) 	GET_PACA(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) 	mflr	r11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) 	mfctr	r12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) 	li	r10,IRQS_ALL_DISABLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) 	stb	r10,PACAIRQSOFTMASK(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) #ifdef CONFIG_RELOCATABLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 	b	system_call_vectored_tramp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 	b	system_call_vectored_common
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 	nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) 	/* SCV 1 - 127 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 	.rept	127
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) 	mr	r9,r13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) 	GET_PACA(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) 	mflr	r11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 	mfctr	r12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) 	li	r10,IRQS_ALL_DISABLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 	stb	r10,PACAIRQSOFTMASK(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) 	li	r0,-1 /* cause failure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) #ifdef CONFIG_RELOCATABLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) 	b	system_call_vectored_sigill_tramp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) 	b	system_call_vectored_sigill
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) 	.endr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) EXC_VIRT_END(system_call_vectored, 0x3000, 0x1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) #ifdef CONFIG_RELOCATABLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) TRAMP_VIRT_BEGIN(system_call_vectored_tramp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 	__LOAD_HANDLER(r10, system_call_vectored_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 	mtctr	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 	bctr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) TRAMP_VIRT_BEGIN(system_call_vectored_sigill_tramp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 	__LOAD_HANDLER(r10, system_call_vectored_sigill)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) 	mtctr	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 	bctr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891) /* No virt vectors corresponding with 0x0..0x100 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) EXC_VIRT_NONE(0x4000, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896)  * Interrupt 0x100 - System Reset Interrupt (SRESET aka NMI).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897)  * This is a non-maskable, asynchronous interrupt always taken in real-mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898)  * It is caused by:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899)  * - Wake from power-saving state, on powernv.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900)  * - An NMI from another CPU, triggered by firmware or hypercall.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901)  * - As crash/debug signal injected from BMC, firmware or hypervisor.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903)  * Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904)  * Power-save wakeup is the only performance critical path, so this is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905)  * determined quickly as possible first. In this case volatile registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906)  * can be discarded and SPRs like CFAR don't need to be read.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908)  * If not a powersave wakeup, then it's run as a regular interrupt, however
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909)  * it uses its own stack and PACA save area to preserve the regular kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910)  * environment for debugging.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912)  * This interrupt is not maskable, so triggering it when MSR[RI] is clear,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913)  * or SCRATCH0 is in use, etc. may cause a crash. It's also not entirely
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914)  * correct to switch to virtual mode to run the regular interrupt handler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915)  * because it might be interrupted when the MMU is in a bad state (e.g., SLB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916)  * is clear).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918)  * FWNMI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919)  * PAPR specifies a "fwnmi" facility which sends the sreset to a different
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920)  * entry point with a different register set up. Some hypervisors will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921)  * send the sreset to 0x100 in the guest if it is not fwnmi capable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923)  * KVM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924)  * Unlike most SRR interrupts, this may be taken by the host while executing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925)  * in a guest, so a KVM test is required. KVM will pull the CPU out of guest
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926)  * mode and then raise the sreset.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) INT_DEFINE_BEGIN(system_reset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) 	IVEC=0x100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) 	IAREA=PACA_EXNMI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) 	IVIRT=0 /* no virt entry point */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 	 * MSR_RI is not enabled, because PACA_EXNMI and nmi stack is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) 	 * being used, so a nested NMI exception would corrupt it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) 	ISET_RI=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 	ISTACK=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 	IRECONCILE=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) INT_DEFINE_END(system_reset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) EXC_REAL_BEGIN(system_reset, 0x100, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) #ifdef CONFIG_PPC_P7_NAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) 	 * If running native on arch 2.06 or later, check if we are waking up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 	 * from nap/sleep/winkle, and branch to idle handler. This tests SRR1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 	 * bits 46:47. A non-0 value indicates that we are coming from a power
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) 	 * saving state. The idle wakeup handler initially runs in real mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 	 * but we branch to the 0xc000... address so we can turn on relocation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) 	 * with mtmsrd later, after SPRs are restored.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) 	 * Careful to minimise cost for the fast path (idle wakeup) while
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 	 * also avoiding clobbering CFAR for the debug path (non-idle).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) 	 * For the idle wake case volatile registers can be clobbered, which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) 	 * is why we use those initially. If it turns out to not be an idle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 	 * wake, carefully put everything back the way it was, so we can use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 	 * common exception macros to handle it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 	SET_SCRATCH0(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 	GET_PACA(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) 	std	r3,PACA_EXNMI+0*8(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) 	std	r4,PACA_EXNMI+1*8(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) 	std	r5,PACA_EXNMI+2*8(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 	mfspr	r3,SPRN_SRR1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) 	mfocrf	r4,0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 	rlwinm.	r5,r3,47-31,30,31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 	bne+	system_reset_idle_wake
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 	/* Not powersave wakeup. Restore regs for regular interrupt handler. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 	mtocrf	0x80,r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 	ld	r3,PACA_EXNMI+0*8(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 	ld	r4,PACA_EXNMI+1*8(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 	ld	r5,PACA_EXNMI+2*8(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 	GET_SCRATCH0(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 	GEN_INT_ENTRY system_reset, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 	 * In theory, we should not enable relocation here if it was disabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 	 * in SRR1, because the MMU may not be configured to support it (e.g.,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) 	 * SLB may have been cleared). In practice, there should only be a few
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) 	 * small windows where that's the case, and sreset is considered to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) 	 * be dangerous anyway.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) EXC_REAL_END(system_reset, 0x100, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) EXC_VIRT_NONE(0x4100, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) #ifdef CONFIG_PPC_P7_NAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) TRAMP_REAL_BEGIN(system_reset_idle_wake)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 	/* We are waking up from idle, so may clobber any volatile register */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 	cmpwi	cr1,r5,2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 	bltlr	cr1	/* no state loss, return to idle caller with r3=SRR1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 	BRANCH_TO_C000(r12, DOTSYM(idle_return_gpr_loss))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) #ifdef CONFIG_PPC_PSERIES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000)  * Vectors for the FWNMI option.  Share common code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) TRAMP_REAL_BEGIN(system_reset_fwnmi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) 	GEN_INT_ENTRY system_reset, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) #endif /* CONFIG_PPC_PSERIES */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) EXC_COMMON_BEGIN(system_reset_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 	__GEN_COMMON_ENTRY system_reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 	 * Increment paca->in_nmi then enable MSR_RI. SLB or MCE will be able
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 	 * to recover, but nested NMI will notice in_nmi and not recover
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 	 * because of the use of the NMI stack. in_nmi reentrancy is tested in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) 	 * system_reset_exception.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 	lhz	r10,PACA_IN_NMI(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 	addi	r10,r10,1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 	sth	r10,PACA_IN_NMI(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 	li	r10,MSR_RI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 	mtmsrd 	r10,1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 	mr	r10,r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) 	ld	r1,PACA_NMI_EMERG_SP(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 	subi	r1,r1,INT_FRAME_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 	__GEN_COMMON_BODY system_reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 	 * Set IRQS_ALL_DISABLED unconditionally so irqs_disabled() does
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 	 * the right thing. We do not want to reconcile because that goes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 	 * through irq tracing which we don't want in NMI.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 	 * Save PACAIRQHAPPENED to RESULT (otherwise unused), and set HARD_DIS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 	 * as we are running with MSR[EE]=0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) 	li	r10,IRQS_ALL_DISABLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) 	stb	r10,PACAIRQSOFTMASK(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 	lbz	r10,PACAIRQHAPPENED(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) 	std	r10,RESULT(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 	ori	r10,r10,PACA_IRQ_HARD_DIS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) 	stb	r10,PACAIRQHAPPENED(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 	bl	system_reset_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 	/* Clear MSR_RI before setting SRR0 and SRR1. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 	li	r9,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 	mtmsrd	r9,1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) 	 * MSR_RI is clear, now we can decrement paca->in_nmi.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 	lhz	r10,PACA_IN_NMI(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) 	subi	r10,r10,1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) 	sth	r10,PACA_IN_NMI(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) 	 * Restore soft mask settings.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) 	ld	r10,RESULT(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) 	stb	r10,PACAIRQHAPPENED(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) 	ld	r10,SOFTE(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) 	stb	r10,PACAIRQSOFTMASK(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) 	kuap_restore_amr r9, r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) 	EXCEPTION_RESTORE_REGS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) 	RFI_TO_USER_OR_KERNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) 	GEN_KVM system_reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070)  * Interrupt 0x200 - Machine Check Interrupt (MCE).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071)  * This is a non-maskable interrupt always taken in real-mode. It can be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072)  * synchronous or asynchronous, caused by hardware or software, and it may be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073)  * taken in a power-saving state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075)  * Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076)  * Similarly to system reset, this uses its own stack and PACA save area,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077)  * the difference is re-entrancy is allowed on the machine check stack.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079)  * machine_check_early is run in real mode, and carefully decodes the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080)  * machine check and tries to handle it (e.g., flush the SLB if there was an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081)  * error detected there), determines if it was recoverable and logs the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082)  * event.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084)  * This early code does not "reconcile" irq soft-mask state like SRESET or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085)  * regular interrupts do, so irqs_disabled() among other things may not work
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086)  * properly (irq disable/enable already doesn't work because irq tracing can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087)  * not work in real mode).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089)  * Then, depending on the execution context when the interrupt is taken, there
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090)  * are 3 main actions:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091)  * - Executing in kernel mode. The event is queued with irq_work, which means
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092)  *   it is handled when it is next safe to do so (i.e., the kernel has enabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093)  *   interrupts), which could be immediately when the interrupt returns. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094)  *   avoids nasty issues like switching to virtual mode when the MMU is in a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095)  *   bad state, or when executing OPAL code. (SRESET is exposed to such issues,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096)  *   but it has different priorities). Check to see if the CPU was in power
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097)  *   save, and return via the wake up code if it was.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099)  * - Executing in user mode. machine_check_exception is run like a normal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100)  *   interrupt handler, which processes the data generated by the early handler.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102)  * - Executing in guest mode. The interrupt is run with its KVM test, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103)  *   branches to KVM to deal with. KVM may queue the event for the host
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104)  *   to report later.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106)  * This interrupt is not maskable, so if it triggers when MSR[RI] is clear,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107)  * or SCRATCH0 is in use, it may cause a crash.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109)  * KVM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110)  * See SRESET.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) INT_DEFINE_BEGIN(machine_check_early)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) 	IVEC=0x200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) 	IAREA=PACA_EXMC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 	IVIRT=0 /* no virt entry point */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 	IREALMODE_COMMON=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 	 * MSR_RI is not enabled, because PACA_EXMC is being used, so a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 	 * nested machine check corrupts it. machine_check_common enables
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 	 * MSR_RI.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 	ISET_RI=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) 	ISTACK=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 	IDAR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 	IDSISR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) 	IRECONCILE=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 	IKUAP=0 /* We don't touch AMR here, we never go to virtual mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) INT_DEFINE_END(machine_check_early)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) INT_DEFINE_BEGIN(machine_check)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 	IVEC=0x200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 	IAREA=PACA_EXMC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 	IVIRT=0 /* no virt entry point */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 	ISET_RI=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 	IDAR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) 	IDSISR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) 	IKVM_SKIP=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) INT_DEFINE_END(machine_check)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) EXC_REAL_BEGIN(machine_check, 0x200, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) 	GEN_INT_ENTRY machine_check_early, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) EXC_REAL_END(machine_check, 0x200, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) EXC_VIRT_NONE(0x4200, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) #ifdef CONFIG_PPC_PSERIES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) TRAMP_REAL_BEGIN(machine_check_fwnmi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) 	/* See comment at machine_check exception, don't turn on RI */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) 	GEN_INT_ENTRY machine_check_early, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) #define MACHINE_CHECK_HANDLER_WINDUP			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) 	/* Clear MSR_RI before setting SRR0 and SRR1. */\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) 	li	r9,0;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) 	mtmsrd	r9,1;		/* Clear MSR_RI */	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) 	/* Decrement paca->in_mce now RI is clear. */	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) 	lhz	r12,PACA_IN_MCE(r13);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) 	subi	r12,r12,1;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) 	sth	r12,PACA_IN_MCE(r13);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 	EXCEPTION_RESTORE_REGS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) EXC_COMMON_BEGIN(machine_check_early_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) 	__GEN_REALMODE_COMMON_ENTRY machine_check_early
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) 	 * Switch to mc_emergency stack and handle re-entrancy (we limit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) 	 * the nested MCE upto level 4 to avoid stack overflow).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) 	 * Save MCE registers srr1, srr0, dar and dsisr and then set ME=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) 	 * We use paca->in_mce to check whether this is the first entry or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) 	 * nested machine check. We increment paca->in_mce to track nested
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) 	 * machine checks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 	 * If this is the first entry then set stack pointer to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) 	 * paca->mc_emergency_sp, otherwise r1 is already pointing to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 	 * stack frame on mc_emergency stack.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 	 * NOTE: We are here with MSR_ME=0 (off), which means we risk a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 	 * checkstop if we get another machine check exception before we do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) 	 * rfid with MSR_ME=1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 	 * This interrupt can wake directly from idle. If that is the case,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 	 * the machine check is handled then the idle wakeup code is called
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 	 * to restore state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) 	lhz	r10,PACA_IN_MCE(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) 	cmpwi	r10,0			/* Are we in nested machine check */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) 	cmpwi	cr1,r10,MAX_MCE_DEPTH	/* Are we at maximum nesting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) 	addi	r10,r10,1		/* increment paca->in_mce */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) 	sth	r10,PACA_IN_MCE(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) 	mr	r10,r1			/* Save r1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) 	bne	1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 	/* First machine check entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) 	ld	r1,PACAMCEMERGSP(r13)	/* Use MC emergency stack */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) 1:	/* Limit nested MCE to level 4 to avoid stack overflow */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) 	bgt	cr1,unrecoverable_mce	/* Check if we hit limit of 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) 	subi	r1,r1,INT_FRAME_SIZE	/* alloc stack frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) 	__GEN_COMMON_BODY machine_check_early
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) 	bl	enable_machine_check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) 	li	r10,MSR_RI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) 	mtmsrd	r10,1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) 	 * Set IRQS_ALL_DISABLED and save PACAIRQHAPPENED (see
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) 	 * system_reset_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) 	li	r10,IRQS_ALL_DISABLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) 	stb	r10,PACAIRQSOFTMASK(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) 	lbz	r10,PACAIRQHAPPENED(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) 	std	r10,RESULT(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) 	ori	r10,r10,PACA_IRQ_HARD_DIS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) 	stb	r10,PACAIRQHAPPENED(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) 	bl	machine_check_early
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) 	std	r3,RESULT(r1)	/* Save result */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) 	ld	r12,_MSR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) 	 * Restore soft mask settings.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) 	ld	r10,RESULT(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) 	stb	r10,PACAIRQHAPPENED(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) 	ld	r10,SOFTE(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) 	stb	r10,PACAIRQSOFTMASK(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) #ifdef CONFIG_PPC_P7_NAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) 	 * Check if thread was in power saving mode. We come here when any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) 	 * of the following is true:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) 	 * a. thread wasn't in power saving mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) 	 * b. thread was in power saving mode with no state loss,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) 	 *    supervisor state loss or hypervisor state loss.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) 	 * Go back to nap/sleep/winkle mode again if (b) is true.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) 	rlwinm.	r11,r12,47-31,30,31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 	bne	machine_check_idle_common
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) 	 * Check if we are coming from guest. If yes, then run the normal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) 	 * exception handler which will take the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) 	 * machine_check_kvm->kvmppc_interrupt branch to deliver the MC event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) 	 * to guest.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) 	lbz	r11,HSTATE_IN_GUEST(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) 	cmpwi	r11,0			/* Check if coming from guest */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) 	bne	mce_deliver		/* continue if we are. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) 	 * Check if we are coming from userspace. If yes, then run the normal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) 	 * exception handler which will deliver the MC event to this kernel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) 	andi.	r11,r12,MSR_PR		/* See if coming from user. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 	bne	mce_deliver		/* continue in V mode if we are. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) 	 * At this point we are coming from kernel context.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) 	 * Queue up the MCE event and return from the interrupt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) 	 * But before that, check if this is an un-recoverable exception.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) 	 * If yes, then stay on emergency stack and panic.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) 	andi.	r11,r12,MSR_RI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) 	beq	unrecoverable_mce
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) 	 * Check if we have successfully handled/recovered from error, if not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) 	 * then stay on emergency stack and panic.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) 	ld	r3,RESULT(r1)	/* Load result */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) 	cmpdi	r3,0		/* see if we handled MCE successfully */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) 	beq	unrecoverable_mce /* if !handled then panic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) 	 * Return from MC interrupt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) 	 * Queue up the MCE event so that we can log it later, while
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) 	 * returning from kernel or opal call.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) 	bl	machine_check_queue_event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) 	MACHINE_CHECK_HANDLER_WINDUP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) 	RFI_TO_KERNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) mce_deliver:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) 	 * This is a host user or guest MCE. Restore all registers, then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) 	 * run the "late" handler. For host user, this will run the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) 	 * machine_check_exception handler in virtual mode like a normal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) 	 * interrupt handler. For guest, this will trigger the KVM test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) 	 * and branch to the KVM interrupt similarly to other interrupts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) 	ld	r10,ORIG_GPR3(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) 	mtspr	SPRN_CFAR,r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) 	MACHINE_CHECK_HANDLER_WINDUP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) 	GEN_INT_ENTRY machine_check, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) EXC_COMMON_BEGIN(machine_check_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) 	 * Machine check is different because we use a different
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) 	 * save area: PACA_EXMC instead of PACA_EXGEN.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) 	GEN_COMMON machine_check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) 	FINISH_NAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) 	/* Enable MSR_RI when finished with PACA_EXMC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) 	li	r10,MSR_RI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) 	mtmsrd 	r10,1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) 	bl	machine_check_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) 	GEN_KVM machine_check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) #ifdef CONFIG_PPC_P7_NAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328)  * This is an idle wakeup. Low level machine check has already been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329)  * done. Queue the event then call the idle code to do the wake up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) EXC_COMMON_BEGIN(machine_check_idle_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) 	bl	machine_check_queue_event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) 	 * GPR-loss wakeups are relatively straightforward, because the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) 	 * idle sleep code has saved all non-volatile registers on its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) 	 * own stack, and r1 in PACAR1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) 	 * For no-loss wakeups the r1 and lr registers used by the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) 	 * early machine check handler have to be restored first. r2 is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) 	 * the kernel TOC, so no need to restore it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) 	 * Then decrement MCE nesting after finishing with the stack.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) 	ld	r3,_MSR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) 	ld	r4,_LINK(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) 	ld	r1,GPR1(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) 	lhz	r11,PACA_IN_MCE(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) 	subi	r11,r11,1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) 	sth	r11,PACA_IN_MCE(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) 	mtlr	r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) 	rlwinm	r10,r3,47-31,30,31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) 	cmpwi	cr1,r10,2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) 	bltlr	cr1	/* no state loss, return to idle caller with r3=SRR1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) 	b	idle_return_gpr_loss
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) EXC_COMMON_BEGIN(unrecoverable_mce)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) 	 * We are going down. But there are chances that we might get hit by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) 	 * another MCE during panic path and we may run into unstable state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) 	 * with no way out. Hence, turn ME bit off while going down, so that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) 	 * when another MCE is hit during panic path, system will checkstop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) 	 * and hypervisor will get restarted cleanly by SP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) 	li	r10,0 /* clear MSR_RI */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) 	mtmsrd	r10,1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) 	bl	disable_machine_check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) 	ld	r10,PACAKMSR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) 	li	r3,MSR_ME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) 	andc	r10,r10,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) 	mtmsrd	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) 	lhz	r12,PACA_IN_MCE(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) 	subi	r12,r12,1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) 	sth	r12,PACA_IN_MCE(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) 	/* Invoke machine_check_exception to print MCE event and panic. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) 	bl	machine_check_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) 	 * We will not reach here. Even if we did, there is no way out.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) 	 * Call unrecoverable_exception and die.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) 	bl	unrecoverable_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) 	b	.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396)  * Interrupt 0x300 - Data Storage Interrupt (DSI).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397)  * This is a synchronous interrupt generated due to a data access exception,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398)  * e.g., a load orstore which does not have a valid page table entry with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399)  * permissions. DAWR matches also fault here, as do RC updates, and minor misc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400)  * errors e.g., copy/paste, AMO, certain invalid CI accesses, etc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402)  * Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403)  * - Hash MMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404)  *   Go to do_hash_page first to see if the HPT can be filled from an entry in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405)  *   the Linux page table. Hash faults can hit in kernel mode in a fairly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406)  *   arbitrary state (e.g., interrupts disabled, locks held) when accessing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407)  *   "non-bolted" regions, e.g., vmalloc space. However these should always be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408)  *   backed by Linux page tables.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410)  *   If none is found, do a Linux page fault. Linux page faults can happen in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411)  *   kernel mode due to user copy operations of course.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413)  *   KVM: The KVM HDSI handler may perform a load with MSR[DR]=1 in guest
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414)  *   MMU context, which may cause a DSI in the host, which must go to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415)  *   KVM handler. MSR[IR] is not enabled, so the real-mode handler will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416)  *   always be used regardless of AIL setting.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418)  * - Radix MMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419)  *   The hardware loads from the Linux page table directly, so a fault goes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420)  *   immediately to Linux page fault.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422)  * Conditions like DAWR match are handled on the way in to Linux page fault.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) INT_DEFINE_BEGIN(data_access)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) 	IVEC=0x300
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) 	IDAR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) 	IDSISR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) 	IKVM_SKIP=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) INT_DEFINE_END(data_access)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) EXC_REAL_BEGIN(data_access, 0x300, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) 	GEN_INT_ENTRY data_access, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) EXC_REAL_END(data_access, 0x300, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) EXC_VIRT_BEGIN(data_access, 0x4300, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) 	GEN_INT_ENTRY data_access, virt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) EXC_VIRT_END(data_access, 0x4300, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) EXC_COMMON_BEGIN(data_access_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) 	GEN_COMMON data_access
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) 	ld	r4,_DAR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) 	ld	r5,_DSISR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) BEGIN_MMU_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) 	ld	r6,_MSR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) 	li	r3,0x300
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) 	b	do_hash_page		/* Try to handle as hpte fault */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) MMU_FTR_SECTION_ELSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) 	b	handle_page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) 	GEN_KVM data_access
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454)  * Interrupt 0x380 - Data Segment Interrupt (DSLB).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455)  * This is a synchronous interrupt in response to an MMU fault missing SLB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456)  * entry for HPT, or an address outside RPT translation range.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458)  * Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459)  * - HPT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460)  *   This refills the SLB, or reports an access fault similarly to a bad page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461)  *   fault. When coming from user-mode, the SLB handler may access any kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462)  *   data, though it may itself take a DSLB. When coming from kernel mode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463)  *   recursive faults must be avoided so access is restricted to the kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464)  *   image text/data, kernel stack, and any data allocated below
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465)  *   ppc64_bolted_size (first segment). The kernel handler must avoid stomping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466)  *   on user-handler data structures.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468)  *   KVM: Same as 0x300, DSLB must test for KVM guest.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470)  * A dedicated save area EXSLB is used (XXX: but it actually need not be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471)  * these days, we could use EXGEN).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) INT_DEFINE_BEGIN(data_access_slb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) 	IVEC=0x380
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) 	IAREA=PACA_EXSLB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) 	IRECONCILE=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) 	IDAR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) 	IKVM_SKIP=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) INT_DEFINE_END(data_access_slb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) EXC_REAL_BEGIN(data_access_slb, 0x380, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) 	GEN_INT_ENTRY data_access_slb, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) EXC_REAL_END(data_access_slb, 0x380, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) EXC_VIRT_BEGIN(data_access_slb, 0x4380, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) 	GEN_INT_ENTRY data_access_slb, virt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) EXC_VIRT_END(data_access_slb, 0x4380, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) EXC_COMMON_BEGIN(data_access_slb_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) 	GEN_COMMON data_access_slb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) 	ld	r4,_DAR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) BEGIN_MMU_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) 	/* HPT case, do SLB fault */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) 	bl	do_slb_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) 	cmpdi	r3,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) 	bne-	1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) 	b	fast_interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) 1:	/* Error case */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) MMU_FTR_SECTION_ELSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) 	/* Radix case, access is outside page table range */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) 	li	r3,-EFAULT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) 	std	r3,RESULT(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) 	RECONCILE_IRQ_STATE(r10, r11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) 	ld	r4,_DAR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) 	ld	r5,RESULT(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) 	bl	do_bad_slb_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) 	GEN_KVM data_access_slb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515)  * Interrupt 0x400 - Instruction Storage Interrupt (ISI).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516)  * This is a synchronous interrupt in response to an MMU fault due to an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517)  * instruction fetch.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519)  * Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520)  * Similar to DSI, though in response to fetch. The faulting address is found
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521)  * in SRR0 (rather than DAR), and status in SRR1 (rather than DSISR).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) INT_DEFINE_BEGIN(instruction_access)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) 	IVEC=0x400
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) 	IISIDE=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) 	IDAR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) 	IDSISR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) INT_DEFINE_END(instruction_access)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) EXC_REAL_BEGIN(instruction_access, 0x400, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) 	GEN_INT_ENTRY instruction_access, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) EXC_REAL_END(instruction_access, 0x400, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) EXC_VIRT_BEGIN(instruction_access, 0x4400, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) 	GEN_INT_ENTRY instruction_access, virt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) EXC_VIRT_END(instruction_access, 0x4400, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) EXC_COMMON_BEGIN(instruction_access_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) 	GEN_COMMON instruction_access
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) 	ld	r4,_DAR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) 	ld	r5,_DSISR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) BEGIN_MMU_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) 	ld      r6,_MSR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) 	li	r3,0x400
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) 	b	do_hash_page		/* Try to handle as hpte fault */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) MMU_FTR_SECTION_ELSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) 	b	handle_page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) 	GEN_KVM instruction_access
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555)  * Interrupt 0x480 - Instruction Segment Interrupt (ISLB).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556)  * This is a synchronous interrupt in response to an MMU fault due to an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557)  * instruction fetch.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559)  * Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560)  * Similar to DSLB, though in response to fetch. The faulting address is found
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561)  * in SRR0 (rather than DAR).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) INT_DEFINE_BEGIN(instruction_access_slb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) 	IVEC=0x480
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) 	IAREA=PACA_EXSLB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) 	IRECONCILE=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) 	IISIDE=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) 	IDAR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) INT_DEFINE_END(instruction_access_slb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) EXC_REAL_BEGIN(instruction_access_slb, 0x480, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) 	GEN_INT_ENTRY instruction_access_slb, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) EXC_REAL_END(instruction_access_slb, 0x480, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) EXC_VIRT_BEGIN(instruction_access_slb, 0x4480, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) 	GEN_INT_ENTRY instruction_access_slb, virt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) EXC_VIRT_END(instruction_access_slb, 0x4480, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) EXC_COMMON_BEGIN(instruction_access_slb_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) 	GEN_COMMON instruction_access_slb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) 	ld	r4,_DAR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) BEGIN_MMU_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) 	/* HPT case, do SLB fault */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) 	bl	do_slb_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) 	cmpdi	r3,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) 	bne-	1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) 	b	fast_interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) 1:	/* Error case */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) MMU_FTR_SECTION_ELSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) 	/* Radix case, access is outside page table range */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) 	li	r3,-EFAULT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) 	std	r3,RESULT(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) 	RECONCILE_IRQ_STATE(r10, r11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) 	ld	r4,_DAR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) 	ld	r5,RESULT(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) 	bl	do_bad_slb_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) 	GEN_KVM instruction_access_slb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607)  * Interrupt 0x500 - External Interrupt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608)  * This is an asynchronous maskable interrupt in response to an "external
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609)  * exception" from the interrupt controller or hypervisor (e.g., device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610)  * interrupt). It is maskable in hardware by clearing MSR[EE], and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611)  * soft-maskable with IRQS_DISABLED mask (i.e., local_irq_disable()).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613)  * When running in HV mode, Linux sets up the LPCR[LPES] bit such that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614)  * interrupts are delivered with HSRR registers, guests use SRRs, which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615)  * reqiures IHSRR_IF_HVMODE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617)  * On bare metal POWER9 and later, Linux sets the LPCR[HVICE] bit such that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618)  * external interrupts are delivered as Hypervisor Virtualization Interrupts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619)  * rather than External Interrupts.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621)  * Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622)  * This calls into Linux IRQ handler. NVGPRs are not saved to reduce overhead,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623)  * because registers at the time of the interrupt are not so important as it is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624)  * asynchronous.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626)  * If soft masked, the masked handler will note the pending interrupt for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627)  * replay, and clear MSR[EE] in the interrupted context.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) INT_DEFINE_BEGIN(hardware_interrupt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) 	IVEC=0x500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) 	IHSRR_IF_HVMODE=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) 	IMASK=IRQS_DISABLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) 	IKVM_VIRT=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) INT_DEFINE_END(hardware_interrupt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) EXC_REAL_BEGIN(hardware_interrupt, 0x500, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) 	GEN_INT_ENTRY hardware_interrupt, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) EXC_REAL_END(hardware_interrupt, 0x500, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) EXC_VIRT_BEGIN(hardware_interrupt, 0x4500, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) 	GEN_INT_ENTRY hardware_interrupt, virt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) EXC_VIRT_END(hardware_interrupt, 0x4500, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) EXC_COMMON_BEGIN(hardware_interrupt_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) 	GEN_COMMON hardware_interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) 	FINISH_NAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) 	RUNLATCH_ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) 	bl	do_IRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) 	GEN_KVM hardware_interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655)  * Interrupt 0x600 - Alignment Interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656)  * This is a synchronous interrupt in response to data alignment fault.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) INT_DEFINE_BEGIN(alignment)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) 	IVEC=0x600
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) 	IDAR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) 	IDSISR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) INT_DEFINE_END(alignment)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) EXC_REAL_BEGIN(alignment, 0x600, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) 	GEN_INT_ENTRY alignment, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) EXC_REAL_END(alignment, 0x600, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) EXC_VIRT_BEGIN(alignment, 0x4600, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) 	GEN_INT_ENTRY alignment, virt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) EXC_VIRT_END(alignment, 0x4600, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) EXC_COMMON_BEGIN(alignment_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) 	GEN_COMMON alignment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) 	bl	alignment_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) 	REST_NVGPRS(r1) /* instruction emulation may change GPRs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) 	GEN_KVM alignment
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684)  * Interrupt 0x700 - Program Interrupt (program check).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685)  * This is a synchronous interrupt in response to various instruction faults:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686)  * traps, privilege errors, TM errors, floating point exceptions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688)  * Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689)  * This interrupt may use the "emergency stack" in some cases when being taken
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690)  * from kernel context, which complicates handling.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) INT_DEFINE_BEGIN(program_check)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) 	IVEC=0x700
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) INT_DEFINE_END(program_check)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) EXC_REAL_BEGIN(program_check, 0x700, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) 	GEN_INT_ENTRY program_check, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) EXC_REAL_END(program_check, 0x700, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) EXC_VIRT_BEGIN(program_check, 0x4700, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) 	GEN_INT_ENTRY program_check, virt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) EXC_VIRT_END(program_check, 0x4700, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) EXC_COMMON_BEGIN(program_check_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) 	__GEN_COMMON_ENTRY program_check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) 	 * It's possible to receive a TM Bad Thing type program check with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) 	 * userspace register values (in particular r1), but with SRR1 reporting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) 	 * that we came from the kernel. Normally that would confuse the bad
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) 	 * stack logic, and we would report a bad kernel stack pointer. Instead
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) 	 * we switch to the emergency stack if we're taking a TM Bad Thing from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) 	 * the kernel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) 	andi.	r10,r12,MSR_PR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) 	bne	.Lnormal_stack		/* If userspace, go normal path */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) 	andis.	r10,r12,(SRR1_PROGTM)@h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) 	bne	.Lemergency_stack	/* If TM, emergency		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) 	cmpdi	r1,-INT_FRAME_SIZE	/* check if r1 is in userspace	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) 	blt	.Lnormal_stack		/* normal path if not		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) 	/* Use the emergency stack					*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) .Lemergency_stack:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) 	andi.	r10,r12,MSR_PR		/* Set CR0 correctly for label	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) 					/* 3 in EXCEPTION_PROLOG_COMMON	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) 	mr	r10,r1			/* Save r1			*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) 	ld	r1,PACAEMERGSP(r13)	/* Use emergency stack		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) 	subi	r1,r1,INT_FRAME_SIZE	/* alloc stack frame		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) 	__ISTACK(program_check)=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) 	__GEN_COMMON_BODY program_check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) 	b .Ldo_program_check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) .Lnormal_stack:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) 	__ISTACK(program_check)=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) 	__GEN_COMMON_BODY program_check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) .Ldo_program_check:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) 	bl	program_check_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) 	REST_NVGPRS(r1) /* instruction emulation may change GPRs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) 	GEN_KVM program_check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751)  * Interrupt 0x800 - Floating-Point Unavailable Interrupt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752)  * This is a synchronous interrupt in response to executing an fp instruction
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753)  * with MSR[FP]=0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755)  * Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756)  * This will load FP registers and enable the FP bit if coming from userspace,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757)  * otherwise report a bad kernel use of FP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) INT_DEFINE_BEGIN(fp_unavailable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) 	IVEC=0x800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) 	IRECONCILE=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) INT_DEFINE_END(fp_unavailable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) EXC_REAL_BEGIN(fp_unavailable, 0x800, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) 	GEN_INT_ENTRY fp_unavailable, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) EXC_REAL_END(fp_unavailable, 0x800, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) EXC_VIRT_BEGIN(fp_unavailable, 0x4800, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) 	GEN_INT_ENTRY fp_unavailable, virt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) EXC_VIRT_END(fp_unavailable, 0x4800, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) EXC_COMMON_BEGIN(fp_unavailable_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) 	GEN_COMMON fp_unavailable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) 	bne	1f			/* if from user, just load it up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) 	RECONCILE_IRQ_STATE(r10, r11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) 	bl	kernel_fp_unavailable_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) 0:	trap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) 	EMIT_BUG_ENTRY 0b, __FILE__, __LINE__, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) 	/* Test if 2 TM state bits are zero.  If non-zero (ie. userspace was in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) 	 * transaction), go do TM stuff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) 	rldicl.	r0, r12, (64-MSR_TS_LG), (64-2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) 	bne-	2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) END_FTR_SECTION_IFSET(CPU_FTR_TM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) 	bl	load_up_fpu
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) 	b	fast_interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) 2:	/* User process was in a transaction */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) 	RECONCILE_IRQ_STATE(r10, r11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) 	bl	fp_unavailable_tm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) 	GEN_KVM fp_unavailable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805)  * Interrupt 0x900 - Decrementer Interrupt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806)  * This is an asynchronous interrupt in response to a decrementer exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807)  * (e.g., DEC has wrapped below zero). It is maskable in hardware by clearing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808)  * MSR[EE], and soft-maskable with IRQS_DISABLED mask (i.e.,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809)  * local_irq_disable()).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811)  * Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812)  * This calls into Linux timer handler. NVGPRs are not saved (see 0x500).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814)  * If soft masked, the masked handler will note the pending interrupt for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815)  * replay, and bump the decrementer to a high value, leaving MSR[EE] enabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816)  * in the interrupted context.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817)  * If PPC_WATCHDOG is configured, the soft masked handler will actually set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818)  * things back up to run soft_nmi_interrupt as a regular interrupt handler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819)  * on the emergency stack.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) INT_DEFINE_BEGIN(decrementer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) 	IVEC=0x900
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) 	IMASK=IRQS_DISABLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) INT_DEFINE_END(decrementer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) EXC_REAL_BEGIN(decrementer, 0x900, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) 	GEN_INT_ENTRY decrementer, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) EXC_REAL_END(decrementer, 0x900, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) EXC_VIRT_BEGIN(decrementer, 0x4900, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) 	GEN_INT_ENTRY decrementer, virt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) EXC_VIRT_END(decrementer, 0x4900, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) EXC_COMMON_BEGIN(decrementer_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) 	GEN_COMMON decrementer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) 	FINISH_NAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) 	RUNLATCH_ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) 	bl	timer_interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) 	GEN_KVM decrementer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847)  * Interrupt 0x980 - Hypervisor Decrementer Interrupt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848)  * This is an asynchronous interrupt, similar to 0x900 but for the HDEC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849)  * register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851)  * Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852)  * Linux does not use this outside KVM where it's used to keep a host timer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853)  * while the guest is given control of DEC. It should normally be caught by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854)  * the KVM test and routed there.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) INT_DEFINE_BEGIN(hdecrementer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) 	IVEC=0x980
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) 	IHSRR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) 	ISTACK=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) 	IRECONCILE=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) 	IKVM_VIRT=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) INT_DEFINE_END(hdecrementer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) EXC_REAL_BEGIN(hdecrementer, 0x980, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) 	GEN_INT_ENTRY hdecrementer, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) EXC_REAL_END(hdecrementer, 0x980, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) EXC_VIRT_BEGIN(hdecrementer, 0x4980, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) 	GEN_INT_ENTRY hdecrementer, virt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) EXC_VIRT_END(hdecrementer, 0x4980, 0x80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) EXC_COMMON_BEGIN(hdecrementer_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) 	__GEN_COMMON_ENTRY hdecrementer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) 	 * Hypervisor decrementer interrupts not caught by the KVM test
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) 	 * shouldn't occur but are sometimes left pending on exit from a KVM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) 	 * guest.  We don't need to do anything to clear them, as they are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) 	 * edge-triggered.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) 	 * Be careful to avoid touching the kernel stack.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) 	ld	r10,PACA_EXGEN+EX_CTR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) 	mtctr	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) 	mtcrf	0x80,r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) 	ld	r9,PACA_EXGEN+EX_R9(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) 	ld	r10,PACA_EXGEN+EX_R10(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) 	ld	r11,PACA_EXGEN+EX_R11(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) 	ld	r12,PACA_EXGEN+EX_R12(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) 	ld	r13,PACA_EXGEN+EX_R13(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) 	HRFI_TO_KERNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) 	GEN_KVM hdecrementer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895)  * Interrupt 0xa00 - Directed Privileged Doorbell Interrupt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896)  * This is an asynchronous interrupt in response to a msgsndp doorbell.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897)  * It is maskable in hardware by clearing MSR[EE], and soft-maskable with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898)  * IRQS_DISABLED mask (i.e., local_irq_disable()).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900)  * Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901)  * Guests may use this for IPIs between threads in a core if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902)  * hypervisor supports it. NVGPRS are not saved (see 0x500).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904)  * If soft masked, the masked handler will note the pending interrupt for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905)  * replay, leaving MSR[EE] enabled in the interrupted context because the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906)  * doorbells are edge triggered.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) INT_DEFINE_BEGIN(doorbell_super)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) 	IVEC=0xa00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) 	IMASK=IRQS_DISABLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) INT_DEFINE_END(doorbell_super)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) EXC_REAL_BEGIN(doorbell_super, 0xa00, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) 	GEN_INT_ENTRY doorbell_super, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) EXC_REAL_END(doorbell_super, 0xa00, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) EXC_VIRT_BEGIN(doorbell_super, 0x4a00, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) 	GEN_INT_ENTRY doorbell_super, virt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) EXC_VIRT_END(doorbell_super, 0x4a00, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) EXC_COMMON_BEGIN(doorbell_super_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) 	GEN_COMMON doorbell_super
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) 	FINISH_NAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) 	RUNLATCH_ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) #ifdef CONFIG_PPC_DOORBELL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) 	bl	doorbell_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) 	bl	unknown_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) 	GEN_KVM doorbell_super
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) EXC_REAL_NONE(0xb00, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) EXC_VIRT_NONE(0x4b00, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941)  * Interrupt 0xc00 - System Call Interrupt (syscall, hcall).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942)  * This is a synchronous interrupt invoked with the "sc" instruction. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943)  * system call is invoked with "sc 0" and does not alter the HV bit, so it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944)  * is directed to the currently running OS. The hypercall is invoked with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945)  * "sc 1" and it sets HV=1, so it elevates to hypervisor.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947)  * In HPT, sc 1 always goes to 0xc00 real mode. In RADIX, sc 1 can go to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948)  * 0x4c00 virtual mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950)  * Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951)  * If the KVM test fires then it was due to a hypercall and is accordingly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952)  * routed to KVM. Otherwise this executes a normal Linux system call.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954)  * Call convention:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956)  * syscall and hypercalls register conventions are documented in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957)  * Documentation/powerpc/syscall64-abi.rst and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958)  * Documentation/powerpc/papr_hcalls.rst respectively.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960)  * The intersection of volatile registers that don't contain possible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961)  * inputs is: cr0, xer, ctr. We may use these as scratch regs upon entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962)  * without saving, though xer is not a good idea to use, as hardware may
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963)  * interpret some bits so it may be costly to change them.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) INT_DEFINE_BEGIN(system_call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) 	IVEC=0xc00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) 	IKVM_VIRT=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) INT_DEFINE_END(system_call)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) .macro SYSTEM_CALL virt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) 	 * There is a little bit of juggling to get syscall and hcall
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) 	 * working well. Save r13 in ctr to avoid using SPRG scratch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) 	 * register.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) 	 * Userspace syscalls have already saved the PPR, hcalls must save
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) 	 * it before setting HMT_MEDIUM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) 	mtctr	r13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) 	GET_PACA(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) 	std	r10,PACA_EXGEN+EX_R10(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) 	INTERRUPT_TO_KERNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) 	KVMTEST system_call /* uses r10, branch to system_call_kvm */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) 	mfctr	r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) 	mr	r9,r13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) 	GET_PACA(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) 	INTERRUPT_TO_KERNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) #ifdef CONFIG_PPC_FAST_ENDIAN_SWITCH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) 	cmpdi	r0,0x1ebe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) 	beq-	1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) 	/* We reach here with PACA in r13, r13 in r9. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) 	mfspr	r11,SPRN_SRR0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) 	mfspr	r12,SPRN_SRR1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) 	HMT_MEDIUM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) 	.if ! \virt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) 	__LOAD_HANDLER(r10, system_call_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) 	mtspr	SPRN_SRR0,r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) 	ld	r10,PACAKMSR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) 	mtspr	SPRN_SRR1,r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) 	RFI_TO_KERNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) 	b	.	/* prevent speculative execution */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) 	li	r10,MSR_RI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) 	mtmsrd 	r10,1			/* Set RI (EE=0) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) #ifdef CONFIG_RELOCATABLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) 	__LOAD_HANDLER(r10, system_call_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) 	mtctr	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) 	bctr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) 	b	system_call_common
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) #ifdef CONFIG_PPC_FAST_ENDIAN_SWITCH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) 	/* Fast LE/BE switch system call */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) 1:	mfspr	r12,SPRN_SRR1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) 	xori	r12,r12,MSR_LE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) 	mtspr	SPRN_SRR1,r12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) 	mr	r13,r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) 	RFI_TO_USER	/* return to userspace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) 	b	.	/* prevent speculative execution */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) EXC_REAL_BEGIN(system_call, 0xc00, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) 	SYSTEM_CALL 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) EXC_REAL_END(system_call, 0xc00, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) EXC_VIRT_BEGIN(system_call, 0x4c00, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) 	SYSTEM_CALL 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) EXC_VIRT_END(system_call, 0x4c00, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) TRAMP_REAL_BEGIN(system_call_kvm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) 	 * This is a hcall, so register convention is as above, with these
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) 	 * differences:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) 	 * r13 = PACA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) 	 * ctr = orig r13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) 	 * orig r10 saved in PACA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) 	 /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) 	  * Save the PPR (on systems that support it) before changing to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) 	  * HMT_MEDIUM. That allows the KVM code to save that value into the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) 	  * guest state (it is the guest's PPR value).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) 	  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) 	mfspr	r10,SPRN_PPR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) 	std	r10,HSTATE_PPR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) 	HMT_MEDIUM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) 	mfctr	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) 	SET_SCRATCH0(r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) 	mfcr	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) 	std	r12,HSTATE_SCRATCH0(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) 	sldi	r12,r10,32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) 	ori	r12,r12,0xc00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) #ifdef CONFIG_RELOCATABLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) 	 * Requires __LOAD_FAR_HANDLER beause kvmppc_interrupt lives
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) 	 * outside the head section.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) 	__LOAD_FAR_HANDLER(r10, kvmppc_interrupt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) 	mtctr   r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) 	ld	r10,PACA_EXGEN+EX_R10(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) 	bctr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) 	ld	r10,PACA_EXGEN+EX_R10(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) 	b       kvmppc_interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085)  * Interrupt 0xd00 - Trace Interrupt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086)  * This is a synchronous interrupt in response to instruction step or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087)  * breakpoint faults.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) INT_DEFINE_BEGIN(single_step)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) 	IVEC=0xd00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) INT_DEFINE_END(single_step)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) EXC_REAL_BEGIN(single_step, 0xd00, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) 	GEN_INT_ENTRY single_step, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) EXC_REAL_END(single_step, 0xd00, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) EXC_VIRT_BEGIN(single_step, 0x4d00, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) 	GEN_INT_ENTRY single_step, virt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) EXC_VIRT_END(single_step, 0x4d00, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) EXC_COMMON_BEGIN(single_step_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) 	GEN_COMMON single_step
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) 	bl	single_step_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) 	GEN_KVM single_step
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112)  * Interrupt 0xe00 - Hypervisor Data Storage Interrupt (HDSI).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113)  * This is a synchronous interrupt in response to an MMU fault caused by a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114)  * guest data access.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116)  * Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117)  * This should always get routed to KVM. In radix MMU mode, this is caused
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118)  * by a guest nested radix access that can't be performed due to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119)  * partition scope page table. In hash mode, this can be caused by guests
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120)  * running with translation disabled (virtual real mode) or with VPM enabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121)  * KVM will update the page table structures or disallow the access.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) INT_DEFINE_BEGIN(h_data_storage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) 	IVEC=0xe00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) 	IHSRR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) 	IDAR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) 	IDSISR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) 	IKVM_SKIP=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) 	IKVM_VIRT=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) INT_DEFINE_END(h_data_storage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) EXC_REAL_BEGIN(h_data_storage, 0xe00, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) 	GEN_INT_ENTRY h_data_storage, virt=0, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) EXC_REAL_END(h_data_storage, 0xe00, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) EXC_VIRT_BEGIN(h_data_storage, 0x4e00, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) 	GEN_INT_ENTRY h_data_storage, virt=1, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) EXC_VIRT_END(h_data_storage, 0x4e00, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) EXC_COMMON_BEGIN(h_data_storage_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) 	GEN_COMMON h_data_storage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) 	addi    r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) BEGIN_MMU_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) 	ld	r4,_DAR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) 	li	r5,SIGSEGV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) 	bl      bad_page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) MMU_FTR_SECTION_ELSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) 	bl      unknown_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) ALT_MMU_FTR_SECTION_END_IFSET(MMU_FTR_TYPE_RADIX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) 	b       interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) 	GEN_KVM h_data_storage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155)  * Interrupt 0xe20 - Hypervisor Instruction Storage Interrupt (HISI).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156)  * This is a synchronous interrupt in response to an MMU fault caused by a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157)  * guest instruction fetch, similar to HDSI.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) INT_DEFINE_BEGIN(h_instr_storage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) 	IVEC=0xe20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) 	IHSRR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) 	IKVM_VIRT=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) INT_DEFINE_END(h_instr_storage)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) EXC_REAL_BEGIN(h_instr_storage, 0xe20, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) 	GEN_INT_ENTRY h_instr_storage, virt=0, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) EXC_REAL_END(h_instr_storage, 0xe20, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) EXC_VIRT_BEGIN(h_instr_storage, 0x4e20, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) 	GEN_INT_ENTRY h_instr_storage, virt=1, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) EXC_VIRT_END(h_instr_storage, 0x4e20, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) EXC_COMMON_BEGIN(h_instr_storage_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) 	GEN_COMMON h_instr_storage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) 	bl	unknown_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) 	GEN_KVM h_instr_storage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182)  * Interrupt 0xe40 - Hypervisor Emulation Assistance Interrupt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) INT_DEFINE_BEGIN(emulation_assist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) 	IVEC=0xe40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) 	IHSRR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) 	IKVM_VIRT=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) INT_DEFINE_END(emulation_assist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) EXC_REAL_BEGIN(emulation_assist, 0xe40, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) 	GEN_INT_ENTRY emulation_assist, virt=0, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) EXC_REAL_END(emulation_assist, 0xe40, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) EXC_VIRT_BEGIN(emulation_assist, 0x4e40, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) 	GEN_INT_ENTRY emulation_assist, virt=1, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) EXC_VIRT_END(emulation_assist, 0x4e40, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) EXC_COMMON_BEGIN(emulation_assist_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) 	GEN_COMMON emulation_assist
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) 	bl	emulation_assist_interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) 	REST_NVGPRS(r1) /* instruction emulation may change GPRs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) 	GEN_KVM emulation_assist
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208)  * Interrupt 0xe60 - Hypervisor Maintenance Interrupt (HMI).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209)  * This is an asynchronous interrupt caused by a Hypervisor Maintenance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210)  * Exception. It is always taken in real mode but uses HSRR registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211)  * unlike SRESET and MCE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213)  * It is maskable in hardware by clearing MSR[EE], and partially soft-maskable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214)  * with IRQS_DISABLED mask (i.e., local_irq_disable()).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216)  * Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217)  * This is a special case, this is handled similarly to machine checks, with an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218)  * initial real mode handler that is not soft-masked, which attempts to fix the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219)  * problem. Then a regular handler which is soft-maskable and reports the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220)  * problem.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222)  * The emergency stack is used for the early real mode handler.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224)  * XXX: unclear why MCE and HMI schemes could not be made common, e.g.,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225)  * either use soft-masking for the MCE, or use irq_work for the HMI.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227)  * KVM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228)  * Unlike MCE, this calls into KVM without calling the real mode handler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229)  * first.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) INT_DEFINE_BEGIN(hmi_exception_early)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) 	IVEC=0xe60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) 	IHSRR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) 	IREALMODE_COMMON=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) 	ISTACK=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) 	IRECONCILE=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) 	IKUAP=0 /* We don't touch AMR here, we never go to virtual mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) INT_DEFINE_END(hmi_exception_early)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) INT_DEFINE_BEGIN(hmi_exception)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) 	IVEC=0xe60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) 	IHSRR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) 	IMASK=IRQS_DISABLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) INT_DEFINE_END(hmi_exception)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) EXC_REAL_BEGIN(hmi_exception, 0xe60, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) 	GEN_INT_ENTRY hmi_exception_early, virt=0, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) EXC_REAL_END(hmi_exception, 0xe60, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) EXC_VIRT_NONE(0x4e60, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) EXC_COMMON_BEGIN(hmi_exception_early_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) 	__GEN_REALMODE_COMMON_ENTRY hmi_exception_early
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) 	mr	r10,r1			/* Save r1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) 	ld	r1,PACAEMERGSP(r13)	/* Use emergency stack for realmode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) 	subi	r1,r1,INT_FRAME_SIZE	/* alloc stack frame		*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) 	__GEN_COMMON_BODY hmi_exception_early
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) 	bl	hmi_exception_realmode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) 	cmpdi	cr0,r3,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) 	bne	1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) 	EXCEPTION_RESTORE_REGS hsrr=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) 	HRFI_TO_USER_OR_KERNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) 	 * Go to virtual mode and pull the HMI event information from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) 	 * firmware.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) 	EXCEPTION_RESTORE_REGS hsrr=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) 	GEN_INT_ENTRY hmi_exception, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) 	GEN_KVM hmi_exception_early
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) EXC_COMMON_BEGIN(hmi_exception_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) 	GEN_COMMON hmi_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) 	FINISH_NAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) 	RUNLATCH_ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) 	bl	handle_hmi_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) 	GEN_KVM hmi_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292)  * Interrupt 0xe80 - Directed Hypervisor Doorbell Interrupt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293)  * This is an asynchronous interrupt in response to a msgsnd doorbell.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294)  * Similar to the 0xa00 doorbell but for host rather than guest.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) INT_DEFINE_BEGIN(h_doorbell)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) 	IVEC=0xe80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) 	IHSRR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) 	IMASK=IRQS_DISABLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) 	IKVM_VIRT=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) INT_DEFINE_END(h_doorbell)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) EXC_REAL_BEGIN(h_doorbell, 0xe80, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) 	GEN_INT_ENTRY h_doorbell, virt=0, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) EXC_REAL_END(h_doorbell, 0xe80, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) EXC_VIRT_BEGIN(h_doorbell, 0x4e80, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) 	GEN_INT_ENTRY h_doorbell, virt=1, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) EXC_VIRT_END(h_doorbell, 0x4e80, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) EXC_COMMON_BEGIN(h_doorbell_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) 	GEN_COMMON h_doorbell
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) 	FINISH_NAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) 	RUNLATCH_ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) #ifdef CONFIG_PPC_DOORBELL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) 	bl	doorbell_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) 	bl	unknown_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) 	GEN_KVM h_doorbell
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326)  * Interrupt 0xea0 - Hypervisor Virtualization Interrupt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327)  * This is an asynchronous interrupt in response to an "external exception".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328)  * Similar to 0x500 but for host only.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) INT_DEFINE_BEGIN(h_virt_irq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) 	IVEC=0xea0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) 	IHSRR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) 	IMASK=IRQS_DISABLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) 	IKVM_VIRT=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) INT_DEFINE_END(h_virt_irq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) EXC_REAL_BEGIN(h_virt_irq, 0xea0, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) 	GEN_INT_ENTRY h_virt_irq, virt=0, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) EXC_REAL_END(h_virt_irq, 0xea0, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) EXC_VIRT_BEGIN(h_virt_irq, 0x4ea0, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) 	GEN_INT_ENTRY h_virt_irq, virt=1, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) EXC_VIRT_END(h_virt_irq, 0x4ea0, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) EXC_COMMON_BEGIN(h_virt_irq_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) 	GEN_COMMON h_virt_irq
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) 	FINISH_NAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) 	RUNLATCH_ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) 	bl	do_IRQ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) 	GEN_KVM h_virt_irq
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) EXC_REAL_NONE(0xec0, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) EXC_VIRT_NONE(0x4ec0, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) EXC_REAL_NONE(0xee0, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) EXC_VIRT_NONE(0x4ee0, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362)  * Interrupt 0xf00 - Performance Monitor Interrupt (PMI, PMU).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363)  * This is an asynchronous interrupt in response to a PMU exception.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364)  * It is maskable in hardware by clearing MSR[EE], and soft-maskable with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365)  * IRQS_PMI_DISABLED mask (NOTE: NOT local_irq_disable()).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367)  * Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368)  * This calls into the perf subsystem.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370)  * Like the watchdog soft-nmi, it appears an NMI interrupt to Linux, in that it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371)  * runs under local_irq_disable. However it may be soft-masked in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372)  * powerpc-specific code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374)  * If soft masked, the masked handler will note the pending interrupt for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375)  * replay, and clear MSR[EE] in the interrupted context.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) INT_DEFINE_BEGIN(performance_monitor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) 	IVEC=0xf00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) 	IMASK=IRQS_PMI_DISABLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) INT_DEFINE_END(performance_monitor)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) EXC_REAL_BEGIN(performance_monitor, 0xf00, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) 	GEN_INT_ENTRY performance_monitor, virt=0, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) EXC_REAL_END(performance_monitor, 0xf00, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) EXC_VIRT_BEGIN(performance_monitor, 0x4f00, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) 	GEN_INT_ENTRY performance_monitor, virt=1, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) EXC_VIRT_END(performance_monitor, 0x4f00, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) EXC_COMMON_BEGIN(performance_monitor_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) 	GEN_COMMON performance_monitor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) 	FINISH_NAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) 	RUNLATCH_ON
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) 	bl	performance_monitor_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) 	GEN_KVM performance_monitor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403)  * Interrupt 0xf20 - Vector Unavailable Interrupt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404)  * This is a synchronous interrupt in response to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405)  * executing a vector (or altivec) instruction with MSR[VEC]=0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406)  * Similar to FP unavailable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) INT_DEFINE_BEGIN(altivec_unavailable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) 	IVEC=0xf20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) 	IRECONCILE=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) INT_DEFINE_END(altivec_unavailable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) EXC_REAL_BEGIN(altivec_unavailable, 0xf20, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) 	GEN_INT_ENTRY altivec_unavailable, virt=0, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) EXC_REAL_END(altivec_unavailable, 0xf20, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419) EXC_VIRT_BEGIN(altivec_unavailable, 0x4f20, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) 	GEN_INT_ENTRY altivec_unavailable, virt=1, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) EXC_VIRT_END(altivec_unavailable, 0x4f20, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) EXC_COMMON_BEGIN(altivec_unavailable_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) 	GEN_COMMON altivec_unavailable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) #ifdef CONFIG_ALTIVEC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) 	beq	1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428)   BEGIN_FTR_SECTION_NESTED(69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) 	/* Test if 2 TM state bits are zero.  If non-zero (ie. userspace was in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) 	 * transaction), go do TM stuff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) 	rldicl.	r0, r12, (64-MSR_TS_LG), (64-2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) 	bne-	2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434)   END_FTR_SECTION_NESTED(CPU_FTR_TM, CPU_FTR_TM, 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) 	bl	load_up_altivec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) 	b	fast_interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) 2:	/* User process was in a transaction */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440) 	RECONCILE_IRQ_STATE(r10, r11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) 	bl	altivec_unavailable_tm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) 	RECONCILE_IRQ_STATE(r10, r11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) 	bl	altivec_unavailable_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) 	GEN_KVM altivec_unavailable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457)  * Interrupt 0xf40 - VSX Unavailable Interrupt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458)  * This is a synchronous interrupt in response to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459)  * executing a VSX instruction with MSR[VSX]=0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460)  * Similar to FP unavailable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) INT_DEFINE_BEGIN(vsx_unavailable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) 	IVEC=0xf40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) 	IRECONCILE=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) INT_DEFINE_END(vsx_unavailable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) EXC_REAL_BEGIN(vsx_unavailable, 0xf40, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) 	GEN_INT_ENTRY vsx_unavailable, virt=0, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) EXC_REAL_END(vsx_unavailable, 0xf40, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) EXC_VIRT_BEGIN(vsx_unavailable, 0x4f40, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) 	GEN_INT_ENTRY vsx_unavailable, virt=1, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) EXC_VIRT_END(vsx_unavailable, 0x4f40, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) EXC_COMMON_BEGIN(vsx_unavailable_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) 	GEN_COMMON vsx_unavailable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) #ifdef CONFIG_VSX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) 	beq	1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482)   BEGIN_FTR_SECTION_NESTED(69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) 	/* Test if 2 TM state bits are zero.  If non-zero (ie. userspace was in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) 	 * transaction), go do TM stuff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) 	rldicl.	r0, r12, (64-MSR_TS_LG), (64-2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) 	bne-	2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488)   END_FTR_SECTION_NESTED(CPU_FTR_TM, CPU_FTR_TM, 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) 	b	load_up_vsx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) 2:	/* User process was in a transaction */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) 	RECONCILE_IRQ_STATE(r10, r11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) 	bl	vsx_unavailable_tm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) END_FTR_SECTION_IFSET(CPU_FTR_VSX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) 	RECONCILE_IRQ_STATE(r10, r11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) 	bl	vsx_unavailable_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) 	GEN_KVM vsx_unavailable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510)  * Interrupt 0xf60 - Facility Unavailable Interrupt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511)  * This is a synchronous interrupt in response to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512)  * executing an instruction without access to the facility that can be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513)  * resolved by the OS (e.g., FSCR, MSR).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514)  * Similar to FP unavailable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) INT_DEFINE_BEGIN(facility_unavailable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) 	IVEC=0xf60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) INT_DEFINE_END(facility_unavailable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) EXC_REAL_BEGIN(facility_unavailable, 0xf60, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) 	GEN_INT_ENTRY facility_unavailable, virt=0, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) EXC_REAL_END(facility_unavailable, 0xf60, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) EXC_VIRT_BEGIN(facility_unavailable, 0x4f60, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) 	GEN_INT_ENTRY facility_unavailable, virt=1, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) EXC_VIRT_END(facility_unavailable, 0x4f60, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) EXC_COMMON_BEGIN(facility_unavailable_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) 	GEN_COMMON facility_unavailable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) 	bl	facility_unavailable_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) 	REST_NVGPRS(r1) /* instruction emulation may change GPRs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) 	GEN_KVM facility_unavailable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540)  * Interrupt 0xf60 - Hypervisor Facility Unavailable Interrupt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541)  * This is a synchronous interrupt in response to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542)  * executing an instruction without access to the facility that can only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543)  * be resolved in HV mode (e.g., HFSCR).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544)  * Similar to FP unavailable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) INT_DEFINE_BEGIN(h_facility_unavailable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) 	IVEC=0xf80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) 	IHSRR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) 	IKVM_VIRT=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) INT_DEFINE_END(h_facility_unavailable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) EXC_REAL_BEGIN(h_facility_unavailable, 0xf80, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) 	GEN_INT_ENTRY h_facility_unavailable, virt=0, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) EXC_REAL_END(h_facility_unavailable, 0xf80, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) EXC_VIRT_BEGIN(h_facility_unavailable, 0x4f80, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) 	GEN_INT_ENTRY h_facility_unavailable, virt=1, ool=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) EXC_VIRT_END(h_facility_unavailable, 0x4f80, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) EXC_COMMON_BEGIN(h_facility_unavailable_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) 	GEN_COMMON h_facility_unavailable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) 	bl	facility_unavailable_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) 	REST_NVGPRS(r1) /* XXX Shouldn't be necessary in practice */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) 	GEN_KVM h_facility_unavailable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) EXC_REAL_NONE(0xfa0, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) EXC_VIRT_NONE(0x4fa0, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) EXC_REAL_NONE(0xfc0, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) EXC_VIRT_NONE(0x4fc0, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) EXC_REAL_NONE(0xfe0, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) EXC_VIRT_NONE(0x4fe0, 0x20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) EXC_REAL_NONE(0x1000, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) EXC_VIRT_NONE(0x5000, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) EXC_REAL_NONE(0x1100, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) EXC_VIRT_NONE(0x5100, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) #ifdef CONFIG_CBE_RAS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) INT_DEFINE_BEGIN(cbe_system_error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) 	IVEC=0x1200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) 	IHSRR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) 	IKVM_SKIP=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) INT_DEFINE_END(cbe_system_error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) EXC_REAL_BEGIN(cbe_system_error, 0x1200, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590) 	GEN_INT_ENTRY cbe_system_error, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) EXC_REAL_END(cbe_system_error, 0x1200, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) EXC_VIRT_NONE(0x5200, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) EXC_COMMON_BEGIN(cbe_system_error_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) 	GEN_COMMON cbe_system_error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) 	bl	cbe_system_error_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) 	GEN_KVM cbe_system_error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) #else /* CONFIG_CBE_RAS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) EXC_REAL_NONE(0x1200, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) EXC_VIRT_NONE(0x5200, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) INT_DEFINE_BEGIN(instruction_breakpoint)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) 	IVEC=0x1300
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) 	IKVM_SKIP=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) INT_DEFINE_END(instruction_breakpoint)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) EXC_REAL_BEGIN(instruction_breakpoint, 0x1300, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) 	GEN_INT_ENTRY instruction_breakpoint, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) EXC_REAL_END(instruction_breakpoint, 0x1300, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) EXC_VIRT_BEGIN(instruction_breakpoint, 0x5300, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) 	GEN_INT_ENTRY instruction_breakpoint, virt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) EXC_VIRT_END(instruction_breakpoint, 0x5300, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) EXC_COMMON_BEGIN(instruction_breakpoint_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) 	GEN_COMMON instruction_breakpoint
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) 	bl	instruction_breakpoint_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) 	GEN_KVM instruction_breakpoint
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) EXC_REAL_NONE(0x1400, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) EXC_VIRT_NONE(0x5400, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634)  * Interrupt 0x1500 - Soft Patch Interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636)  * Handling:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637)  * This is an implementation specific interrupt which can be used for a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638)  * range of exceptions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640)  * This interrupt handler is unique in that it runs the denormal assist
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641)  * code even for guests (and even in guest context) without going to KVM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642)  * for speed. POWER9 does not raise denorm exceptions, so this special case
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643)  * could be phased out in future to reduce special cases.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) INT_DEFINE_BEGIN(denorm_exception)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) 	IVEC=0x1500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) 	IHSRR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) 	IBRANCH_TO_COMMON=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) INT_DEFINE_END(denorm_exception)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652) EXC_REAL_BEGIN(denorm_exception, 0x1500, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) 	GEN_INT_ENTRY denorm_exception, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) #ifdef CONFIG_PPC_DENORMALISATION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) 	andis.	r10,r12,(HSRR1_DENORM)@h /* denorm? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) 	bne+	denorm_assist
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) 	GEN_BRANCH_TO_COMMON denorm_exception, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) EXC_REAL_END(denorm_exception, 0x1500, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) #ifdef CONFIG_PPC_DENORMALISATION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) EXC_VIRT_BEGIN(denorm_exception, 0x5500, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) 	GEN_INT_ENTRY denorm_exception, virt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) 	andis.	r10,r12,(HSRR1_DENORM)@h /* denorm? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) 	bne+	denorm_assist
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) 	GEN_BRANCH_TO_COMMON denorm_exception, virt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) EXC_VIRT_END(denorm_exception, 0x5500, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) EXC_VIRT_NONE(0x5500, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) #ifdef CONFIG_PPC_DENORMALISATION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) TRAMP_REAL_BEGIN(denorm_assist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675)  * To denormalise we need to move a copy of the register to itself.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676)  * For POWER6 do that here for all FP regs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) 	mfmsr	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) 	ori	r10,r10,(MSR_FP|MSR_FE0|MSR_FE1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) 	xori	r10,r10,(MSR_FE0|MSR_FE1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) 	mtmsrd	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) 	sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) 	.Lreg=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) 	.rept 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) 	fmr	.Lreg,.Lreg
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) 	.Lreg=.Lreg+1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) 	.endr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) FTR_SECTION_ELSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692)  * To denormalise we need to move a copy of the register to itself.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693)  * For POWER7 do that here for the first 32 VSX registers only.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) 	mfmsr	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) 	oris	r10,r10,MSR_VSX@h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) 	mtmsrd	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) 	sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) 	.Lreg=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) 	.rept 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) 	XVCPSGNDP(.Lreg,.Lreg,.Lreg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) 	.Lreg=.Lreg+1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) 	.endr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) 	b	denorm_done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712)  * To denormalise we need to move a copy of the register to itself.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713)  * For POWER8 we need to do that for all 64 VSX registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) 	.Lreg=32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) 	.rept 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) 	XVCPSGNDP(.Lreg,.Lreg,.Lreg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) 	.Lreg=.Lreg+1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) 	.endr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) denorm_done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) 	mfspr	r11,SPRN_HSRR0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) 	subi	r11,r11,4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) 	mtspr	SPRN_HSRR0,r11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) 	mtcrf	0x80,r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) 	ld	r9,PACA_EXGEN+EX_R9(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) 	ld	r10,PACA_EXGEN+EX_PPR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) 	mtspr	SPRN_PPR,r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) BEGIN_FTR_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) 	ld	r10,PACA_EXGEN+EX_CFAR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) 	mtspr	SPRN_CFAR,r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) 	ld	r10,PACA_EXGEN+EX_R10(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) 	ld	r11,PACA_EXGEN+EX_R11(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) 	ld	r12,PACA_EXGEN+EX_R12(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) 	ld	r13,PACA_EXGEN+EX_R13(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) 	HRFI_TO_UNKNOWN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) 	b	.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) EXC_COMMON_BEGIN(denorm_exception_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) 	GEN_COMMON denorm_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) 	bl	unknown_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) 	GEN_KVM denorm_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) #ifdef CONFIG_CBE_RAS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) INT_DEFINE_BEGIN(cbe_maintenance)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) 	IVEC=0x1600
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) 	IHSRR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) 	IKVM_SKIP=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) INT_DEFINE_END(cbe_maintenance)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) EXC_REAL_BEGIN(cbe_maintenance, 0x1600, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) 	GEN_INT_ENTRY cbe_maintenance, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) EXC_REAL_END(cbe_maintenance, 0x1600, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) EXC_VIRT_NONE(0x5600, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) EXC_COMMON_BEGIN(cbe_maintenance_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) 	GEN_COMMON cbe_maintenance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) 	bl	cbe_maintenance_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) 	GEN_KVM cbe_maintenance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) #else /* CONFIG_CBE_RAS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) EXC_REAL_NONE(0x1600, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) EXC_VIRT_NONE(0x5600, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) INT_DEFINE_BEGIN(altivec_assist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) 	IVEC=0x1700
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) INT_DEFINE_END(altivec_assist)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) EXC_REAL_BEGIN(altivec_assist, 0x1700, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) 	GEN_INT_ENTRY altivec_assist, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) EXC_REAL_END(altivec_assist, 0x1700, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) EXC_VIRT_BEGIN(altivec_assist, 0x5700, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) 	GEN_INT_ENTRY altivec_assist, virt=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) EXC_VIRT_END(altivec_assist, 0x5700, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) EXC_COMMON_BEGIN(altivec_assist_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) 	GEN_COMMON altivec_assist
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) #ifdef CONFIG_ALTIVEC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) 	bl	altivec_assist_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) 	REST_NVGPRS(r1) /* instruction emulation may change GPRs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) 	bl	unknown_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) 	GEN_KVM altivec_assist
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) #ifdef CONFIG_CBE_RAS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) INT_DEFINE_BEGIN(cbe_thermal)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) 	IVEC=0x1800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) 	IHSRR=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) 	IKVM_SKIP=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) 	IKVM_REAL=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) INT_DEFINE_END(cbe_thermal)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) EXC_REAL_BEGIN(cbe_thermal, 0x1800, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) 	GEN_INT_ENTRY cbe_thermal, virt=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815) EXC_REAL_END(cbe_thermal, 0x1800, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) EXC_VIRT_NONE(0x5800, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) EXC_COMMON_BEGIN(cbe_thermal_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) 	GEN_COMMON cbe_thermal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) 	bl	cbe_thermal_exception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) 	GEN_KVM cbe_thermal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) #else /* CONFIG_CBE_RAS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) EXC_REAL_NONE(0x1800, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) EXC_VIRT_NONE(0x5800, 0x100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) #ifdef CONFIG_PPC_WATCHDOG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) INT_DEFINE_BEGIN(soft_nmi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) 	IVEC=0x900
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) 	ISTACK=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) 	IRECONCILE=0	/* Soft-NMI may fire under local_irq_disable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) INT_DEFINE_END(soft_nmi)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840)  * Branch to soft_nmi_interrupt using the emergency stack. The emergency
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841)  * stack is one that is usable by maskable interrupts so long as MSR_EE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842)  * remains off. It is used for recovery when something has corrupted the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843)  * normal kernel stack, for example. The "soft NMI" must not use the process
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844)  * stack because we want irq disabled sections to avoid touching the stack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845)  * at all (other than PMU interrupts), so use the emergency stack for this,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846)  * and run it entirely with interrupts hard disabled.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) EXC_COMMON_BEGIN(soft_nmi_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) 	mfspr	r11,SPRN_SRR0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) 	mr	r10,r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) 	ld	r1,PACAEMERGSP(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) 	subi	r1,r1,INT_FRAME_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) 	__GEN_COMMON_BODY soft_nmi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) 	 * Set IRQS_ALL_DISABLED and save PACAIRQHAPPENED (see
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) 	 * system_reset_common)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) 	li	r10,IRQS_ALL_DISABLED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) 	stb	r10,PACAIRQSOFTMASK(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) 	lbz	r10,PACAIRQHAPPENED(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862) 	std	r10,RESULT(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) 	ori	r10,r10,PACA_IRQ_HARD_DIS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) 	stb	r10,PACAIRQHAPPENED(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) 	bl	soft_nmi_interrupt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) 	/* Clear MSR_RI before setting SRR0 and SRR1. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) 	li	r9,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) 	mtmsrd	r9,1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) 	 * Restore soft mask settings.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) 	ld	r10,RESULT(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) 	stb	r10,PACAIRQHAPPENED(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) 	ld	r10,SOFTE(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) 	stb	r10,PACAIRQSOFTMASK(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) 	kuap_restore_amr r9, r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) 	EXCEPTION_RESTORE_REGS hsrr=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) 	RFI_TO_KERNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) #endif /* CONFIG_PPC_WATCHDOG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888)  * An interrupt came in while soft-disabled. We set paca->irq_happened, then:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889)  * - If it was a decrementer interrupt, we bump the dec to max and and return.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890)  * - If it was a doorbell we return immediately since doorbells are edge
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891)  *   triggered and won't automatically refire.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892)  * - If it was a HMI we return immediately since we handled it in realmode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893)  *   and it won't refire.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894)  * - Else it is one of PACA_IRQ_MUST_HARD_MASK, so hard disable and return.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895)  * This is called with r10 containing the value to OR to the paca field.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) .macro MASKED_INTERRUPT hsrr=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) 	.if \hsrr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) masked_Hinterrupt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) masked_interrupt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) 	lbz	r11,PACAIRQHAPPENED(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) 	or	r11,r11,r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) 	stb	r11,PACAIRQHAPPENED(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) 	cmpwi	r10,PACA_IRQ_DEC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) 	bne	1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) 	lis	r10,0x7fff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) 	ori	r10,r10,0xffff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) 	mtspr	SPRN_DEC,r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) #ifdef CONFIG_PPC_WATCHDOG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) 	b	soft_nmi_common
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) 	b	2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) 1:	andi.	r10,r10,PACA_IRQ_MUST_HARD_MASK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917) 	beq	2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) 	xori	r12,r12,MSR_EE	/* clear MSR_EE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919) 	.if \hsrr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) 	mtspr	SPRN_HSRR1,r12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) 	mtspr	SPRN_SRR1,r12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) 	ori	r11,r11,PACA_IRQ_HARD_DIS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925) 	stb	r11,PACAIRQHAPPENED(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926) 2:	/* done */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) 	ld	r10,PACA_EXGEN+EX_CTR(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928) 	mtctr	r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) 	mtcrf	0x80,r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) 	std	r1,PACAR1(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931) 	ld	r9,PACA_EXGEN+EX_R9(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) 	ld	r10,PACA_EXGEN+EX_R10(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933) 	ld	r11,PACA_EXGEN+EX_R11(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) 	ld	r12,PACA_EXGEN+EX_R12(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935) 	ld	r13,PACA_EXGEN+EX_R13(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936) 	/* May return to masked low address where r13 is not set up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937) 	.if \hsrr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) 	HRFI_TO_KERNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939) 	.else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940) 	RFI_TO_KERNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941) 	.endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) 	b	.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) TRAMP_REAL_BEGIN(stf_barrier_fallback)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946) 	std	r9,PACA_EXRFI+EX_R9(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) 	std	r10,PACA_EXRFI+EX_R10(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948) 	sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949) 	ld	r9,PACA_EXRFI+EX_R9(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950) 	ld	r10,PACA_EXRFI+EX_R10(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951) 	ori	31,31,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952) 	.rept 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953) 	b	1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955) 	.endr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956) 	blr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958) /* Clobbers r10, r11, ctr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959) .macro L1D_DISPLACEMENT_FLUSH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960) 	ld	r10,PACA_RFI_FLUSH_FALLBACK_AREA(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961) 	ld	r11,PACA_L1D_FLUSH_SIZE(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962) 	srdi	r11,r11,(7 + 3) /* 128 byte lines, unrolled 8x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963) 	mtctr	r11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964) 	DCBT_BOOK3S_STOP_ALL_STREAM_IDS(r11) /* Stop prefetch streams */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966) 	/* order ld/st prior to dcbt stop all streams with flushing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967) 	sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970) 	 * The load addresses are at staggered offsets within cachelines,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971) 	 * which suits some pipelines better (on others it should not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) 	 * hurt).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975) 	ld	r11,(0x80 + 8)*0(r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976) 	ld	r11,(0x80 + 8)*1(r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977) 	ld	r11,(0x80 + 8)*2(r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978) 	ld	r11,(0x80 + 8)*3(r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979) 	ld	r11,(0x80 + 8)*4(r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980) 	ld	r11,(0x80 + 8)*5(r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981) 	ld	r11,(0x80 + 8)*6(r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982) 	ld	r11,(0x80 + 8)*7(r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983) 	addi	r10,r10,0x80*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) 	bdnz	1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987) TRAMP_REAL_BEGIN(entry_flush_fallback)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988) 	std	r9,PACA_EXRFI+EX_R9(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989) 	std	r10,PACA_EXRFI+EX_R10(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990) 	std	r11,PACA_EXRFI+EX_R11(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991) 	mfctr	r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992) 	L1D_DISPLACEMENT_FLUSH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993) 	mtctr	r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994) 	ld	r9,PACA_EXRFI+EX_R9(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995) 	ld	r10,PACA_EXRFI+EX_R10(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996) 	ld	r11,PACA_EXRFI+EX_R11(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997) 	blr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000)  * The SCV entry flush happens with interrupts enabled, so it must disable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001)  * to prevent EXRFI being clobbered by NMIs (e.g., soft_nmi_common). r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002)  * (containing LR) does not need to be preserved here because scv entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003)  * puts 0 in the pt_regs, CTR can be clobbered for the same reason.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) TRAMP_REAL_BEGIN(scv_entry_flush_fallback)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006) 	li	r10,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007) 	mtmsrd	r10,1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008) 	lbz	r10,PACAIRQHAPPENED(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009) 	ori	r10,r10,PACA_IRQ_HARD_DIS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010) 	stb	r10,PACAIRQHAPPENED(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011) 	std	r11,PACA_EXRFI+EX_R11(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012) 	L1D_DISPLACEMENT_FLUSH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) 	ld	r11,PACA_EXRFI+EX_R11(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014) 	li	r10,MSR_RI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015) 	mtmsrd	r10,1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) 	blr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018) TRAMP_REAL_BEGIN(rfi_flush_fallback)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019) 	SET_SCRATCH0(r13);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020) 	GET_PACA(r13);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021) 	std	r1,PACA_EXRFI+EX_R12(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022) 	ld	r1,PACAKSAVE(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023) 	std	r9,PACA_EXRFI+EX_R9(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024) 	std	r10,PACA_EXRFI+EX_R10(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025) 	std	r11,PACA_EXRFI+EX_R11(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026) 	mfctr	r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) 	L1D_DISPLACEMENT_FLUSH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028) 	mtctr	r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029) 	ld	r9,PACA_EXRFI+EX_R9(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030) 	ld	r10,PACA_EXRFI+EX_R10(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) 	ld	r11,PACA_EXRFI+EX_R11(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032) 	ld	r1,PACA_EXRFI+EX_R12(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033) 	GET_SCRATCH0(r13);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034) 	rfid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036) TRAMP_REAL_BEGIN(hrfi_flush_fallback)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037) 	SET_SCRATCH0(r13);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038) 	GET_PACA(r13);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) 	std	r1,PACA_EXRFI+EX_R12(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040) 	ld	r1,PACAKSAVE(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) 	std	r9,PACA_EXRFI+EX_R9(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) 	std	r10,PACA_EXRFI+EX_R10(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043) 	std	r11,PACA_EXRFI+EX_R11(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044) 	mfctr	r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045) 	L1D_DISPLACEMENT_FLUSH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046) 	mtctr	r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047) 	ld	r9,PACA_EXRFI+EX_R9(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048) 	ld	r10,PACA_EXRFI+EX_R10(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049) 	ld	r11,PACA_EXRFI+EX_R11(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050) 	ld	r1,PACA_EXRFI+EX_R12(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) 	GET_SCRATCH0(r13);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052) 	hrfid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054) TRAMP_REAL_BEGIN(rfscv_flush_fallback)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055) 	/* system call volatile */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056) 	mr	r7,r13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057) 	GET_PACA(r13);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058) 	mr	r8,r1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059) 	ld	r1,PACAKSAVE(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060) 	mfctr	r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061) 	ld	r10,PACA_RFI_FLUSH_FALLBACK_AREA(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062) 	ld	r11,PACA_L1D_FLUSH_SIZE(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063) 	srdi	r11,r11,(7 + 3) /* 128 byte lines, unrolled 8x */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064) 	mtctr	r11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065) 	DCBT_BOOK3S_STOP_ALL_STREAM_IDS(r11) /* Stop prefetch streams */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067) 	/* order ld/st prior to dcbt stop all streams with flushing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068) 	sync
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) 	 * The load adresses are at staggered offsets within cachelines,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) 	 * which suits some pipelines better (on others it should not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073) 	 * hurt).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076) 	ld	r11,(0x80 + 8)*0(r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077) 	ld	r11,(0x80 + 8)*1(r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078) 	ld	r11,(0x80 + 8)*2(r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079) 	ld	r11,(0x80 + 8)*3(r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080) 	ld	r11,(0x80 + 8)*4(r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081) 	ld	r11,(0x80 + 8)*5(r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082) 	ld	r11,(0x80 + 8)*6(r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083) 	ld	r11,(0x80 + 8)*7(r10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) 	addi	r10,r10,0x80*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085) 	bdnz	1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087) 	mtctr	r9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) 	li	r9,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089) 	li	r10,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090) 	li	r11,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091) 	mr	r1,r8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092) 	mr	r13,r7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) 	RFSCV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) USE_TEXT_SECTION()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097) _GLOBAL(do_uaccess_flush)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098) 	UACCESS_FLUSH_FIXUP_SECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099) 	nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100) 	nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101) 	nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102) 	blr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103) 	L1D_DISPLACEMENT_FLUSH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104) 	blr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105) _ASM_NOKPROBE_SYMBOL(do_uaccess_flush)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106) EXPORT_SYMBOL(do_uaccess_flush)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109) MASKED_INTERRUPT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110) MASKED_INTERRUPT hsrr=1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112) #ifdef CONFIG_KVM_BOOK3S_64_HANDLER
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113) kvmppc_skip_interrupt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115) 	 * Here all GPRs are unchanged from when the interrupt happened
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116) 	 * except for r13, which is saved in SPRG_SCRATCH0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118) 	mfspr	r13, SPRN_SRR0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119) 	addi	r13, r13, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120) 	mtspr	SPRN_SRR0, r13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) 	GET_SCRATCH0(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) 	RFI_TO_KERNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123) 	b	.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125) kvmppc_skip_Hinterrupt:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) 	 * Here all GPRs are unchanged from when the interrupt happened
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128) 	 * except for r13, which is saved in SPRG_SCRATCH0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130) 	mfspr	r13, SPRN_HSRR0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131) 	addi	r13, r13, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132) 	mtspr	SPRN_HSRR0, r13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133) 	GET_SCRATCH0(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) 	HRFI_TO_KERNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135) 	b	.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139) 	 * Relocation-on interrupts: A subset of the interrupts can be delivered
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140) 	 * with IR=1/DR=1, if AIL==2 and MSR.HV won't be changed by delivering
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141) 	 * it.  Addresses are the same as the original interrupt addresses, but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) 	 * offset by 0xc000000000004000.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143) 	 * It's impossible to receive interrupts below 0x300 via this mechanism.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144) 	 * KVM: None of these traps are from the guest ; anything that escalated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145) 	 * to HV=1 from HV=0 is delivered via real mode handlers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149) 	 * This uses the standard macro, since the original 0x300 vector
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150) 	 * only has extra guff for STAB-based processors -- which never
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151) 	 * come here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154) EXC_COMMON_BEGIN(ppc64_runlatch_on_trampoline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155) 	b	__ppc64_runlatch_on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157) USE_FIXED_SECTION(virt_trampolines)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159) 	 * All code below __end_interrupts is treated as soft-masked. If
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160) 	 * any code runs here with MSR[EE]=1, it must then cope with pending
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161) 	 * soft interrupt being raised (i.e., by ensuring it is replayed).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163) 	 * The __end_interrupts marker must be past the out-of-line (OOL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164) 	 * handlers, so that they are copied to real address 0x100 when running
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165) 	 * a relocatable kernel. This ensures they can be reached from the short
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) 	 * trampoline handlers (like 0x4f00, 0x4f20, etc.) which branch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167) 	 * directly, without using LOAD_HANDLER().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169) 	.align	7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170) 	.globl	__end_interrupts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171) __end_interrupts:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172) DEFINE_FIXED_SYMBOL(__end_interrupts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) #ifdef CONFIG_PPC_970_NAP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176) 	 * Called by exception entry code if _TLF_NAPPING was set, this clears
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177) 	 * the NAPPING flag, and redirects the exception exit to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178) 	 * power4_fixup_nap_return.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180) 	.globl power4_fixup_nap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181) EXC_COMMON_BEGIN(power4_fixup_nap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182) 	andc	r9,r9,r10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183) 	std	r9,TI_LOCAL_FLAGS(r11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184) 	LOAD_REG_ADDR(r10, power4_idle_nap_return)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185) 	std	r10,_NIP(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186) 	blr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188) power4_idle_nap_return:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189) 	blr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192) CLOSE_FIXED_SECTION(real_vectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193) CLOSE_FIXED_SECTION(real_trampolines);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194) CLOSE_FIXED_SECTION(virt_vectors);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195) CLOSE_FIXED_SECTION(virt_trampolines);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197) USE_TEXT_SECTION()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199) /* MSR[RI] should be clear because this uses SRR[01] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200) enable_machine_check:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201) 	mflr	r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202) 	bcl	20,31,$+4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203) 0:	mflr	r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204) 	addi	r3,r3,(1f - 0b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205) 	mtspr	SPRN_SRR0,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206) 	mfmsr	r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207) 	ori	r3,r3,MSR_ME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208) 	mtspr	SPRN_SRR1,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209) 	RFI_TO_KERNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210) 1:	mtlr	r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211) 	blr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213) /* MSR[RI] should be clear because this uses SRR[01] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214) disable_machine_check:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215) 	mflr	r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216) 	bcl	20,31,$+4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217) 0:	mflr	r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218) 	addi	r3,r3,(1f - 0b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219) 	mtspr	SPRN_SRR0,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220) 	mfmsr	r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221) 	li	r4,MSR_ME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222) 	andc	r3,r3,r4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223) 	mtspr	SPRN_SRR1,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) 	RFI_TO_KERNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225) 1:	mtlr	r0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) 	blr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229)  * Hash table stuff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231) 	.balign	IFETCH_ALIGN_BYTES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232) do_hash_page:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233) #ifdef CONFIG_PPC_BOOK3S_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234) 	lis	r0,(DSISR_BAD_FAULT_64S | DSISR_DABRMATCH | DSISR_KEYFAULT)@h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235) 	ori	r0,r0,DSISR_BAD_FAULT_64S@l
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236) 	and.	r0,r5,r0		/* weird error? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237) 	bne-	handle_page_fault	/* if not, try to insert a HPTE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240) 	 * If we are in an "NMI" (e.g., an interrupt when soft-disabled), then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241) 	 * don't call hash_page, just fail the fault. This is required to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242) 	 * prevent re-entrancy problems in the hash code, namely perf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243) 	 * interrupts hitting while something holds H_PAGE_BUSY, and taking a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244) 	 * hash fault. See the comment in hash_preload().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246) 	ld	r11, PACA_THREAD_INFO(r13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247) 	lwz	r0,TI_PREEMPT(r11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248) 	andis.	r0,r0,NMI_MASK@h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249) 	bne	77f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252) 	 * r3 contains the trap number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253) 	 * r4 contains the faulting address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254) 	 * r5 contains dsisr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255) 	 * r6 msr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257) 	 * at return r3 = 0 for success, 1 for page fault, negative for error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259) 	bl	__hash_page		/* build HPTE if possible */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260)         cmpdi	r3,0			/* see if __hash_page succeeded */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262) 	/* Success */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263) 	beq	interrupt_return	/* Return from exception on success */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265) 	/* Error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266) 	blt-	13f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268) 	/* Reload DAR/DSISR into r4/r5 for the DABR check below */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269) 	ld	r4,_DAR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270) 	ld      r5,_DSISR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271) #endif /* CONFIG_PPC_BOOK3S_64 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273) /* Here we have a page fault that hash_page can't handle. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274) handle_page_fault:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275) 11:	andis.  r0,r5,DSISR_DABRMATCH@h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276) 	bne-    handle_dabr_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278) 	bl	do_page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279) 	cmpdi	r3,0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280) 	beq+	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281) 	mr	r5,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283) 	ld	r4,_DAR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284) 	bl	bad_page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287) /* We have a data breakpoint exception - handle it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288) handle_dabr_fault:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289) 	ld      r4,_DAR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290) 	ld      r5,_DSISR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291) 	addi    r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292) 	bl      do_break
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294) 	 * do_break() may have changed the NV GPRS while handling a breakpoint.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295) 	 * If so, we need to restore them with their updated values.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297) 	REST_NVGPRS(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298) 	b       interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301) #ifdef CONFIG_PPC_BOOK3S_64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) /* We have a page fault that hash_page could handle but HV refused
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303)  * the PTE insertion
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305) 13:	mr	r5,r3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306) 	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307) 	ld	r4,_DAR(r1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308) 	bl	low_hash_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309) 	b	interrupt_return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313)  * We come here as a result of a DSI at a point where we don't want
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314)  * to call hash_page, such as when we are accessing memory (possibly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315)  * user memory) inside a PMU interrupt that occurred while interrupts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316)  * were soft-disabled.  We want to invoke the exception handler for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317)  * the access, or panic if there isn't a handler.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319) 77:	addi	r3,r1,STACK_FRAME_OVERHEAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320) 	li	r5,SIGSEGV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321) 	bl	bad_page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322) 	b	interrupt_return