From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38113) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wz6ZS-0005bp-GG for qemu-devel@nongnu.org; Mon, 23 Jun 2014 11:54:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Wz6ZM-00023Q-RI for qemu-devel@nongnu.org; Mon, 23 Jun 2014 11:54:14 -0400 Received: from mx1.redhat.com ([209.132.183.28]:1107) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wz6ZM-000234-IO for qemu-devel@nongnu.org; Mon, 23 Jun 2014 11:54:08 -0400 Date: Mon, 23 Jun 2014 18:54:25 +0300 From: "Michael S. Tsirkin" Message-ID: <1403538745-18622-24-git-send-email-mst@redhat.com> References: <1403538745-18622-1-git-send-email-mst@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1403538745-18622-1-git-send-email-mst@redhat.com> Subject: [Qemu-devel] [PULL 23/23] xen-hvm: Handle machine opt max-ram-below-4g List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Maydell , xen-devel@lists.xensource.com, Don Slutz , Anthony Liguori , Stefano Stabellini From: Don Slutz This is the xen part of "pc & q35: Add new machine opt max-ram-below-4g" Note: this machine option cannot be used to increase the amount of ram below 4G. Signed-off-by: Don Slutz Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- xen-hvm.c | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/xen-hvm.c b/xen-hvm.c index 5bcebdd..bafdf12 100644 --- a/xen-hvm.c +++ b/xen-hvm.c @@ -161,25 +161,36 @@ static void xen_ram_init(ram_addr_t *below_4g_mem_size, { MemoryRegion *sysmem = get_system_memory(); ram_addr_t block_len; + uint64_t user_lowmem = object_property_get_int(qdev_get_machine(), + PC_MACHINE_MAX_RAM_BELOW_4G, + &error_abort); - block_len = ram_size; - if (ram_size >= HVM_BELOW_4G_RAM_END) { - /* Xen does not allocate the memory continuously, and keep a hole at - * HVM_BELOW_4G_MMIO_START of HVM_BELOW_4G_MMIO_LENGTH - */ - block_len += HVM_BELOW_4G_MMIO_LENGTH; + /* Handle the machine opt max-ram-below-4g. It is basicly doing + * min(xen limit, user limit). + */ + if (HVM_BELOW_4G_RAM_END <= user_lowmem) { + user_lowmem = HVM_BELOW_4G_RAM_END; } - memory_region_init_ram(&ram_memory, NULL, "xen.ram", block_len); - *ram_memory_p = &ram_memory; - vmstate_register_ram_global(&ram_memory); - if (ram_size >= HVM_BELOW_4G_RAM_END) { - *above_4g_mem_size = ram_size - HVM_BELOW_4G_RAM_END; - *below_4g_mem_size = HVM_BELOW_4G_RAM_END; + if (ram_size >= user_lowmem) { + *above_4g_mem_size = ram_size - user_lowmem; + *below_4g_mem_size = user_lowmem; } else { *above_4g_mem_size = 0; *below_4g_mem_size = ram_size; } + if (!*above_4g_mem_size) { + block_len = ram_size; + } else { + /* + * Xen does not allocate the memory continuously, it keeps a + * hole of the size computed above or passed in. + */ + block_len = (1ULL << 32) + *above_4g_mem_size; + } + memory_region_init_ram(&ram_memory, NULL, "xen.ram", block_len); + *ram_memory_p = &ram_memory; + vmstate_register_ram_global(&ram_memory); memory_region_init_alias(&ram_640k, NULL, "xen.ram.640k", &ram_memory, 0, 0xa0000); -- MST