[U-Boot] [U-Boot, 2/3] mpc85xx: Add deep sleep framework support
Tang Yuantian-B29983
Yuantian.Tang at freescale.com
Wed Feb 26 09:13:01 CET 2014
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
>
>
More information about the U-Boot
mailing list