From 9512e4a9edef2d9b59eb10a03184cd90a34f62d5 Mon Sep 17 00:00:00 2001 From: Avi Kivity Date: Tue, 6 Mar 2012 17:50:10 +0200 Subject: [PATCH] kvmvapic: align start address as well as size The kvmvapic code remaps a section of ROM as RAM to allow the guest to maintain state there. It is careful to align the section size to a page boundary, to avoid creating subpages, but neglects to do the same for the start address. These leads to an assert later on when the memory core tries to create a page which is half RAM and half ROM. Fix by aligning the start address to a page boundary. This can be triggered by running qemu-system-x86_64 -enable-kvm -vga none. Signed-off-by: Avi Kivity Signed-off-by: Anthony Liguori --- hw/kvmvapic.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hw/kvmvapic.c b/hw/kvmvapic.c index 36ccfbcdbd..e8bfeec3de 100644 --- a/hw/kvmvapic.c +++ b/hw/kvmvapic.c @@ -578,8 +578,10 @@ static void vapic_map_rom_writable(VAPICROMState *s) rom_size = ram[rom_paddr + 2] * ROM_BLOCK_SIZE; s->rom_size = rom_size; - /* We need to round up to avoid creating subpages + /* We need to round to avoid creating subpages * from which we cannot run code. */ + rom_size += rom_paddr & ~TARGET_PAGE_MASK; + rom_paddr &= TARGET_PAGE_MASK; rom_size = TARGET_PAGE_ALIGN(rom_size); memory_region_init_alias(&s->rom, "kvmvapic-rom", section.mr, rom_paddr,