* Asias He <asias.hejun@xxxxxxxxx> wrote: > On 05/11/2011 11:17 PM, levinsasha928@xxxxxxxxx wrote: > > From: Sasha Levin <levinsasha928@xxxxxxxxx> > > > > e820 is expected to leave a memory gap within the low 32 > > bits of RAM space. From the documentation of e820_setup_gap(): > > /* > > * Search for the biggest gap in the low 32 bits of the e820 > > * memory space. We pass this space to PCI to assign MMIO resources > > * for hotplug or unconfigured devices in. > > * Hopefully the BIOS let enough space left. > > */ > > > > Not leaving such gap causes errors and hangs during the boot > > process. > > > > This patch adds a memory gap between 0xe0000000 and 0x100000000 > > when using more than 0xe0000000 bytes for guest RAM. > > > > This patch updates the e820 table, slot allocations > > used for KVM_SET_USER_MEMORY_REGION. > > > > Changes in V2: > > - Allocate RAM with the gap to avoid altering the translation code. > > - New patch description. > > > > Changes in V3: > > - Remove unnecessary casts. > > > > Changes in V4: > > - Rewrite kvm__init_ram(). > > - Document the 64bit gap within the code. > > > > Signed-off-by: Sasha Levin <levinsasha928@xxxxxxxxx> > > --- > > tools/kvm/bios.c | 27 ++++++++++++---- > > tools/kvm/include/kvm/e820.h | 2 +- > > tools/kvm/include/kvm/kvm.h | 2 + > > tools/kvm/kvm.c | 66 +++++++++++++++++++++++++++++++++++++---- > > 4 files changed, 82 insertions(+), 15 deletions(-) > > > > diff --git a/tools/kvm/bios.c b/tools/kvm/bios.c > > index 2199c0c..3cd9b24 100644 > > --- a/tools/kvm/bios.c > > +++ b/tools/kvm/bios.c > > @@ -61,8 +61,6 @@ static void e820_setup(struct kvm *kvm) > > size = guest_flat_to_host(kvm, E820_MAP_SIZE); > > mem_map = guest_flat_to_host(kvm, E820_MAP_START); > > > > - *size = E820_MEM_AREAS; > > - > > mem_map[i++] = (struct e820_entry) { > > .addr = REAL_MODE_IVT_BEGIN, > > .size = EBDA_START - REAL_MODE_IVT_BEGIN, > > @@ -78,13 +76,28 @@ static void e820_setup(struct kvm *kvm) > > .size = MB_BIOS_END - MB_BIOS_BEGIN, > > .type = E820_MEM_RESERVED, > > }; > > - mem_map[i++] = (struct e820_entry) { > > - .addr = BZ_KERNEL_START, > > - .size = kvm->ram_size - BZ_KERNEL_START, > > - .type = E820_MEM_USABLE, > > - }; > > + if (kvm->ram_size < KVM_32BIT_GAP_START) { > > + mem_map[i++] = (struct e820_entry) { > > + .addr = BZ_KERNEL_START, > > + .size = kvm->ram_size - BZ_KERNEL_START, > > + .type = E820_MEM_USABLE, > > + }; > > + } else { > > + mem_map[i++] = (struct e820_entry) { > > + .addr = BZ_KERNEL_START, > > + .size = KVM_32BIT_GAP_START - BZ_KERNEL_START, > > + .type = E820_MEM_USABLE, > > + }; > > + mem_map[i++] = (struct e820_entry) { > > + .addr = 0x100000000ULL, > > + .size = kvm->ram_size - KVM_32BIT_GAP_START, > > + .type = E820_MEM_USABLE, > > + }; > > + } > > > > BUILD_BUG_ON(i > E820_MEM_AREAS); > > + > > + *size = i; > > } > > > > /** > > diff --git a/tools/kvm/include/kvm/e820.h b/tools/kvm/include/kvm/e820.h > > index 252ae1f..e0f5f2a 100644 > > --- a/tools/kvm/include/kvm/e820.h > > +++ b/tools/kvm/include/kvm/e820.h > > @@ -8,7 +8,7 @@ > > #define E820_MEM_USABLE 1 > > #define E820_MEM_RESERVED 2 > > > > -#define E820_MEM_AREAS 4 > > +#define E820_MEM_AREAS 5 > > > > struct e820_entry { > > u64 addr; /* start of memory segment */ > > diff --git a/tools/kvm/include/kvm/kvm.h b/tools/kvm/include/kvm/kvm.h > > index 3dab78d..5e2e64c 100644 > > --- a/tools/kvm/include/kvm/kvm.h > > +++ b/tools/kvm/include/kvm/kvm.h > > @@ -8,6 +8,8 @@ > > #include <time.h> > > > > #define KVM_NR_CPUS (255) > > +#define KVM_32BIT_GAP_SIZE (512 << 20) > > +#define KVM_32BIT_GAP_START ((1ULL << 32) - KVM_32BIT_GAP_SIZE) > > > > struct kvm { > > int sys_fd; /* For system ioctls(), i.e. /dev/kvm */ > > diff --git a/tools/kvm/kvm.c b/tools/kvm/kvm.c > > index 65793f2..a3d3dd8 100644 > > --- a/tools/kvm/kvm.c > > +++ b/tools/kvm/kvm.c > > @@ -153,23 +153,64 @@ static bool kvm__cpu_supports_vm(void) > > return regs.ecx & (1 << feature); > > } > > > > -void kvm__init_ram(struct kvm *self) > > +static void kvm_register_mem_slot(struct kvm *kvm, u32 slot, u64 guest_phys, u64 size, void *userspace_addr) > > { > > struct kvm_userspace_memory_region mem; > > int ret; > > > > mem = (struct kvm_userspace_memory_region) { > > - .slot = 0, > > - .guest_phys_addr = 0x0UL, > > - .memory_size = self->ram_size, > > - .userspace_addr = (unsigned long) self->ram_start, > > + .slot = slot, > > + .guest_phys_addr = guest_phys, > > + .memory_size = size, > > + .userspace_addr = (u64)userspace_addr, > > > I am seeing: > > CC kvm.o > kvm.c: In function âkvm_register_mem_slotâ: > kvm.c:165:22: error: cast from pointer to integer of different size > [-Werror=pointer-to-int-cast] > cc1: all warnings being treated as errors > > make: *** [kvm.o] Error 1 > > with this patch on 32-bit box. it's useful if you report the 'gcc -v' output for compiler warnings - so that we can after some time have a mental picture of which GCC versions produce spurious warnings. Btw,. it would also be useful to add a 'make WERROR=0' option - that way warnings that trigger only on some GCC versions can be skipped during the build while they will still be reported to us because the default 'make' fails. [ If you add that then please also send such a patch against tools/perf/ :-) ] Thanks, Ingo -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html