(CC'ing qemu-devel) On 07/16/13 17:12, Borislav Petkov wrote:> (this time after I subscribed to the ML) > > Hi guys, > > I've been playing with mapping EFI runtime regions in a topdown manner > in Linux for purposes of using EFI in a kexec'ed kernel. For that I've > been using EFI BIOS built from edk2 sources, svn revision r14165 from > March this year in qemu. > > Here's the problem I'm observing: I'm handing down a prepared virtual > map to SetVirtualAddressMap which has, a.o., the following > EFI_RUNTIME_SERVICES_CODE mapping: > > [ 47.371000] __lookup_address_in_pgd: address: 0xfffffffefdd6d000 > [ 47.373000] __lookup_address_in_pgd: pgd: 0x2a0d067 > (0xffff88000009cff8) > [ 47.375000] __lookup_address_in_pgd: pud: 0x7c818063 > (0xffff880002a0dfd8) > [ 47.377000] __lookup_address_in_pgd: pmd: 0x7c823063 > (0xffff88007c818f70) > [ 47.379000] __lookup_address_in_pgd: pte: 0x7fb12063 > (0xffff88007c823b68) > > i.e., virtual address 0xfffffffefdd6d000 maps to physical address > 0x7fb12063. > > After SetVirtualAddressMap finishes, the mapping has changed to > > [ 47.383000] efi: efi_enter_virtual_mode: phys_efi_set_virtual_address_map > succeeded > [ 47.385000] __lookup_address_in_pgd: address: 0xfffffffefdd6d000 > [ 47.387000] __lookup_address_in_pgd: pgd: 0x2a0d067 > (0xffff88000009cff8) > [ 47.389000] __lookup_address_in_pgd: pud: 0x7c818063 > (0xffff880002a0dfd8) > [ 47.391000] __lookup_address_in_pgd: pmd: 0x7c823063 > (0xffff88007c818f70) > [ 47.393000] __lookup_address_in_pgd: pte: 0x800000007fb12163 > (0xffff88007c823b68) > > and the PTE has gotten the NX bit set even though it is part of > EFI_RUNTIME_SERVICES_CODE mapping which should be executable. > > The same thing doesn't happen on baremetal, on the Dell box I have > here. > > Is this known? Do I need to rebuild the OVMF.id BIOS? > > I appreciate any suggestions,
See the end of efi_enter_virtual_mode() (the call to runtime_code_page_mkexec()), and http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=a2172e25 http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=1c083eb2 http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=4de0d4a6 http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=9cd2b07c These give me the impression that NX gets set by default during remapping, and that it is cleared afterwards only when some conditions hold. Maybe __supported_pte_mask is set up differently (x86_configure_nx()) in the kexec'd kernel, when it runs on qemu. Does TCG vs. KVM make a difference? Just random ideas... Thanks Laszlo ------------------------------------------------------------------------------ Get your SQL database under version control now! Version control is standard for application code, but databases havent caught up. So what steps can you take to put your SQL databases under version control? Why should you start doing it? Read more to find out. http://pubads.g.doubleclick.net/gampad/clk?id=49501711&iu=/4140/ostg.clktrk _______________________________________________ edk2-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/edk2-devel
