On Tue, Sep 30, 2014 at 12:54:37PM -0700, Geoff Levand wrote: [..] > > > +{ > > > + switch (flag) { > > > + case IND_INDIRECTION: > > > + case IND_SOURCE: > > > + __flush_dcache_area(addr, PAGE_SIZE); > > > + break; > > > > So what does __flush_dcache_area() do? Flush data caches. IIUC, addr > > is virtual address at this point of time. While copying pages and > > walking through the list, I am assuming you have switched off page > > tables and you are in some kind of 1:1 physical mode. So how did > > flushing data caches related to a virtual address help. I guess we > > are not even accessing that virtual address now. > > __flush_dcache_area(), and the underling aarch64 civac instruction > operate on virtual addresses. Here we are still running with the > MMU on and the identity mapping has not yet been enabled. This is > the sequence: > > flush dcache -> turn off MMU, dcache -> access memory (PoC) directly Sorry, I don't understand that why do we need to flush dcache for source and indirection page addresses. Some information here will help. Thanks Vivek