From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tang Yuantian-B29983 Date: Wed, 26 Feb 2014 16:13:01 +0800 Subject: [U-Boot] [U-Boot, 2/3] mpc85xx: Add deep sleep framework support In-Reply-To: <1393269065.6733.926.camel@snotra.buserror.net> References: <1390716041-13541-2-git-send-email-Yuantian.Tang@freescale.com> <20140213004412.GA9660@home.buserror.net> <07dc877206434a4ea634d912c02da3a5@BL2PR03MB115.namprd03.prod.outlook.com> <1392416485.6733.616.camel@snotra.buserror.net> <530AF923.2040009@freescale.com> <1393269065.6733.926.camel@snotra.buserror.net> Message-ID: <530DA20D.1070309@freescale.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de 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 > >