Check for a kernel IPL entry and load kernel image if one was specified. If no kernel image was supplied and no boot device was specified or the boot device is not of type virtio-blk-ccw, print an error message and exit.
Signed-off-by: Christian Paro <cp...@us.ibm.com> Signed-off-by: Dominik Dingel <din...@linux.vnet.ibm.com> diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index ace5ff5..bcbba7c 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 @@ -57,13 +59,22 @@ typedef struct S390IPLState { } S390IPLState; -static void s390_ipl_cpu(uint64_t pswaddr) +static void s390_ipl_cpu(uint64_t pswaddr, VirtioCcwDevice *dev) { S390CPU *cpu = S390_CPU(qemu_get_cpu(0)); CPUS390XState *env = &cpu->env; env->psw.addr = pswaddr; env->psw.mask = IPL_PSW_MASK; + + if (dev) { + env->regs[7] = dev->sch->cssid << 24 | + dev->sch->ssid << 16 | + dev->sch->devno; + } else { + env->regs[7] = -1; + } + s390_add_running_cpu(cpu); } @@ -151,8 +162,17 @@ static Property s390_ipl_properties[] = { static void s390_ipl_reset(DeviceState *dev) { S390IPLState *ipl = S390_IPL(dev); - - s390_ipl_cpu(ipl->start_addr); + + if (ipl->kernel) { + s390_ipl_cpu(ipl->start_addr, NULL); + } else { + /* is there a bootable device? */ + DeviceState *dev_st = get_boot_device(0); + VirtioCcwDevice *ccw_dev = (VirtioCcwDevice *) object_dynamic_cast( + OBJECT(&(dev_st->parent_obj)), "virtio-blk-ccw"); + + s390_ipl_cpu(ipl->start_addr, ccw_dev); + } } static void s390_ipl_class_init(ObjectClass *klass, void *data) -- 1.7.9.5