xref: /onnv-gate/usr/src/cmd/fps/fptest/cheetah_sdc.c (revision 7186:e728311aafb0)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #pragma ident	"%Z%%M%	%I%	%E% SMI"
28 
29 #include <stdio.h>
30 #include <unistd.h>
31 #include <fps_ereport.h>
32 
33 extern void	iflush(void);
34 extern int	g1(unsigned long, unsigned long *, unsigned long *);
35 extern int	g2(unsigned long, unsigned long *, unsigned long *);
36 extern int	g3(unsigned long, unsigned long *, unsigned long *);
37 extern int	g4(unsigned long, unsigned long *, unsigned long *);
38 extern int	l0(unsigned long, unsigned long *, unsigned long *);
39 extern int	l1(unsigned long, unsigned long *, unsigned long *);
40 extern int	l2(unsigned long, unsigned long *, unsigned long *);
41 extern int	l3(unsigned long, unsigned long *, unsigned long *);
42 extern int	l4(unsigned long, unsigned long *, unsigned long *);
43 extern int	l5(unsigned long, unsigned long *, unsigned long *);
44 extern int	l6(unsigned long, unsigned long *, unsigned long *);
45 extern int	l7(unsigned long, unsigned long *, unsigned long *);
46 extern int	o0(unsigned long, unsigned long *, unsigned long *);
47 extern int	o1(unsigned long, unsigned long *, unsigned long *);
48 extern int	o2(unsigned long, unsigned long *, unsigned long *);
49 extern int	o3(unsigned long, unsigned long *, unsigned long *);
50 extern int	o4(unsigned long, unsigned long *, unsigned long *);
51 extern int	o5(unsigned long, unsigned long *, unsigned long *);
52 extern int	o7(unsigned long, unsigned long *, unsigned long *);
53 
54 typedef struct {
55 	char	*reg;
56 	int	(*test_func) (unsigned long, unsigned long *,\
57 		unsigned long *);
58 }reg_info;
59 
60 /* Registers to be tested and the functions to be used for it. */
61 static
62 reg_info	reg_func[] =
63 {
64 	{"g1", g1},
65 	{"g2", g2},
66 	{"g3", g3},
67 	{"g4", g4},
68 	{"l0", l0},
69 	{"l1", l1},
70 	{"l2", l2},
71 	{"l3", l3},
72 	{"l4", l4},
73 	{"l5", l5},
74 	{"l6", l6},
75 	{"l7", l7},
76 	{"o0", o0},
77 	{"o1", o1},
78 	{"o2", o2},
79 	{"o3", o3},
80 	{"o4", o4},
81 	{"o5", o5},
82 	/* %o6 is not tested as it is the %sp */
83 	{"o7", o7}
84 };
85 
86 #define	N_REGS (sizeof (reg_func)/sizeof (*reg_func))
87 
88 /*
89  * cheetah_sdc_test(int limit, int unit, struct fps_test_ereport *report)
90  * tests for silent data corruption first unearthed in a 750 Mhz Cheetah
91  * (Toshiba). Returns if successful or not. If an error, relevant data
92  * is stored in report. The test calls an assembly routine with
93  * different target registers but essentially the same code sequence
94  */
95 int
cheetah_sdc_test(int limit,struct fps_test_ereport * report)96 cheetah_sdc_test(int limit, struct fps_test_ereport *report)
97 {
98 	char err_data[MAX_INFO_SIZE];
99 	int iter;
100 	int regs;
101 	int rval;
102 	uint64_t expect;
103 	uint64_t observe;
104 	unsigned long tmp1 = 0;
105 	unsigned long tmp2 = 0;
106 
107 	unsigned long pattern = 0xDEADDEADDEADDEAD;
108 
109 	for (regs = 0; regs < N_REGS; regs++) {
110 		for (iter = 0; iter < limit; iter++) {
111 			iflush();
112 			rval = reg_func[regs].test_func(pattern, &tmp1, &tmp2);
113 
114 			if (rval != 0) {
115 				(void) snprintf(err_data, sizeof (err_data),
116 				    "Test:%d, reg:%s", iter,
117 				    reg_func[regs].reg);
118 				expect = (uint64_t)0;
119 				observe = (uint64_t)rval;
120 				setup_fps_test_struct(IS_EREPORT_INFO,
121 				    report,	6357, &observe,
122 				    &expect, 1, 1, err_data);
123 
124 				return (-1);
125 			}
126 		}
127 	}
128 
129 	return (0);
130 }
131