3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5 * See file CREDITS for list of people who contributed to this
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
28 * Branch instructions: b, bl, bc
30 * The first 2 instructions (b, bl) are verified by jumping
31 * to a fixed address and checking whether control was transfered
32 * to that very point. For the bl instruction the value of the
33 * link register is checked as well (using mfspr).
34 * To verify the bc instruction various combinations of the BI/BO
35 * fields, the CTR and the condition register values are
36 * checked. The list of such combinations is pre-built and
37 * linked in U-Boot at build time.
45 #if CONFIG_POST & CFG_POST_CPU
47 extern void cpu_post_exec_11 (ulong
*code
, ulong
*res
, ulong op1
);
48 extern void cpu_post_exec_31 (ulong
*code
, ulong
*ctr
, ulong
*lr
, ulong
*jump
,
51 static int cpu_post_test_bc (ulong cmd
, ulong bo
, ulong bi
,
52 int pjump
, int decr
, int link
, ulong pctr
, ulong cr
)
59 unsigned long code
[] =
66 ASM_3O(cmd
, bo
, bi
, 8),
74 cpu_post_exec_31 (code
, &ctr
, &lr
, &jump
, cr
);
77 ret
= pjump
== jump
? 0 : -1;
81 ret
= pctr
== ctr
+ 1 ? 0 : -1;
83 ret
= pctr
== ctr
? 0 : -1;
88 ret
= lr
== (ulong
) code
+ 24 ? 0 : -1;
90 ret
= lr
== 0 ? 0 : -1;
96 int cpu_post_test_b (void)
114 cpu_post_exec_11 (code
, &res
, 0);
116 ret
= res
== 0 ? 0 : -1;
120 post_log ("Error at b1 test !\n");
137 cpu_post_exec_11 (code
, &res
, 0);
139 ret
= res
== (ulong
)code
+ 12 ? 0 : -1;
143 post_log ("Error at b2 test !\n");
156 for (cc
= 0; cc
< 4 && ret
== 0; cc
++)
158 for (cd
= 0; cd
< 4 && ret
== 0; cd
++)
160 for (link
= 0; link
<= 1 && ret
== 0; link
++)
162 for (cond
= 0; cond
<= 1 && ret
== 0; cond
++)
164 for (ctr
= 1; ctr
<= 2 && ret
== 0; ctr
++)
167 int cr
= cond
? 0x80000000 : 0x00000000;
168 int jumpc
= cc
>= 2 ||
169 (cc
== 0 && !cond
) ||
171 int jumpd
= cd
>= 2 ||
172 (cd
== 0 && ctr
!= 1) ||
173 (cd
== 1 && ctr
== 1);
174 int jump
= jumpc
&& jumpd
;
176 ret
= cpu_post_test_bc (link
? OP_BCL
: OP_BC
,
177 (cc
<< 3) + (cd
<< 1), 0, jump
, decr
, link
,
182 post_log ("Error at b3 test %d !\n", i
);