diff options
author | Dominik Dingel <dingel@linux.vnet.ibm.com> | 2013-04-30 07:15:58 +0000 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2013-05-06 17:30:01 +0200 |
commit | ff151f4ec977c38266b79ebfbb6e8689f2121d4f (patch) | |
tree | cec9b0494b8beda1167046090f7b827e0bb3afec | |
parent | ba1509c0a99ad4c852c22cbd46d244ec7dc90402 (diff) | |
download | hqemu-ff151f4ec977c38266b79ebfbb6e8689f2121d4f.zip hqemu-ff151f4ec977c38266b79ebfbb6e8689f2121d4f.tar.gz |
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 <dingel@linux.vnet.ibm.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
-rw-r--r-- | pc-bios/s390-ccw/main.c | 24 | ||||
-rw-r--r-- | 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 fd40fa5..1665c57 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 09deee7..5d5df0d 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 */ /* |