From 1f7de853306499b83e627a09b15281fd6d566a51 Mon Sep 17 00:00:00 2001 From: Dominik Dingel Date: Mon, 29 Apr 2013 04:52:05 +0000 Subject: S390: BIOS check for file Add a check if the BIOS blob exists before trying to load. Signed-off-by: Dominik Dingel Signed-off-by: Alexander Graf --- hw/s390x/ipl.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'hw') diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index ace5ff5..cc3cd23 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -82,6 +82,10 @@ static int s390_ipl_init(SysBusDevice *dev) } bios_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); + if (bios_filename == NULL) { + hw_error("could not find stage1 bootloader\n"); + } + bios_size = load_elf(bios_filename, NULL, NULL, &ipl->start_addr, NULL, NULL, 1, ELF_MACHINE, 0); if (bios_size == -1UL) { -- cgit v1.1 From 2c4c71ee3a904bd07141c6499e5834818e6757f1 Mon Sep 17 00:00:00 2001 From: Dominik Dingel Date: Tue, 30 Apr 2013 07:15:56 +0000 Subject: S390: Merging s390_ipl_cpu and s390_ipl_reset There is no use in have this splitted in two functions. Signed-off-by: Dominik Dingel Signed-off-by: Alexander Graf --- hw/s390x/ipl.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) (limited to 'hw') diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index cc3cd23..d14c548 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -57,16 +57,6 @@ typedef struct S390IPLState { } S390IPLState; -static void s390_ipl_cpu(uint64_t pswaddr) -{ - S390CPU *cpu = S390_CPU(qemu_get_cpu(0)); - CPUS390XState *env = &cpu->env; - - env->psw.addr = pswaddr; - env->psw.mask = IPL_PSW_MASK; - s390_add_running_cpu(cpu); -} - static int s390_ipl_init(SysBusDevice *dev) { S390IPLState *ipl = S390_IPL(dev); @@ -155,8 +145,12 @@ static Property s390_ipl_properties[] = { static void s390_ipl_reset(DeviceState *dev) { S390IPLState *ipl = S390_IPL(dev); + S390CPU *cpu = S390_CPU(qemu_get_cpu(0)); + CPUS390XState *env = &cpu->env; - s390_ipl_cpu(ipl->start_addr); + env->psw.addr = ipl->start_addr; + env->psw.mask = IPL_PSW_MASK; + s390_add_running_cpu(cpu); } static void s390_ipl_class_init(ObjectClass *klass, void *data) -- cgit v1.1 From ba1509c0a99ad4c852c22cbd46d244ec7dc90402 Mon Sep 17 00:00:00 2001 From: Dominik Dingel Date: Tue, 30 Apr 2013 07:15:57 +0000 Subject: S390: Add virtio-blk boot If no kernel IPL entry is specified, boot the bios and pass if available device information for the first boot device (as given by the boot index). The provided information will be used in the next commit from the BIOS. Signed-off-by: Dominik Dingel Signed-off-by: Alexander Graf --- hw/s390x/ipl.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'hw') diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index d14c548..0aeb003 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -16,6 +16,8 @@ #include "elf.h" #include "hw/loader.h" #include "hw/sysbus.h" +#include "hw/s390x/virtio-ccw.h" +#include "hw/s390x/css.h" #define KERN_IMAGE_START 0x010000UL #define KERN_PARM_AREA 0x010480UL @@ -150,6 +152,22 @@ static void s390_ipl_reset(DeviceState *dev) env->psw.addr = ipl->start_addr; env->psw.mask = IPL_PSW_MASK; + + if (!ipl->kernel) { + /* booting firmware, tell what device to boot from */ + DeviceState *dev_st = get_boot_device(0); + VirtioCcwDevice *ccw_dev = (VirtioCcwDevice *) object_dynamic_cast( + OBJECT(&(dev_st->parent_obj)), "virtio-blk-ccw"); + + if (ccw_dev) { + env->regs[7] = ccw_dev->sch->cssid << 24 | + ccw_dev->sch->ssid << 16 | + ccw_dev->sch->devno; + } else { + env->regs[7] = -1; + } + } + s390_add_running_cpu(cpu); } -- cgit v1.1