1*a19f903fSjason /*	$OpenBSD: main.c,v 1.1 2003/07/12 04:08:33 jason Exp $	*/
2*a19f903fSjason 
3*a19f903fSjason /*
4*a19f903fSjason  * Copyright (c) 2003 Jason L. Wright (jason@thought.net)
5*a19f903fSjason  * All rights reserved.
6*a19f903fSjason  *
7*a19f903fSjason  * Redistribution and use in source and binary forms, with or without
8*a19f903fSjason  * modification, are permitted provided that the following conditions
9*a19f903fSjason  * are met:
10*a19f903fSjason  * 1. Redistributions of source code must retain the above copyright
11*a19f903fSjason  *    notice, this list of conditions and the following disclaimer.
12*a19f903fSjason  * 2. Redistributions in binary form must reproduce the above copyright
13*a19f903fSjason  *    notice, this list of conditions and the following disclaimer in the
14*a19f903fSjason  *    documentation and/or other materials provided with the distribution.
15*a19f903fSjason  *
16*a19f903fSjason  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17*a19f903fSjason  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18*a19f903fSjason  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19*a19f903fSjason  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
20*a19f903fSjason  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21*a19f903fSjason  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22*a19f903fSjason  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23*a19f903fSjason  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24*a19f903fSjason  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
25*a19f903fSjason  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26*a19f903fSjason  * POSSIBILITY OF SUCH DAMAGE.
27*a19f903fSjason  */
28*a19f903fSjason #include <sys/types.h>
29*a19f903fSjason #include <signal.h>
30*a19f903fSjason #include <stdio.h>
31*a19f903fSjason #include <err.h>
32*a19f903fSjason #include <string.h>
33*a19f903fSjason #include <unistd.h>
34*a19f903fSjason 
35*a19f903fSjason struct fpquad {
36*a19f903fSjason 	u_int64_t x1;
37*a19f903fSjason 	u_int64_t x2;
38*a19f903fSjason 	u_int64_t x3;
39*a19f903fSjason 	u_int64_t x4;
40*a19f903fSjason };
41*a19f903fSjason 
42*a19f903fSjason void test_ldq_f2_g0(struct fpquad *);
43*a19f903fSjason void test_ldq_f2_simm13(struct fpquad *);
44*a19f903fSjason void test_stq_f2_g0(struct fpquad *);
45*a19f903fSjason void test_stq_f2_simm13(struct fpquad *);
46*a19f903fSjason void test_ldq_f6_g0(struct fpquad *);
47*a19f903fSjason void test_ldq_f6_simm13(struct fpquad *);
48*a19f903fSjason void test_stq_f6_g0(struct fpquad *);
49*a19f903fSjason void test_stq_f6_simm13(struct fpquad *);
50*a19f903fSjason void test_ldq_f10_g0(struct fpquad *);
51*a19f903fSjason void test_ldq_f10_simm13(struct fpquad *);
52*a19f903fSjason void test_stq_f10_g0(struct fpquad *);
53*a19f903fSjason void test_stq_f10_simm13(struct fpquad *);
54*a19f903fSjason void test_ldq_f14_g0(struct fpquad *);
55*a19f903fSjason void test_ldq_f14_simm13(struct fpquad *);
56*a19f903fSjason void test_stq_f14_g0(struct fpquad *);
57*a19f903fSjason void test_stq_f14_simm13(struct fpquad *);
58*a19f903fSjason void test_ldq_f18_g0(struct fpquad *);
59*a19f903fSjason void test_ldq_f18_simm13(struct fpquad *);
60*a19f903fSjason void test_stq_f18_g0(struct fpquad *);
61*a19f903fSjason void test_stq_f18_simm13(struct fpquad *);
62*a19f903fSjason void test_ldq_f22_g0(struct fpquad *);
63*a19f903fSjason void test_ldq_f22_simm13(struct fpquad *);
64*a19f903fSjason void test_stq_f22_g0(struct fpquad *);
65*a19f903fSjason void test_stq_f22_simm13(struct fpquad *);
66*a19f903fSjason void test_ldq_f26_g0(struct fpquad *);
67*a19f903fSjason void test_ldq_f26_simm13(struct fpquad *);
68*a19f903fSjason void test_stq_f26_g0(struct fpquad *);
69*a19f903fSjason void test_stq_f26_simm13(struct fpquad *);
70*a19f903fSjason void test_ldq_f30_g0(struct fpquad *);
71*a19f903fSjason void test_ldq_f30_simm13(struct fpquad *);
72*a19f903fSjason void test_stq_f30_g0(struct fpquad *);
73*a19f903fSjason void test_stq_f30_simm13(struct fpquad *);
74*a19f903fSjason void test_ldq_f34_g0(struct fpquad *);
75*a19f903fSjason void test_ldq_f34_simm13(struct fpquad *);
76*a19f903fSjason void test_stq_f34_g0(struct fpquad *);
77*a19f903fSjason void test_stq_f34_simm13(struct fpquad *);
78*a19f903fSjason void test_ldq_f38_g0(struct fpquad *);
79*a19f903fSjason void test_ldq_f38_simm13(struct fpquad *);
80*a19f903fSjason void test_stq_f38_g0(struct fpquad *);
81*a19f903fSjason void test_stq_f38_simm13(struct fpquad *);
82*a19f903fSjason void test_ldq_f42_g0(struct fpquad *);
83*a19f903fSjason void test_ldq_f42_simm13(struct fpquad *);
84*a19f903fSjason void test_stq_f42_g0(struct fpquad *);
85*a19f903fSjason void test_stq_f42_simm13(struct fpquad *);
86*a19f903fSjason void test_ldq_f46_g0(struct fpquad *);
87*a19f903fSjason void test_ldq_f46_simm13(struct fpquad *);
88*a19f903fSjason void test_stq_f46_g0(struct fpquad *);
89*a19f903fSjason void test_stq_f46_simm13(struct fpquad *);
90*a19f903fSjason void test_ldq_f50_g0(struct fpquad *);
91*a19f903fSjason void test_ldq_f50_simm13(struct fpquad *);
92*a19f903fSjason void test_stq_f50_g0(struct fpquad *);
93*a19f903fSjason void test_stq_f50_simm13(struct fpquad *);
94*a19f903fSjason void test_ldq_f54_g0(struct fpquad *);
95*a19f903fSjason void test_ldq_f54_simm13(struct fpquad *);
96*a19f903fSjason void test_stq_f54_g0(struct fpquad *);
97*a19f903fSjason void test_stq_f54_simm13(struct fpquad *);
98*a19f903fSjason void test_ldq_f58_g0(struct fpquad *);
99*a19f903fSjason void test_ldq_f58_simm13(struct fpquad *);
100*a19f903fSjason void test_stq_f58_g0(struct fpquad *);
101*a19f903fSjason void test_stq_f58_simm13(struct fpquad *);
102*a19f903fSjason void test_ldq_f62_g0(struct fpquad *);
103*a19f903fSjason void test_ldq_f62_simm13(struct fpquad *);
104*a19f903fSjason void test_stq_f62_g0(struct fpquad *);
105*a19f903fSjason void test_stq_f62_simm13(struct fpquad *);
106*a19f903fSjason 
107*a19f903fSjason struct fptest {
108*a19f903fSjason 	char *reg;
109*a19f903fSjason 	char *ldst;
110*a19f903fSjason 	char *dir;
111*a19f903fSjason 	void (*func)(struct fpquad *);
112*a19f903fSjason } thetests[] = {
113*a19f903fSjason 	{"2", "st", "reg", test_stq_f2_g0},
114*a19f903fSjason 	{"2", "ld", "reg", test_ldq_f2_g0},
115*a19f903fSjason 	{"2", "st", "imm", test_stq_f2_simm13},
116*a19f903fSjason 	{"2", "ld", "imm", test_ldq_f2_simm13},
117*a19f903fSjason 	{"6", "st", "reg", test_stq_f6_g0},
118*a19f903fSjason 	{"6", "ld", "reg", test_ldq_f6_g0},
119*a19f903fSjason 	{"6", "st", "imm", test_stq_f6_simm13},
120*a19f903fSjason 	{"6", "ld", "imm", test_ldq_f6_simm13},
121*a19f903fSjason 	{"10", "st", "reg", test_stq_f10_g0},
122*a19f903fSjason 	{"10", "ld", "reg", test_ldq_f10_g0},
123*a19f903fSjason 	{"10", "st", "imm", test_stq_f10_simm13},
124*a19f903fSjason 	{"10", "ld", "imm", test_ldq_f10_simm13},
125*a19f903fSjason 	{"14", "st", "reg", test_stq_f14_g0},
126*a19f903fSjason 	{"14", "ld", "reg", test_ldq_f14_g0},
127*a19f903fSjason 	{"14", "st", "imm", test_stq_f14_simm13},
128*a19f903fSjason 	{"14", "ld", "imm", test_ldq_f14_simm13},
129*a19f903fSjason 	{"18", "st", "reg", test_stq_f18_g0},
130*a19f903fSjason 	{"18", "ld", "reg", test_ldq_f18_g0},
131*a19f903fSjason 	{"18", "st", "imm", test_stq_f18_simm13},
132*a19f903fSjason 	{"18", "ld", "imm", test_ldq_f18_simm13},
133*a19f903fSjason 	{"22", "st", "reg", test_stq_f22_g0},
134*a19f903fSjason 	{"22", "ld", "reg", test_ldq_f22_g0},
135*a19f903fSjason 	{"22", "st", "imm", test_stq_f22_simm13},
136*a19f903fSjason 	{"22", "ld", "imm", test_ldq_f22_simm13},
137*a19f903fSjason 	{"26", "st", "reg", test_stq_f26_g0},
138*a19f903fSjason 	{"26", "ld", "reg", test_ldq_f26_g0},
139*a19f903fSjason 	{"26", "st", "imm", test_stq_f26_simm13},
140*a19f903fSjason 	{"26", "ld", "imm", test_ldq_f26_simm13},
141*a19f903fSjason 	{"30", "st", "reg", test_stq_f30_g0},
142*a19f903fSjason 	{"30", "ld", "reg", test_ldq_f30_g0},
143*a19f903fSjason 	{"30", "st", "imm", test_stq_f30_simm13},
144*a19f903fSjason 	{"30", "ld", "imm", test_ldq_f30_simm13},
145*a19f903fSjason 	{"34", "st", "reg", test_stq_f34_g0},
146*a19f903fSjason 	{"34", "ld", "reg", test_ldq_f34_g0},
147*a19f903fSjason 	{"34", "st", "imm", test_stq_f34_simm13},
148*a19f903fSjason 	{"34", "ld", "imm", test_ldq_f34_simm13},
149*a19f903fSjason 	{"38", "st", "reg", test_stq_f38_g0},
150*a19f903fSjason 	{"38", "ld", "reg", test_ldq_f38_g0},
151*a19f903fSjason 	{"38", "st", "imm", test_stq_f38_simm13},
152*a19f903fSjason 	{"38", "ld", "imm", test_ldq_f38_simm13},
153*a19f903fSjason 	{"42", "st", "reg", test_stq_f42_g0},
154*a19f903fSjason 	{"42", "ld", "reg", test_ldq_f42_g0},
155*a19f903fSjason 	{"42", "st", "imm", test_stq_f42_simm13},
156*a19f903fSjason 	{"42", "ld", "imm", test_ldq_f42_simm13},
157*a19f903fSjason 	{"46", "st", "reg", test_stq_f46_g0},
158*a19f903fSjason 	{"46", "ld", "reg", test_ldq_f46_g0},
159*a19f903fSjason 	{"46", "st", "imm", test_stq_f46_simm13},
160*a19f903fSjason 	{"46", "ld", "imm", test_ldq_f46_simm13},
161*a19f903fSjason 	{"50", "st", "reg", test_stq_f50_g0},
162*a19f903fSjason 	{"50", "ld", "reg", test_ldq_f50_g0},
163*a19f903fSjason 	{"50", "st", "imm", test_stq_f50_simm13},
164*a19f903fSjason 	{"50", "ld", "imm", test_ldq_f50_simm13},
165*a19f903fSjason 	{"54", "st", "reg", test_stq_f54_g0},
166*a19f903fSjason 	{"54", "ld", "reg", test_ldq_f54_g0},
167*a19f903fSjason 	{"54", "st", "imm", test_stq_f54_simm13},
168*a19f903fSjason 	{"54", "ld", "imm", test_ldq_f54_simm13},
169*a19f903fSjason 	{"58", "st", "reg", test_stq_f58_g0},
170*a19f903fSjason 	{"58", "ld", "reg", test_ldq_f58_g0},
171*a19f903fSjason 	{"58", "st", "imm", test_stq_f58_simm13},
172*a19f903fSjason 	{"58", "ld", "imm", test_ldq_f58_simm13},
173*a19f903fSjason 	{"62", "st", "reg", test_stq_f62_g0},
174*a19f903fSjason 	{"62", "ld", "reg", test_ldq_f62_g0},
175*a19f903fSjason 	{"62", "st", "imm", test_stq_f62_simm13},
176*a19f903fSjason 	{"62", "ld", "imm", test_ldq_f62_simm13},
177*a19f903fSjason };
178*a19f903fSjason #define	NTESTS	(sizeof(thetests)/sizeof(thetests[0]))
179*a19f903fSjason 
180*a19f903fSjason void ill_catcher(int, siginfo_t *, void *);
181*a19f903fSjason 
182*a19f903fSjason int
main(int argc,char * argv[])183*a19f903fSjason main(int argc, char *argv[])
184*a19f903fSjason {
185*a19f903fSjason 	struct fptest *fpt;
186*a19f903fSjason 	struct fpquad fpq;
187*a19f903fSjason 	struct sigaction sa;
188*a19f903fSjason 	int i;
189*a19f903fSjason 
190*a19f903fSjason 	if (argc != 4) {
191*a19f903fSjason 		fprintf(stderr, "badreg regnum [ld|st] [reg|imm]\n");
192*a19f903fSjason 		return (1);
193*a19f903fSjason 	}
194*a19f903fSjason 
195*a19f903fSjason 	for (i = 0; i < NTESTS; i++) {
196*a19f903fSjason 		fpt = thetests + i;
197*a19f903fSjason 		if (strcmp(fpt->reg, argv[1]) == 0 &&
198*a19f903fSjason 		    strcmp(fpt->ldst, argv[2]) == 0 &&
199*a19f903fSjason 		    strcmp(fpt->dir, argv[3]) == 0)
200*a19f903fSjason 			break;
201*a19f903fSjason 	}
202*a19f903fSjason 	if (i == NTESTS)
203*a19f903fSjason 		errx(1, "unknown test: %s %s %s", argv[1], argv[2], argv[3]);
204*a19f903fSjason 
205*a19f903fSjason 	sa.sa_sigaction = ill_catcher;
206*a19f903fSjason 	sigemptyset(&sa.sa_mask);
207*a19f903fSjason 	sa.sa_flags = SA_SIGINFO;
208*a19f903fSjason 
209*a19f903fSjason 	if (sigaction(SIGILL, &sa, NULL) == -1)
210*a19f903fSjason 		err(1, "sigaction");
211*a19f903fSjason 
212*a19f903fSjason 	(*fpt->func)(&fpq);
213*a19f903fSjason 	err(1, "%s %s %s did not generate sigill", argv[1], argv[2], argv[3]);
214*a19f903fSjason 	return (0);
215*a19f903fSjason }
216*a19f903fSjason 
217*a19f903fSjason void
ill_catcher(int sig,siginfo_t * si,void * v)218*a19f903fSjason ill_catcher(int sig, siginfo_t *si, void *v)
219*a19f903fSjason {
220*a19f903fSjason 	_exit(0);
221*a19f903fSjason }
222