xref: /OK3568_Linux_fs/kernel/arch/powerpc/include/asm/kvm_book3s_asm.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright SUSE Linux Products GmbH 2009
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Authors: Alexander Graf <agraf@suse.de>
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifndef __ASM_KVM_BOOK3S_ASM_H__
10*4882a593Smuzhiyun #define __ASM_KVM_BOOK3S_ASM_H__
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun /* XICS ICP register offsets */
13*4882a593Smuzhiyun #define XICS_XIRR		4
14*4882a593Smuzhiyun #define XICS_MFRR		0xc
15*4882a593Smuzhiyun #define XICS_IPI		2	/* interrupt source # for IPIs */
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun /* LPIDs we support with this build -- runtime limit may be lower */
18*4882a593Smuzhiyun #define KVMPPC_NR_LPIDS			(LPID_RSVD + 1)
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun /* Maximum number of threads per physical core */
21*4882a593Smuzhiyun #define MAX_SMT_THREADS		8
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun /* Maximum number of subcores per physical core */
24*4882a593Smuzhiyun #define MAX_SUBCORES		4
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #ifdef __ASSEMBLY__
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #ifdef CONFIG_KVM_BOOK3S_HANDLER
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #include <asm/kvm_asm.h>
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun .macro DO_KVM intno
33*4882a593Smuzhiyun 	.if (\intno == BOOK3S_INTERRUPT_SYSTEM_RESET) || \
34*4882a593Smuzhiyun 	    (\intno == BOOK3S_INTERRUPT_MACHINE_CHECK) || \
35*4882a593Smuzhiyun 	    (\intno == BOOK3S_INTERRUPT_DATA_STORAGE) || \
36*4882a593Smuzhiyun 	    (\intno == BOOK3S_INTERRUPT_INST_STORAGE) || \
37*4882a593Smuzhiyun 	    (\intno == BOOK3S_INTERRUPT_DATA_SEGMENT) || \
38*4882a593Smuzhiyun 	    (\intno == BOOK3S_INTERRUPT_INST_SEGMENT) || \
39*4882a593Smuzhiyun 	    (\intno == BOOK3S_INTERRUPT_EXTERNAL) || \
40*4882a593Smuzhiyun 	    (\intno == BOOK3S_INTERRUPT_EXTERNAL_HV) || \
41*4882a593Smuzhiyun 	    (\intno == BOOK3S_INTERRUPT_ALIGNMENT) || \
42*4882a593Smuzhiyun 	    (\intno == BOOK3S_INTERRUPT_PROGRAM) || \
43*4882a593Smuzhiyun 	    (\intno == BOOK3S_INTERRUPT_FP_UNAVAIL) || \
44*4882a593Smuzhiyun 	    (\intno == BOOK3S_INTERRUPT_DECREMENTER) || \
45*4882a593Smuzhiyun 	    (\intno == BOOK3S_INTERRUPT_SYSCALL) || \
46*4882a593Smuzhiyun 	    (\intno == BOOK3S_INTERRUPT_TRACE) || \
47*4882a593Smuzhiyun 	    (\intno == BOOK3S_INTERRUPT_PERFMON) || \
48*4882a593Smuzhiyun 	    (\intno == BOOK3S_INTERRUPT_ALTIVEC) || \
49*4882a593Smuzhiyun 	    (\intno == BOOK3S_INTERRUPT_VSX)
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun 	b	kvmppc_trampoline_\intno
52*4882a593Smuzhiyun kvmppc_resume_\intno:
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun 	.endif
55*4882a593Smuzhiyun .endm
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun #else
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun .macro DO_KVM intno
60*4882a593Smuzhiyun .endm
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun #endif /* CONFIG_KVM_BOOK3S_HANDLER */
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun #else  /*__ASSEMBLY__ */
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun struct kvmppc_vcore;
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /* Struct used for coordinating micro-threading (split-core) mode changes */
69*4882a593Smuzhiyun struct kvm_split_mode {
70*4882a593Smuzhiyun 	unsigned long	rpr;
71*4882a593Smuzhiyun 	unsigned long	pmmar;
72*4882a593Smuzhiyun 	unsigned long	ldbar;
73*4882a593Smuzhiyun 	u8		subcore_size;
74*4882a593Smuzhiyun 	u8		do_nap;
75*4882a593Smuzhiyun 	u8		napped[MAX_SMT_THREADS];
76*4882a593Smuzhiyun 	struct kvmppc_vcore *vc[MAX_SUBCORES];
77*4882a593Smuzhiyun 	/* Bits for changing lpcr on P9 */
78*4882a593Smuzhiyun 	unsigned long	lpcr_req;
79*4882a593Smuzhiyun 	unsigned long	lpidr_req;
80*4882a593Smuzhiyun 	unsigned long	host_lpcr;
81*4882a593Smuzhiyun 	u32		do_set;
82*4882a593Smuzhiyun 	u32		do_restore;
83*4882a593Smuzhiyun 	union {
84*4882a593Smuzhiyun 		u32	allphases;
85*4882a593Smuzhiyun 		u8	phase[4];
86*4882a593Smuzhiyun 	} lpcr_sync;
87*4882a593Smuzhiyun };
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun /*
90*4882a593Smuzhiyun  * This struct goes in the PACA on 64-bit processors.  It is used
91*4882a593Smuzhiyun  * to store host state that needs to be saved when we enter a guest
92*4882a593Smuzhiyun  * and restored when we exit, but isn't specific to any particular
93*4882a593Smuzhiyun  * guest or vcpu.  It also has some scratch fields used by the guest
94*4882a593Smuzhiyun  * exit code.
95*4882a593Smuzhiyun  */
96*4882a593Smuzhiyun struct kvmppc_host_state {
97*4882a593Smuzhiyun 	ulong host_r1;
98*4882a593Smuzhiyun 	ulong host_r2;
99*4882a593Smuzhiyun 	ulong host_msr;
100*4882a593Smuzhiyun 	ulong vmhandler;
101*4882a593Smuzhiyun 	ulong scratch0;
102*4882a593Smuzhiyun 	ulong scratch1;
103*4882a593Smuzhiyun 	ulong scratch2;
104*4882a593Smuzhiyun 	u8 in_guest;
105*4882a593Smuzhiyun 	u8 restore_hid5;
106*4882a593Smuzhiyun 	u8 napping;
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
109*4882a593Smuzhiyun 	u8 hwthread_req;
110*4882a593Smuzhiyun 	u8 hwthread_state;
111*4882a593Smuzhiyun 	u8 host_ipi;
112*4882a593Smuzhiyun 	u8 ptid;		/* thread number within subcore when split */
113*4882a593Smuzhiyun 	u8 tid;			/* thread number within whole core */
114*4882a593Smuzhiyun 	u8 fake_suspend;
115*4882a593Smuzhiyun 	struct kvm_vcpu *kvm_vcpu;
116*4882a593Smuzhiyun 	struct kvmppc_vcore *kvm_vcore;
117*4882a593Smuzhiyun 	void __iomem *xics_phys;
118*4882a593Smuzhiyun 	void __iomem *xive_tima_phys;
119*4882a593Smuzhiyun 	void __iomem *xive_tima_virt;
120*4882a593Smuzhiyun 	u32 saved_xirr;
121*4882a593Smuzhiyun 	u64 dabr;
122*4882a593Smuzhiyun 	u64 host_mmcr[10];	/* MMCR 0,1,A, SIAR, SDAR, MMCR2, SIER, MMCR3, SIER2/3 */
123*4882a593Smuzhiyun 	u32 host_pmc[8];
124*4882a593Smuzhiyun 	u64 host_purr;
125*4882a593Smuzhiyun 	u64 host_spurr;
126*4882a593Smuzhiyun 	u64 host_dscr;
127*4882a593Smuzhiyun 	u64 dec_expires;
128*4882a593Smuzhiyun 	struct kvm_split_mode *kvm_split_mode;
129*4882a593Smuzhiyun #endif
130*4882a593Smuzhiyun #ifdef CONFIG_PPC_BOOK3S_64
131*4882a593Smuzhiyun 	u64 cfar;
132*4882a593Smuzhiyun 	u64 ppr;
133*4882a593Smuzhiyun 	u64 host_fscr;
134*4882a593Smuzhiyun #endif
135*4882a593Smuzhiyun };
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun struct kvmppc_book3s_shadow_vcpu {
138*4882a593Smuzhiyun 	bool in_use;
139*4882a593Smuzhiyun 	ulong gpr[14];
140*4882a593Smuzhiyun 	u32 cr;
141*4882a593Smuzhiyun 	ulong xer;
142*4882a593Smuzhiyun 	ulong ctr;
143*4882a593Smuzhiyun 	ulong lr;
144*4882a593Smuzhiyun 	ulong pc;
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun 	ulong shadow_srr1;
147*4882a593Smuzhiyun 	ulong fault_dar;
148*4882a593Smuzhiyun 	u32 fault_dsisr;
149*4882a593Smuzhiyun 	u32 last_inst;
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun #ifdef CONFIG_PPC_BOOK3S_32
152*4882a593Smuzhiyun 	u32     sr[16];			/* Guest SRs */
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	struct kvmppc_host_state hstate;
155*4882a593Smuzhiyun #endif
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun #ifdef CONFIG_PPC_BOOK3S_64
158*4882a593Smuzhiyun 	u8 slb_max;			/* highest used guest slb entry */
159*4882a593Smuzhiyun 	struct  {
160*4882a593Smuzhiyun 		u64     esid;
161*4882a593Smuzhiyun 		u64     vsid;
162*4882a593Smuzhiyun 	} slb[64];			/* guest SLB */
163*4882a593Smuzhiyun 	u64 shadow_fscr;
164*4882a593Smuzhiyun #endif
165*4882a593Smuzhiyun };
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun #endif /*__ASSEMBLY__ */
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun /* Values for kvm_state */
170*4882a593Smuzhiyun #define KVM_HWTHREAD_IN_KERNEL	0
171*4882a593Smuzhiyun #define KVM_HWTHREAD_IN_IDLE	1
172*4882a593Smuzhiyun #define KVM_HWTHREAD_IN_KVM	2
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun #endif /* __ASM_KVM_BOOK3S_ASM_H__ */
175