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