From patchwork Thu May 12 08:50:44 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christian Borntraeger X-Patchwork-Id: 95272 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 0A2B81007D1 for ; Thu, 12 May 2011 18:51:05 +1000 (EST) Received: from localhost ([::1]:46422 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QKRbq-0003gv-63 for incoming@patchwork.ozlabs.org; Thu, 12 May 2011 04:51:02 -0400 Received: from eggs.gnu.org ([140.186.70.92]:58704) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QKRbh-0003ga-DP for qemu-devel@nongnu.org; Thu, 12 May 2011 04:50:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QKRbg-00087B-Fr for qemu-devel@nongnu.org; Thu, 12 May 2011 04:50:53 -0400 Received: from mtagate7.uk.ibm.com ([194.196.100.167]:43973) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QKRbg-00086n-6y for qemu-devel@nongnu.org; Thu, 12 May 2011 04:50:52 -0400 Received: from d06nrmr1307.portsmouth.uk.ibm.com (d06nrmr1307.portsmouth.uk.ibm.com [9.149.38.129]) by mtagate7.uk.ibm.com (8.13.1/8.13.1) with ESMTP id p4C8olb3024531 for ; Thu, 12 May 2011 08:50:47 GMT Received: from d06av03.portsmouth.uk.ibm.com (d06av03.portsmouth.uk.ibm.com [9.149.37.213]) by d06nrmr1307.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p4C8okiJ2134206 for ; Thu, 12 May 2011 09:50:46 +0100 Received: from d06av03.portsmouth.uk.ibm.com (localhost.localdomain [127.0.0.1]) by d06av03.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p4C8ojwa013792 for ; Thu, 12 May 2011 02:50:45 -0600 Received: from [9.152.224.62] (dyn-9-152-224-62.boeblingen.de.ibm.com [9.152.224.62]) by d06av03.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id p4C8ojDs013786; Thu, 12 May 2011 02:50:45 -0600 Message-ID: <4DCB9F64.8070408@de.ibm.com> Date: Thu, 12 May 2011 10:50:44 +0200 From: Christian Borntraeger User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.17) Gecko/20110424 Lightning/1.0b2 Thunderbird/3.1.10 MIME-Version: 1.0 To: Alexander Graf References: <4DC9346B.9050309@de.ibm.com> <1AFDA82C-ED1F-44AB-A9F0-B53416E15581@suse.de> <4DCB9137.70008@de.ibm.com> <4DCB9345.9000804@de.ibm.com> In-Reply-To: X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) X-Received-From: 194.196.100.167 Cc: Carsten Otte , "qemu-devel@nongnu.org" Subject: Re: [Qemu-devel] [PatchV3] s390x: fix memory detection for guests > 64GB X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org > I'd definitely prefer that over the change on vl.c :) the s390 memory detection has a 16bit field that specifies the amount of increments. This patch adopts the memory size to always fit into that scheme. This also fixes virtio detection for these guests, since the descriptor page is located after the main memory. Signed-off-by: Christian Borntraeger --- hw/s390-virtio.c | 20 +++++++++++++++----- target-s390x/op_helper.c | 8 ++++++-- 2 files changed, 21 insertions(+), 7 deletions(-) Index: b/hw/s390-virtio.c =================================================================== --- a/hw/s390-virtio.c +++ b/hw/s390-virtio.c @@ -133,7 +133,7 @@ int s390_virtio_hypercall(CPUState *env, } /* PC hardware initialisation */ -static void s390_init(ram_addr_t ram_size, +static void s390_init(ram_addr_t my_ram_size, const char *boot_device, const char *kernel_filename, const char *kernel_cmdline, @@ -145,19 +145,29 @@ static void s390_init(ram_addr_t ram_siz ram_addr_t kernel_size = 0; ram_addr_t initrd_offset; ram_addr_t initrd_size = 0; + int shift = 0; uint8_t *storage_keys; int i; + /* s390x ram size detection needs a 16bit multiplier + an increment. So + guests > 64GB can be specified in 2MB steps etc. */ + while ((my_ram_size >> (20 + shift)) > 65535) { + shift++; + } + my_ram_size = my_ram_size >> (20 + shift) << (20 + shift); + + /* lets propagate the changed ram size into the global variable. */ + ram_size = my_ram_size; /* get a BUS */ - s390_bus = s390_virtio_bus_init(&ram_size); + s390_bus = s390_virtio_bus_init(&my_ram_size); /* allocate RAM */ - ram_addr = qemu_ram_alloc(NULL, "s390.ram", ram_size); - cpu_register_physical_memory(0, ram_size, ram_addr); + ram_addr = qemu_ram_alloc(NULL, "s390.ram", my_ram_size); + cpu_register_physical_memory(0, my_ram_size, ram_addr); /* allocate storage keys */ - storage_keys = qemu_mallocz(ram_size / TARGET_PAGE_SIZE); + storage_keys = qemu_mallocz(my_ram_size / TARGET_PAGE_SIZE); /* init CPUs */ if (cpu_model == NULL) { Index: b/target-s390x/op_helper.c =================================================================== --- a/target-s390x/op_helper.c +++ b/target-s390x/op_helper.c @@ -2361,6 +2361,7 @@ static void ext_interrupt(CPUState *env, int sclp_service_call(CPUState *env, uint32_t sccb, uint64_t code) { int r = 0; + int shift = 0; #ifdef DEBUG_HELPER printf("sclp(0x%x, 0x%" PRIx64 ")\n", sccb, code); @@ -2375,8 +2376,11 @@ int sclp_service_call(CPUState *env, uin switch(code) { case SCLP_CMDW_READ_SCP_INFO: case SCLP_CMDW_READ_SCP_INFO_FORCED: - stw_phys(sccb + SCP_MEM_CODE, ram_size >> 20); - stb_phys(sccb + SCP_INCREMENT, 1); + while ((ram_size >> (20 + shift)) > 65535) { + shift++; + } + stw_phys(sccb + SCP_MEM_CODE, ram_size >> (20 + shift)); + stb_phys(sccb + SCP_INCREMENT, 1 << shift); stw_phys(sccb + SCP_RESPONSE_CODE, 0x10); if (kvm_enabled()) {