From patchwork Wed Jan 16 11:57:25 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cornelia Huck X-Patchwork-Id: 212496 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 601CB2C0098 for ; Wed, 16 Jan 2013 22:57:57 +1100 (EST) Received: from localhost ([::1]:35453 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TvRcx-0002qV-I1 for incoming@patchwork.ozlabs.org; Wed, 16 Jan 2013 06:57:55 -0500 Received: from eggs.gnu.org ([208.118.235.92]:55842) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TvRcf-0002qH-9b for qemu-devel@nongnu.org; Wed, 16 Jan 2013 06:57:38 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TvRcc-0002d2-58 for qemu-devel@nongnu.org; Wed, 16 Jan 2013 06:57:37 -0500 Received: from e06smtp10.uk.ibm.com ([195.75.94.106]:58538) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TvRcb-0002cK-R0 for qemu-devel@nongnu.org; Wed, 16 Jan 2013 06:57:34 -0500 Received: from /spool/local by e06smtp10.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 16 Jan 2013 11:56:59 -0000 Received: from b06cxnps4074.portsmouth.uk.ibm.com (9.149.109.196) by e06smtp10.uk.ibm.com (192.168.101.140) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 16 Jan 2013 11:56:58 -0000 Received: from d06av09.portsmouth.uk.ibm.com (d06av09.portsmouth.uk.ibm.com [9.149.37.250]) by b06cxnps4074.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r0GBvK2I32178304 for ; Wed, 16 Jan 2013 11:57:20 GMT Received: from d06av09.portsmouth.uk.ibm.com (loopback [127.0.0.1]) by d06av09.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r0GBvSS5025243 for ; Wed, 16 Jan 2013 04:57:28 -0700 Received: from tuxmaker.boeblingen.de.ibm.com (tuxmaker.boeblingen.de.ibm.com [9.152.85.9]) by d06av09.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r0GBvQN8025119; Wed, 16 Jan 2013 04:57:27 -0700 From: Cornelia Huck To: Alexander Graf Date: Wed, 16 Jan 2013 12:57:25 +0100 Message-Id: <1358337445-53555-3-git-send-email-cornelia.huck@de.ibm.com> X-Mailer: git-send-email 1.7.12.4 In-Reply-To: <1358337445-53555-1-git-send-email-cornelia.huck@de.ibm.com> References: <1358337445-53555-1-git-send-email-cornelia.huck@de.ibm.com> x-cbid: 13011611-4966-0000-0000-000004A2B469 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 195.75.94.106 Cc: Christian Borntraeger , Jens Freimann , qemu-devel Subject: [Qemu-devel] [PATCH 2/2] s390-virtio: Factor out some initialization code. 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 Some of the machine initialization for s390-virtio will be reused by virtio-ccw. Signed-off-by: Cornelia Huck --- hw/s390-virtio.c | 134 ++++++++++++++++++++++++++++++++----------------------- hw/s390-virtio.h | 6 +++ 2 files changed, 85 insertions(+), 55 deletions(-) diff --git a/hw/s390-virtio.c b/hw/s390-virtio.c index 91ad43b..3856ab7 100644 --- a/hw/s390-virtio.c +++ b/hw/s390-virtio.c @@ -159,62 +159,11 @@ unsigned s390_del_running_cpu(CPUS390XState *env) return s390_running_cpus; } -/* PC hardware initialisation */ -static void s390_init(QEMUMachineInitArgs *args) +CPUS390XState *s390_init_cpus(const char *cpu_model, uint8_t *storage_keys) { - ram_addr_t my_ram_size = args->ram_size; - const char *cpu_model = args->cpu_model; - const char *kernel_filename = args->kernel_filename; - const char *kernel_cmdline = args->kernel_cmdline; - const char *initrd_filename = args->initrd_filename; CPUS390XState *env = NULL; - MemoryRegion *sysmem = get_system_memory(); - MemoryRegion *ram = g_new(MemoryRegion, 1); - ram_addr_t kernel_size = 0; - ram_addr_t initrd_offset; - ram_addr_t initrd_size = 0; - int shift = 0; - uint8_t *storage_keys; - void *virtio_region; - hwaddr virtio_region_len; - hwaddr virtio_region_start; 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(&my_ram_size); - s390_sclp_init(); - - /* register hypercalls */ - s390_virtio_register_hcalls(); - - /* allocate RAM */ - memory_region_init_ram(ram, "s390.ram", my_ram_size); - vmstate_register_ram_global(ram); - memory_region_add_subregion(sysmem, 0, ram); - - /* clear virtio region */ - virtio_region_len = my_ram_size - ram_size; - virtio_region_start = ram_size; - virtio_region = cpu_physical_memory_map(virtio_region_start, - &virtio_region_len, true); - memset(virtio_region, 0, virtio_region_len); - cpu_physical_memory_unmap(virtio_region, virtio_region_len, 1, - virtio_region_len); - - /* allocate storage keys */ - storage_keys = g_malloc0(my_ram_size / TARGET_PAGE_SIZE); - - /* init CPUs */ if (cpu_model == NULL) { cpu_model = "host"; } @@ -235,6 +184,17 @@ static void s390_init(QEMUMachineInitArgs *args) tmp_env->exception_index = EXCP_HLT; tmp_env->storage_keys = storage_keys; } + return env; +} + +void s390_set_up_kernel(CPUS390XState *env, + const char *kernel_filename, + const char *kernel_cmdline, + const char *initrd_filename) +{ + ram_addr_t kernel_size = 0; + ram_addr_t initrd_offset; + ram_addr_t initrd_size = 0; /* One CPU has to run */ s390_add_running_cpu(env); @@ -306,9 +266,13 @@ static void s390_init(QEMUMachineInitArgs *args) memcpy(rom_ptr(KERN_PARM_AREA), kernel_cmdline, strlen(kernel_cmdline) + 1); } +} - /* Create VirtIO network adapters */ - for(i = 0; i < nb_nics; i++) { +void s390_create_virtio_net(BusState *bus, const char *name) +{ + int i; + + for (i = 0; i < nb_nics; i++) { NICInfo *nd = &nd_table[i]; DeviceState *dev; @@ -321,12 +285,72 @@ static void s390_init(QEMUMachineInitArgs *args) exit(1); } - dev = qdev_create((BusState *)s390_bus, "virtio-net-s390"); + dev = qdev_create(bus, name); qdev_set_nic_properties(dev, nd); qdev_init_nofail(dev); } } +/* PC hardware initialisation */ +static void s390_init(QEMUMachineInitArgs *args) +{ + ram_addr_t my_ram_size = args->ram_size; + const char *cpu_model = args->cpu_model; + const char *kernel_filename = args->kernel_filename; + const char *kernel_cmdline = args->kernel_cmdline; + const char *initrd_filename = args->initrd_filename; + CPUS390XState *env = NULL; + MemoryRegion *sysmem = get_system_memory(); + MemoryRegion *ram = g_new(MemoryRegion, 1); + int shift = 0; + uint8_t *storage_keys; + void *virtio_region; + hwaddr virtio_region_len; + hwaddr virtio_region_start; + + /* 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(&my_ram_size); + s390_sclp_init(); + + /* register hypercalls */ + s390_virtio_register_hcalls(); + + /* allocate RAM */ + memory_region_init_ram(ram, "s390.ram", my_ram_size); + vmstate_register_ram_global(ram); + memory_region_add_subregion(sysmem, 0, ram); + + /* clear virtio region */ + virtio_region_len = my_ram_size - ram_size; + virtio_region_start = ram_size; + virtio_region = cpu_physical_memory_map(virtio_region_start, + &virtio_region_len, true); + memset(virtio_region, 0, virtio_region_len); + cpu_physical_memory_unmap(virtio_region, virtio_region_len, 1, + virtio_region_len); + + /* allocate storage keys */ + storage_keys = g_malloc0(my_ram_size / TARGET_PAGE_SIZE); + + /* init CPUs */ + env = s390_init_cpus(cpu_model, storage_keys); + + s390_set_up_kernel(env, kernel_filename, kernel_cmdline, initrd_filename); + + /* Create VirtIO network adapters */ + s390_create_virtio_net((BusState *)s390_bus, "virtio-net-s390"); +} + static QEMUMachine s390_machine = { .name = "s390-virtio", .alias = "s390", diff --git a/hw/s390-virtio.h b/hw/s390-virtio.h index cd88179..acd4846 100644 --- a/hw/s390-virtio.h +++ b/hw/s390-virtio.h @@ -20,4 +20,10 @@ typedef int (*s390_virtio_fn)(uint64_t reg2, uint64_t reg3, uint64_t reg4, uint64_t reg5, uint64_t reg6, uint64_t reg7); void s390_register_virtio_hypercall(uint64_t code, s390_virtio_fn fn); +CPUS390XState *s390_init_cpus(const char *cpu_model, uint8_t *storage_keys); +void s390_set_up_kernel(CPUS390XState *env, + const char *kernel_filename, + const char *kernel_cmdline, + const char *initrd_filename); +void s390_create_virtio_net(BusState *bus, const char *name); #endif