xref: /OK3568_Linux_fs/kernel/arch/powerpc/include/asm/kvm_asm.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright IBM Corp. 2008
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Authors: Hollis Blanchard <hollisb@us.ibm.com>
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifndef __POWERPC_KVM_ASM_H__
10*4882a593Smuzhiyun #define __POWERPC_KVM_ASM_H__
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #ifdef __ASSEMBLY__
13*4882a593Smuzhiyun #ifdef CONFIG_64BIT
14*4882a593Smuzhiyun #define PPC_STD(sreg, offset, areg)  std sreg, (offset)(areg)
15*4882a593Smuzhiyun #define PPC_LD(treg, offset, areg)   ld treg, (offset)(areg)
16*4882a593Smuzhiyun #else
17*4882a593Smuzhiyun #define PPC_STD(sreg, offset, areg)  stw sreg, (offset+4)(areg)
18*4882a593Smuzhiyun #define PPC_LD(treg, offset, areg)   lwz treg, (offset+4)(areg)
19*4882a593Smuzhiyun #endif
20*4882a593Smuzhiyun #endif
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun /* IVPR must be 64KiB-aligned. */
23*4882a593Smuzhiyun #define VCPU_SIZE_ORDER 4
24*4882a593Smuzhiyun #define VCPU_SIZE_LOG   (VCPU_SIZE_ORDER + 12)
25*4882a593Smuzhiyun #define VCPU_SIZE_BYTES (1<<VCPU_SIZE_LOG)
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #define BOOKE_INTERRUPT_CRITICAL 0
28*4882a593Smuzhiyun #define BOOKE_INTERRUPT_MACHINE_CHECK 1
29*4882a593Smuzhiyun #define BOOKE_INTERRUPT_DATA_STORAGE 2
30*4882a593Smuzhiyun #define BOOKE_INTERRUPT_INST_STORAGE 3
31*4882a593Smuzhiyun #define BOOKE_INTERRUPT_EXTERNAL 4
32*4882a593Smuzhiyun #define BOOKE_INTERRUPT_ALIGNMENT 5
33*4882a593Smuzhiyun #define BOOKE_INTERRUPT_PROGRAM 6
34*4882a593Smuzhiyun #define BOOKE_INTERRUPT_FP_UNAVAIL 7
35*4882a593Smuzhiyun #define BOOKE_INTERRUPT_SYSCALL 8
36*4882a593Smuzhiyun #define BOOKE_INTERRUPT_AP_UNAVAIL 9
37*4882a593Smuzhiyun #define BOOKE_INTERRUPT_DECREMENTER 10
38*4882a593Smuzhiyun #define BOOKE_INTERRUPT_FIT 11
39*4882a593Smuzhiyun #define BOOKE_INTERRUPT_WATCHDOG 12
40*4882a593Smuzhiyun #define BOOKE_INTERRUPT_DTLB_MISS 13
41*4882a593Smuzhiyun #define BOOKE_INTERRUPT_ITLB_MISS 14
42*4882a593Smuzhiyun #define BOOKE_INTERRUPT_DEBUG 15
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun /* E500 */
45*4882a593Smuzhiyun #ifdef CONFIG_SPE_POSSIBLE
46*4882a593Smuzhiyun #define BOOKE_INTERRUPT_SPE_UNAVAIL 32
47*4882a593Smuzhiyun #define BOOKE_INTERRUPT_SPE_FP_DATA 33
48*4882a593Smuzhiyun #define BOOKE_INTERRUPT_SPE_FP_ROUND 34
49*4882a593Smuzhiyun #endif
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #ifdef CONFIG_PPC_E500MC
52*4882a593Smuzhiyun #define BOOKE_INTERRUPT_ALTIVEC_UNAVAIL 32
53*4882a593Smuzhiyun #define BOOKE_INTERRUPT_ALTIVEC_ASSIST 33
54*4882a593Smuzhiyun #endif
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun #define BOOKE_INTERRUPT_PERFORMANCE_MONITOR 35
57*4882a593Smuzhiyun #define BOOKE_INTERRUPT_DOORBELL 36
58*4882a593Smuzhiyun #define BOOKE_INTERRUPT_DOORBELL_CRITICAL 37
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun /* booke_hv */
61*4882a593Smuzhiyun #define BOOKE_INTERRUPT_GUEST_DBELL 38
62*4882a593Smuzhiyun #define BOOKE_INTERRUPT_GUEST_DBELL_CRIT 39
63*4882a593Smuzhiyun #define BOOKE_INTERRUPT_HV_SYSCALL 40
64*4882a593Smuzhiyun #define BOOKE_INTERRUPT_HV_PRIV 41
65*4882a593Smuzhiyun #define BOOKE_INTERRUPT_LRAT_ERROR 42
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun /* book3s */
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_SYSTEM_RESET	0x100
70*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_MACHINE_CHECK	0x200
71*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_DATA_STORAGE	0x300
72*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_DATA_SEGMENT	0x380
73*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_INST_STORAGE	0x400
74*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_INST_SEGMENT	0x480
75*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_EXTERNAL	0x500
76*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_EXTERNAL_HV	0x502
77*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_ALIGNMENT	0x600
78*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_PROGRAM	0x700
79*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_FP_UNAVAIL	0x800
80*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_DECREMENTER	0x900
81*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_HV_DECREMENTER	0x980
82*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_DOORBELL	0xa00
83*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_SYSCALL	0xc00
84*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_TRACE		0xd00
85*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_H_DATA_STORAGE	0xe00
86*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_H_INST_STORAGE	0xe20
87*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_H_EMUL_ASSIST	0xe40
88*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_HMI		0xe60
89*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_H_DOORBELL	0xe80
90*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_H_VIRT		0xea0
91*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_PERFMON	0xf00
92*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_ALTIVEC	0xf20
93*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_VSX		0xf40
94*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_FAC_UNAVAIL	0xf60
95*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_H_FAC_UNAVAIL	0xf80
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun /* book3s_hv */
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_HV_SOFTPATCH	0x1500
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun /*
102*4882a593Smuzhiyun  * Special trap used to indicate to host that this is a
103*4882a593Smuzhiyun  * passthrough interrupt that could not be handled
104*4882a593Smuzhiyun  * completely in the guest.
105*4882a593Smuzhiyun  */
106*4882a593Smuzhiyun #define BOOK3S_INTERRUPT_HV_RM_HARD	0x5555
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun #define BOOK3S_IRQPRIO_SYSTEM_RESET		0
109*4882a593Smuzhiyun #define BOOK3S_IRQPRIO_DATA_SEGMENT		1
110*4882a593Smuzhiyun #define BOOK3S_IRQPRIO_INST_SEGMENT		2
111*4882a593Smuzhiyun #define BOOK3S_IRQPRIO_DATA_STORAGE		3
112*4882a593Smuzhiyun #define BOOK3S_IRQPRIO_INST_STORAGE		4
113*4882a593Smuzhiyun #define BOOK3S_IRQPRIO_ALIGNMENT		5
114*4882a593Smuzhiyun #define BOOK3S_IRQPRIO_PROGRAM			6
115*4882a593Smuzhiyun #define BOOK3S_IRQPRIO_FP_UNAVAIL		7
116*4882a593Smuzhiyun #define BOOK3S_IRQPRIO_ALTIVEC			8
117*4882a593Smuzhiyun #define BOOK3S_IRQPRIO_VSX			9
118*4882a593Smuzhiyun #define BOOK3S_IRQPRIO_FAC_UNAVAIL		10
119*4882a593Smuzhiyun #define BOOK3S_IRQPRIO_SYSCALL			11
120*4882a593Smuzhiyun #define BOOK3S_IRQPRIO_MACHINE_CHECK		12
121*4882a593Smuzhiyun #define BOOK3S_IRQPRIO_DEBUG			13
122*4882a593Smuzhiyun #define BOOK3S_IRQPRIO_EXTERNAL			14
123*4882a593Smuzhiyun #define BOOK3S_IRQPRIO_DECREMENTER		15
124*4882a593Smuzhiyun #define BOOK3S_IRQPRIO_PERFORMANCE_MONITOR	16
125*4882a593Smuzhiyun #define BOOK3S_IRQPRIO_MAX			17
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun #define BOOK3S_HFLAG_DCBZ32			0x1
128*4882a593Smuzhiyun #define BOOK3S_HFLAG_SLB			0x2
129*4882a593Smuzhiyun #define BOOK3S_HFLAG_PAIRED_SINGLE		0x4
130*4882a593Smuzhiyun #define BOOK3S_HFLAG_NATIVE_PS			0x8
131*4882a593Smuzhiyun #define BOOK3S_HFLAG_MULTI_PGSIZE		0x10
132*4882a593Smuzhiyun #define BOOK3S_HFLAG_NEW_TLBIE			0x20
133*4882a593Smuzhiyun #define BOOK3S_HFLAG_SPLIT_HACK			0x40
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun #define RESUME_FLAG_NV          (1<<0)  /* Reload guest nonvolatile state? */
136*4882a593Smuzhiyun #define RESUME_FLAG_HOST        (1<<1)  /* Resume host? */
137*4882a593Smuzhiyun #define RESUME_FLAG_ARCH1	(1<<2)
138*4882a593Smuzhiyun #define RESUME_FLAG_ARCH2	(1<<3)
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun #define RESUME_GUEST            0
141*4882a593Smuzhiyun #define RESUME_GUEST_NV         RESUME_FLAG_NV
142*4882a593Smuzhiyun #define RESUME_HOST             RESUME_FLAG_HOST
143*4882a593Smuzhiyun #define RESUME_HOST_NV          (RESUME_FLAG_HOST|RESUME_FLAG_NV)
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun #define KVM_GUEST_MODE_NONE	0
146*4882a593Smuzhiyun #define KVM_GUEST_MODE_GUEST	1
147*4882a593Smuzhiyun #define KVM_GUEST_MODE_SKIP	2
148*4882a593Smuzhiyun #define KVM_GUEST_MODE_GUEST_HV	3
149*4882a593Smuzhiyun #define KVM_GUEST_MODE_HOST_HV	4
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun #define KVM_INST_FETCH_FAILED	-1
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun /* Extract PO and XOP opcode fields */
154*4882a593Smuzhiyun #define PO_XOP_OPCODE_MASK 0xfc0007fe
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun #endif /* __POWERPC_KVM_ASM_H__ */
157