Thread (44 messages) 44 messages, 11 authors, 2013-06-27

[PATCH 1/4] Documentation: arm: [U]EFI runtime services

From: James.Bottomley@HansenPartnership.com (James Bottomley)
Date: 2013-06-27 06:33:45
Also in: linux-efi, lkml

On Thu, 2013-06-27 at 07:23 +0100, Grant Likely wrote:
On Thu, Jun 27, 2013 at 2:32 AM, Matthew Garrett [off-list ref] wrote:
quoted
On Wed, Jun 26, 2013 at 07:38:19AM -0700, James Bottomley wrote:
quoted
The fixed virtual address scheme currently being looked at for x86_64 to
make SetVirtualAddressMap() kexec invariant doesn't work on 32 bit
because the address space isn't big enough.  For ARM, given that we've
much more opportunity to work with the vendors, can we just avoid
transitioning to a virtual address map and always just install a
physical mapping before doing efi calls?
We can probably get away with that now, but it does risk us ending up
with some firmware that expects to run in physical mode (boards designed
for Linux) and some firmware that expects to run in virtual mode (boards
designed for Windows). The degree of lockdown in the Windows ecosystem
at present means it's not a real problem at the moment, but if that ever
changes we're going to risk incompatibility.
What is the problem trying to be avoided by not using the virtual map?
Is it passing the virtual mapping data from one kernel to the next
when kexecing? Or something else?
Where to begin ... SetVirtualAddressMap() is one massive hack job ...
just look at the tiano core implementation.   Basically it has a fixed
idea of where all the pointers are and it tries to convert them all to
the new address space.  The problem we see in x86 is that this
conversion process isn't exhaustive due to implementation cockups, so
the post virtual address map image occasionally tries to access
unconverted pointers via the old physical address and oopses the kernel.

The problem for kexec is that SetVirtualAddressMap isn't idempotent.  In
fact by API fiat it can only ever be called once for the entire lifetime
of the UEFI bios, which could be many kernels in a kexec situation.  So,
somehow the subsequent kernels have to know not to call it, plus,
obviously, the virtual address map of the previous kernel has to work in
the next because it can't set up a new one.

James
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help