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(+) diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index ace5ff50d1..cc3cd2352b 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.2.1 From e89e33e12e4185fa056a5d7ae6d2e8e7f5400a20 Mon Sep 17 00:00:00 2001 From: Dominik Dingel Date: Mon, 29 Apr 2013 04:52:06 +0000 Subject: S390: BIOS create link to src folder for .img file For *.img files, there will be a link created directly to the src folder, like for all other blobs. Signed-off-by: Dominik Dingel Signed-off-by: Alexander Graf --- configure | 1 + 1 file changed, 1 insertion(+) diff --git a/configure b/configure index a9ff4ad882..9439f1c727 100755 --- a/configure +++ b/configure @@ -4518,6 +4518,7 @@ for bios_file in \ $source_path/pc-bios/*.aml \ $source_path/pc-bios/*.rom \ $source_path/pc-bios/*.dtb \ + $source_path/pc-bios/*.img \ $source_path/pc-bios/openbios-* \ $source_path/pc-bios/palcode-* do -- cgit v1.2.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(-) diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index cc3cd2352b..d14c548d88 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.2.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(+) diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index d14c548d88..0aeb003c9d 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.2.1 From ff151f4ec977c38266b79ebfbb6e8689f2121d4f Mon Sep 17 00:00:00 2001 From: Dominik Dingel Date: Tue, 30 Apr 2013 07:15:58 +0000 Subject: S390: BIOS boot from given device Use the passed device, if there is no device, use the first applicable device. Signed-off-by: Dominik Dingel Signed-off-by: Alexander Graf --- pc-bios/s390-ccw/main.c | 24 ++++++++++++++++++------ pc-bios/s390-ccw/start.S | 2 ++ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index fd40fa582a..1665c57225 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -12,6 +12,7 @@ struct subchannel_id blk_schid; char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); +uint64_t boot_value; void virtio_panic(const char *string) { @@ -20,15 +21,22 @@ void virtio_panic(const char *string) while (1) { } } -static void virtio_setup(void) +static void virtio_setup(uint64_t dev_info) { struct schib schib; int i; int r; bool found = false; - + bool check_devno = false; + uint16_t dev_no = -1; blk_schid.one = 1; + if (dev_info != -1) { + check_devno = true; + dev_no = dev_info & 0xffff; + debug_print_int("device no. ", dev_no); + } + for (i = 0; i < 0x10000; i++) { blk_schid.sch_no = i; r = stsch_err(blk_schid, &schib); @@ -36,9 +44,11 @@ static void virtio_setup(void) break; } if (schib.pmcw.dnv) { - if (virtio_is_blk(blk_schid)) { - found = true; - break; + if (!check_devno || (schib.pmcw.dev == dev_no)) { + if (virtio_is_blk(blk_schid)) { + found = true; + break; + } } } } @@ -53,7 +63,9 @@ static void virtio_setup(void) int main(void) { sclp_setup(); - virtio_setup(); + debug_print_int("boot reg[7] ", boot_value); + virtio_setup(boot_value); + if (zipl_load() < 0) sclp_print("Failed to load OS from hard disk\n"); disabled_wait(); diff --git a/pc-bios/s390-ccw/start.S b/pc-bios/s390-ccw/start.S index 09deee7fc0..5d5df0d616 100644 --- a/pc-bios/s390-ccw/start.S +++ b/pc-bios/s390-ccw/start.S @@ -14,6 +14,8 @@ _start: larl %r15, stack + 0x8000 /* Set up stack */ +larl %r6, boot_value +stg %r7, 0(%r6) /* save the boot_value before any function calls */ j main /* And call C */ /* -- cgit v1.2.1 From 2ddef429d14136a0156a75b1d77b72cb3bdad18f Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Wed, 1 May 2013 04:50:05 +0200 Subject: s390: update s390-ccw.img Now that we have boot device selection support, update the firmware blob accordingly. Signed-off-by: Alexander Graf --- pc-bios/s390-ccw.img | Bin 9432 -> 9432 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pc-bios/s390-ccw.img b/pc-bios/s390-ccw.img index 149cf70140..1b2a11e728 100644 Binary files a/pc-bios/s390-ccw.img and b/pc-bios/s390-ccw.img differ -- cgit v1.2.1