xref: /kvm-unit-tests/lib/s390x/asm/sie-arch.h (revision 1f08a91a41402b0e032ecce8ed1b5952cbfca0ea)
1*c6798030SJanosch Frank /* SPDX-License-Identifier: GPL-2.0-or-later */
2*c6798030SJanosch Frank #ifndef _S390X_SIE_ARCH_H_
3*c6798030SJanosch Frank #define _S390X_SIE_ARCH_H_
4*c6798030SJanosch Frank 
5*c6798030SJanosch Frank #include <stdint.h>
6*c6798030SJanosch Frank #include <asm/arch_def.h>
7*c6798030SJanosch Frank 
8*c6798030SJanosch Frank #define CPUSTAT_STOPPED    0x80000000
9*c6798030SJanosch Frank #define CPUSTAT_WAIT       0x10000000
10*c6798030SJanosch Frank #define CPUSTAT_ECALL_PEND 0x08000000
11*c6798030SJanosch Frank #define CPUSTAT_STOP_INT   0x04000000
12*c6798030SJanosch Frank #define CPUSTAT_IO_INT     0x02000000
13*c6798030SJanosch Frank #define CPUSTAT_EXT_INT    0x01000000
14*c6798030SJanosch Frank #define CPUSTAT_RUNNING    0x00800000
15*c6798030SJanosch Frank #define CPUSTAT_RETAINED   0x00400000
16*c6798030SJanosch Frank #define CPUSTAT_TIMING_SUB 0x00020000
17*c6798030SJanosch Frank #define CPUSTAT_SIE_SUB    0x00010000
18*c6798030SJanosch Frank #define CPUSTAT_RRF        0x00008000
19*c6798030SJanosch Frank #define CPUSTAT_SLSV       0x00004000
20*c6798030SJanosch Frank #define CPUSTAT_SLSR       0x00002000
21*c6798030SJanosch Frank #define CPUSTAT_ZARCH      0x00000800
22*c6798030SJanosch Frank #define CPUSTAT_MCDS       0x00000100
23*c6798030SJanosch Frank #define CPUSTAT_KSS        0x00000200
24*c6798030SJanosch Frank #define CPUSTAT_SM         0x00000080
25*c6798030SJanosch Frank #define CPUSTAT_IBS        0x00000040
26*c6798030SJanosch Frank #define CPUSTAT_GED2       0x00000010
27*c6798030SJanosch Frank #define CPUSTAT_G          0x00000008
28*c6798030SJanosch Frank #define CPUSTAT_GED        0x00000004
29*c6798030SJanosch Frank #define CPUSTAT_J          0x00000002
30*c6798030SJanosch Frank #define CPUSTAT_P          0x00000001
31*c6798030SJanosch Frank 
32*c6798030SJanosch Frank struct kvm_s390_sie_block {
33*c6798030SJanosch Frank 	uint32_t 	cpuflags;		/* 0x0000 */
34*c6798030SJanosch Frank 	uint32_t : 1;			/* 0x0004 */
35*c6798030SJanosch Frank 	uint32_t 	prefix : 18;
36*c6798030SJanosch Frank 	uint32_t : 1;
37*c6798030SJanosch Frank 	uint32_t 	ibc : 12;
38*c6798030SJanosch Frank 	uint8_t		reserved08[4];		/* 0x0008 */
39*c6798030SJanosch Frank #define PROG_IN_SIE (1<<0)
40*c6798030SJanosch Frank 	uint32_t	prog0c;			/* 0x000c */
41*c6798030SJanosch Frank union {
42*c6798030SJanosch Frank 		uint8_t	reserved10[16];		/* 0x0010 */
43*c6798030SJanosch Frank 		struct {
44*c6798030SJanosch Frank 			uint64_t	pv_handle_cpu;
45*c6798030SJanosch Frank 			uint64_t	pv_handle_config;
46*c6798030SJanosch Frank 		};
47*c6798030SJanosch Frank 	};
48*c6798030SJanosch Frank #define PROG_BLOCK_SIE	(1<<0)
49*c6798030SJanosch Frank #define PROG_REQUEST	(1<<1)
50*c6798030SJanosch Frank 	uint32_t 	prog20;		/* 0x0020 */
51*c6798030SJanosch Frank 	uint8_t		reserved24[4];		/* 0x0024 */
52*c6798030SJanosch Frank 	uint64_t	cputm;			/* 0x0028 */
53*c6798030SJanosch Frank 	uint64_t	ckc;			/* 0x0030 */
54*c6798030SJanosch Frank 	uint64_t	epoch;			/* 0x0038 */
55*c6798030SJanosch Frank 	uint32_t	svcc;			/* 0x0040 */
56*c6798030SJanosch Frank #define LCTL_CR0	0x8000
57*c6798030SJanosch Frank #define LCTL_CR6	0x0200
58*c6798030SJanosch Frank #define LCTL_CR9	0x0040
59*c6798030SJanosch Frank #define LCTL_CR10	0x0020
60*c6798030SJanosch Frank #define LCTL_CR11	0x0010
61*c6798030SJanosch Frank #define LCTL_CR14	0x0002
62*c6798030SJanosch Frank 	uint16_t   	lctl;			/* 0x0044 */
63*c6798030SJanosch Frank 	int16_t		icpua;			/* 0x0046 */
64*c6798030SJanosch Frank #define ICTL_OPEREXC	0x80000000
65*c6798030SJanosch Frank #define ICTL_PINT	0x20000000
66*c6798030SJanosch Frank #define ICTL_LPSW	0x00400000
67*c6798030SJanosch Frank #define ICTL_STCTL	0x00040000
68*c6798030SJanosch Frank #define ICTL_ISKE	0x00004000
69*c6798030SJanosch Frank #define ICTL_SSKE	0x00002000
70*c6798030SJanosch Frank #define ICTL_RRBE	0x00001000
71*c6798030SJanosch Frank #define ICTL_TPROT	0x00000200
72*c6798030SJanosch Frank 	uint32_t	ictl;			/* 0x0048 */
73*c6798030SJanosch Frank #define ECA_CEI		0x80000000
74*c6798030SJanosch Frank #define ECA_IB		0x40000000
75*c6798030SJanosch Frank #define ECA_SIGPI	0x10000000
76*c6798030SJanosch Frank #define ECA_MVPGI	0x01000000
77*c6798030SJanosch Frank #define ECA_AIV		0x00200000
78*c6798030SJanosch Frank #define ECA_VX		0x00020000
79*c6798030SJanosch Frank #define ECA_PROTEXCI	0x00002000
80*c6798030SJanosch Frank #define ECA_APIE	0x00000008
81*c6798030SJanosch Frank #define ECA_SII		0x00000001
82*c6798030SJanosch Frank 	uint32_t	eca;			/* 0x004c */
83*c6798030SJanosch Frank #define ICPT_INST	0x04
84*c6798030SJanosch Frank #define ICPT_PROGI	0x08
85*c6798030SJanosch Frank #define ICPT_INSTPROGI	0x0C
86*c6798030SJanosch Frank #define ICPT_EXTREQ	0x10
87*c6798030SJanosch Frank #define ICPT_EXTINT	0x14
88*c6798030SJanosch Frank #define ICPT_IOREQ	0x18
89*c6798030SJanosch Frank #define ICPT_WAIT	0x1c
90*c6798030SJanosch Frank #define ICPT_VALIDITY	0x20
91*c6798030SJanosch Frank #define ICPT_STOP	0x28
92*c6798030SJanosch Frank #define ICPT_OPEREXC	0x2C
93*c6798030SJanosch Frank #define ICPT_PARTEXEC	0x38
94*c6798030SJanosch Frank #define ICPT_IOINST	0x40
95*c6798030SJanosch Frank #define ICPT_KSS	0x5c
96*c6798030SJanosch Frank #define ICPT_INT_ENABLE	0x64
97*c6798030SJanosch Frank #define ICPT_PV_INSTR	0x68
98*c6798030SJanosch Frank #define ICPT_PV_NOTIFY	0x6c
99*c6798030SJanosch Frank #define ICPT_PV_PREF	0x70
100*c6798030SJanosch Frank 	uint8_t		icptcode;		/* 0x0050 */
101*c6798030SJanosch Frank 	uint8_t		icptstatus;		/* 0x0051 */
102*c6798030SJanosch Frank 	uint16_t	ihcpu;			/* 0x0052 */
103*c6798030SJanosch Frank 	uint8_t		reserved54;		/* 0x0054 */
104*c6798030SJanosch Frank #define IICTL_CODE_NONE		 0x00
105*c6798030SJanosch Frank #define IICTL_CODE_MCHK		 0x01
106*c6798030SJanosch Frank #define IICTL_CODE_EXT		 0x02
107*c6798030SJanosch Frank #define IICTL_CODE_IO		 0x03
108*c6798030SJanosch Frank #define IICTL_CODE_RESTART	 0x04
109*c6798030SJanosch Frank #define IICTL_CODE_SPECIFICATION 0x10
110*c6798030SJanosch Frank #define IICTL_CODE_OPERAND	 0x11
111*c6798030SJanosch Frank 	uint8_t		iictl;			/* 0x0055 */
112*c6798030SJanosch Frank 	uint16_t	ipa;			/* 0x0056 */
113*c6798030SJanosch Frank 	uint32_t	ipb;			/* 0x0058 */
114*c6798030SJanosch Frank 	uint32_t	scaoh;			/* 0x005c */
115*c6798030SJanosch Frank #define FPF_BPBC 	0x20
116*c6798030SJanosch Frank 	uint8_t		fpf;			/* 0x0060 */
117*c6798030SJanosch Frank #define ECB_GS		0x40
118*c6798030SJanosch Frank #define ECB_TE		0x10
119*c6798030SJanosch Frank #define ECB_SPECI	0x08
120*c6798030SJanosch Frank #define ECB_SRSI	0x04
121*c6798030SJanosch Frank #define ECB_HOSTPROTINT	0x02
122*c6798030SJanosch Frank 	uint8_t		ecb;			/* 0x0061 */
123*c6798030SJanosch Frank #define ECB2_CMMA	0x80
124*c6798030SJanosch Frank #define ECB2_IEP	0x20
125*c6798030SJanosch Frank #define ECB2_PFMFI	0x08
126*c6798030SJanosch Frank #define ECB2_ESCA	0x04
127*c6798030SJanosch Frank 	uint8_t    	ecb2;                   /* 0x0062 */
128*c6798030SJanosch Frank #define ECB3_DEA 0x08
129*c6798030SJanosch Frank #define ECB3_AES 0x04
130*c6798030SJanosch Frank #define ECB3_RI  0x01
131*c6798030SJanosch Frank 	uint8_t    	ecb3;			/* 0x0063 */
132*c6798030SJanosch Frank 	uint32_t	scaol;			/* 0x0064 */
133*c6798030SJanosch Frank 	uint8_t		sdf;			/* 0x0068 */
134*c6798030SJanosch Frank 	uint8_t    	epdx;			/* 0x0069 */
135*c6798030SJanosch Frank 	uint8_t    	reserved6a[2];		/* 0x006a */
136*c6798030SJanosch Frank 	uint32_t	todpr;			/* 0x006c */
137*c6798030SJanosch Frank #define GISA_FORMAT1 0x00000001
138*c6798030SJanosch Frank 	uint32_t	gd;			/* 0x0070 */
139*c6798030SJanosch Frank 	uint8_t		reserved74[12];		/* 0x0074 */
140*c6798030SJanosch Frank 	uint64_t	mso;			/* 0x0080 */
141*c6798030SJanosch Frank 	uint64_t	msl;			/* 0x0088 */
142*c6798030SJanosch Frank 	struct psw	gpsw;			/* 0x0090 */
143*c6798030SJanosch Frank 	uint64_t	gg14;			/* 0x00a0 */
144*c6798030SJanosch Frank 	uint64_t	gg15;			/* 0x00a8 */
145*c6798030SJanosch Frank 	uint8_t		reservedb0[8];		/* 0x00b0 */
146*c6798030SJanosch Frank #define HPID_KVM	0x4
147*c6798030SJanosch Frank #define HPID_VSIE	0x5
148*c6798030SJanosch Frank 	uint8_t		hpid;			/* 0x00b8 */
149*c6798030SJanosch Frank 	uint8_t		reservedb9[7];		/* 0x00b9 */
150*c6798030SJanosch Frank 	union {
151*c6798030SJanosch Frank 		struct {
152*c6798030SJanosch Frank 			uint32_t	eiparams;	/* 0x00c0 */
153*c6798030SJanosch Frank 			uint16_t	extcpuaddr;	/* 0x00c4 */
154*c6798030SJanosch Frank 			uint16_t	eic;		/* 0x00c6 */
155*c6798030SJanosch Frank 		};
156*c6798030SJanosch Frank 		uint64_t	mcic;			/* 0x00c0 */
157*c6798030SJanosch Frank 	} __attribute__ ((__packed__));
158*c6798030SJanosch Frank 	uint32_t	reservedc8;		/* 0x00c8 */
159*c6798030SJanosch Frank 	uint16_t	pgmilc;			/* 0x00cc */
160*c6798030SJanosch Frank 	uint16_t	iprcc;			/* 0x00ce */
161*c6798030SJanosch Frank 	uint32_t	dxc;			/* 0x00d0 */
162*c6798030SJanosch Frank 	uint16_t	mcn;			/* 0x00d4 */
163*c6798030SJanosch Frank 	uint8_t		perc;			/* 0x00d6 */
164*c6798030SJanosch Frank 	uint8_t		peratmid;		/* 0x00d7 */
165*c6798030SJanosch Frank 	uint64_t	peraddr;		/* 0x00d8 */
166*c6798030SJanosch Frank 	uint8_t		eai;			/* 0x00e0 */
167*c6798030SJanosch Frank 	uint8_t		peraid;			/* 0x00e1 */
168*c6798030SJanosch Frank 	uint8_t		oai;			/* 0x00e2 */
169*c6798030SJanosch Frank 	uint8_t		armid;			/* 0x00e3 */
170*c6798030SJanosch Frank 	uint8_t		reservede4[4];		/* 0x00e4 */
171*c6798030SJanosch Frank 	uint64_t	tecmc;			/* 0x00e8 */
172*c6798030SJanosch Frank 	uint8_t		reservedf0[12];		/* 0x00f0 */
173*c6798030SJanosch Frank #define CRYCB_FORMAT_MASK 0x00000003
174*c6798030SJanosch Frank #define CRYCB_FORMAT0 0x00000000
175*c6798030SJanosch Frank #define CRYCB_FORMAT1 0x00000001
176*c6798030SJanosch Frank #define CRYCB_FORMAT2 0x00000003
177*c6798030SJanosch Frank 	uint32_t	crycbd;			/* 0x00fc */
178*c6798030SJanosch Frank 	uint64_t	gcr[16];		/* 0x0100 */
179*c6798030SJanosch Frank 	union {
180*c6798030SJanosch Frank 		uint64_t	gbea;			/* 0x0180 */
181*c6798030SJanosch Frank 		uint64_t	sidad;
182*c6798030SJanosch Frank 	};
183*c6798030SJanosch Frank 	uint8_t		reserved188[8];		/* 0x0188 */
184*c6798030SJanosch Frank 	uint64_t   	sdnxo;			/* 0x0190 */
185*c6798030SJanosch Frank 	uint8_t    	reserved198[8];		/* 0x0198 */
186*c6798030SJanosch Frank 	uint32_t	fac;			/* 0x01a0 */
187*c6798030SJanosch Frank 	uint8_t		reserved1a4[20];	/* 0x01a4 */
188*c6798030SJanosch Frank 	uint64_t	cbrlo;			/* 0x01b8 */
189*c6798030SJanosch Frank 	uint8_t		reserved1c0[8];		/* 0x01c0 */
190*c6798030SJanosch Frank #define ECD_HOSTREGMGMT	0x20000000
191*c6798030SJanosch Frank #define ECD_MEF		0x08000000
192*c6798030SJanosch Frank #define ECD_ETOKENF	0x02000000
193*c6798030SJanosch Frank #define ECD_ECC		0x00200000
194*c6798030SJanosch Frank 	uint32_t	ecd;			/* 0x01c8 */
195*c6798030SJanosch Frank 	uint8_t		reserved1cc[18];	/* 0x01cc */
196*c6798030SJanosch Frank 	uint64_t	pp;			/* 0x01de */
197*c6798030SJanosch Frank 	uint8_t		reserved1e6[2];		/* 0x01e6 */
198*c6798030SJanosch Frank 	uint64_t	itdba;			/* 0x01e8 */
199*c6798030SJanosch Frank 	uint64_t   	riccbd;			/* 0x01f0 */
200*c6798030SJanosch Frank 	uint64_t	gvrd;			/* 0x01f8 */
201*c6798030SJanosch Frank 	uint64_t	reserved200[48];	/* 0x0200 */
202*c6798030SJanosch Frank 	uint64_t	pv_grregs[16];		/* 0x0380 */
203*c6798030SJanosch Frank } __attribute__((packed));
204*c6798030SJanosch Frank 
205*c6798030SJanosch Frank union esca_sigp_ctrl {
206*c6798030SJanosch Frank 	uint16_t value;
207*c6798030SJanosch Frank 	struct {
208*c6798030SJanosch Frank 		uint8_t c : 1;
209*c6798030SJanosch Frank 		uint8_t reserved: 7;
210*c6798030SJanosch Frank 		uint8_t scn;
211*c6798030SJanosch Frank 	};
212*c6798030SJanosch Frank };
213*c6798030SJanosch Frank 
214*c6798030SJanosch Frank struct esca_entry {
215*c6798030SJanosch Frank 	union esca_sigp_ctrl sigp_ctrl;
216*c6798030SJanosch Frank 	uint16_t   reserved1[3];
217*c6798030SJanosch Frank 	uint64_t   sda;
218*c6798030SJanosch Frank 	uint64_t   reserved2[6];
219*c6798030SJanosch Frank };
220*c6798030SJanosch Frank 
221*c6798030SJanosch Frank union ipte_control {
222*c6798030SJanosch Frank 	unsigned long val;
223*c6798030SJanosch Frank 	struct {
224*c6798030SJanosch Frank 		unsigned long k  : 1;
225*c6798030SJanosch Frank 		unsigned long kh : 31;
226*c6798030SJanosch Frank 		unsigned long kg : 32;
227*c6798030SJanosch Frank 	};
228*c6798030SJanosch Frank };
229*c6798030SJanosch Frank 
230*c6798030SJanosch Frank struct esca_block {
231*c6798030SJanosch Frank 	union ipte_control ipte_control;
232*c6798030SJanosch Frank 	uint64_t   reserved1[7];
233*c6798030SJanosch Frank 	uint64_t   mcn[4];
234*c6798030SJanosch Frank 	uint64_t   reserved2[20];
235*c6798030SJanosch Frank 	struct esca_entry cpu[256];
236*c6798030SJanosch Frank };
237*c6798030SJanosch Frank 
238*c6798030SJanosch Frank #endif /* _S390X_SIE_ARCH_H_ */
239