xref: /aosp_15_r20/external/strace/tests-m32/s390_sthyi.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker  * Check decoding of s390_sthyi syscall.
3*cf84ac9aSAndroid Build Coastguard Worker  *
4*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2018 The strace developers.
5*cf84ac9aSAndroid Build Coastguard Worker  * All rights reserved.
6*cf84ac9aSAndroid Build Coastguard Worker  *
7*cf84ac9aSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
8*cf84ac9aSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
9*cf84ac9aSAndroid Build Coastguard Worker  * are met:
10*cf84ac9aSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
11*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
12*cf84ac9aSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
13*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
14*cf84ac9aSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
15*cf84ac9aSAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
16*cf84ac9aSAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
17*cf84ac9aSAndroid Build Coastguard Worker  *
18*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19*cf84ac9aSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20*cf84ac9aSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21*cf84ac9aSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22*cf84ac9aSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23*cf84ac9aSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*cf84ac9aSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*cf84ac9aSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*cf84ac9aSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*cf84ac9aSAndroid Build Coastguard Worker  */
29*cf84ac9aSAndroid Build Coastguard Worker 
30*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
31*cf84ac9aSAndroid Build Coastguard Worker #include <asm/unistd.h>
32*cf84ac9aSAndroid Build Coastguard Worker 
33*cf84ac9aSAndroid Build Coastguard Worker #if defined HAVE_ICONV_H && defined HAVE_ICONV_OPEN && defined __NR_s390_sthyi
34*cf84ac9aSAndroid Build Coastguard Worker 
35*cf84ac9aSAndroid Build Coastguard Worker # include <errno.h>
36*cf84ac9aSAndroid Build Coastguard Worker # include <iconv.h>
37*cf84ac9aSAndroid Build Coastguard Worker # include <inttypes.h>
38*cf84ac9aSAndroid Build Coastguard Worker # include <stdint.h>
39*cf84ac9aSAndroid Build Coastguard Worker # include <stdio.h>
40*cf84ac9aSAndroid Build Coastguard Worker # include <unistd.h>
41*cf84ac9aSAndroid Build Coastguard Worker 
42*cf84ac9aSAndroid Build Coastguard Worker # include <sys/user.h>
43*cf84ac9aSAndroid Build Coastguard Worker 
44*cf84ac9aSAndroid Build Coastguard Worker # define EBCDIC_MAX_LEN 16
45*cf84ac9aSAndroid Build Coastguard Worker 
46*cf84ac9aSAndroid Build Coastguard Worker # ifndef VERBOSE
47*cf84ac9aSAndroid Build Coastguard Worker #  define VERBOSE 0
48*cf84ac9aSAndroid Build Coastguard Worker # endif
49*cf84ac9aSAndroid Build Coastguard Worker 
50*cf84ac9aSAndroid Build Coastguard Worker static inline bool
print_0x8(const char * prefix,unsigned char * buf,unsigned int offs,bool zero)51*cf84ac9aSAndroid Build Coastguard Worker print_0x8(const char *prefix, unsigned char *buf, unsigned int offs, bool zero)
52*cf84ac9aSAndroid Build Coastguard Worker {
53*cf84ac9aSAndroid Build Coastguard Worker 	if (!zero && !buf[offs])
54*cf84ac9aSAndroid Build Coastguard Worker 		return false;
55*cf84ac9aSAndroid Build Coastguard Worker 
56*cf84ac9aSAndroid Build Coastguard Worker 	printf("%s=%#02hhx", prefix, buf[offs]);
57*cf84ac9aSAndroid Build Coastguard Worker 
58*cf84ac9aSAndroid Build Coastguard Worker 	return true;
59*cf84ac9aSAndroid Build Coastguard Worker }
60*cf84ac9aSAndroid Build Coastguard Worker 
61*cf84ac9aSAndroid Build Coastguard Worker static inline bool
print_u8(const char * prefix,unsigned char * buf,unsigned int offs,bool zero)62*cf84ac9aSAndroid Build Coastguard Worker print_u8(const char *prefix, unsigned char *buf, unsigned int offs, bool zero)
63*cf84ac9aSAndroid Build Coastguard Worker {
64*cf84ac9aSAndroid Build Coastguard Worker 	if (!zero && !buf[offs])
65*cf84ac9aSAndroid Build Coastguard Worker 		return false;
66*cf84ac9aSAndroid Build Coastguard Worker 
67*cf84ac9aSAndroid Build Coastguard Worker 	printf("%s=%hhu", prefix, buf[offs]);
68*cf84ac9aSAndroid Build Coastguard Worker 
69*cf84ac9aSAndroid Build Coastguard Worker 	return true;
70*cf84ac9aSAndroid Build Coastguard Worker }
71*cf84ac9aSAndroid Build Coastguard Worker 
72*cf84ac9aSAndroid Build Coastguard Worker static inline bool
print_u16(const char * prefix,unsigned char * buf,unsigned int offs,bool zero)73*cf84ac9aSAndroid Build Coastguard Worker print_u16(const char *prefix, unsigned char *buf, unsigned int offs, bool zero)
74*cf84ac9aSAndroid Build Coastguard Worker {
75*cf84ac9aSAndroid Build Coastguard Worker 	uint16_t val = *(uint16_t *) (buf + offs);
76*cf84ac9aSAndroid Build Coastguard Worker 
77*cf84ac9aSAndroid Build Coastguard Worker 	if (!zero && !val)
78*cf84ac9aSAndroid Build Coastguard Worker 		return false;
79*cf84ac9aSAndroid Build Coastguard Worker 
80*cf84ac9aSAndroid Build Coastguard Worker 	printf("%s=%" PRIu16, prefix, val);
81*cf84ac9aSAndroid Build Coastguard Worker 
82*cf84ac9aSAndroid Build Coastguard Worker 	return true;
83*cf84ac9aSAndroid Build Coastguard Worker }
84*cf84ac9aSAndroid Build Coastguard Worker 
85*cf84ac9aSAndroid Build Coastguard Worker static inline bool
print_x32(const char * prefix,unsigned char * buf,unsigned int offs,bool zero)86*cf84ac9aSAndroid Build Coastguard Worker print_x32(const char *prefix, unsigned char *buf, unsigned int offs, bool zero)
87*cf84ac9aSAndroid Build Coastguard Worker {
88*cf84ac9aSAndroid Build Coastguard Worker 	uint32_t val = *(uint32_t *) (buf + offs);
89*cf84ac9aSAndroid Build Coastguard Worker 
90*cf84ac9aSAndroid Build Coastguard Worker 	if (!zero && !val)
91*cf84ac9aSAndroid Build Coastguard Worker 		return false;
92*cf84ac9aSAndroid Build Coastguard Worker 
93*cf84ac9aSAndroid Build Coastguard Worker 	printf("%s=%#" PRIx32, prefix, val);
94*cf84ac9aSAndroid Build Coastguard Worker 
95*cf84ac9aSAndroid Build Coastguard Worker 	return true;
96*cf84ac9aSAndroid Build Coastguard Worker }
97*cf84ac9aSAndroid Build Coastguard Worker 
98*cf84ac9aSAndroid Build Coastguard Worker static inline bool
print_weight(const char * prefix,unsigned char * buf,unsigned int offs,bool zero)99*cf84ac9aSAndroid Build Coastguard Worker print_weight(const char *prefix, unsigned char *buf, unsigned int offs,
100*cf84ac9aSAndroid Build Coastguard Worker 	     bool zero)
101*cf84ac9aSAndroid Build Coastguard Worker {
102*cf84ac9aSAndroid Build Coastguard Worker 	uint32_t val = *(uint32_t *) (buf + offs);
103*cf84ac9aSAndroid Build Coastguard Worker 
104*cf84ac9aSAndroid Build Coastguard Worker 	if (print_x32(prefix, buf, offs, zero)) {
105*cf84ac9aSAndroid Build Coastguard Worker 		if (val)
106*cf84ac9aSAndroid Build Coastguard Worker 			printf(" /* %u %u/65536 cores */",
107*cf84ac9aSAndroid Build Coastguard Worker 			       val >> 16, val & 0xFFFF);
108*cf84ac9aSAndroid Build Coastguard Worker 		else
109*cf84ac9aSAndroid Build Coastguard Worker 			printf(" /* unlimited */");
110*cf84ac9aSAndroid Build Coastguard Worker 
111*cf84ac9aSAndroid Build Coastguard Worker 		return true;
112*cf84ac9aSAndroid Build Coastguard Worker 	}
113*cf84ac9aSAndroid Build Coastguard Worker 
114*cf84ac9aSAndroid Build Coastguard Worker 	return false;
115*cf84ac9aSAndroid Build Coastguard Worker }
116*cf84ac9aSAndroid Build Coastguard Worker 
117*cf84ac9aSAndroid Build Coastguard Worker static inline char *
ebcdic2ascii(unsigned char * ebcdic,size_t size)118*cf84ac9aSAndroid Build Coastguard Worker ebcdic2ascii(unsigned char *ebcdic, size_t size)
119*cf84ac9aSAndroid Build Coastguard Worker {
120*cf84ac9aSAndroid Build Coastguard Worker 	static char ascii_buf[EBCDIC_MAX_LEN];
121*cf84ac9aSAndroid Build Coastguard Worker 
122*cf84ac9aSAndroid Build Coastguard Worker 	char *ebcdic_pos = (char *) ebcdic;
123*cf84ac9aSAndroid Build Coastguard Worker 	char *ascii_pos = ascii_buf;
124*cf84ac9aSAndroid Build Coastguard Worker 	size_t ebcdic_left = size;
125*cf84ac9aSAndroid Build Coastguard Worker 	size_t ascii_left = size;
126*cf84ac9aSAndroid Build Coastguard Worker 	size_t ret;
127*cf84ac9aSAndroid Build Coastguard Worker 
128*cf84ac9aSAndroid Build Coastguard Worker 	iconv_t cd = iconv_open("ASCII", "EBCDICUS");
129*cf84ac9aSAndroid Build Coastguard Worker 
130*cf84ac9aSAndroid Build Coastguard Worker 	if (size > sizeof(ascii_buf))
131*cf84ac9aSAndroid Build Coastguard Worker 		error_msg_and_fail("ebcdic2ascii: EBCDIC string is too big: "
132*cf84ac9aSAndroid Build Coastguard Worker 				   "%zu (maximum is %zu)",
133*cf84ac9aSAndroid Build Coastguard Worker 				   size, sizeof(ascii_buf));
134*cf84ac9aSAndroid Build Coastguard Worker 	if (cd == (iconv_t) -1)
135*cf84ac9aSAndroid Build Coastguard Worker 		perror_msg_and_fail("ebcdic2ascii: unable to allocate a "
136*cf84ac9aSAndroid Build Coastguard Worker 				    "conversion descriptior for converting "
137*cf84ac9aSAndroid Build Coastguard Worker 				    "EBCDIC to ASCII");
138*cf84ac9aSAndroid Build Coastguard Worker 
139*cf84ac9aSAndroid Build Coastguard Worker 	while ((ret = iconv(cd, &ebcdic_pos, &ebcdic_left,
140*cf84ac9aSAndroid Build Coastguard Worker 	    &ascii_pos, &ascii_left)) == (size_t) -1) {
141*cf84ac9aSAndroid Build Coastguard Worker 		switch (errno) {
142*cf84ac9aSAndroid Build Coastguard Worker 		case EILSEQ:
143*cf84ac9aSAndroid Build Coastguard Worker 		case EINVAL: /* That one is quite unexpected, actually */
144*cf84ac9aSAndroid Build Coastguard Worker 			if (!ebcdic_left || !ascii_left)
145*cf84ac9aSAndroid Build Coastguard Worker 				goto ebcdic2ascii_end;
146*cf84ac9aSAndroid Build Coastguard Worker 
147*cf84ac9aSAndroid Build Coastguard Worker 			*ascii_pos++ = ' ';
148*cf84ac9aSAndroid Build Coastguard Worker 			ebcdic_pos++;
149*cf84ac9aSAndroid Build Coastguard Worker 			ebcdic_left--;
150*cf84ac9aSAndroid Build Coastguard Worker 
151*cf84ac9aSAndroid Build Coastguard Worker 			break;
152*cf84ac9aSAndroid Build Coastguard Worker 
153*cf84ac9aSAndroid Build Coastguard Worker 		case E2BIG:
154*cf84ac9aSAndroid Build Coastguard Worker 			perror_msg_and_fail("ebcdic2ascii: ran out of "
155*cf84ac9aSAndroid Build Coastguard Worker 					    "ASCII buffer unexpectedly");
156*cf84ac9aSAndroid Build Coastguard Worker 		default:
157*cf84ac9aSAndroid Build Coastguard Worker 			perror_msg_and_fail("ebcdic2ascii: unexpected error");
158*cf84ac9aSAndroid Build Coastguard Worker 		}
159*cf84ac9aSAndroid Build Coastguard Worker 	}
160*cf84ac9aSAndroid Build Coastguard Worker 
161*cf84ac9aSAndroid Build Coastguard Worker ebcdic2ascii_end:
162*cf84ac9aSAndroid Build Coastguard Worker 	iconv_close(cd);
163*cf84ac9aSAndroid Build Coastguard Worker 
164*cf84ac9aSAndroid Build Coastguard Worker 	if (ebcdic_left != ascii_left)
165*cf84ac9aSAndroid Build Coastguard Worker 		error_msg_and_fail("ebcdic2ascii: ASCII string differs in size "
166*cf84ac9aSAndroid Build Coastguard Worker 				   "from EBCDIC");
167*cf84ac9aSAndroid Build Coastguard Worker 
168*cf84ac9aSAndroid Build Coastguard Worker 	return ascii_buf;
169*cf84ac9aSAndroid Build Coastguard Worker }
170*cf84ac9aSAndroid Build Coastguard Worker 
171*cf84ac9aSAndroid Build Coastguard Worker static inline bool
is_empty(unsigned char * ptr,size_t size)172*cf84ac9aSAndroid Build Coastguard Worker is_empty(unsigned char *ptr, size_t size)
173*cf84ac9aSAndroid Build Coastguard Worker {
174*cf84ac9aSAndroid Build Coastguard Worker 	size_t i;
175*cf84ac9aSAndroid Build Coastguard Worker 
176*cf84ac9aSAndroid Build Coastguard Worker 	for (i = 0; !*ptr && i < size; ptr++, i++)
177*cf84ac9aSAndroid Build Coastguard Worker 		;
178*cf84ac9aSAndroid Build Coastguard Worker 
179*cf84ac9aSAndroid Build Coastguard Worker 	return i == size;
180*cf84ac9aSAndroid Build Coastguard Worker }
181*cf84ac9aSAndroid Build Coastguard Worker 
182*cf84ac9aSAndroid Build Coastguard Worker static inline bool
print_ebcdic(const char * prefix,unsigned char * addr,unsigned int offs,size_t size,bool zero,bool blank)183*cf84ac9aSAndroid Build Coastguard Worker print_ebcdic(const char *prefix, unsigned char *addr, unsigned int offs,
184*cf84ac9aSAndroid Build Coastguard Worker 	     size_t size, bool zero, bool blank)
185*cf84ac9aSAndroid Build Coastguard Worker {
186*cf84ac9aSAndroid Build Coastguard Worker 	const char *ascii = ebcdic2ascii(addr + offs, size);
187*cf84ac9aSAndroid Build Coastguard Worker 
188*cf84ac9aSAndroid Build Coastguard Worker 	if (!zero) {
189*cf84ac9aSAndroid Build Coastguard Worker 		size_t i;
190*cf84ac9aSAndroid Build Coastguard Worker 
191*cf84ac9aSAndroid Build Coastguard Worker 		for (i = 0; (addr[offs + i] == (blank ? 64 : 0)) && (i < size);
192*cf84ac9aSAndroid Build Coastguard Worker 		    i++)
193*cf84ac9aSAndroid Build Coastguard Worker 			;
194*cf84ac9aSAndroid Build Coastguard Worker 
195*cf84ac9aSAndroid Build Coastguard Worker 		if (i == size)
196*cf84ac9aSAndroid Build Coastguard Worker 			return false;
197*cf84ac9aSAndroid Build Coastguard Worker 	}
198*cf84ac9aSAndroid Build Coastguard Worker 
199*cf84ac9aSAndroid Build Coastguard Worker 	printf("%s=", prefix);
200*cf84ac9aSAndroid Build Coastguard Worker 	print_quoted_hex((char *) (addr + offs), size);
201*cf84ac9aSAndroid Build Coastguard Worker 	printf(" /* ");
202*cf84ac9aSAndroid Build Coastguard Worker 	print_quoted_memory(ascii, size);
203*cf84ac9aSAndroid Build Coastguard Worker 	printf(" */");
204*cf84ac9aSAndroid Build Coastguard Worker 
205*cf84ac9aSAndroid Build Coastguard Worker 	return true;
206*cf84ac9aSAndroid Build Coastguard Worker }
207*cf84ac9aSAndroid Build Coastguard Worker 
208*cf84ac9aSAndroid Build Coastguard Worker static void
print_hypervisor_header(unsigned char * buf,int level,unsigned int offs_pos,unsigned int len_pos,bool mt)209*cf84ac9aSAndroid Build Coastguard Worker print_hypervisor_header(unsigned char *buf, int level, unsigned int offs_pos,
210*cf84ac9aSAndroid Build Coastguard Worker 			unsigned int len_pos, bool mt)
211*cf84ac9aSAndroid Build Coastguard Worker {
212*cf84ac9aSAndroid Build Coastguard Worker 	uint16_t offs = *(uint16_t *) (buf + offs_pos);
213*cf84ac9aSAndroid Build Coastguard Worker 	uint16_t hdr_size = *(uint16_t *) (buf + len_pos);
214*cf84ac9aSAndroid Build Coastguard Worker 	unsigned char *cur;
215*cf84ac9aSAndroid Build Coastguard Worker 
216*cf84ac9aSAndroid Build Coastguard Worker 	if (!offs)
217*cf84ac9aSAndroid Build Coastguard Worker 		return;
218*cf84ac9aSAndroid Build Coastguard Worker 	if (hdr_size < 32)
219*cf84ac9aSAndroid Build Coastguard Worker 		error_msg_and_fail("sthyi: hypervisor %d section is too small "
220*cf84ac9aSAndroid Build Coastguard Worker 			           "(got %hu, 32 expected)", level, hdr_size);
221*cf84ac9aSAndroid Build Coastguard Worker 
222*cf84ac9aSAndroid Build Coastguard Worker 	cur = buf + offs;
223*cf84ac9aSAndroid Build Coastguard Worker 
224*cf84ac9aSAndroid Build Coastguard Worker 	printf(", /* hypervisor %d */ {infyflg1", level);
225*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8("", cur, 0, true);
226*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
227*cf84ac9aSAndroid Build Coastguard Worker 	if (cur[0]) {
228*cf84ac9aSAndroid Build Coastguard Worker 		bool printed = false;
229*cf84ac9aSAndroid Build Coastguard Worker 
230*cf84ac9aSAndroid Build Coastguard Worker 		printf(" /* ");
231*cf84ac9aSAndroid Build Coastguard Worker 		if (cur[0] & 0x80) {
232*cf84ac9aSAndroid Build Coastguard Worker 			printf("0x80 - guest CPU usage had limiting is using "
233*cf84ac9aSAndroid Build Coastguard Worker 			       "the consumption method");
234*cf84ac9aSAndroid Build Coastguard Worker 			printed = true;
235*cf84ac9aSAndroid Build Coastguard Worker 		}
236*cf84ac9aSAndroid Build Coastguard Worker 		if (cur[0] & 0x40) {
237*cf84ac9aSAndroid Build Coastguard Worker 			if (printed)
238*cf84ac9aSAndroid Build Coastguard Worker 				printf(", ");
239*cf84ac9aSAndroid Build Coastguard Worker 			printf("0x40 - LIMITHARD caps use prorated core time "
240*cf84ac9aSAndroid Build Coastguard Worker 			       "for capping");
241*cf84ac9aSAndroid Build Coastguard Worker 			printed = true;
242*cf84ac9aSAndroid Build Coastguard Worker 		}
243*cf84ac9aSAndroid Build Coastguard Worker 		if (cur[0] & 0x3F) {
244*cf84ac9aSAndroid Build Coastguard Worker 			if (printed)
245*cf84ac9aSAndroid Build Coastguard Worker 				printf(", ");
246*cf84ac9aSAndroid Build Coastguard Worker 			printf("%#hhx - ???", cur[0] & 0x3F);
247*cf84ac9aSAndroid Build Coastguard Worker 		}
248*cf84ac9aSAndroid Build Coastguard Worker 		printf(" */");
249*cf84ac9aSAndroid Build Coastguard Worker 	}
250*cf84ac9aSAndroid Build Coastguard Worker 
251*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8(", infyflg2", cur, 1, false);
252*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8(", infyval1", cur, 2, false);
253*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8(", infyval2", cur, 3, false);
254*cf84ac9aSAndroid Build Coastguard Worker 
255*cf84ac9aSAndroid Build Coastguard Worker 	print_u8(", infytype", cur, 4, true);
256*cf84ac9aSAndroid Build Coastguard Worker 	if (cur[4] == 1)
257*cf84ac9aSAndroid Build Coastguard Worker 		printf(" /* z/VM is the hypervisor */");
258*cf84ac9aSAndroid Build Coastguard Worker 	else
259*cf84ac9aSAndroid Build Coastguard Worker 		printf(" /* unknown hypervisor type */");
260*cf84ac9aSAndroid Build Coastguard Worker 
261*cf84ac9aSAndroid Build Coastguard Worker 	if (cur[5])
262*cf84ac9aSAndroid Build Coastguard Worker 		printf(", reserved_1__=\"\\x%#02hhx\"", cur[5]);
263*cf84ac9aSAndroid Build Coastguard Worker 
264*cf84ac9aSAndroid Build Coastguard Worker 	print_u8(", infycpt",  cur, 6, mt);
265*cf84ac9aSAndroid Build Coastguard Worker 	print_u8(", infyiflt", cur, 7, mt);
266*cf84ac9aSAndroid Build Coastguard Worker # endif /* !VERBOSE */
267*cf84ac9aSAndroid Build Coastguard Worker 
268*cf84ac9aSAndroid Build Coastguard Worker 	print_ebcdic(", infysyid", cur, 8,  8, VERBOSE, true);
269*cf84ac9aSAndroid Build Coastguard Worker 	print_ebcdic(", infyclnm", cur, 16, 8, VERBOSE, true);
270*cf84ac9aSAndroid Build Coastguard Worker 
271*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infyscps", cur, 24, VERBOSE);
272*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infydcps", cur, 26, VERBOSE);
273*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infysifl", cur, 28, VERBOSE);
274*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infydifl", cur, 30, VERBOSE);
275*cf84ac9aSAndroid Build Coastguard Worker 
276*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
277*cf84ac9aSAndroid Build Coastguard Worker 	if (hdr_size > 32 && !is_empty(cur + 32, hdr_size - 32)) {
278*cf84ac9aSAndroid Build Coastguard Worker 		printf(", ");
279*cf84ac9aSAndroid Build Coastguard Worker 		print_quoted_hex((char *) (cur + 32), hdr_size - 32);
280*cf84ac9aSAndroid Build Coastguard Worker 	}
281*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
282*cf84ac9aSAndroid Build Coastguard Worker 	printf(", ...");
283*cf84ac9aSAndroid Build Coastguard Worker # endif /* !VERBOSE */
284*cf84ac9aSAndroid Build Coastguard Worker 
285*cf84ac9aSAndroid Build Coastguard Worker 	printf("}");
286*cf84ac9aSAndroid Build Coastguard Worker }
287*cf84ac9aSAndroid Build Coastguard Worker 
288*cf84ac9aSAndroid Build Coastguard Worker static void
print_guest_header(unsigned char * buf,int level,unsigned int offs_pos,unsigned int len_pos)289*cf84ac9aSAndroid Build Coastguard Worker print_guest_header(unsigned char *buf, int level, unsigned int offs_pos,
290*cf84ac9aSAndroid Build Coastguard Worker 		   unsigned int len_pos)
291*cf84ac9aSAndroid Build Coastguard Worker {
292*cf84ac9aSAndroid Build Coastguard Worker 	uint16_t offs = *(uint16_t *) (buf + offs_pos);
293*cf84ac9aSAndroid Build Coastguard Worker 	uint16_t hdr_size = *(uint16_t *) (buf + len_pos);
294*cf84ac9aSAndroid Build Coastguard Worker 	unsigned char *cur;
295*cf84ac9aSAndroid Build Coastguard Worker 
296*cf84ac9aSAndroid Build Coastguard Worker 	if (!offs)
297*cf84ac9aSAndroid Build Coastguard Worker 		return;
298*cf84ac9aSAndroid Build Coastguard Worker 	if (hdr_size < 56)
299*cf84ac9aSAndroid Build Coastguard Worker 		error_msg_and_fail("sthyi: guest %d section is too small "
300*cf84ac9aSAndroid Build Coastguard Worker 			           "(got %hu, 56 expected)", level, hdr_size);
301*cf84ac9aSAndroid Build Coastguard Worker 
302*cf84ac9aSAndroid Build Coastguard Worker 	cur = buf + offs;
303*cf84ac9aSAndroid Build Coastguard Worker 
304*cf84ac9aSAndroid Build Coastguard Worker 	printf(", /* guest %d */ {infgflg1", level);
305*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8("", cur, 0, true);
306*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
307*cf84ac9aSAndroid Build Coastguard Worker 	if (cur[0]) {
308*cf84ac9aSAndroid Build Coastguard Worker 		bool printed = false;
309*cf84ac9aSAndroid Build Coastguard Worker 
310*cf84ac9aSAndroid Build Coastguard Worker 		printf(" /* ");
311*cf84ac9aSAndroid Build Coastguard Worker 		if (cur[0] & 0x80) {
312*cf84ac9aSAndroid Build Coastguard Worker 			printf("0x80 - guest is mobility enabled");
313*cf84ac9aSAndroid Build Coastguard Worker 			printed = true;
314*cf84ac9aSAndroid Build Coastguard Worker 		}
315*cf84ac9aSAndroid Build Coastguard Worker 		if (cur[0] & 0x40) {
316*cf84ac9aSAndroid Build Coastguard Worker 			if (printed)
317*cf84ac9aSAndroid Build Coastguard Worker 				printf(", ");
318*cf84ac9aSAndroid Build Coastguard Worker 			printf("0x40 - guest has multiple virtual CPU types");
319*cf84ac9aSAndroid Build Coastguard Worker 			printed = true;
320*cf84ac9aSAndroid Build Coastguard Worker 		}
321*cf84ac9aSAndroid Build Coastguard Worker 		if (cur[0] & 0x20) {
322*cf84ac9aSAndroid Build Coastguard Worker 			if (printed)
323*cf84ac9aSAndroid Build Coastguard Worker 				printf(", ");
324*cf84ac9aSAndroid Build Coastguard Worker 			printf("0x20 - guest CP dispatch type has LIMITHARD "
325*cf84ac9aSAndroid Build Coastguard Worker 			       "cap");
326*cf84ac9aSAndroid Build Coastguard Worker 			printed = true;
327*cf84ac9aSAndroid Build Coastguard Worker 		}
328*cf84ac9aSAndroid Build Coastguard Worker 		if (cur[0] & 0x10) {
329*cf84ac9aSAndroid Build Coastguard Worker 			if (printed)
330*cf84ac9aSAndroid Build Coastguard Worker 				printf(", ");
331*cf84ac9aSAndroid Build Coastguard Worker 			printf("0x10 - guest IFL dispatch type has LIMITHARD "
332*cf84ac9aSAndroid Build Coastguard Worker 			       "cap");
333*cf84ac9aSAndroid Build Coastguard Worker 			printed = true;
334*cf84ac9aSAndroid Build Coastguard Worker 		}
335*cf84ac9aSAndroid Build Coastguard Worker 		if (cur[0] & 0x08) {
336*cf84ac9aSAndroid Build Coastguard Worker 			if (printed)
337*cf84ac9aSAndroid Build Coastguard Worker 				printf(", ");
338*cf84ac9aSAndroid Build Coastguard Worker 			printf("0x08 - virtual CPs are thread dispatched");
339*cf84ac9aSAndroid Build Coastguard Worker 			printed = true;
340*cf84ac9aSAndroid Build Coastguard Worker 		}
341*cf84ac9aSAndroid Build Coastguard Worker 		if (cur[0] & 0x04) {
342*cf84ac9aSAndroid Build Coastguard Worker 			if (printed)
343*cf84ac9aSAndroid Build Coastguard Worker 				printf(", ");
344*cf84ac9aSAndroid Build Coastguard Worker 			printf("0x04 - virtual IFLs are thread dispatched");
345*cf84ac9aSAndroid Build Coastguard Worker 			printed = true;
346*cf84ac9aSAndroid Build Coastguard Worker 		}
347*cf84ac9aSAndroid Build Coastguard Worker 		if (cur[0] & 0x3) {
348*cf84ac9aSAndroid Build Coastguard Worker 			if (printed)
349*cf84ac9aSAndroid Build Coastguard Worker 				printf(", ");
350*cf84ac9aSAndroid Build Coastguard Worker 			printf("%#hhx - ???", cur[0] & 0x3);
351*cf84ac9aSAndroid Build Coastguard Worker 		}
352*cf84ac9aSAndroid Build Coastguard Worker 		printf(" */");
353*cf84ac9aSAndroid Build Coastguard Worker 	}
354*cf84ac9aSAndroid Build Coastguard Worker 
355*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8(", infgflg2", cur, 1, false);
356*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8(", infgval1", cur, 2, false);
357*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8(", infgval2", cur, 3, false);
358*cf84ac9aSAndroid Build Coastguard Worker # endif /* !VERBOSE */
359*cf84ac9aSAndroid Build Coastguard Worker 
360*cf84ac9aSAndroid Build Coastguard Worker 	print_ebcdic(", infgusid", cur, 4, 8, true, false);
361*cf84ac9aSAndroid Build Coastguard Worker 
362*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infgscps", cur, 12, VERBOSE);
363*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infgdcps", cur, 14, VERBOSE);
364*cf84ac9aSAndroid Build Coastguard Worker 
365*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
366*cf84ac9aSAndroid Build Coastguard Worker 	print_u8(", infgcpdt", cur, 16, true);
367*cf84ac9aSAndroid Build Coastguard Worker 	if (cur[16] == 0)
368*cf84ac9aSAndroid Build Coastguard Worker 		printf(" /* General Purpose (CP) */");
369*cf84ac9aSAndroid Build Coastguard Worker 	else
370*cf84ac9aSAndroid Build Coastguard Worker 		printf(" /* unknown */");
371*cf84ac9aSAndroid Build Coastguard Worker 
372*cf84ac9aSAndroid Build Coastguard Worker 	if (cur[17] || cur[18] || cur[19])
373*cf84ac9aSAndroid Build Coastguard Worker 		printf(", reserved_1__=\"\\x%#02hhx\\x%#02hhx\\x%#02hhx\"",
374*cf84ac9aSAndroid Build Coastguard Worker 		       cur[17], cur[18], cur[19]);
375*cf84ac9aSAndroid Build Coastguard Worker # endif /* !VERBOSE */
376*cf84ac9aSAndroid Build Coastguard Worker 
377*cf84ac9aSAndroid Build Coastguard Worker 	print_weight(", infgcpcc", cur, 20, VERBOSE);
378*cf84ac9aSAndroid Build Coastguard Worker 
379*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infgsifl", cur, 24, VERBOSE);
380*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infgdifl", cur, 26, VERBOSE);
381*cf84ac9aSAndroid Build Coastguard Worker 
382*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
383*cf84ac9aSAndroid Build Coastguard Worker 	print_u8(", infgifdt", cur, 28, true);
384*cf84ac9aSAndroid Build Coastguard Worker 	if (cur[28] == 0)
385*cf84ac9aSAndroid Build Coastguard Worker 		printf(" /* General Purpose (CP) */");
386*cf84ac9aSAndroid Build Coastguard Worker 	else if (cur[28] == 3)
387*cf84ac9aSAndroid Build Coastguard Worker 		printf(" /* Integrated Facility for Linux (IFL) */");
388*cf84ac9aSAndroid Build Coastguard Worker 	else
389*cf84ac9aSAndroid Build Coastguard Worker 		printf(" /* unknown */");
390*cf84ac9aSAndroid Build Coastguard Worker 
391*cf84ac9aSAndroid Build Coastguard Worker 	if (cur[29] || cur[30] || cur[31])
392*cf84ac9aSAndroid Build Coastguard Worker 		printf(", reserved_2__=\"\\x%#02hhx\\x%#02hhx\\x%#02hhx\"",
393*cf84ac9aSAndroid Build Coastguard Worker 		       cur[29], cur[30], cur[31]);
394*cf84ac9aSAndroid Build Coastguard Worker # endif /* !VERBOSE */
395*cf84ac9aSAndroid Build Coastguard Worker 
396*cf84ac9aSAndroid Build Coastguard Worker 	print_weight(", infgifcc", cur, 32, VERBOSE);
397*cf84ac9aSAndroid Build Coastguard Worker 
398*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8(", infgpflg", cur, 36, true);
399*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
400*cf84ac9aSAndroid Build Coastguard Worker 	if (cur[36]) {
401*cf84ac9aSAndroid Build Coastguard Worker 		bool printed = false;
402*cf84ac9aSAndroid Build Coastguard Worker 
403*cf84ac9aSAndroid Build Coastguard Worker 		printf(" /* ");
404*cf84ac9aSAndroid Build Coastguard Worker 		if (cur[36] & 0x80) {
405*cf84ac9aSAndroid Build Coastguard Worker 			printf("0x80 - CPU pool's CP virtual type has "
406*cf84ac9aSAndroid Build Coastguard Worker 			       "LIMITHARD cap");
407*cf84ac9aSAndroid Build Coastguard Worker 			printed = true;
408*cf84ac9aSAndroid Build Coastguard Worker 		}
409*cf84ac9aSAndroid Build Coastguard Worker 		if (cur[36] & 0x40) {
410*cf84ac9aSAndroid Build Coastguard Worker 			if (printed)
411*cf84ac9aSAndroid Build Coastguard Worker 				printf(", ");
412*cf84ac9aSAndroid Build Coastguard Worker 			printf("0x40 - CPU pool's CP virtual type has "
413*cf84ac9aSAndroid Build Coastguard Worker 			       "CAPACITY cap");
414*cf84ac9aSAndroid Build Coastguard Worker 			printed = true;
415*cf84ac9aSAndroid Build Coastguard Worker 		}
416*cf84ac9aSAndroid Build Coastguard Worker 		if (cur[36] & 0x20) {
417*cf84ac9aSAndroid Build Coastguard Worker 			if (printed)
418*cf84ac9aSAndroid Build Coastguard Worker 				printf(", ");
419*cf84ac9aSAndroid Build Coastguard Worker 			printf("0x20 - CPU pool's IFL virtual type has "
420*cf84ac9aSAndroid Build Coastguard Worker 			       "LIMITHARD cap");
421*cf84ac9aSAndroid Build Coastguard Worker 			printed = true;
422*cf84ac9aSAndroid Build Coastguard Worker 		}
423*cf84ac9aSAndroid Build Coastguard Worker 		if (cur[36] & 0x10) {
424*cf84ac9aSAndroid Build Coastguard Worker 			if (printed)
425*cf84ac9aSAndroid Build Coastguard Worker 				printf(", ");
426*cf84ac9aSAndroid Build Coastguard Worker 			printf("0x10 - CPU pool's IFL virtual type has "
427*cf84ac9aSAndroid Build Coastguard Worker 			       "CAPACITY cap");
428*cf84ac9aSAndroid Build Coastguard Worker 			printed = true;
429*cf84ac9aSAndroid Build Coastguard Worker 		}
430*cf84ac9aSAndroid Build Coastguard Worker 		if (cur[36] & 0x08) {
431*cf84ac9aSAndroid Build Coastguard Worker 			if (printed)
432*cf84ac9aSAndroid Build Coastguard Worker 				printf(", ");
433*cf84ac9aSAndroid Build Coastguard Worker 			printf("0x08 - CPU pool uses prorated core time");
434*cf84ac9aSAndroid Build Coastguard Worker 			printed = true;
435*cf84ac9aSAndroid Build Coastguard Worker 		}
436*cf84ac9aSAndroid Build Coastguard Worker 		if (cur[36] & 0x7) {
437*cf84ac9aSAndroid Build Coastguard Worker 			if (printed)
438*cf84ac9aSAndroid Build Coastguard Worker 				printf(", ");
439*cf84ac9aSAndroid Build Coastguard Worker 			printf("%#hhx - ???", cur[36] & 0x7);
440*cf84ac9aSAndroid Build Coastguard Worker 		}
441*cf84ac9aSAndroid Build Coastguard Worker 		printf(" */");
442*cf84ac9aSAndroid Build Coastguard Worker 	}
443*cf84ac9aSAndroid Build Coastguard Worker 
444*cf84ac9aSAndroid Build Coastguard Worker 	if (cur[37] || cur[38] || cur[39])
445*cf84ac9aSAndroid Build Coastguard Worker 		printf(", reserved_3__=\"\\x%#02hhx\\x%#02hhx\\x%#02hhx\"",
446*cf84ac9aSAndroid Build Coastguard Worker 		       cur[37], cur[38], cur[39]);
447*cf84ac9aSAndroid Build Coastguard Worker 
448*cf84ac9aSAndroid Build Coastguard Worker 	print_ebcdic(", infgpnam", cur, 40, 8, false, true);
449*cf84ac9aSAndroid Build Coastguard Worker 
450*cf84ac9aSAndroid Build Coastguard Worker 	print_weight(", infgpccc", cur, 48, true);
451*cf84ac9aSAndroid Build Coastguard Worker 	print_weight(", infgpicc", cur, 52, true);
452*cf84ac9aSAndroid Build Coastguard Worker 
453*cf84ac9aSAndroid Build Coastguard Worker 	if (hdr_size > 56 && !is_empty(cur + 56, hdr_size - 56)) {
454*cf84ac9aSAndroid Build Coastguard Worker 		printf(", ");
455*cf84ac9aSAndroid Build Coastguard Worker 		print_quoted_hex((char *) (cur + 56), hdr_size - 56);
456*cf84ac9aSAndroid Build Coastguard Worker 	}
457*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
458*cf84ac9aSAndroid Build Coastguard Worker 	printf(", ...");
459*cf84ac9aSAndroid Build Coastguard Worker # endif /* !VERBOSE */
460*cf84ac9aSAndroid Build Coastguard Worker 
461*cf84ac9aSAndroid Build Coastguard Worker 	printf("}");
462*cf84ac9aSAndroid Build Coastguard Worker }
463*cf84ac9aSAndroid Build Coastguard Worker 
464*cf84ac9aSAndroid Build Coastguard Worker static void
print_sthyi(unsigned char * buf)465*cf84ac9aSAndroid Build Coastguard Worker print_sthyi(unsigned char *buf)
466*cf84ac9aSAndroid Build Coastguard Worker {
467*cf84ac9aSAndroid Build Coastguard Worker 	unsigned char *cur;
468*cf84ac9aSAndroid Build Coastguard Worker 	uint16_t hdr_size;
469*cf84ac9aSAndroid Build Coastguard Worker 	uint16_t offs;
470*cf84ac9aSAndroid Build Coastguard Worker 	bool mt = false;
471*cf84ac9aSAndroid Build Coastguard Worker 
472*cf84ac9aSAndroid Build Coastguard Worker 	hdr_size = *(uint16_t *) (buf + 10);
473*cf84ac9aSAndroid Build Coastguard Worker 	if (hdr_size < 44)
474*cf84ac9aSAndroid Build Coastguard Worker 		error_msg_and_fail("sthyi: header section is too small "
475*cf84ac9aSAndroid Build Coastguard Worker 			           "(got %hu, 44 expected)", hdr_size);
476*cf84ac9aSAndroid Build Coastguard Worker 
477*cf84ac9aSAndroid Build Coastguard Worker 	/* INFHFLG1 */
478*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8("{/* header */ {infhflg1", buf, 0, true);
479*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
480*cf84ac9aSAndroid Build Coastguard Worker 	if (buf[0]) {
481*cf84ac9aSAndroid Build Coastguard Worker 		bool printed = false;
482*cf84ac9aSAndroid Build Coastguard Worker 
483*cf84ac9aSAndroid Build Coastguard Worker 		printf(" /* ");
484*cf84ac9aSAndroid Build Coastguard Worker 		if (buf[0] & 0x80) {
485*cf84ac9aSAndroid Build Coastguard Worker 			printf("0x80 - Global Performance Data unavailable");
486*cf84ac9aSAndroid Build Coastguard Worker 			printed = true;
487*cf84ac9aSAndroid Build Coastguard Worker 		}
488*cf84ac9aSAndroid Build Coastguard Worker 		if (buf[0] & 0x40) {
489*cf84ac9aSAndroid Build Coastguard Worker 			if (printed)
490*cf84ac9aSAndroid Build Coastguard Worker 				printf(", ");
491*cf84ac9aSAndroid Build Coastguard Worker 			printf("0x40 - One or more hypervisor levels below "
492*cf84ac9aSAndroid Build Coastguard Worker 			       "this level does not support the STHYI "
493*cf84ac9aSAndroid Build Coastguard Worker 			       "instruction");
494*cf84ac9aSAndroid Build Coastguard Worker 			printed = true;
495*cf84ac9aSAndroid Build Coastguard Worker 		}
496*cf84ac9aSAndroid Build Coastguard Worker 		if (buf[0] & 0x20) {
497*cf84ac9aSAndroid Build Coastguard Worker 			if (printed)
498*cf84ac9aSAndroid Build Coastguard Worker 				printf(", ");
499*cf84ac9aSAndroid Build Coastguard Worker 			printf("0x20 - Virtualization stack is incomplete");
500*cf84ac9aSAndroid Build Coastguard Worker 			printed = true;
501*cf84ac9aSAndroid Build Coastguard Worker 		}
502*cf84ac9aSAndroid Build Coastguard Worker 		if (buf[0] & 0x10) {
503*cf84ac9aSAndroid Build Coastguard Worker 			if (printed)
504*cf84ac9aSAndroid Build Coastguard Worker 				printf(", ");
505*cf84ac9aSAndroid Build Coastguard Worker 			printf("0x10 - Execution environment is not within a "
506*cf84ac9aSAndroid Build Coastguard Worker 			       "logical partition");
507*cf84ac9aSAndroid Build Coastguard Worker 			printed = true;
508*cf84ac9aSAndroid Build Coastguard Worker 		}
509*cf84ac9aSAndroid Build Coastguard Worker 		if (buf[0] & 0xF) {
510*cf84ac9aSAndroid Build Coastguard Worker 			if (printed)
511*cf84ac9aSAndroid Build Coastguard Worker 				printf(", ");
512*cf84ac9aSAndroid Build Coastguard Worker 			printf("%#hhx - ???", buf[0] & 0xF);
513*cf84ac9aSAndroid Build Coastguard Worker 		}
514*cf84ac9aSAndroid Build Coastguard Worker 		printf(" */");
515*cf84ac9aSAndroid Build Coastguard Worker 	}
516*cf84ac9aSAndroid Build Coastguard Worker 
517*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8(", infhflg2", buf, 1, false);
518*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8(", infhval1", buf, 2, false);
519*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8(", infhval2", buf, 3, false);
520*cf84ac9aSAndroid Build Coastguard Worker 
521*cf84ac9aSAndroid Build Coastguard Worker 	/* Reserved */
522*cf84ac9aSAndroid Build Coastguard Worker 	if (buf[4] || buf[5] || buf[6])
523*cf84ac9aSAndroid Build Coastguard Worker 		printf(", reserved_1__=\"\\x%#02hhx\\x%#02hhx\\x%#02hhx\"",
524*cf84ac9aSAndroid Build Coastguard Worker 		       buf[4], buf[5], buf[6]);
525*cf84ac9aSAndroid Build Coastguard Worker 
526*cf84ac9aSAndroid Build Coastguard Worker 	print_u8(", infhygct", buf, 7, true);
527*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infhtotl", buf, 8, true);
528*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infhdln", buf, 10, true);
529*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infmoff", buf, 12, true);
530*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infmlen", buf, 14, true);
531*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infpoff", buf, 16, true);
532*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infplen", buf, 18, true);
533*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infhoff1", buf, 20, true);
534*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infhlen1", buf, 22, true);
535*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infgoff1", buf, 24, true);
536*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infglen1", buf, 26, true);
537*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infhoff2", buf, 28, true);
538*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infhlen2", buf, 30, true);
539*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infgoff2", buf, 32, true);
540*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infglen2", buf, 34, true);
541*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infhoff3", buf, 36, true);
542*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infhlen3", buf, 38, true);
543*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infgoff3", buf, 40, true);
544*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infglen3", buf, 42, true);
545*cf84ac9aSAndroid Build Coastguard Worker 
546*cf84ac9aSAndroid Build Coastguard Worker 	if (hdr_size > 44 && !is_empty(buf + 44, hdr_size - 44)) {
547*cf84ac9aSAndroid Build Coastguard Worker 		printf(", ");
548*cf84ac9aSAndroid Build Coastguard Worker 		print_quoted_hex((char *) (buf + 44), hdr_size - 44);
549*cf84ac9aSAndroid Build Coastguard Worker 	}
550*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
551*cf84ac9aSAndroid Build Coastguard Worker 	printf(", ...");
552*cf84ac9aSAndroid Build Coastguard Worker # endif /* !VERBOSE */
553*cf84ac9aSAndroid Build Coastguard Worker 
554*cf84ac9aSAndroid Build Coastguard Worker 	printf("}");
555*cf84ac9aSAndroid Build Coastguard Worker 
556*cf84ac9aSAndroid Build Coastguard Worker 	/* Machine header */
557*cf84ac9aSAndroid Build Coastguard Worker 	offs = *(uint16_t *) (buf + 12);
558*cf84ac9aSAndroid Build Coastguard Worker 	if (!offs)
559*cf84ac9aSAndroid Build Coastguard Worker 		goto partition_hdr;
560*cf84ac9aSAndroid Build Coastguard Worker 
561*cf84ac9aSAndroid Build Coastguard Worker 	hdr_size = *(uint16_t *) (buf + 14);
562*cf84ac9aSAndroid Build Coastguard Worker 	if (hdr_size < 60)
563*cf84ac9aSAndroid Build Coastguard Worker 		error_msg_and_fail("sthyi: machine section is too small "
564*cf84ac9aSAndroid Build Coastguard Worker 			           "(got %hu, 60 expected)", hdr_size);
565*cf84ac9aSAndroid Build Coastguard Worker 
566*cf84ac9aSAndroid Build Coastguard Worker 	cur = buf + offs;
567*cf84ac9aSAndroid Build Coastguard Worker 
568*cf84ac9aSAndroid Build Coastguard Worker 	printf(", /* machine */ {");
569*cf84ac9aSAndroid Build Coastguard Worker 
570*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
571*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8("infmflg1", cur, 0, false);
572*cf84ac9aSAndroid Build Coastguard Worker 	if (cur[0])
573*cf84ac9aSAndroid Build Coastguard Worker 		printf(", ");
574*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8("infmflg2", cur, 1, false);
575*cf84ac9aSAndroid Build Coastguard Worker 	if (cur[1])
576*cf84ac9aSAndroid Build Coastguard Worker 		printf(", ");
577*cf84ac9aSAndroid Build Coastguard Worker # endif /* !VERBOSE */
578*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8("infmval1", cur, 2, true);
579*cf84ac9aSAndroid Build Coastguard Worker 
580*cf84ac9aSAndroid Build Coastguard Worker 	bool cnt_valid = cur[2] & 0x80;
581*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
582*cf84ac9aSAndroid Build Coastguard Worker 	bool id_valid = cur[2] & 0x40;
583*cf84ac9aSAndroid Build Coastguard Worker 	bool name_valid = cur[2] & 0x20;
584*cf84ac9aSAndroid Build Coastguard Worker 
585*cf84ac9aSAndroid Build Coastguard Worker 	printf(" /* processor count validity: %d, machine ID validity: %d, "
586*cf84ac9aSAndroid Build Coastguard Worker 	       "machine name validity: %d",
587*cf84ac9aSAndroid Build Coastguard Worker 	       !!cnt_valid, !!id_valid, !!name_valid);
588*cf84ac9aSAndroid Build Coastguard Worker 	if (cur[2] & 0x1F)
589*cf84ac9aSAndroid Build Coastguard Worker 		printf(", %#hhx - ???", cur[2] & 0x1F);
590*cf84ac9aSAndroid Build Coastguard Worker 	printf(" */");
591*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8(", infmval2", cur, 3, false);
592*cf84ac9aSAndroid Build Coastguard Worker # endif /* !VERBOSE */
593*cf84ac9aSAndroid Build Coastguard Worker 
594*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infmscps", cur, 4,  cnt_valid);
595*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infmdcps", cur, 6,  cnt_valid);
596*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infmsifl", cur, 8,  cnt_valid);
597*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infmdifl", cur, 10, cnt_valid);
598*cf84ac9aSAndroid Build Coastguard Worker 
599*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
600*cf84ac9aSAndroid Build Coastguard Worker 	print_ebcdic(", infmname", cur, 12, 8, name_valid, false);
601*cf84ac9aSAndroid Build Coastguard Worker 
602*cf84ac9aSAndroid Build Coastguard Worker 	print_ebcdic(", infmtype", cur, 20, 4,  id_valid, false);
603*cf84ac9aSAndroid Build Coastguard Worker 	print_ebcdic(", infmmanu", cur, 24, 16, id_valid, false);
604*cf84ac9aSAndroid Build Coastguard Worker 	print_ebcdic(", infmseq",  cur, 40, 16, id_valid, false);
605*cf84ac9aSAndroid Build Coastguard Worker 	print_ebcdic(", infmpman", cur, 56, 4,  id_valid, false);
606*cf84ac9aSAndroid Build Coastguard Worker 
607*cf84ac9aSAndroid Build Coastguard Worker 	if (hdr_size > 60 && !is_empty(cur + 60, hdr_size - 60)) {
608*cf84ac9aSAndroid Build Coastguard Worker 		printf(", ");
609*cf84ac9aSAndroid Build Coastguard Worker 		print_quoted_hex((char *) (cur + 60), hdr_size - 60);
610*cf84ac9aSAndroid Build Coastguard Worker 	}
611*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
612*cf84ac9aSAndroid Build Coastguard Worker 	printf(", ...");
613*cf84ac9aSAndroid Build Coastguard Worker # endif /* !VERBOSE */
614*cf84ac9aSAndroid Build Coastguard Worker 
615*cf84ac9aSAndroid Build Coastguard Worker 	printf("}");
616*cf84ac9aSAndroid Build Coastguard Worker 
617*cf84ac9aSAndroid Build Coastguard Worker partition_hdr:
618*cf84ac9aSAndroid Build Coastguard Worker 	/* Partition header */
619*cf84ac9aSAndroid Build Coastguard Worker 	offs = *(uint16_t *) (buf + 16);
620*cf84ac9aSAndroid Build Coastguard Worker 	if (!offs)
621*cf84ac9aSAndroid Build Coastguard Worker 		goto hv_hdr;
622*cf84ac9aSAndroid Build Coastguard Worker 
623*cf84ac9aSAndroid Build Coastguard Worker 	hdr_size = *(uint16_t *) (buf + 18);
624*cf84ac9aSAndroid Build Coastguard Worker 	if (hdr_size < 56)
625*cf84ac9aSAndroid Build Coastguard Worker 		error_msg_and_fail("sthyi: partition section is too small "
626*cf84ac9aSAndroid Build Coastguard Worker 			           "(got %hu, 56 expected)", hdr_size);
627*cf84ac9aSAndroid Build Coastguard Worker 
628*cf84ac9aSAndroid Build Coastguard Worker 	cur = buf + offs;
629*cf84ac9aSAndroid Build Coastguard Worker 
630*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8(", /* partition */ {infpflg1", cur, 0, true);
631*cf84ac9aSAndroid Build Coastguard Worker 	mt = !!(cur[0] & 0x80);
632*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
633*cf84ac9aSAndroid Build Coastguard Worker 	if (cur[0]) {
634*cf84ac9aSAndroid Build Coastguard Worker 		bool printed = false;
635*cf84ac9aSAndroid Build Coastguard Worker 
636*cf84ac9aSAndroid Build Coastguard Worker 		printf(" /* ");
637*cf84ac9aSAndroid Build Coastguard Worker 		if (cur[0] & 0x80) {
638*cf84ac9aSAndroid Build Coastguard Worker 			printf("0x80 - multithreading is enabled");
639*cf84ac9aSAndroid Build Coastguard Worker 			printed = true;
640*cf84ac9aSAndroid Build Coastguard Worker 		}
641*cf84ac9aSAndroid Build Coastguard Worker 		if (cur[0] & 0x7F) {
642*cf84ac9aSAndroid Build Coastguard Worker 			if (printed)
643*cf84ac9aSAndroid Build Coastguard Worker 				printf(", ");
644*cf84ac9aSAndroid Build Coastguard Worker 			printf("%#hhx - ???", cur[0] & 0x7F);
645*cf84ac9aSAndroid Build Coastguard Worker 		}
646*cf84ac9aSAndroid Build Coastguard Worker 		printf(" */");
647*cf84ac9aSAndroid Build Coastguard Worker 	}
648*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8(", infpflg2", cur, 1, false);
649*cf84ac9aSAndroid Build Coastguard Worker # endif /* !VERBOSE */
650*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8(", infpval1", cur, 2, true);
651*cf84ac9aSAndroid Build Coastguard Worker 
652*cf84ac9aSAndroid Build Coastguard Worker 	bool pcnt_valid  = cur[2] & 0x80;
653*cf84ac9aSAndroid Build Coastguard Worker 	bool pid_valid   = cur[2] & 0x10;
654*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
655*cf84ac9aSAndroid Build Coastguard Worker 	bool pwcap_valid = cur[2] & 0x40;
656*cf84ac9aSAndroid Build Coastguard Worker 	bool pacap_valid = cur[2] & 0x20;
657*cf84ac9aSAndroid Build Coastguard Worker 	bool lpar_valid  = cur[2] & 0x08;
658*cf84ac9aSAndroid Build Coastguard Worker # endif /* !VERBOSE */
659*cf84ac9aSAndroid Build Coastguard Worker 
660*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
661*cf84ac9aSAndroid Build Coastguard Worker 	printf(" /* processor count validity: %d, partition weight-based "
662*cf84ac9aSAndroid Build Coastguard Worker 	       "capacity validity: %d, partition absolute capacity validity: "
663*cf84ac9aSAndroid Build Coastguard Worker 	       "%d, partition ID validity: %d, LPAR group absolute capacity "
664*cf84ac9aSAndroid Build Coastguard Worker 	       "capping information validity: %d",
665*cf84ac9aSAndroid Build Coastguard Worker 	       !!pcnt_valid, !!pwcap_valid, !!pacap_valid, !!pid_valid,
666*cf84ac9aSAndroid Build Coastguard Worker 	       !!lpar_valid);
667*cf84ac9aSAndroid Build Coastguard Worker 	if (cur[2] & 0x7)
668*cf84ac9aSAndroid Build Coastguard Worker 		printf(", %#hhx - ???", cur[2] & 0x7);
669*cf84ac9aSAndroid Build Coastguard Worker 	printf(" */");
670*cf84ac9aSAndroid Build Coastguard Worker 
671*cf84ac9aSAndroid Build Coastguard Worker 	print_0x8(", infpval2", cur, 3, false);
672*cf84ac9aSAndroid Build Coastguard Worker # endif /* !VERBOSE */
673*cf84ac9aSAndroid Build Coastguard Worker 
674*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infppnum", cur, 4, pid_valid);
675*cf84ac9aSAndroid Build Coastguard Worker 
676*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infpscps", cur, 6,  pcnt_valid);
677*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infpdcps", cur, 8,  pcnt_valid);
678*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infpsifl", cur, 10, pcnt_valid);
679*cf84ac9aSAndroid Build Coastguard Worker 	print_u16(", infpdifl", cur, 12, pcnt_valid);
680*cf84ac9aSAndroid Build Coastguard Worker 
681*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
682*cf84ac9aSAndroid Build Coastguard Worker 	if (cur[14] || cur[15])
683*cf84ac9aSAndroid Build Coastguard Worker 		printf(", reserved_1__=\"\\x%#02hhx\\x%#02hhx\"",
684*cf84ac9aSAndroid Build Coastguard Worker 		       cur[14], cur[15]);
685*cf84ac9aSAndroid Build Coastguard Worker # endif /* !VERBOSE */
686*cf84ac9aSAndroid Build Coastguard Worker 
687*cf84ac9aSAndroid Build Coastguard Worker 	print_ebcdic(", infppnam", cur, 16, 8, pid_valid, false);
688*cf84ac9aSAndroid Build Coastguard Worker 
689*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
690*cf84ac9aSAndroid Build Coastguard Worker 	print_weight(", infpwbcp", cur, 24, pwcap_valid);
691*cf84ac9aSAndroid Build Coastguard Worker 	print_weight(", infpabcp", cur, 28, pacap_valid);
692*cf84ac9aSAndroid Build Coastguard Worker 	print_weight(", infpwbif", cur, 32, pwcap_valid);
693*cf84ac9aSAndroid Build Coastguard Worker 	print_weight(", infpabif", cur, 36, pacap_valid);
694*cf84ac9aSAndroid Build Coastguard Worker 
695*cf84ac9aSAndroid Build Coastguard Worker 	if (print_ebcdic(", infplgnm", cur, 40, 8, false, false)) {
696*cf84ac9aSAndroid Build Coastguard Worker 
697*cf84ac9aSAndroid Build Coastguard Worker 		print_weight(", infplgcp", cur, 48, false);
698*cf84ac9aSAndroid Build Coastguard Worker 		print_weight(", infplgif", cur, 52, false);
699*cf84ac9aSAndroid Build Coastguard Worker 	} else {
700*cf84ac9aSAndroid Build Coastguard Worker 		if (lpar_valid) {
701*cf84ac9aSAndroid Build Coastguard Worker 			printf(", infplgnm=");
702*cf84ac9aSAndroid Build Coastguard Worker 			print_quoted_hex((char *) (cur + 40), 8);
703*cf84ac9aSAndroid Build Coastguard Worker 		}
704*cf84ac9aSAndroid Build Coastguard Worker 
705*cf84ac9aSAndroid Build Coastguard Worker 		print_x32(", infplgcp", cur, 48, false);
706*cf84ac9aSAndroid Build Coastguard Worker 		print_x32(", infplgif", cur, 52, false);
707*cf84ac9aSAndroid Build Coastguard Worker 	}
708*cf84ac9aSAndroid Build Coastguard Worker 
709*cf84ac9aSAndroid Build Coastguard Worker 	if (hdr_size > 56 && !is_empty(cur + 56, hdr_size - 56)) {
710*cf84ac9aSAndroid Build Coastguard Worker 		printf(", ");
711*cf84ac9aSAndroid Build Coastguard Worker 		print_quoted_hex((char *) (cur + 56), hdr_size - 56);
712*cf84ac9aSAndroid Build Coastguard Worker 	}
713*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
714*cf84ac9aSAndroid Build Coastguard Worker 	printf(", ...");
715*cf84ac9aSAndroid Build Coastguard Worker # endif /* !VERBOSE */
716*cf84ac9aSAndroid Build Coastguard Worker 
717*cf84ac9aSAndroid Build Coastguard Worker 	printf("}");
718*cf84ac9aSAndroid Build Coastguard Worker 
719*cf84ac9aSAndroid Build Coastguard Worker hv_hdr:
720*cf84ac9aSAndroid Build Coastguard Worker 	/* Hypervisor/guest headers */
721*cf84ac9aSAndroid Build Coastguard Worker 	print_hypervisor_header(buf, 1, 20, 22, mt);
722*cf84ac9aSAndroid Build Coastguard Worker 	print_guest_header(buf, 1, 24, 26);
723*cf84ac9aSAndroid Build Coastguard Worker 	print_hypervisor_header(buf, 2, 28, 30, mt);
724*cf84ac9aSAndroid Build Coastguard Worker 	print_guest_header(buf, 2, 32, 34);
725*cf84ac9aSAndroid Build Coastguard Worker 	print_hypervisor_header(buf, 3, 36, 38, mt);
726*cf84ac9aSAndroid Build Coastguard Worker 	print_guest_header(buf, 3, 40, 42);
727*cf84ac9aSAndroid Build Coastguard Worker 
728*cf84ac9aSAndroid Build Coastguard Worker 	printf("}");
729*cf84ac9aSAndroid Build Coastguard Worker }
730*cf84ac9aSAndroid Build Coastguard Worker 
731*cf84ac9aSAndroid Build Coastguard Worker int
main(void)732*cf84ac9aSAndroid Build Coastguard Worker main(void)
733*cf84ac9aSAndroid Build Coastguard Worker {
734*cf84ac9aSAndroid Build Coastguard Worker 	static const kernel_ulong_t bogus_func =
735*cf84ac9aSAndroid Build Coastguard Worker 		(kernel_ulong_t) 0xdeafbeefdeadc0deULL;
736*cf84ac9aSAndroid Build Coastguard Worker 	static const kernel_ulong_t bogus_resp_buf =
737*cf84ac9aSAndroid Build Coastguard Worker 		(kernel_ulong_t) 0xfacefeedac0ffeedULL;
738*cf84ac9aSAndroid Build Coastguard Worker 	static const kernel_ulong_t bogus_ret_code =
739*cf84ac9aSAndroid Build Coastguard Worker 		(kernel_ulong_t) 0xf00dfa57decaffedULL;
740*cf84ac9aSAndroid Build Coastguard Worker 	static const kernel_ulong_t bogus_flags =
741*cf84ac9aSAndroid Build Coastguard Worker 		(kernel_ulong_t) 0xfee1deadfa57beefULL;
742*cf84ac9aSAndroid Build Coastguard Worker 
743*cf84ac9aSAndroid Build Coastguard Worker 	unsigned char *buf = tail_alloc(PAGE_SIZE);
744*cf84ac9aSAndroid Build Coastguard Worker 	TAIL_ALLOC_OBJECT_CONST_PTR(uint64_t, ret);
745*cf84ac9aSAndroid Build Coastguard Worker 
746*cf84ac9aSAndroid Build Coastguard Worker 	long rc;
747*cf84ac9aSAndroid Build Coastguard Worker 
748*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_s390_sthyi, 0, 0, 0, 0);
749*cf84ac9aSAndroid Build Coastguard Worker 	printf("s390_sthyi(STHYI_FC_CP_IFL_CAP, NULL, NULL, 0) = %s\n",
750*cf84ac9aSAndroid Build Coastguard Worker 	       sprintrc(rc));
751*cf84ac9aSAndroid Build Coastguard Worker 
752*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_s390_sthyi, bogus_func, bogus_resp_buf,
753*cf84ac9aSAndroid Build Coastguard Worker 		     bogus_ret_code, bogus_flags);
754*cf84ac9aSAndroid Build Coastguard Worker 	printf("s390_sthyi(%#llx /* STHYI_FC_??? */, %#llx, %#llx, %#llx) = "
755*cf84ac9aSAndroid Build Coastguard Worker 	       "%s\n",
756*cf84ac9aSAndroid Build Coastguard Worker 	       (unsigned long long) bogus_func,
757*cf84ac9aSAndroid Build Coastguard Worker 	       (unsigned long long) bogus_resp_buf,
758*cf84ac9aSAndroid Build Coastguard Worker 	       (unsigned long long) bogus_ret_code,
759*cf84ac9aSAndroid Build Coastguard Worker 	       (unsigned long long) bogus_flags,
760*cf84ac9aSAndroid Build Coastguard Worker 	       sprintrc(rc));
761*cf84ac9aSAndroid Build Coastguard Worker 
762*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_s390_sthyi, bogus_func, buf, ret, 0);
763*cf84ac9aSAndroid Build Coastguard Worker 	printf("s390_sthyi(%#llx /* STHYI_FC_??? */, %p, %p, 0) = %s\n",
764*cf84ac9aSAndroid Build Coastguard Worker 	       (unsigned long long) bogus_func, buf, ret, sprintrc(rc));
765*cf84ac9aSAndroid Build Coastguard Worker 
766*cf84ac9aSAndroid Build Coastguard Worker 	rc = syscall(__NR_s390_sthyi, 0, buf, ret, 0);
767*cf84ac9aSAndroid Build Coastguard Worker 	if (rc)
768*cf84ac9aSAndroid Build Coastguard Worker 		error_msg_and_skip("syscall(__NR_s390_sthyi, 0, buf, ret, 0) "
769*cf84ac9aSAndroid Build Coastguard Worker 				   "returned unexpected value of %ld", rc);
770*cf84ac9aSAndroid Build Coastguard Worker 
771*cf84ac9aSAndroid Build Coastguard Worker 	printf("s390_sthyi(STHYI_FC_CP_IFL_CAP, ");
772*cf84ac9aSAndroid Build Coastguard Worker 	print_sthyi(buf);
773*cf84ac9aSAndroid Build Coastguard Worker 	printf(", [0], 0) = 0\n");
774*cf84ac9aSAndroid Build Coastguard Worker 
775*cf84ac9aSAndroid Build Coastguard Worker 	puts("+++ exited with 0 +++");
776*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
777*cf84ac9aSAndroid Build Coastguard Worker }
778*cf84ac9aSAndroid Build Coastguard Worker 
779*cf84ac9aSAndroid Build Coastguard Worker #else
780*cf84ac9aSAndroid Build Coastguard Worker 
781*cf84ac9aSAndroid Build Coastguard Worker SKIP_MAIN_UNDEFINED("HAVE_ICONV_H && HAVE_ICONV_OPEN && __NR_s390_sthyi")
782*cf84ac9aSAndroid Build Coastguard Worker 
783*cf84ac9aSAndroid Build Coastguard Worker #endif
784