diff options
author | Christian Borntraeger <borntraeger@de.ibm.com> | 2014-07-01 12:17:41 +0200 |
---|---|---|
committer | Cornelia Huck <cornelia.huck@de.ibm.com> | 2014-07-08 15:08:03 +0200 |
commit | f2879a5c9e45e8432d15deea84fdf53586e9949c (patch) | |
tree | 4f4737fa7539d8ceb47c615502a69c98426ddcf1 | |
parent | eaa4980185943da6e36f6f2e052d41924705e1ea (diff) |
pc-bios/s390-ccw: store proper subsystem information word
POP chapter 17 requires to store a subsystem information word at 184
during IPL. Furthermore bytes 188-191 should be zero. The bootmap might
contain data blocks that are written to the first page. We have to
write these values after we processed the bootmap and before the final
IPL.
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
-rw-r--r-- | pc-bios/s390-ccw/bootmap.c | 2 | ||||
-rw-r--r-- | pc-bios/s390-ccw/main.c | 17 | ||||
-rw-r--r-- | pc-bios/s390-ccw/s390-ccw.h | 1 |
3 files changed, 19 insertions, 1 deletions
diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index fa54abb4d3..f1756796df 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -51,6 +51,8 @@ static void jump_to_IPL_2(void) static void jump_to_IPL_code(uint64_t address) { + /* store the subsystem information _after_ the bootmap was loaded */ + write_subsystem_identification(); /* * The IPL PSW is at address 0. We also must not overwrite the * content of non-BIOS memory after we loaded the guest, so we diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index dbfb40e685..f9ec2157ad 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -13,6 +13,22 @@ char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); uint64_t boot_value; +struct subchannel_id blk_schid = { .one = 1 }; + +/* + * Priniciples of Operations (SA22-7832-09) chapter 17 requires that + * a subsystem-identification is at 184-187 and bytes 188-191 are zero + * after list-directed-IPL and ccw-IPL. + */ +void write_subsystem_identification(void) +{ + struct subchannel_id *schid = (struct subchannel_id *) 184; + uint32_t *zeroes = (uint32_t *) 188; + + *schid = blk_schid; + *zeroes = 0; +} + void virtio_panic(const char *string) { @@ -23,7 +39,6 @@ void virtio_panic(const char *string) static void virtio_setup(uint64_t dev_info) { - struct subchannel_id blk_schid = { .one = 1 }; struct schib schib; int i; int r; diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h index 959aed0d0b..2b773deafa 100644 --- a/pc-bios/s390-ccw/s390-ccw.h +++ b/pc-bios/s390-ccw/s390-ccw.h @@ -50,6 +50,7 @@ void disabled_wait(void); /* main.c */ void virtio_panic(const char *string); +void write_subsystem_identification(void); /* sclp-ascii.c */ void sclp_print(const char *string); |