I was trying to not discuss the detailed implementation of ReadUnaligned/WriteUnaligned for different arches. I am trying to think the problem at the view point the PCD database. The unaligned case is not expected by original design for the BaseTools generated PCD database. So ASSERT() could be helpful to identify the bug of BaseTools. Anyway, many thank you and Aaron found the bug, and now we could fix the bug.
Thanks, Star -----Original Message----- From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org] Sent: Wednesday, May 6, 2015 4:41 PM To: Zeng, Star Cc: edk2-devel@lists.sourceforge.net; Laszlo Ersek; Feng, Bob C Subject: Re: [edk2] [PATCH] MdeModulePkg: avoid unaligned writes in PcdDxe driver On 6 May 2015 at 10:31, Zeng, Star <star.z...@intel.com> wrote: > You mean ASSERT (((UINTN) InternalData & (*Size - 1)) == 0)? > Yes. > Do you want to use ReadUnaligned/WriteUnaligned for all the > UINT16*/UINT32*/UINT64* data pointers even they are assured to be aligned? > I prefer to use ASSERT() if I must select one. > If you look at MdePkg/Library/BaseLib/Unaligned.c, you will notice that most architectures do nothing interesting for WriteUnalignedXX(), only IPF and ARM do something special. Combined with the fact that writes to dynamic PCDs are hardly a bottleneck in the execution, I think using ReadAligned/WriteAligned is mostly harmless. > -----Original Message----- > From: Ard Biesheuvel [mailto:ard.biesheu...@linaro.org] > Sent: Wednesday, May 6, 2015 4:19 PM > To: Zeng, Star > Cc: edk2-devel@lists.sourceforge.net; Laszlo Ersek; Feng, Bob C > Subject: Re: [edk2] [PATCH] MdeModulePkg: avoid unaligned writes in > PcdDxe driver > > On 6 May 2015 at 10:13, Zeng, Star <star.z...@intel.com> wrote: >> Yes of course, it relies on the correctness of the BaseTools. Even >> the whole BIOS image relies on the correctness of the BaseTools. ^_^ >> > > ... which is exactly why there are ASSERT()s all over the place, isn't it? > >> The ASSERT() you mean is like below? I admit it is an approach to ensure the >> correctness of BaseTools. >> ASSERT (((UINTN) InternalData & (sizeof (UINT16) - 1)) == >> 0); >> > > No we need (*Size - 1) not a constant. > >> But the ASSERT check maybe a little redundant as it will be in every >> 16/32/64 PcdSet. Do you think it could be a little more efficient to add >> ASSERT check only for the start pointer of uninitialized data(must be 8bytes >> aligned) as we found the bug only in the uninitialized data? you can >> reference the analysis result about the root cause of the bug in the email I >> attached in the previous email thread. >> > > Well, the most efficient would be not to ASSERT() at all but use > ReadUnaligned/WriteUnaligned, since those will be implemented > according to the capabilities of the architecture, i.e., it may simply > be an unaligned load/store, but in ARM's case, it may perform the > access byte by byte (depending on which base architecture version is > being targeted) > > I still think we need to approach this as two separate problems, and fix this > one by using the unaligned accessors. That way, it is independent of > whether/how the BaseTools get fixed. > > -- > Ard. ------------------------------------------------------------------------------ One dashboard for servers and applications across Physical-Virtual-Cloud Widest out-of-the-box monitoring support with 50+ applications Performance metrics, stats and reports that give you Actionable Insights Deep dive visibility with transaction tracing using APM Insight. http://ad.doubleclick.net/ddm/clk/290420510;117567292;y _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel