x86/boot: Don't map 0 during boot

In particular, it causes accidental NULL pointer dereferences to go unnoticed.

The majority of the early operation takes place either in Real mode, or
Protected Unpaged mode.  The only bit which requires pagetable mappings is the
trampoline transition into Long mode and jump to the higher mappings, so there
is no need for the whole bottom 2M to be mapped.

Introduce a new l1_bootmap in .init.data, and use it instead of l1_identmap.
The EFI boot path doesn't pass through the trampoline, so doesn't need any
adjustment.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Andrew Cooper committed 2020-01-10 17:45:30 +00:00
1 parent a8d27a54cc
commit faa85d4fb3
2 files changed
+12 -6

No files matched your search

+8 -6
View File
@@ -689,12 +689,14 @@ trampoline_setup:
sub $(L2_PAGETABLE_ENTRIES*8),%eax
loop 1b
/*
* During boot, hook 4kB mappings of first 2MB of memory into L2.
* This avoids mixing cachability for the legacy VGA region.
*/
lea __PAGE_HYPERVISOR+sym_esi(l1_identmap),%edi
mov %edi,sym_fs(l2_bootmap)
/* Map the permanent trampoline page into l{1,2}_bootmap[]. */
mov sym_esi(trampoline_phys), %ecx
lea __PAGE_HYPERVISOR_RX(%ecx), %edx /* %edx = PTE to write */
shr $PAGE_SHIFT, %ecx /* %ecx = Slot to write */
mov %edx, sym_offs(l1_bootmap)(%esi, %ecx, 8)
lea __PAGE_HYPERVISOR + sym_esi(l1_bootmap), %edx
mov %edx, sym_esi(l2_bootmap)
/* Apply relocations to bootstrap trampoline. */
mov sym_fs(trampoline_phys),%edx
+4
View File
@@ -155,6 +155,10 @@ GLOBAL(__page_tables_end)
.section .init.data, "aw", @progbits
.align PAGE_SIZE, 0
l1_bootmap:
.fill L1_PAGETABLE_ENTRIES, 8, 0
.size l1_bootmap, . - l1_bootmap
GLOBAL(l2_bootmap)
.fill 4 * L2_PAGETABLE_ENTRIES, 8, 0
.size l2_bootmap, . - l2_bootmap
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.