On 26/04/13 17:22, Alexander Graf wrote: > > On 26.04.2013, at 14:12, Dominik Dingel wrote: > >> Check for a kernel IPL entry and load kernel image if one was >> specified. >> If no kernel image was supplied and the first boot device >> is not a virtio-ccw-blk device, print error message and exit. >> >> In case it is a virtio-ccw-blk device store the dev_no in reg[7] > > I thought we want a boot order, not a singular device to boot off of? > > Alex
First of all we want to be able to choose a boot device as a first step. With this patch the user is able to use libvirt and friends to choose the disk to boot from. The nice approach with this bios/ipl device is that we can update both in lock-step so this reg7 interface is not an ABI. So in a future version we actually could: a: implement diag 308 subcode 5/6, which would enable /sys/devices/firmware/[ipl|reipl] just like on z/VM or LPAR (this allows to reboot from a different device). b: implement a list. b looks nice, but I actually prefer a for two reasons: 1. be closer to the real hw 2. predictability but we can certainly discuss this. So I suggest to go with this patch and implement later on what we agree upon? Christian > >> >> 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..9758529 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 >> @@ -56,14 +58,25 @@ typedef struct S390IPLState { >> char *firmware; >> } S390IPLState; >> >> +static void s390_ipl_kernel(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 void s390_ipl_cpu(uint64_t pswaddr) >> +static void s390_ipl_from_disk(VirtIOBlkCcw *dev, uint64_t pswaddr) >> { >> S390CPU *cpu = S390_CPU(qemu_get_cpu(0)); >> CPUS390XState *env = &cpu->env; >> + VirtioCcwDevice *ccw_dev = &(dev->parent_obj); >> >> env->psw.addr = pswaddr; >> env->psw.mask = IPL_PSW_MASK; >> + env->regs[7] = ccw_dev->sch->devno; >> s390_add_running_cpu(cpu); >> } >> >> @@ -152,7 +165,18 @@ static void s390_ipl_reset(DeviceState *dev) >> { >> S390IPLState *ipl = S390_IPL(dev); >> >> - s390_ipl_cpu(ipl->start_addr); >> + if (ipl->kernel) { >> + return s390_ipl_kernel(ipl->start_addr); >> + } >> + >> + DeviceState *boot_device = get_boot_device(0); >> + if (object_dynamic_cast(OBJECT(boot_device), TYPE_VIRTIO_BLK) != NULL) { >> + s390_ipl_from_disk(VIRTIO_BLK_CCW(boot_device->parent_obj.parent), >> + ipl->start_addr); >> + } else { >> + fprintf(stderr, "qemu: s390x only supports boot from >> virtio-ccw-blk\n"); >> + exit(1); >> + } >> } >> >> static void s390_ipl_class_init(ObjectClass *klass, void *data) >> -- >> 1.7.9.5 >> >