On Mon, Dec 16, 2024 at 11:24:08PM +0000, David Woodhouse wrote: > From: David Woodhouse <dwmw@xxxxxxxxxxxx> > > The kernel switches to a new set of page tables during kexec. The global > mappings (_PAGE_GLOBAL==1) can remain in the TLB after this switch. This > is generally not a problem because the new page tables use a different > portion of the virtual address space than the normal kernel mappings. > > The critical exception to that generalisation (and the only mapping > which isn't an identity mapping) is the kexec control page itself — > which was ROX in the original kernel mapping, but should be RWX in the > new page tables. If there is a global TLB entry for that in its prior > read-only state, it definitely needs to be flushed before attempting to > write through that virtual mapping. > > It would be possible to just avoid writing to the virtual address of the > page and defer all writes until they can be done through the identity > mapping. But there's no good reason to keep the old TLB entries around, > as they can cause nothing but trouble. > > Clear the PGE bit in %cr4 early, before storing data in the control page. It worth noting that flipping CR4.PGE triggers TLB flush. I was not sure if CR3 write is required to make it happen. -- Kiryl Shutsemau / Kirill A. Shutemov