From f2879a5c9e45e8432d15deea84fdf53586e9949c Mon Sep 17 00:00:00 2001 From: Christian Borntraeger Date: Tue, 1 Jul 2014 12:17:41 +0200 Subject: [PATCH 1/3] 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 Reviewed-by: Cornelia Huck Signed-off-by: Cornelia Huck --- pc-bios/s390-ccw/bootmap.c | 2 ++ pc-bios/s390-ccw/main.c | 17 ++++++++++++++++- pc-bios/s390-ccw/s390-ccw.h | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) 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); From 32a02d070be46b5c5a863e1542883f4a39231a39 Mon Sep 17 00:00:00 2001 From: Cornelia Huck Date: Mon, 7 Jul 2014 09:52:03 +0200 Subject: [PATCH 2/3] pc-bios/s390-ccw: update binary Signed-off-by: Cornelia Huck --- pc-bios/s390-ccw.img | Bin 17624 -> 17752 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/pc-bios/s390-ccw.img b/pc-bios/s390-ccw.img index 603e19e003d574b24bb3b97bacda2bf38077e8fd..e3ea0d5664f01ff472d3531980941fb5f163ff02 100644 GIT binary patch delta 5380 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 delta 5386 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 ls|uuEJgH Date: Mon, 30 Jun 2014 14:33:38 +0200 Subject: [PATCH 3/3] s390x/css: reflect cpa in scsw We neglected to update the the channel-program-address field of the scsw after completion of the start or the halt function: Fortunately, Linux didn't miss it so far. Let's update it for the cases where the cpa is expected to be valid; in some cases, the cpa is 'unpredictable', so we leave it untouched. Reviewed-by: David Hildenbrand Signed-off-by: Cornelia Huck --- hw/s390x/css.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/hw/s390x/css.c b/hw/s390x/css.c index e758890dcd..49c2aaff1f 100644 --- a/hw/s390x/css.c +++ b/hw/s390x/css.c @@ -200,6 +200,7 @@ static void sch_handle_halt_func(SubchDev *sch) PMCW *p = &sch->curr_status.pmcw; SCSW *s = &sch->curr_status.scsw; + hwaddr curr_ccw = sch->channel_prog; int path; /* Path management: In our simple css, we always choose the only path. */ @@ -216,6 +217,10 @@ static void sch_handle_halt_func(SubchDev *sch) (s->ctrl & SCSW_ACTL_SUSP))) { s->dstat = SCSW_DSTAT_DEVICE_END; } + if ((s->ctrl & (SCSW_ACTL_SUBCH_ACTIVE | SCSW_ACTL_DEVICE_ACTIVE)) || + (s->ctrl & SCSW_ACTL_SUSP)) { + s->cpa = curr_ccw + 8; + } s->cstat = 0; p->lpum = path; @@ -398,6 +403,7 @@ static void sch_handle_start_func(SubchDev *sch, ORB *orb) s->ctrl |= SCSW_STCTL_PRIMARY | SCSW_STCTL_SECONDARY | SCSW_STCTL_STATUS_PEND; s->dstat = SCSW_DSTAT_CHANNEL_END | SCSW_DSTAT_DEVICE_END; + s->cpa = sch->channel_prog + 8; break; case -ENOSYS: /* unsupported command, generate unit check (command reject) */ @@ -408,6 +414,7 @@ static void sch_handle_start_func(SubchDev *sch, ORB *orb) s->ctrl &= ~SCSW_CTRL_MASK_STCTL; s->ctrl |= SCSW_STCTL_PRIMARY | SCSW_STCTL_SECONDARY | SCSW_STCTL_ALERT | SCSW_STCTL_STATUS_PEND; + s->cpa = sch->channel_prog + 8; break; case -EFAULT: /* memory problem, generate channel data check */ @@ -416,6 +423,7 @@ static void sch_handle_start_func(SubchDev *sch, ORB *orb) s->ctrl &= ~SCSW_CTRL_MASK_STCTL; s->ctrl |= SCSW_STCTL_PRIMARY | SCSW_STCTL_SECONDARY | SCSW_STCTL_ALERT | SCSW_STCTL_STATUS_PEND; + s->cpa = sch->channel_prog + 8; break; case -EBUSY: /* subchannel busy, generate deferred cc 1 */ @@ -436,6 +444,7 @@ static void sch_handle_start_func(SubchDev *sch, ORB *orb) s->ctrl &= ~SCSW_CTRL_MASK_STCTL; s->ctrl |= SCSW_STCTL_PRIMARY | SCSW_STCTL_SECONDARY | SCSW_STCTL_ALERT | SCSW_STCTL_STATUS_PEND; + s->cpa = sch->channel_prog + 8; break; } } while (ret == -EAGAIN);