From nobody Mon Apr 29 06:06:05 2024 Delivered-To: importer@patchew.org Received-SPF: temperror (zoho.com: Error in retrieving data from DNS) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=temperror (zoho.com: Error in retrieving data from DNS) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1513030918597447.9322373819638; Mon, 11 Dec 2017 14:21:58 -0800 (PST) Received: from localhost ([::1]:55746 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eOWSJ-0002Dg-39 for importer@patchew.org; Mon, 11 Dec 2017 17:21:47 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54577) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eOWQa-0001BH-Lq for qemu-devel@nongnu.org; Mon, 11 Dec 2017 17:20:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eOWQW-0001UF-KE for qemu-devel@nongnu.org; Mon, 11 Dec 2017 17:20:00 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:41220 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eOWQW-0001TV-E7 for qemu-devel@nongnu.org; Mon, 11 Dec 2017 17:19:56 -0500 Received: from pps.filterd (m0098421.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id vBBMG7Ch040839 for ; Mon, 11 Dec 2017 17:19:54 -0500 Received: from e11.ny.us.ibm.com (e11.ny.us.ibm.com [129.33.205.201]) by mx0a-001b2d01.pphosted.com with ESMTP id 2et0fmew2m-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Mon, 11 Dec 2017 17:19:53 -0500 Received: from localhost by e11.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 11 Dec 2017 17:19:53 -0500 Received: from b01cxnp22033.gho.pok.ibm.com (9.57.198.23) by e11.ny.us.ibm.com (146.89.104.198) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 11 Dec 2017 17:19:51 -0500 Received: from b01ledav005.gho.pok.ibm.com (b01ledav005.gho.pok.ibm.com [9.57.199.110]) by b01cxnp22033.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id vBBMJp0t40501380; Mon, 11 Dec 2017 22:19:51 GMT Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 57C0DAE03C; Mon, 11 Dec 2017 17:20:51 -0500 (EST) Received: from collin-ThinkPad-W541.ibm.com (unknown [9.80.202.87]) by b01ledav005.gho.pok.ibm.com (Postfix) with ESMTP id 1033CAE051; Mon, 11 Dec 2017 17:20:50 -0500 (EST) From: "Collin L. Walling" To: qemu-s390x@nongnu.org, qemu-devel@nongnu.org Date: Mon, 11 Dec 2017 17:19:16 -0500 X-Mailer: git-send-email 2.7.4 In-Reply-To: <1513030760-26245-1-git-send-email-walling@linux.vnet.ibm.com> References: <1513030760-26245-1-git-send-email-walling@linux.vnet.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 17121122-2213-0000-0000-00000248EE40 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00008190; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000244; SDB=6.00958839; UDB=6.00484865; IPR=6.00738861; BA=6.00005736; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00018489; XFM=3.00000015; UTC=2017-12-11 22:19:53 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17121122-2214-0000-0000-0000586A32A8 Message-Id: <1513030760-26245-2-git-send-email-walling@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-12-11_10:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=2 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1712110317 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.158.5 Subject: [Qemu-devel] [PATCH v2 1/5] s390-ccw: update libc X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: borntraeger@de.ibm.com, thuth@redhat.com, cohuck@redhat.com, david@redhat.com, frankja@linux.vnet.ibm.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_6 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Moved: memcmp from bootmap.h to libc.h (renamed from _memcmp) strlen from sclp.c to libc.h (renamed from _strlen) Added C standard functions: isdigit atoi Added non-C standard function: itostr Signed-off-by: Collin L. Walling Acked-by: Christian Borntraeger Reviewed-by: Janosch Frank --- pc-bios/s390-ccw/Makefile | 2 +- pc-bios/s390-ccw/bootmap.c | 4 +-- pc-bios/s390-ccw/bootmap.h | 16 +--------- pc-bios/s390-ccw/libc.c | 75 ++++++++++++++++++++++++++++++++++++++++++= ++++ pc-bios/s390-ccw/libc.h | 31 +++++++++++++++++++ pc-bios/s390-ccw/main.c | 17 +---------- pc-bios/s390-ccw/sclp.c | 10 +------ 7 files changed, 112 insertions(+), 43 deletions(-) create mode 100644 pc-bios/s390-ccw/libc.c diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile index 6d0c2ee..9f7904f 100644 --- a/pc-bios/s390-ccw/Makefile +++ b/pc-bios/s390-ccw/Makefile @@ -9,7 +9,7 @@ $(call set-vpath, $(SRC_PATH)/pc-bios/s390-ccw) =20 .PHONY : all clean build-all =20 -OBJECTS =3D start.o main.o bootmap.o sclp.o virtio.o virtio-scsi.o virtio-= blkdev.o +OBJECTS =3D start.o main.o bootmap.o sclp.o virtio.o virtio-scsi.o virtio-= blkdev.o libc.o QEMU_CFLAGS :=3D $(filter -W%, $(QEMU_CFLAGS)) QEMU_CFLAGS +=3D -ffreestanding -fno-delete-null-pointer-checks -msoft-flo= at QEMU_CFLAGS +=3D -march=3Dz900 -fPIE -fno-strict-aliasing diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index 67a6123..6f8e30f 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -512,7 +512,7 @@ static bool is_iso_bc_entry_compatible(IsoBcSection *s) "Failed to read image sector 0"); =20 /* Checking bytes 8 - 32 for S390 Linux magic */ - return !_memcmp(magic_sec + 8, linux_s390_magic, 24); + return !memcmp(magic_sec + 8, linux_s390_magic, 24); } =20 /* Location of the current sector of the directory */ @@ -641,7 +641,7 @@ static uint32_t find_iso_bc(void) if (vd->type =3D=3D VOL_DESC_TYPE_BOOT) { IsoVdElTorito *et =3D &vd->vd.boot; =20 - if (!_memcmp(&et->el_torito[0], el_torito_magic, 32)) { + if (!memcmp(&et->el_torito[0], el_torito_magic, 32)) { return bswap32(et->bc_offset); } } diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h index cf99a4c..4980838 100644 --- a/pc-bios/s390-ccw/bootmap.h +++ b/pc-bios/s390-ccw/bootmap.h @@ -310,20 +310,6 @@ static inline bool magic_match(const void *data, const= void *magic) return *((uint32_t *)data) =3D=3D *((uint32_t *)magic); } =20 -static inline int _memcmp(const void *s1, const void *s2, size_t n) -{ - int i; - const uint8_t *p1 =3D s1, *p2 =3D s2; - - for (i =3D 0; i < n; i++) { - if (p1[i] !=3D p2[i]) { - return p1[i] > p2[i] ? 1 : -1; - } - } - - return 0; -} - static inline uint32_t iso_733_to_u32(uint64_t x) { return (uint32_t)x; @@ -416,7 +402,7 @@ const uint8_t vol_desc_magic[] =3D "CD001"; =20 static inline bool is_iso_vd_valid(IsoVolDesc *vd) { - return !_memcmp(&vd->ident[0], vol_desc_magic, 5) && + return !memcmp(&vd->ident[0], vol_desc_magic, 5) && vd->version =3D=3D 0x1 && vd->type <=3D VOL_DESC_TYPE_PARTITION; } diff --git a/pc-bios/s390-ccw/libc.c b/pc-bios/s390-ccw/libc.c new file mode 100644 index 0000000..60c4b28 --- /dev/null +++ b/pc-bios/s390-ccw/libc.c @@ -0,0 +1,75 @@ +/* + * libc-style definitions and functions + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#include "libc.h" + +/** + * atoi: + * @str: the string to be converted. + * + * Given a string @str, convert it to an integer. Any non-numerical value + * will terminate the conversion. + * + * Returns: an integer converted from the string @str. + */ +int atoi(const char *str) +{ + int i; + int val =3D 0; + + for (i =3D 0; str[i]; i++) { + char c =3D str[i]; + if (!isdigit(c)) { + break; + } + val *=3D 10; + val +=3D c - '0'; + } + + return val; +} + +/** + * itostr: + * @num: the integer to be converted. + * @str: a pointer to a string to store the conversion. + * @len: the length of the passed string. + * + * Given an integer @num, convert it to a string. The string @str must be + * allocated beforehand. The resulting string will be null terminated and + * returned. + * + * Returns: the string @str of the converted integer @num. + */ +char *itostr(int num, char *str, size_t len) +{ + long num_len =3D 1; + int tmp =3D num; + int i; + + /* Count length of num */ + while ((tmp /=3D 10) > 0) { + num_len++; + } + + /* Check if we have enough space for num and null */ + if (len < num_len) { + return 0; + } + + /* Convert int to string */ + for (i =3D num_len - 1; i >=3D 0; i--) { + str[i] =3D num % 10 + '0'; + num /=3D 10; + } + + str[num_len] =3D '\0'; + + return str; +} diff --git a/pc-bios/s390-ccw/libc.h b/pc-bios/s390-ccw/libc.h index 0142ea8..00268e3 100644 --- a/pc-bios/s390-ccw/libc.h +++ b/pc-bios/s390-ccw/libc.h @@ -42,4 +42,35 @@ static inline void *memcpy(void *s1, const void *s2, siz= e_t n) return s1; } =20 +static inline int memcmp(const void *s1, const void *s2, size_t n) +{ + int i; + const uint8_t *p1 =3D s1, *p2 =3D s2; + + for (i =3D 0; i < n; i++) { + if (p1[i] !=3D p2[i]) { + return p1[i] > p2[i] ? 1 : -1; + } + } + + return 0; +} + +static inline size_t strlen(const char *str) +{ + size_t i; + for (i =3D 0; *str; i++) { + str++; + } + return i; +} + +static inline int isdigit(int c) +{ + return (c >=3D '0') && (c <=3D '9'); +} + +int atoi(const char *str); +char *itostr(int num, char *str, size_t len); + #endif diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 401e9db..a8ef120 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -40,22 +40,7 @@ void panic(const char *string) =20 unsigned int get_loadparm_index(void) { - const char *lp =3D loadparm; - int i; - unsigned int idx =3D 0; - - for (i =3D 0; i < 8; i++) { - char c =3D lp[i]; - - if (c < '0' || c > '9') { - break; - } - - idx *=3D 10; - idx +=3D c - '0'; - } - - return idx; + return atoi(loadparm); } =20 static bool find_dev(Schib *schib, int dev_no) diff --git a/pc-bios/s390-ccw/sclp.c b/pc-bios/s390-ccw/sclp.c index b1fc8ff..486fce1 100644 --- a/pc-bios/s390-ccw/sclp.c +++ b/pc-bios/s390-ccw/sclp.c @@ -65,14 +65,6 @@ void sclp_setup(void) sclp_set_write_mask(); } =20 -static int _strlen(const char *str) -{ - int i; - for (i =3D 0; *str; i++) - str++; - return i; -} - long write(int fd, const void *str, size_t len) { WriteEventData *sccb =3D (void *)_sccb; @@ -95,7 +87,7 @@ long write(int fd, const void *str, size_t len) =20 void sclp_print(const char *str) { - write(1, str, _strlen(str)); + write(1, str, strlen(str)); } =20 void sclp_get_loadparm_ascii(char *loadparm) --=20 2.7.4 From nobody Mon Apr 29 06:06:05 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1513031050764736.4479401440741; Mon, 11 Dec 2017 14:24:10 -0800 (PST) Received: from localhost ([::1]:55758 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eOWUP-0004DH-LW for importer@patchew.org; Mon, 11 Dec 2017 17:23:57 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54581) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eOWQa-0001BJ-O5 for qemu-devel@nongnu.org; Mon, 11 Dec 2017 17:20:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eOWQW-0001UR-M7 for qemu-devel@nongnu.org; Mon, 11 Dec 2017 17:20:00 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:41248 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eOWQW-0001Tq-H1 for qemu-devel@nongnu.org; Mon, 11 Dec 2017 17:19:56 -0500 Received: from pps.filterd (m0098421.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id vBBMJNfo051268 for ; Mon, 11 Dec 2017 17:19:56 -0500 Received: from e12.ny.us.ibm.com (e12.ny.us.ibm.com [129.33.205.202]) by mx0a-001b2d01.pphosted.com with ESMTP id 2et0fmew3r-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Mon, 11 Dec 2017 17:19:55 -0500 Received: from localhost by e12.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 11 Dec 2017 17:19:55 -0500 Received: from b01cxnp22035.gho.pok.ibm.com (9.57.198.25) by e12.ny.us.ibm.com (146.89.104.199) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 11 Dec 2017 17:19:52 -0500 Received: from b01ledav005.gho.pok.ibm.com (b01ledav005.gho.pok.ibm.com [9.57.199.110]) by b01cxnp22035.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id vBBMJqKT48562378; Mon, 11 Dec 2017 22:19:52 GMT Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9DD3AAE043; Mon, 11 Dec 2017 17:20:52 -0500 (EST) Received: from collin-ThinkPad-W541.ibm.com (unknown [9.80.202.87]) by b01ledav005.gho.pok.ibm.com (Postfix) with ESMTP id 60AF3AE03B; Mon, 11 Dec 2017 17:20:52 -0500 (EST) From: "Collin L. Walling" To: qemu-s390x@nongnu.org, qemu-devel@nongnu.org Date: Mon, 11 Dec 2017 17:19:17 -0500 X-Mailer: git-send-email 2.7.4 In-Reply-To: <1513030760-26245-1-git-send-email-walling@linux.vnet.ibm.com> References: <1513030760-26245-1-git-send-email-walling@linux.vnet.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 17121122-0048-0000-0000-00000212E87B X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00008190; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000244; SDB=6.00958839; UDB=6.00484865; IPR=6.00738861; BA=6.00005736; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00018489; XFM=3.00000015; UTC=2017-12-11 22:19:54 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17121122-0049-0000-0000-0000436E04F7 Message-Id: <1513030760-26245-3-git-send-email-walling@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-12-11_10:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=2 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1712110317 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.158.5 Subject: [Qemu-devel] [PATCH v2 2/5] s390-ccw: ipl structs for eckd cdl/ldl X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: borntraeger@de.ibm.com, thuth@redhat.com, cohuck@redhat.com, david@redhat.com, frankja@linux.vnet.ibm.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" ECKD DASDs have different IPL structures for CDL and LDL formats. The current Ipl1 and Ipl2 structs follow the CDL format, so we prepend "EckdCdl" to them. Boot info for LDL has been moved to a new struct: EckdLdlIpl1. Also introduce structs for IPL stages 1 and 1b and for disk geometry. Signed-off-by: Collin L. Walling Acked-by: Janosch Frank --- pc-bios/s390-ccw/bootmap.c | 24 ++++++++++---------- pc-bios/s390-ccw/bootmap.h | 55 +++++++++++++++++++++++++++++++++---------= ---- 2 files changed, 53 insertions(+), 26 deletions(-) diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index 6f8e30f..5546b79 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -221,9 +221,9 @@ static void run_eckd_boot_script(block_number_t mbr_blo= ck_nr) static void ipl_eckd_cdl(void) { XEckdMbr *mbr; - Ipl2 *ipl2 =3D (void *)sec; + EckdCdlIpl2 *ipl2 =3D (void *)sec; IplVolumeLabel *vlbl =3D (void *)sec; - block_number_t block_nr; + block_number_t mbr_block_nr; =20 /* we have just read the block #0 and recognized it as "IPL1" */ sclp_print("CDL\n"); @@ -231,7 +231,7 @@ static void ipl_eckd_cdl(void) memset(sec, FREE_SPACE_FILLER, sizeof(sec)); read_block(1, ipl2, "Cannot read IPL2 record at block 1"); =20 - mbr =3D &ipl2->u.x.mbr; + mbr =3D &ipl2->mbr; IPL_assert(magic_match(mbr, ZIPL_MAGIC), "No zIPL section in IPL2 reco= rd."); IPL_assert(block_size_ok(mbr->blockptr.xeckd.bptr.size), "Bad block size in zIPL section of IPL2 record."); @@ -239,7 +239,7 @@ static void ipl_eckd_cdl(void) "Non-ECKD device type in zIPL section of IPL2 record."); =20 /* save pointer to Boot Script */ - block_nr =3D eckd_block_num((void *)&(mbr->blockptr)); + mbr_block_nr =3D eckd_block_num((void *)&(mbr->blockptr)); =20 memset(sec, FREE_SPACE_FILLER, sizeof(sec)); read_block(2, vlbl, "Cannot read Volume Label at block 2"); @@ -249,7 +249,7 @@ static void ipl_eckd_cdl(void) "Invalid magic of volser block"); print_volser(vlbl->f.volser); =20 - run_eckd_boot_script(block_nr); + run_eckd_boot_script(mbr_block_nr); /* no return */ } =20 @@ -280,8 +280,8 @@ static void print_eckd_ldl_msg(ECKD_IPL_mode_t mode) =20 static void ipl_eckd_ldl(ECKD_IPL_mode_t mode) { - block_number_t block_nr; - BootInfo *bip =3D (void *)(sec + 0x70); /* BootInfo is MBR for LDL */ + block_number_t mbr_block_nr; + EckdLdlIpl1 *ipl1 =3D (void *)sec; =20 if (mode !=3D ECKD_LDL_UNLABELED) { print_eckd_ldl_msg(mode); @@ -292,15 +292,17 @@ static void ipl_eckd_ldl(ECKD_IPL_mode_t mode) memset(sec, FREE_SPACE_FILLER, sizeof(sec)); read_block(0, sec, "Cannot read block 0 to grab boot info."); if (mode =3D=3D ECKD_LDL_UNLABELED) { - if (!magic_match(bip->magic, ZIPL_MAGIC)) { + if (!magic_match(ipl1->boot_info.magic, ZIPL_MAGIC)) { return; /* not applicable layout */ } sclp_print("unlabeled LDL.\n"); } - verify_boot_info(bip); + verify_boot_info(&ipl1->boot_info); + + mbr_block_nr =3D + eckd_block_num((void *)&(ipl1->boot_info.bp.ipl.bm_ptr.eckd.bptr)); =20 - block_nr =3D eckd_block_num((void *)&(bip->bp.ipl.bm_ptr.eckd.bptr)); - run_eckd_boot_script(block_nr); + run_eckd_boot_script(mbr_block_nr); /* no return */ } =20 diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h index 4980838..b700d08 100644 --- a/pc-bios/s390-ccw/bootmap.h +++ b/pc-bios/s390-ccw/bootmap.h @@ -226,22 +226,47 @@ typedef struct BootInfo { /* @ 0x70, record = #0 */ } bp; } __attribute__ ((packed)) BootInfo; /* see also XEckdMbr */ =20 -typedef struct Ipl1 { - unsigned char key[4]; /* =3D=3D "IPL1" */ - unsigned char data[24]; -} __attribute__((packed)) Ipl1; +/* + * Structs for IPL + */ +#define STAGE2_BLK_CNT_MAX 24 /* Stage 1b can load up to 24 blocks */ =20 -typedef struct Ipl2 { - unsigned char key[4]; /* =3D=3D "IPL2" */ - union { - unsigned char data[144]; - struct { - unsigned char reserved1[92-4]; - XEckdMbr mbr; - unsigned char reserved2[144-(92-4)-sizeof(XEckdMbr)]; - } x; - } u; -} __attribute__((packed)) Ipl2; +typedef struct EckdCdlIpl1 { + uint8_t key[4]; /* =3D=3D "IPL1" */ + uint8_t data[24]; +} __attribute__((packed)) EckdCdlIpl1; + +typedef struct EckdSeekarg { + uint16_t pad; + uint16_t cyl; + uint16_t head; + uint8_t sec; + uint8_t pad2; +} __attribute__ ((packed)) EckdSeekarg; + +typedef struct EckdStage1b { + uint8_t reserved[32 * STAGE2_BLK_CNT_MAX]; + struct EckdSeekarg seek[STAGE2_BLK_CNT_MAX]; + uint8_t unused[64]; +} __attribute__ ((packed)) EckdStage1b; + +typedef struct EckdStage1 { + uint8_t reserved[72]; + struct EckdSeekarg seek[2]; +} __attribute__ ((packed)) EckdStage1; + +typedef struct EckdCdlIpl2 { + uint8_t key[4]; /* =3D=3D "IPL2" */ + struct EckdStage1 stage1; + XEckdMbr mbr; + uint8_t reserved[24]; +} __attribute__((packed)) EckdCdlIpl2; + +typedef struct EckdLdlIpl1 { + uint8_t reserved[24]; + struct EckdStage1 stage1; + BootInfo boot_info; /* BootInfo is MBR for LDL */ +} __attribute__((packed)) EckdLdlIpl1; =20 typedef struct IplVolumeLabel { unsigned char key[4]; /* =3D=3D "VOL1" */ --=20 2.7.4 From nobody Mon Apr 29 06:06:05 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1513030937983714.77075410594; Mon, 11 Dec 2017 14:22:17 -0800 (PST) Received: from localhost ([::1]:55747 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eOWSh-0002Tr-8E for importer@patchew.org; Mon, 11 Dec 2017 17:22:11 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54653) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eOWQf-0001Es-Ll for qemu-devel@nongnu.org; Mon, 11 Dec 2017 17:20:08 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eOWQd-0001bC-8M for qemu-devel@nongnu.org; Mon, 11 Dec 2017 17:20:05 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:55532) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eOWQc-0001aR-Vm for qemu-devel@nongnu.org; Mon, 11 Dec 2017 17:20:03 -0500 Received: from pps.filterd (m0098404.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id vBBMG8mS057951 for ; Mon, 11 Dec 2017 17:19:59 -0500 Received: from e16.ny.us.ibm.com (e16.ny.us.ibm.com [129.33.205.206]) by mx0a-001b2d01.pphosted.com with ESMTP id 2et1vtswss-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Mon, 11 Dec 2017 17:19:59 -0500 Received: from localhost by e16.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 11 Dec 2017 17:19:57 -0500 Received: from b01cxnp23032.gho.pok.ibm.com (9.57.198.27) by e16.ny.us.ibm.com (146.89.104.203) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 11 Dec 2017 17:19:54 -0500 Received: from b01ledav005.gho.pok.ibm.com (b01ledav005.gho.pok.ibm.com [9.57.199.110]) by b01cxnp23032.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id vBBMJr3N40894516; Mon, 11 Dec 2017 22:19:53 GMT Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 06B3EAE060; Mon, 11 Dec 2017 17:20:54 -0500 (EST) Received: from collin-ThinkPad-W541.ibm.com (unknown [9.80.202.87]) by b01ledav005.gho.pok.ibm.com (Postfix) with ESMTP id B294FAE03C; Mon, 11 Dec 2017 17:20:53 -0500 (EST) From: "Collin L. Walling" To: qemu-s390x@nongnu.org, qemu-devel@nongnu.org Date: Mon, 11 Dec 2017 17:19:18 -0500 X-Mailer: git-send-email 2.7.4 In-Reply-To: <1513030760-26245-1-git-send-email-walling@linux.vnet.ibm.com> References: <1513030760-26245-1-git-send-email-walling@linux.vnet.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 17121122-0024-0000-0000-000002FFE676 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00008190; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000244; SDB=6.00958839; UDB=6.00484865; IPR=6.00738861; BA=6.00005736; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00018489; XFM=3.00000015; UTC=2017-12-11 22:19:55 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17121122-0025-0000-0000-00004649A7F5 Message-Id: <1513030760-26245-4-git-send-email-walling@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-12-11_10:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1011 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1712110317 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.156.1 Subject: [Qemu-devel] [PATCH v2 3/5] s390-ccw: parse and set boot menu options X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: borntraeger@de.ibm.com, thuth@redhat.com, cohuck@redhat.com, david@redhat.com, frankja@linux.vnet.ibm.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Set boot menu options for an s390 guest and store them in the iplb. These options are set via the QEMU command line option: -boot menu=3Don|off[,splash-time=3DX] or via the libvirt domain xml: Where X represents some positive integer representing milliseconds. A loadparm other than 'prompt' will disable the menu and just boot the specified entry. Signed-off-by: Collin L. Walling Reviewed-by: Janosch Frank --- hw/s390x/ipl.c | 55 +++++++++++++++++++++++++++++++++++++++++++++= ++++ hw/s390x/ipl.h | 8 +++++-- pc-bios/s390-ccw/iplb.h | 8 +++++-- 3 files changed, 67 insertions(+), 4 deletions(-) diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index 0d06fc1..ed5e8d1 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -23,6 +23,8 @@ #include "hw/s390x/ebcdic.h" #include "ipl.h" #include "qemu/error-report.h" +#include "qemu/config-file.h" +#include "qemu/cutils.h" =20 #define KERN_IMAGE_START 0x010000UL #define KERN_PARM_AREA 0x010480UL @@ -33,6 +35,9 @@ #define ZIPL_IMAGE_START 0x009000UL #define IPL_PSW_MASK (PSW_MASK_32 | PSW_MASK_64) =20 +#define BOOT_MENU_FLAG_BOOT_OPTS 0x80 +#define BOOT_MENU_FLAG_ZIPL_OPTS 0x40 + static bool iplb_extended_needed(void *opaque) { S390IPLState *ipl =3D S390_IPL(object_resolve_path(TYPE_S390_IPL, NULL= )); @@ -219,6 +224,51 @@ static Property s390_ipl_properties[] =3D { DEFINE_PROP_END_OF_LIST(), }; =20 +static void s390_ipl_set_boot_menu(uint8_t *boot_menu_flags, + uint16_t *boot_menu_timeout) +{ + MachineState *machine =3D MACHINE(qdev_get_machine()); + char *lp =3D object_property_get_str(OBJECT(machine), "loadparm", NULL= ); + QemuOptsList *plist =3D qemu_find_opts("boot-opts"); + QemuOpts *opts =3D QTAILQ_FIRST(&plist->head); + const char *p =3D qemu_opt_get(opts, "menu"); + unsigned long timeout =3D 0; + + if (memcmp(lp, "PROMPT ", 8) =3D=3D 0) { + *boot_menu_flags =3D BOOT_MENU_FLAG_BOOT_OPTS; + + } else if (*lp) { + /* If loadparm is set to any value, then discard boot menu */ + return; + + } else if (!p) { + /* In the absence of -boot menu, use zipl loader parameters */ + *boot_menu_flags =3D BOOT_MENU_FLAG_ZIPL_OPTS; + + } else if (strncmp(p, "on", 2) =3D=3D 0) { + *boot_menu_flags =3D BOOT_MENU_FLAG_BOOT_OPTS; + + p =3D qemu_opt_get(opts, "splash-time"); + + if (p && qemu_strtoul(p, NULL, 10, &timeout)) { + error_report("splash-time value is invalid, forcing it to 0."); + return; + } + + /* Store timeout value as seconds */ + timeout /=3D 1000; + + if (timeout > 0xffff) { + error_report("splash-time value is greater than 65535000," + " forcing it to 65535000."); + *boot_menu_timeout =3D 0xffff; + return; + } + + *boot_menu_timeout =3D timeout; + } +} + static bool s390_gen_initial_iplb(S390IPLState *ipl) { DeviceState *dev_st; @@ -245,6 +295,8 @@ static bool s390_gen_initial_iplb(S390IPLState *ipl) ipl->iplb.pbt =3D S390_IPL_TYPE_CCW; ipl->iplb.ccw.devno =3D cpu_to_be16(ccw_dev->sch->devno); ipl->iplb.ccw.ssid =3D ccw_dev->sch->ssid & 3; + s390_ipl_set_boot_menu(&ipl->iplb.ccw.boot_menu_flags, + &ipl->iplb.ccw.boot_menu_timeout); } else if (sd) { SCSIBus *bus =3D scsi_bus_from_device(sd); VirtIOSCSI *vdev =3D container_of(bus, VirtIOSCSI, bus); @@ -266,6 +318,8 @@ static bool s390_gen_initial_iplb(S390IPLState *ipl) ipl->iplb.scsi.channel =3D cpu_to_be16(sd->channel); ipl->iplb.scsi.devno =3D cpu_to_be16(ccw_dev->sch->devno); ipl->iplb.scsi.ssid =3D ccw_dev->sch->ssid & 3; + s390_ipl_set_boot_menu(&ipl->iplb.scsi.boot_menu_flags, + &ipl->iplb.scsi.boot_menu_timeout); } else { return false; /* unknown device */ } @@ -273,6 +327,7 @@ static bool s390_gen_initial_iplb(S390IPLState *ipl) if (!s390_ipl_set_loadparm(ipl->iplb.loadparm)) { ipl->iplb.flags |=3D DIAG308_FLAGS_LP_VALID; } + return true; } =20 diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h index 8a705e0..ff3b397 100644 --- a/hw/s390x/ipl.h +++ b/hw/s390x/ipl.h @@ -17,7 +17,9 @@ =20 struct IplBlockCcw { uint64_t netboot_start_addr; - uint8_t reserved0[77]; + uint8_t reserved0[74]; + uint16_t boot_menu_timeout; + uint8_t boot_menu_flags; uint8_t ssid; uint16_t devno; uint8_t vm_flags; @@ -51,7 +53,9 @@ struct IplBlockQemuScsi { uint32_t lun; uint16_t target; uint16_t channel; - uint8_t reserved0[77]; + uint8_t reserved0[74]; + uint16_t boot_menu_timeout; + uint8_t boot_menu_flags; uint8_t ssid; uint16_t devno; } QEMU_PACKED; diff --git a/pc-bios/s390-ccw/iplb.h b/pc-bios/s390-ccw/iplb.h index 890aed9..fe909d2 100644 --- a/pc-bios/s390-ccw/iplb.h +++ b/pc-bios/s390-ccw/iplb.h @@ -14,7 +14,9 @@ =20 struct IplBlockCcw { uint64_t netboot_start_addr; - uint8_t reserved0[77]; + uint8_t reserved0[74]; + uint16_t boot_menu_timeout; + uint8_t boot_menu_flags; uint8_t ssid; uint16_t devno; uint8_t vm_flags; @@ -48,7 +50,9 @@ struct IplBlockQemuScsi { uint32_t lun; uint16_t target; uint16_t channel; - uint8_t reserved0[77]; + uint8_t reserved0[74]; + uint16_t boot_menu_timeout; + uint8_t boot_menu_flags; uint8_t ssid; uint16_t devno; } __attribute__ ((packed)); --=20 2.7.4 From nobody Mon Apr 29 06:06:05 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1513031050883309.9119494340707; Mon, 11 Dec 2017 14:24:10 -0800 (PST) Received: from localhost ([::1]:55759 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eOWUQ-0004DV-2s for importer@patchew.org; Mon, 11 Dec 2017 17:23:58 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54657) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eOWQg-0001FK-0h for qemu-devel@nongnu.org; Mon, 11 Dec 2017 17:20:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eOWQa-0001Yn-Jl for qemu-devel@nongnu.org; Mon, 11 Dec 2017 17:20:06 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:53006 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eOWQa-0001YP-CZ for qemu-devel@nongnu.org; Mon, 11 Dec 2017 17:20:00 -0500 Received: from pps.filterd (m0098419.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id vBBMG8IB012183 for ; Mon, 11 Dec 2017 17:19:59 -0500 Received: from e19.ny.us.ibm.com (e19.ny.us.ibm.com [129.33.205.209]) by mx0b-001b2d01.pphosted.com with ESMTP id 2esyjk1ag2-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Mon, 11 Dec 2017 17:19:59 -0500 Received: from localhost by e19.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 11 Dec 2017 17:19:58 -0500 Received: from b01cxnp23034.gho.pok.ibm.com (9.57.198.29) by e19.ny.us.ibm.com (146.89.104.206) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 11 Dec 2017 17:19:55 -0500 Received: from b01ledav005.gho.pok.ibm.com (b01ledav005.gho.pok.ibm.com [9.57.199.110]) by b01cxnp23034.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id vBBMJtE346203024; Mon, 11 Dec 2017 22:19:55 GMT Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8CFDDAE052; Mon, 11 Dec 2017 17:20:55 -0500 (EST) Received: from collin-ThinkPad-W541.ibm.com (unknown [9.80.202.87]) by b01ledav005.gho.pok.ibm.com (Postfix) with ESMTP id 3FFE0AE03C; Mon, 11 Dec 2017 17:20:55 -0500 (EST) From: "Collin L. Walling" To: qemu-s390x@nongnu.org, qemu-devel@nongnu.org Date: Mon, 11 Dec 2017 17:19:19 -0500 X-Mailer: git-send-email 2.7.4 In-Reply-To: <1513030760-26245-1-git-send-email-walling@linux.vnet.ibm.com> References: <1513030760-26245-1-git-send-email-walling@linux.vnet.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 17121122-0056-0000-0000-000003F6E6A4 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00008190; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000244; SDB=6.00958839; UDB=6.00484865; IPR=6.00738861; BA=6.00005736; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00018489; XFM=3.00000015; UTC=2017-12-11 22:19:57 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17121122-0057-0000-0000-0000082E2458 Message-Id: <1513030760-26245-5-git-send-email-walling@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-12-11_10:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=2 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1712110317 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.158.5 Subject: [Qemu-devel] [PATCH v2 4/5] s390-ccw: interactive boot menu for eckd dasd X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: borntraeger@de.ibm.com, thuth@redhat.com, cohuck@redhat.com, david@redhat.com, frankja@linux.vnet.ibm.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" When the boot menu options are present and the guest's disk has been configured by the zipl tool, then the user will be presented with an interactive boot menu with labeled entries. An example of what the menu might look like: zIPL v1.37.1-build-20170714 interactive boot menu. 0. default (linux-4.13.0) 1. linux-4.13.0 2. performance 3. kvm Please choose (default will boot in 10 seconds): If the user's input is empty or 0, the default zipl entry will be chosen. If the input is within the range presented by the menu, then the selection will be booted. Any erroneous input will cancel the timeout and prompt the user until correct input is given. Any value set for loadparm will override all boot menu options. If loadparm=3DPROMPT, then the menu prompt will continuously wait until correct user input is given. The absence of any boot options on the command line will attempt to use the zipl loader values. Signed-off-by: Collin L. Walling --- pc-bios/s390-ccw/Makefile | 2 +- pc-bios/s390-ccw/bootmap.c | 71 +++++++++++++- pc-bios/s390-ccw/bootmap.h | 2 + pc-bios/s390-ccw/main.c | 3 + pc-bios/s390-ccw/menu.c | 223 ++++++++++++++++++++++++++++++++++++++++= ++++ pc-bios/s390-ccw/menu.h | 28 ++++++ pc-bios/s390-ccw/s390-ccw.h | 2 + pc-bios/s390-ccw/sclp.c | 20 ++++ pc-bios/s390-ccw/virtio.c | 2 +- 9 files changed, 348 insertions(+), 5 deletions(-) create mode 100644 pc-bios/s390-ccw/menu.c create mode 100644 pc-bios/s390-ccw/menu.h diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile index 9f7904f..1712c2d 100644 --- a/pc-bios/s390-ccw/Makefile +++ b/pc-bios/s390-ccw/Makefile @@ -9,7 +9,7 @@ $(call set-vpath, $(SRC_PATH)/pc-bios/s390-ccw) =20 .PHONY : all clean build-all =20 -OBJECTS =3D start.o main.o bootmap.o sclp.o virtio.o virtio-scsi.o virtio-= blkdev.o libc.o +OBJECTS =3D start.o main.o bootmap.o sclp.o virtio.o virtio-scsi.o virtio-= blkdev.o libc.o menu.o QEMU_CFLAGS :=3D $(filter -W%, $(QEMU_CFLAGS)) QEMU_CFLAGS +=3D -ffreestanding -fno-delete-null-pointer-checks -msoft-flo= at QEMU_CFLAGS +=3D -march=3Dz900 -fPIE -fno-strict-aliasing diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index 5546b79..c817cf8 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -13,6 +13,7 @@ #include "bootmap.h" #include "virtio.h" #include "bswap.h" +#include "menu.h" =20 #ifdef DEBUG /* #define DEBUG_FALLBACK */ @@ -83,6 +84,7 @@ static void jump_to_IPL_code(uint64_t address) =20 static unsigned char _bprs[8*1024]; /* guessed "max" ECKD sector size */ static const int max_bprs_entries =3D sizeof(_bprs) / sizeof(ExtEckdBlockP= tr); +static uint8_t stage2[STAGE2_MAX_SIZE] __attribute__((__aligned__(PAGE_SIZ= E))); =20 static inline void verify_boot_info(BootInfo *bip) { @@ -182,7 +184,57 @@ static block_number_t load_eckd_segments(block_number_= t blk, uint64_t *address) return block_nr; } =20 -static void run_eckd_boot_script(block_number_t mbr_block_nr) +static void read_stage2(block_number_t s1b_block_nr) +{ + block_number_t s2_block_nr; + EckdStage1b *s1b =3D (void *)sec; + int i; + + /* Get Stage1b data */ + memset(sec, FREE_SPACE_FILLER, sizeof(sec)); + read_block(s1b_block_nr, s1b, "Cannot read stage1b boot loader."); + + /* Get Stage2 data */ + memset(stage2, FREE_SPACE_FILLER, sizeof(stage2)); + + for (i =3D 0; i < STAGE2_MAX_SIZE / MAX_SECTOR_SIZE; i++) { + s2_block_nr =3D eckd_block_num((void *)&(s1b->seek[i].cyl)); + + if (!s2_block_nr) { + break; + } + + read_block(s2_block_nr, (stage2 + MAX_SECTOR_SIZE * i), + "Error reading Stage2 data"); + } +} + +static bool find_zipl_boot_menu_data(block_number_t s1b_block_nr, + ZiplParms *zipl_parms) +{ + int offset; + void *s2_offset; + + read_stage2(s1b_block_nr); + + /* Menu banner starts with "zIPL" */ + for (offset =3D 0; offset < STAGE2_MAX_SIZE - 4; offset++) { + s2_offset =3D stage2 + offset; + + if (magic_match(s2_offset, ZIPL_MAGIC_EBCDIC)) { + zipl_parms->flag =3D *(uint16_t *)(s2_offset - 140); + zipl_parms->timeout =3D *(uint16_t *)(s2_offset - 138); + zipl_parms->menu_start =3D offset; + return true; + } + } + + sclp_print("No zipl boot menu data found. Booting default entry."); + return false; +} + +static void run_eckd_boot_script(block_number_t mbr_block_nr, + block_number_t s1b_block_nr) { int i; unsigned int loadparm =3D get_loadparm_index(); @@ -190,6 +242,12 @@ static void run_eckd_boot_script(block_number_t mbr_bl= ock_nr) uint64_t address; ScsiMbr *bte =3D (void *)sec; /* Eckd bootmap table entry */ BootMapScript *bms =3D (void *)sec; + ZiplParms zipl_parms; + + if (menu_check_flags(BOOT_MENU_FLAG_BOOT_OPTS | BOOT_MENU_FLAG_ZIPL_OP= TS) + && find_zipl_boot_menu_data(s1b_block_nr, &zipl_parms)) { + loadparm =3D menu_get_zipl_boot_index(stage2, zipl_parms); + } =20 debug_print_int("loadparm", loadparm); IPL_assert(loadparm < 31, "loadparm value greater than" @@ -224,6 +282,7 @@ static void ipl_eckd_cdl(void) EckdCdlIpl2 *ipl2 =3D (void *)sec; IplVolumeLabel *vlbl =3D (void *)sec; block_number_t mbr_block_nr; + block_number_t s1b_block_nr; =20 /* we have just read the block #0 and recognized it as "IPL1" */ sclp_print("CDL\n"); @@ -241,6 +300,9 @@ static void ipl_eckd_cdl(void) /* save pointer to Boot Script */ mbr_block_nr =3D eckd_block_num((void *)&(mbr->blockptr)); =20 + /* save pointer to Stage1b Data */ + s1b_block_nr =3D eckd_block_num((void *)&(ipl2->stage1.seek[0].cyl)); + memset(sec, FREE_SPACE_FILLER, sizeof(sec)); read_block(2, vlbl, "Cannot read Volume Label at block 2"); IPL_assert(magic_match(vlbl->key, VOL1_MAGIC), @@ -249,7 +311,7 @@ static void ipl_eckd_cdl(void) "Invalid magic of volser block"); print_volser(vlbl->f.volser); =20 - run_eckd_boot_script(mbr_block_nr); + run_eckd_boot_script(mbr_block_nr, s1b_block_nr); /* no return */ } =20 @@ -281,6 +343,7 @@ static void print_eckd_ldl_msg(ECKD_IPL_mode_t mode) static void ipl_eckd_ldl(ECKD_IPL_mode_t mode) { block_number_t mbr_block_nr; + block_number_t s1b_block_nr; EckdLdlIpl1 *ipl1 =3D (void *)sec; =20 if (mode !=3D ECKD_LDL_UNLABELED) { @@ -302,7 +365,9 @@ static void ipl_eckd_ldl(ECKD_IPL_mode_t mode) mbr_block_nr =3D eckd_block_num((void *)&(ipl1->boot_info.bp.ipl.bm_ptr.eckd.bptr)); =20 - run_eckd_boot_script(mbr_block_nr); + s1b_block_nr =3D eckd_block_num((void *)&(ipl1->stage1.seek[0].cyl)); + + run_eckd_boot_script(mbr_block_nr, s1b_block_nr); /* no return */ } =20 diff --git a/pc-bios/s390-ccw/bootmap.h b/pc-bios/s390-ccw/bootmap.h index b700d08..8089402 100644 --- a/pc-bios/s390-ccw/bootmap.h +++ b/pc-bios/s390-ccw/bootmap.h @@ -74,6 +74,7 @@ typedef struct ScsiMbr { } __attribute__ ((packed)) ScsiMbr; =20 #define ZIPL_MAGIC "zIPL" +#define ZIPL_MAGIC_EBCDIC "\xa9\xc9\xd7\xd3" #define IPL1_MAGIC "\xc9\xd7\xd3\xf1" /* =3D=3D "IPL1" in EBCDIC */ #define IPL2_MAGIC "\xc9\xd7\xd3\xf2" /* =3D=3D "IPL2" in EBCDIC */ #define VOL1_MAGIC "\xe5\xd6\xd3\xf1" /* =3D=3D "VOL1" in EBCDIC */ @@ -229,6 +230,7 @@ typedef struct BootInfo { /* @ 0x70, record #0= */ /* * Structs for IPL */ +#define STAGE2_MAX_SIZE 0x3000 #define STAGE2_BLK_CNT_MAX 24 /* Stage 1b can load up to 24 blocks */ =20 typedef struct EckdCdlIpl1 { diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index a8ef120..fb0ef92 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -11,6 +11,7 @@ #include "libc.h" #include "s390-ccw.h" #include "virtio.h" +#include "menu.h" =20 char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); static SubChannelId blk_schid =3D { .one =3D 1 }; @@ -101,6 +102,8 @@ static void virtio_setup(void) blk_schid.ssid =3D iplb.ccw.ssid & 0x3; debug_print_int("ssid ", blk_schid.ssid); found =3D find_dev(&schib, dev_no); + menu_set_parms(iplb.ccw.boot_menu_flags, + iplb.ccw.boot_menu_timeout); break; case S390_IPL_TYPE_QEMU_SCSI: vdev->scsi_device_selected =3D true; diff --git a/pc-bios/s390-ccw/menu.c b/pc-bios/s390-ccw/menu.c new file mode 100644 index 0000000..d707afb --- /dev/null +++ b/pc-bios/s390-ccw/menu.c @@ -0,0 +1,223 @@ +/* + * QEMU S390 Interactive Boot Menu + * + * Copyright 2017 IBM Corp. + * Author: Collin L. Walling + * + * This work is licensed under the terms of the GNU GPL, version 2 or (at + * your option) any later version. See the COPYING file in the top-level + * directory. + */ + +#include "libc.h" +#include "s390-ccw.h" +#include "menu.h" + +#define KEYCODE_NO_INP '\0' +#define KEYCODE_ESCAPE '\033' +#define KEYCODE_BACKSP '\177' +#define KEYCODE_ENTER '\r' + +static uint8_t flags; +static uint64_t timeout; + +static inline void enable_clock_int(void) +{ + uint64_t tmp =3D 0; + + asm volatile( + "stctg 0,0,%0\n" + "oi 6+%0, 0x8\n" + "lctlg 0,0,%0" + : : "Q" (tmp) + ); +} + +static inline void disable_clock_int(void) +{ + uint64_t tmp =3D 0; + + asm volatile( + "stctg 0,0,%0\n" + "ni 6+%0, 0xf7\n" + "lctlg 0,0,%0" + : : "Q" (tmp) + ); +} + +static inline void set_clock_comparator(uint64_t time) +{ + asm volatile("sckc %0" : : "Q" (time)); +} + +static inline bool check_clock_int(void) +{ + uint16_t code =3D *(uint16_t *)0x86; + + consume_sclp_int(); + + return code =3D=3D 0x1004; +} + +static int read_prompt(char *buf, size_t len) +{ + char inp[2]; + uint8_t idx =3D 0; + uint64_t time; + + if (timeout) { + time =3D get_clock() + (timeout << 32); + set_clock_comparator(time); + enable_clock_int(); + } + + inp[1] =3D '\0'; + + while (!check_clock_int()) { + + /* Process only one character at a time */ + sclp_read(inp, 1); + + switch (inp[0]) { + case KEYCODE_NO_INP: + case KEYCODE_ESCAPE: + continue; + case KEYCODE_BACKSP: + if (idx > 0) { + /* Remove last character */ + buf[idx - 1] =3D ' '; + sclp_print("\r"); + sclp_print(buf); + + idx--; + + /* Reset cursor */ + buf[idx] =3D 0; + sclp_print("\r"); + sclp_print(buf); + } + continue; + case KEYCODE_ENTER: + disable_clock_int(); + return idx; + } + + /* Echo input and add to buffer */ + if (idx < len) { + buf[idx] =3D inp[0]; + sclp_print(inp); + idx++; + } + } + + disable_clock_int(); + *buf =3D NULL; + + return 0; +} + +static int get_index(void) +{ + char buf[10]; + int len; + int i; + + memset(buf, 0, sizeof(buf)); + + len =3D read_prompt(buf, sizeof(buf)); + + if (len =3D=3D 0) { + return 0; + } + + for (i =3D 0; i < len; i++) { + if (!isdigit(buf[i])) { + return -1; + } + } + + return atoi(buf); +} + +static int get_boot_index(int entries) +{ + char tmp[6]; + int boot_index; + + /* Prompt User */ + if (timeout > 0) { + sclp_print("Please choose (default will boot in "); + sclp_print(itostr(timeout, tmp, sizeof(tmp))); + sclp_print(" seconds):\n"); + } else { + sclp_print("Please choose:\n"); + } + + /* Get Menu Choice */ + boot_index =3D get_index(); + + timeout =3D 0; + + while (boot_index < 0 || boot_index >=3D entries) { + sclp_print("\nError: undefined configuration" + "\nPlease choose:\n"); + boot_index =3D get_index(); + } + + sclp_print("\nBooting entry #"); + sclp_print(itostr(boot_index, tmp, sizeof(tmp))); + + return boot_index; +} + +static void zipl_println(const char *data, size_t len) +{ + char buf[len + 1]; + + ebcdic_to_ascii(data, buf, len); + buf[len] =3D '\n'; + buf[len + 1] =3D '\0'; + + sclp_print(buf); +} + +int menu_get_zipl_boot_index(const void *stage2, ZiplParms zipl_parms) +{ + const char *data =3D stage2 + zipl_parms.menu_start; + size_t len; + int ct; + + if (flags & BOOT_MENU_FLAG_ZIPL_OPTS) { + if (zipl_parms.flag) { + timeout =3D zipl_parms.timeout; + } else { + return 0; /* Boot default */ + } + } + + /* Print and count all menu items, including the banner */ + for (ct =3D 0; *data; ct++) { + len =3D strlen(data); + zipl_println(data, len); + data +=3D len + 1; + + if (ct < 2) { + sclp_print("\n"); + } + } + + sclp_print("\n"); + + return get_boot_index(ct - 1); +} + +void menu_set_parms(uint8_t boot_menu_flag, uint16_t boot_menu_timeout) +{ + flags =3D boot_menu_flag; + timeout =3D boot_menu_timeout; +} + +int menu_check_flags(uint8_t check_flags) +{ + return flags & check_flags; +} diff --git a/pc-bios/s390-ccw/menu.h b/pc-bios/s390-ccw/menu.h new file mode 100644 index 0000000..a8727fa --- /dev/null +++ b/pc-bios/s390-ccw/menu.h @@ -0,0 +1,28 @@ +/* + * QEMU S390 Interactive Boot Menu + * + * Copyright 2017 IBM Corp. + * Author: Collin L. Walling + * + * This work is licensed under the terms of the GNU GPL, version 2 or (at + * your option) any later version. See the COPYING file in the top-level + * directory. + */ + +#ifndef MENU_H +#define MENU_H + +#define BOOT_MENU_FLAG_BOOT_OPTS 0x80 +#define BOOT_MENU_FLAG_ZIPL_OPTS 0x40 + +typedef struct ZiplParms { + unsigned short flag; + unsigned short timeout; + unsigned long long menu_start; +} ZiplParms; + +void menu_set_parms(uint8_t boot_menu_flags, uint16_t boot_menu_timeout); +bool menu_check_flags(uint8_t check_flags); +int menu_get_zipl_boot_index(const void *stage2, ZiplParms zipl_parms); + +#endif /* MENU_H */ diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h index 25d4d21..df4bc88 100644 --- a/pc-bios/s390-ccw/s390-ccw.h +++ b/pc-bios/s390-ccw/s390-ccw.h @@ -71,6 +71,7 @@ unsigned int get_loadparm_index(void); void sclp_print(const char *string); void sclp_setup(void); void sclp_get_loadparm_ascii(char *loadparm); +void sclp_read(char *str, size_t len); =20 /* virtio.c */ unsigned long virtio_load_direct(ulong rec_list1, ulong rec_list2, @@ -79,6 +80,7 @@ bool virtio_is_supported(SubChannelId schid); void virtio_blk_setup_device(SubChannelId schid); int virtio_read(ulong sector, void *load_addr); int enable_mss_facility(void); +u64 get_clock(void); ulong get_second(void); =20 /* bootmap.c */ diff --git a/pc-bios/s390-ccw/sclp.c b/pc-bios/s390-ccw/sclp.c index 486fce1..5e4a78b 100644 --- a/pc-bios/s390-ccw/sclp.c +++ b/pc-bios/s390-ccw/sclp.c @@ -101,3 +101,23 @@ void sclp_get_loadparm_ascii(char *loadparm) ebcdic_to_ascii((char *) sccb->loadparm, loadparm, 8); } } + +void sclp_read(char *str, size_t len) +{ + ReadEventData *sccb =3D (void *)_sccb; + char *buf =3D (char *)(&sccb->ebh) + 7; + + /* Len should not exceed the maximum size of the event buffer */ + if (len > SCCB_SIZE - 8) { + len =3D SCCB_SIZE - 8; + } + + sccb->h.length =3D SCCB_SIZE; + sccb->h.function_code =3D SCLP_UNCONDITIONAL_READ; + sccb->ebh.length =3D sizeof(EventBufferHeader); + sccb->ebh.type =3D SCLP_EVENT_ASCII_CONSOLE_DATA; + sccb->ebh.flags =3D 0; + + sclp_service_call(SCLP_CMD_READ_EVENT_DATA, sccb); + memcpy(str, buf, len); +} diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c index c890a03..817e7f5 100644 --- a/pc-bios/s390-ccw/virtio.c +++ b/pc-bios/s390-ccw/virtio.c @@ -176,7 +176,7 @@ void vring_send_buf(VRing *vr, void *p, int len, int fl= ags) } } =20 -static u64 get_clock(void) +u64 get_clock(void) { u64 r; =20 --=20 2.7.4 From nobody Mon Apr 29 06:06:05 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1513031153799292.02853083336447; Mon, 11 Dec 2017 14:25:53 -0800 (PST) Received: from localhost ([::1]:55782 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eOWW8-0005qG-4R for importer@patchew.org; Mon, 11 Dec 2017 17:25:44 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54685) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eOWQi-0001G4-8J for qemu-devel@nongnu.org; Mon, 11 Dec 2017 17:20:11 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eOWQd-0001bw-TU for qemu-devel@nongnu.org; Mon, 11 Dec 2017 17:20:08 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:39784) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eOWQd-0001b0-Ki for qemu-devel@nongnu.org; Mon, 11 Dec 2017 17:20:03 -0500 Received: from pps.filterd (m0098410.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id vBBMGIbb069561 for ; Mon, 11 Dec 2017 17:20:01 -0500 Received: from e19.ny.us.ibm.com (e19.ny.us.ibm.com [129.33.205.209]) by mx0a-001b2d01.pphosted.com with ESMTP id 2eswubdggt-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Mon, 11 Dec 2017 17:20:00 -0500 Received: from localhost by e19.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 11 Dec 2017 17:19:59 -0500 Received: from b01cxnp22036.gho.pok.ibm.com (9.57.198.26) by e19.ny.us.ibm.com (146.89.104.206) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 11 Dec 2017 17:19:57 -0500 Received: from b01ledav005.gho.pok.ibm.com (b01ledav005.gho.pok.ibm.com [9.57.199.110]) by b01cxnp22036.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id vBBMJuMo48103618; Mon, 11 Dec 2017 22:19:56 GMT Received: from b01ledav005.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id F1CBCAE03B; Mon, 11 Dec 2017 17:20:56 -0500 (EST) Received: from collin-ThinkPad-W541.ibm.com (unknown [9.80.202.87]) by b01ledav005.gho.pok.ibm.com (Postfix) with ESMTP id B5339AE043; Mon, 11 Dec 2017 17:20:56 -0500 (EST) From: "Collin L. Walling" To: qemu-s390x@nongnu.org, qemu-devel@nongnu.org Date: Mon, 11 Dec 2017 17:19:20 -0500 X-Mailer: git-send-email 2.7.4 In-Reply-To: <1513030760-26245-1-git-send-email-walling@linux.vnet.ibm.com> References: <1513030760-26245-1-git-send-email-walling@linux.vnet.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 17121122-0056-0000-0000-000003F6E6A6 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00008190; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000244; SDB=6.00958839; UDB=6.00484865; IPR=6.00738861; BA=6.00005736; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00018489; XFM=3.00000015; UTC=2017-12-11 22:19:59 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17121122-0057-0000-0000-0000082E2459 Message-Id: <1513030760-26245-6-git-send-email-walling@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-12-11_10:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1712110317 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.156.1 Subject: [Qemu-devel] [PATCH v2 5/5] s390-ccw: interactive boot menu for scsi X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: borntraeger@de.ibm.com, thuth@redhat.com, cohuck@redhat.com, david@redhat.com, frankja@linux.vnet.ibm.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Interactive boot menu for scsi. This follows the same procedure as the interactive menu for eckd dasd. An example follows: s390x Enumerated Boot Menu. 3 entries detected. Select from index 0 to 2. Please choose: Signed-off-by: Collin L. Walling --- pc-bios/s390-ccw/bootmap.c | 9 ++++++--- pc-bios/s390-ccw/main.c | 2 ++ pc-bios/s390-ccw/menu.c | 14 ++++++++++++++ pc-bios/s390-ccw/menu.h | 1 + 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index c817cf8..78e41ab 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -552,15 +552,18 @@ static void ipl_scsi(void) } =20 program_table_entries++; - if (program_table_entries =3D=3D loadparm + 1) { - break; /* selected entry found */ - } } =20 debug_print_int("program table entries", program_table_entries); =20 IPL_assert(program_table_entries !=3D 0, "Empty Program Table"); =20 + if (menu_check_flags(BOOT_MENU_FLAG_BOOT_OPTS)) { + loadparm =3D menu_get_enum_boot_index(program_table_entries); + } + + prog_table_entry =3D (ScsiBlockPtr *)(sec + pte_len * (loadparm + 1)); + zipl_run(prog_table_entry); /* no return */ } =20 diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index fb0ef92..2a697a0 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -112,6 +112,8 @@ static void virtio_setup(void) vdev->selected_scsi_device.lun =3D iplb.scsi.lun; blk_schid.ssid =3D iplb.scsi.ssid & 0x3; found =3D find_dev(&schib, iplb.scsi.devno); + menu_set_parms(iplb.scsi.boot_menu_flags, + iplb.scsi.boot_menu_timeout); break; default: panic("List-directed IPL not supported yet!\n"); diff --git a/pc-bios/s390-ccw/menu.c b/pc-bios/s390-ccw/menu.c index d707afb..49876c1 100644 --- a/pc-bios/s390-ccw/menu.c +++ b/pc-bios/s390-ccw/menu.c @@ -211,6 +211,20 @@ int menu_get_zipl_boot_index(const void *stage2, ZiplP= arms zipl_parms) return get_boot_index(ct - 1); } =20 +int menu_get_enum_boot_index(int entries) +{ + char tmp[4]; + + sclp_print("s390x Enumerated Boot Menu.\n\n"); + + sclp_print(itostr(entries, tmp, sizeof(tmp))); + sclp_print(" entries detected. Select from boot index 0 to "); + sclp_print(itostr(entries - 1, tmp, sizeof(tmp))); + sclp_print(".\n\n"); + + return get_boot_index(entries); +} + void menu_set_parms(uint8_t boot_menu_flag, uint16_t boot_menu_timeout) { flags =3D boot_menu_flag; diff --git a/pc-bios/s390-ccw/menu.h b/pc-bios/s390-ccw/menu.h index a8727fa..4373b0c 100644 --- a/pc-bios/s390-ccw/menu.h +++ b/pc-bios/s390-ccw/menu.h @@ -24,5 +24,6 @@ typedef struct ZiplParms { void menu_set_parms(uint8_t boot_menu_flags, uint16_t boot_menu_timeout); bool menu_check_flags(uint8_t check_flags); int menu_get_zipl_boot_index(const void *stage2, ZiplParms zipl_parms); +int menu_get_enum_boot_index(int entries); =20 #endif /* MENU_H */ --=20 2.7.4