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