Skip to content

Commit 8454821

Browse files
schlacfrankjaa
authored andcommitted
selftests: kvm: s390: Add kvm_s390_sie_block definition for userspace tests
Subsequent tests do require direct manipulation of the SIE control block. This commit introduces the SIE control block definition for use within the selftests. There are already definitions of this within the kernel. This differs in two ways. * This is the first definition of this in userspace. * In the context of the selftests this does not require atomicity for the flags. With the userspace definition of the SIE block layout now being present we can reuse the values in other tests where applicable. Signed-off-by: Christoph Schlameuss <[email protected]> Reviewed-by: Janosch Frank <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Janosch Frank <[email protected]> Message-ID: <[email protected]>
1 parent 252b6fd commit 8454821

File tree

2 files changed

+242
-2
lines changed

2 files changed

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

tools/testing/selftests/kvm/s390x/debug_test.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
/* Test KVM debugging features. */
33
#include "kvm_util.h"
44
#include "test_util.h"
5+
#include "sie.h"
56

67
#include <linux/kvm.h>
78

89
#define __LC_SVC_NEW_PSW 0x1c0
910
#define __LC_PGM_NEW_PSW 0x1d0
10-
#define ICPT_INSTRUCTION 0x04
1111
#define IPA0_DIAG 0x8300
1212
#define PGM_SPECIFICATION 0x06
1313

@@ -85,7 +85,7 @@ static void test_step_pgm_diag(void)
8585
vm = test_step_int_1(&vcpu, test_step_pgm_diag_guest_code,
8686
__LC_PGM_NEW_PSW, new_psw);
8787
TEST_ASSERT_KVM_EXIT_REASON(vcpu, KVM_EXIT_S390_SIEIC);
88-
TEST_ASSERT_EQ(vcpu->run->s390_sieic.icptcode, ICPT_INSTRUCTION);
88+
TEST_ASSERT_EQ(vcpu->run->s390_sieic.icptcode, ICPT_INST);
8989
TEST_ASSERT_EQ(vcpu->run->s390_sieic.ipa & 0xff00, IPA0_DIAG);
9090
vcpu_ioctl(vcpu, KVM_S390_IRQ, &irq);
9191
vcpu_run(vcpu);

0 commit comments

Comments
 (0)