On 2014/2/25 星期二 3:11, Scott Wood wrote:
Why what? Why we need it?

It is a help function and used by ASM code in which
we can't determine whether it is a warm reset boot.
Why don't you just open code it?
I can't check the warmboot status in ASM code.
In order to get the warmboot status in ASM code, I wrote this function.
Why can't you check it in asm code?  See lib/asm-offsets.c.
Found it. Still learn how to use it.

Thanks,
Yuantian

+       if (gd->flags & GD_FLG_WARM_BOOT) {
+               src = (u64 *)in_be32(&scfg->sparecr[2]);
+               dst = (u64 *)(0);
+               for (i = 0; i < 128/sizeof(u64); i++) {
+                       *dst = *src;
+                       dst++;
+                       src++;
+               }
+       }
(u64 *)(0) is a NULL pointer.  Dereferencing NULL pointers is undefined
and GCC has been getting increasingly free with making surprising
optimizations based on that (such as assuming any code path that it knows
can reach a NULL dereference is dead code and can be removed).

Then how we operate 0 address if not dereferencing NULL pointer?

With an I/O accessor (or other inline asm), a TLB mapping, or using a
different memory location.
we found the zero address has benefit.
I don't know how to achieve this in inline asm or TLB mapping, could you
be more specific or write a example for me?
Inline asm would be something like:

        asm("stw %1, 0(%0); stw %2, 4(%0)" : "=r" (dst) :
                "r" ((u32)(src >> 32)), "r" ((u32)src));

-Scott



_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to