[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH for-4.6] efi: introduce efi_arch_flush_dcache_area
On Mon, Sep 07, 2015 at 05:06:36PM +0100, Ian Campbell wrote: > On Mon, 2015-09-07 at 16:08 +0100, Stefano Stabellini wrote: > > On Mon, 7 Sep 2015, Jan Beulich wrote: > > > > > > On 07.09.15 at 16:13, <stefano.stabellini@xxxxxxxxxxxxx> wrote: > > > > Objects loaded by FileHandle->Read need to be flushed to dcache, > > > > otherwise copy_from_paddr will read stale data when copying the > > > > kernel, > > > > causing a failure to boot. > > > > > > I have to admit that I'm a little puzzled by this description: If this > > > was a general requirement (which is how it reads to me) > > > > Yes, it is > > > > > > > why does > ->Read() not do the necessary flushing? Or if it's not a > > > general requirement, perhaps the description could be changed to make > > > clear what exact dependency exists that does not exist for all users > > > of ->Read()? > > > > It is a general requirement: anything that could be accessed without a > > cacheable mapping needs to be flushed. Unfortunately the UEFI spec is > > not clear enough on who should do the flushing on what, and in fact the > > Forum is working on improving it > > I might be wrong and/or misremembering but I think this stems partly from > the fact that the ARM UEFI stub in Xen needs to turn off caches (and > paging?) before jumping to the usual Xen entry point. > > Then when caches come back on you get inconsistencies because of stale > stuff in the cache which suddenly reappears etc. It's more to do with using inconsistent attributes than about whether the caches are enabled -- at both points the kernel image is manipulated, SCTLR_EL2.{C,M} == {1,1}. EFI_FILE_PROTOCOL.Read() may place data into the caches without updating memory because of coherent IO or simply because it copies to a cacheable alias. If Xen were to modify the image in any way (e.g. decompressing it), it would only update the cached copy. Later kernel_zimage_load calls copy_from_paddr, which uses a non-cacheable alias, bypassing the caches and going straight to memory. Even if the two aliases were in use simultaneously, they wouldn't be coherent with each other. For more background, Marc Zyngier did a good talk at KVM Forum regarding the usual behaviour of the caches [1,2]. Mark. [1] http://events.linuxfoundation.org/sites/events/files/slides/slides_10.pdf [2] https://www.youtube.com/watch?v=A_zCxzpxzmE _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |