From patchwork Thu Jun 20 14:16:54 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nina Schoetterl-Glausch X-Patchwork-Id: 13705611 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A756F1AD483; Thu, 20 Jun 2024 14:17:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718893038; cv=none; b=FPbUOmvXW2GA3cIvZTi+6Ws4GPNCV3pBfAlya5seSLGv1C53vGkX3AW2HkekXvkQHjBFOTuo5KgAOenzl2zPpL0dP5Lto3kBBhtIDbsMo4cuzthDMvw18+hK9Dp77uLBH3GsD9Eay7N6cUi1ybzdaVWxhaGKzsWWq5xGpjQ+4BM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718893038; c=relaxed/simple; bh=aqMDKPV3iu3Y4sA0CpCDc+eqRVw3CJGgvOfLX6fLJyk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Io2Stn1ZMCdLlH3M469ULb0g9Qd0uY6jExm9g8TFP4h77MdxMT9gKL6ZfJuV6QOHI9Qpif/qxHztFoFFF5qbw+Vg041T7nhx0ztl9Jf8463UGKT4eZMmEjRUMDFNY0I1rOk3GziKsBmgWY6y2QQsj+WZOEjRz7lWfO5vfb5axKA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=aKyIWmrV; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="aKyIWmrV" Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 45KDwhr7023531; Thu, 20 Jun 2024 14:17:10 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from :to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=pp1; bh=rNoHxJIwcJFfm 6hdfl+KkBYDEFsUdZO3t9hC7J/CON4=; b=aKyIWmrVjIfaKQ9FLNnOzOU3v+3L+ sjtdSYflA4RjkNaYH7ED8AHvGNGXShwapmIrulR39dHWMffqO1xXBOdKVKZ66QND F8kivmTemY/GU/ZTMLXDnabVm0SuftyHHp0e8qui1dZfMDOyzQq19IVInuNrcnax 5eOXu7P199mDTQTkV1fY/2iL+LvS+BUc9xmvKlwzV+gAor8+/SrzDNpJnzKqTLoJ fUpxRVLSwrL4F+C5dCGf4yssloxZBVrRnZ3Y5a04N7l4unT9VUgeuLkOewxt4SGJ MJO4OwgoHt34AtNg3KxOehVt3drDMSXaIWHL8cNNbqO9vVVvgVXUnn+IA== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3yvnsar1td-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:10 +0000 (GMT) Received: from m0353729.ppops.net (m0353729.ppops.net [127.0.0.1]) by pps.reinject (8.18.0.8/8.18.0.8) with ESMTP id 45KEH9nK023151; Thu, 20 Jun 2024 14:17:09 GMT Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3yvnsar1tb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:09 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 45KDvfrT019545; Thu, 20 Jun 2024 14:17:08 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 3ysnp1q004-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:08 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 45KEH2RQ51249452 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 20 Jun 2024 14:17:04 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9D7BF2004B; Thu, 20 Jun 2024 14:17:02 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5F3622004E; Thu, 20 Jun 2024 14:17:02 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.152.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 20 Jun 2024 14:17:02 +0000 (GMT) From: Nina Schoetterl-Glausch To: Nina Schoetterl-Glausch , Nicholas Piggin , Nico Boehr , Thomas Huth , Andrew Jones Cc: linux-s390@vger.kernel.org, Claudio Imbrenda , David Hildenbrand , Janosch Frank , kvm@vger.kernel.org Subject: [kvm-unit-tests PATCH v3 1/7] lib: Add pseudo random functions Date: Thu, 20 Jun 2024 16:16:54 +0200 Message-Id: <20240620141700.4124157-2-nsg@linux.ibm.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240620141700.4124157-1-nsg@linux.ibm.com> References: <20240620141700.4124157-1-nsg@linux.ibm.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: beDaDAhvyuBkJ9HNqQWBSIRTtQkNS5GY X-Proofpoint-GUID: qsYGq10zvxbjlaPK2LZfxlAIctcIgbR9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.28.16 definitions=2024-06-20_07,2024-06-20_04,2024-05-17_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxscore=0 spamscore=0 clxscore=1015 adultscore=0 impostorscore=0 suspectscore=0 bulkscore=0 mlxlogscore=999 priorityscore=1501 phishscore=0 lowpriorityscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2405170001 definitions=main-2406200099 Add functions for generating pseudo random 32 and 64 bit values. The implementation uses SHA-256 and so the randomness should have good quality. Implement the necessary subset of SHA-256. The PRNG algorithm is equivalent to the following python snippet: def prng32(seed): from hashlib import sha256 state = seed.to_bytes(8, byteorder="big") while True: state = sha256(state).digest() for i in range(8): yield int.from_bytes(state[i*4:(i+1)*4], byteorder="big") Acked-by: Andrew Jones Signed-off-by: Nina Schoetterl-Glausch Acked-by: Nicholas Piggin --- Notes: Since a PRNG with better quality was asked for I decided to use SHA-256 because: * it is a standard, commonly used algorithm * high quality randomness is assured * the implementation can be checked against the spec * the implementation can be easily checked via comparison I tested the implementation in the following way: cat <<'EOF' > rand.py #!/usr/bin/python3 def prng32(seed): from hashlib import sha256 state = seed.to_bytes(8, byteorder="big") while True: state = sha256(state).digest() for i in range(8): yield int.from_bytes(state[i*4:(i+1)*4], byteorder="big") r = prng32(0) for i in range(100): print(f"{next(r):08x}") EOF cat <<'EOF' > rand.c #include #include "rand.h" void main(void) { prng_state state = prng_init(0); for (int i = 0; i < 100; i++) { printf("%08x\n", prng32(&state)); } } EOF cat <<'EOF' > libcflat.h #define ARRAY_SIZE(_a) (sizeof(_a)/sizeof((_a)[0])) EOF chmod +x rand.py ln -s lib/rand.c librand.c gcc -Ilib librand.c rand.c diff <(./a.out) <(./rand.py) Makefile | 1 + lib/rand.h | 21 +++++++ lib/rand.c | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 199 insertions(+) create mode 100644 lib/rand.h create mode 100644 lib/rand.c diff --git a/Makefile b/Makefile index 5b7998b7..3d51cb72 100644 --- a/Makefile +++ b/Makefile @@ -28,6 +28,7 @@ cflatobjs := \ lib/printf.o \ lib/string.o \ lib/abort.o \ + lib/rand.o \ lib/report.o \ lib/stack.o diff --git a/lib/rand.h b/lib/rand.h new file mode 100644 index 00000000..cdce8bd7 --- /dev/null +++ b/lib/rand.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * (pseudo) random functions + * + * Copyright IBM Corp. 2024 + */ +#ifndef _RAND_H_ +#define _RAND_H_ + +#include + +/* Non cryptographically secure PRNG */ +typedef struct { + uint32_t hash[8]; + uint8_t next_word; +} prng_state; +prng_state prng_init(uint64_t seed); +uint32_t prng32(prng_state *state); +uint64_t prng64(prng_state *state); + +#endif /* _RAND_H_ */ diff --git a/lib/rand.c b/lib/rand.c new file mode 100644 index 00000000..583d2d9f --- /dev/null +++ b/lib/rand.c @@ -0,0 +1,177 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * (pseudo) random functions + * Currently uses SHA-256 to scramble the PRNG state. + * + * Copyright IBM Corp. 2024 + */ + +#include "libcflat.h" +#include "rand.h" +#include + +/* Begin SHA-256 related definitions */ + +#define INITAL_HASH { \ + 0x6a09e667, \ + 0xbb67ae85, \ + 0x3c6ef372, \ + 0xa54ff53a, \ + 0x510e527f, \ + 0x9b05688c, \ + 0x1f83d9ab, \ + 0x5be0cd19, \ +} + +static const uint32_t K[] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, +}; + +static inline uint32_t ch(uint32_t x, uint32_t y, uint32_t z) +{ + return (x & y) ^ ((~x) & z); +} + +static inline uint32_t maj(uint32_t x, uint32_t y, uint32_t z) +{ + return (x & y) ^ (x & z) ^ (y & z); +} + +static inline uint32_t rot(uint32_t value, unsigned int count) +{ + return value >> count | value << (32 - count); +} + +static inline uint32_t upper_sig0(uint32_t x) +{ + return rot(x, 2) ^ rot(x, 13) ^ rot(x, 22); +} + +static inline uint32_t upper_sig1(uint32_t x) +{ + return rot(x, 6) ^ rot(x, 11) ^ rot(x, 25); +} + +static inline uint32_t lower_sig0(uint32_t x) +{ + return rot(x, 7) ^ rot(x, 18) ^ (x >> 3); +} + +static inline uint32_t lower_sig1(uint32_t x) +{ + return rot(x, 17) ^ rot(x, 19) ^ (x >> 10); +} + +enum alphabet { A, B, C, D, E, F, G, H, }; + +static void sha256_chunk(const uint32_t (*chunk)[16], uint32_t (*hash)[8]) +{ + uint32_t w[64]; + uint32_t w_hash[8]; + + memcpy(w, chunk, sizeof(*chunk)); + + for (int i = 16; i < 64; i++) + w[i] = lower_sig1(w[i - 2]) + w[i - 7] + lower_sig0(w[i - 15]) + w[i - 16]; + + memcpy(w_hash, hash, sizeof(*hash)); + + for (int i = 0; i < 64; i++) { + uint32_t t1, t2; + + t1 = w_hash[H] + + upper_sig1(w_hash[E]) + + ch(w_hash[E], w_hash[F], w_hash[G]) + + K[i] + + w[i]; + + t2 = upper_sig0(w_hash[A]) + maj(w_hash[A], w_hash[B], w_hash[C]); + + w_hash[H] = w_hash[G]; + w_hash[G] = w_hash[F]; + w_hash[F] = w_hash[E]; + w_hash[E] = w_hash[D] + t1; + w_hash[D] = w_hash[C]; + w_hash[C] = w_hash[B]; + w_hash[B] = w_hash[A]; + w_hash[A] = t1 + t2; + } + + for (int i = 0; i < 8; i++) + (*hash)[i] += w_hash[i]; +} + +/** + * sha256_hash - Calculate SHA-256 of input. Only a limited subset of inputs supported. + * @n: Number of words to hash, must be <= 13 + * @input: Input data to hash + * @hash: Output hash as a word array, ordered such that the first word contains + * the first/leftmost bits of the 256 bit hash + * + * Calculate the SHA-256 hash of the input where the input must be a multiple of + * 4 bytes and at most 52 long. The input is used without any adjustment, so, + * should the caller want to hash bytes it needs to interpret the bytes in the + * ordering as defined by the specification, that is big endian. + * The same applies to interpreting the output array as bytes. + * The function computes the same as: printf "%08x" ${input[@]} | xxd -r -p | sha256sum . + */ +static void sha256_hash(unsigned int n, const uint32_t (*input)[n], uint32_t (*hash)[8]) +{ + /* + * Pad according to SHA-2 specification. + * First set up length in bits. + */ + uint32_t chunk[16] = { + [15] = sizeof(*input) * 8, + }; + + memcpy(chunk, input, sizeof(*input)); + /* Then add separator */ + chunk[n] = 1 << 31; + memcpy(hash, (uint32_t[])INITAL_HASH, sizeof(*hash)); + sha256_chunk(&chunk, hash); +} + +/* End SHA-256 related definitions */ + +prng_state prng_init(uint64_t seed) +{ + prng_state state = { .next_word = 0 }; + uint32_t seed_arr[2] = { seed >> 32, seed }; + + sha256_hash(ARRAY_SIZE(seed_arr), &seed_arr, &state.hash); + return state; +} + +static void prng_scramble(prng_state *state) +{ + uint32_t input[8]; + + memcpy(input, state->hash, sizeof(state->hash)); + sha256_hash(ARRAY_SIZE(input), &input, &state->hash); + state->next_word = 0; +} + +uint32_t prng32(prng_state *state) +{ + if (state->next_word < ARRAY_SIZE(state->hash)) + return state->hash[state->next_word++]; + + prng_scramble(state); + return prng32(state); +} + +uint64_t prng64(prng_state *state) +{ + /* explicitly evaluate the high word first */ + uint64_t high = prng32(state); + + return high << 32 | prng32(state); +} From patchwork Thu Jun 20 14:16:55 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nina Schoetterl-Glausch X-Patchwork-Id: 13705612 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2B92B1AD9F4; Thu, 20 Jun 2024 14:17:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718893038; cv=none; b=l8awc3A44qZRlYTrqX7+qO1Z+OiF5d97XmfNv4hkNFWsXtFnwCRAFdjcCyJflAb7im+JfQVA8W9ust1BcfxI1FJDvllWCo9iCRrq3U4uxLUmiVvScGpvzjoWWqzO/GKpQbHE2dTyb0cvQqOiENcUN7DwSU2WndT4Tk74vkdZMro= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718893038; c=relaxed/simple; bh=6s0f4LnN/nltxozjmOmalCHRIrjHYE78BKI7JROLR/0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=sKGhdFAKXdx3tXeUtHitpgb0x61K0wQYSmhrqH359qn7R5z7AEHHQgK04s17elYLM8U7BANSfFfN79VOfVnWNgbJH/O4cyFF6Y1VeC7tUOiK2p2j8Tu9U2Afefsu3clTgmh7W9Qjju2p26vm7+ClYMJXDxUOuZgV5NE8jiR3nEw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=bgtdjozk; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="bgtdjozk" Received: from pps.filterd (m0353723.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 45KChqAv028774; Thu, 20 Jun 2024 14:17:10 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from :to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=pp1; bh=RdSen22QYJg8Z pbu+FAoTU1FhfAmbp5otZs5W4EN8GI=; b=bgtdjozksmPd0JESDWJI7osAjBihK UuXC1qSyAm+KsYFdvVLe4gxjBV1vEPYjgCjeNs+sTHeIT7kPwxS3Lsh8DHYqjCbv lvQRWE2LGjfN+0NLz2mU2v1hzztvDyDHnnxC9m4r/GD6KAhdGx/tvPraLKWViApM Tx8SjX873DB6avCu68QNeGIgrC52whHafvUOxrLFuc2Nen8JeDBF+3Rfk23M1+Jq qTIBOcG6CfTOP+z6VbHVYi20XY/l5okEo7yLovsLDics4jft02rZ9J1WAnrwtY29 Kx6XT+sEzc1XGwPTZOWMhTemBjl8UbQEqCBUvh2LQYQmagY2MVLsHMqPQ== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3yvg2s8yv9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:09 +0000 (GMT) Received: from m0353723.ppops.net (m0353723.ppops.net [127.0.0.1]) by pps.reinject (8.18.0.8/8.18.0.8) with ESMTP id 45KEH9cX027020; Thu, 20 Jun 2024 14:17:09 GMT Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3yvg2s8yv7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:09 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 45KD1d2T009433; Thu, 20 Jun 2024 14:17:08 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 3ysqgn6gev-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:08 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 45KEH3VN22544686 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 20 Jun 2024 14:17:05 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id F1F6F2004E; Thu, 20 Jun 2024 14:17:02 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B16492004F; Thu, 20 Jun 2024 14:17:02 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.152.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 20 Jun 2024 14:17:02 +0000 (GMT) From: Nina Schoetterl-Glausch To: Claudio Imbrenda , =?utf-8?q?Nico_B=C3=B6hr?= , Janosch Frank Cc: Nina Schoetterl-Glausch , Thomas Huth , Nicholas Piggin , kvm@vger.kernel.org, Andrew Jones , David Hildenbrand , linux-s390@vger.kernel.org Subject: [kvm-unit-tests PATCH v3 2/7] s390x: lib: Remove double include Date: Thu, 20 Jun 2024 16:16:55 +0200 Message-Id: <20240620141700.4124157-3-nsg@linux.ibm.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240620141700.4124157-1-nsg@linux.ibm.com> References: <20240620141700.4124157-1-nsg@linux.ibm.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: aPD2wXub83KCHUh9kS3C57a0XUAB9zIJ X-Proofpoint-ORIG-GUID: uDsDrJ7PX9cWMGhCAoHEdVMZ2FEublYe X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.28.16 definitions=2024-06-20_07,2024-06-20_04,2024-05-17_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 mlxscore=0 clxscore=1015 impostorscore=0 lowpriorityscore=0 malwarescore=0 adultscore=0 suspectscore=0 bulkscore=0 phishscore=0 priorityscore=1501 mlxlogscore=847 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2405170001 definitions=main-2406200099 libcflat.h was included twice. Reviewed-by: Claudio Imbrenda Signed-off-by: Nina Schoetterl-Glausch Reviewed-by: Janosch Frank --- lib/s390x/sie.c | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/s390x/sie.c b/lib/s390x/sie.c index 28fbf146..40936bd2 100644 --- a/lib/s390x/sie.c +++ b/lib/s390x/sie.c @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include From patchwork Thu Jun 20 14:16:56 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nina Schoetterl-Glausch X-Patchwork-Id: 13705606 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EC5561AD499; Thu, 20 Jun 2024 14:17:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718893036; cv=none; b=HzC6GOg5pDsXOdFherOH2Rn05Q5KS/yW4oiFP3ddkGuJXG0LKNxrvzipeZ9Q50XuaqfTR8OZD99E6mHjM4vH9MWGapXI0tIKwIYNK41+WJsB3r+k4uEKrVC9V0mr86FlxdyaHbGvv5ZA68yXsNehDhPZX0I0N3JiNCf/oQw731g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718893036; c=relaxed/simple; bh=TmMuRr8W3SjFtQudukPEkp/XUQff0qDDavNzHyogiOw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=hggEYZxoFQBdBLV2vt7rGCT8YMv+6Z6VXtRAbQiEAYjrEFIBnv8XEgwzXkddoI6KuB03bmmL04kxO1dQKzE1navAPNk5SzzPcpxXUjTHyDjzK7pObYyg2882r0nSrj9nH/rx8z8NS6BYv7dc3DiXO8tc9VxiKu9u0iq9lbz5cGk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=oXnzAfex; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="oXnzAfex" Received: from pps.filterd (m0353724.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 45KDvHZN021924; Thu, 20 Jun 2024 14:17:10 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from :to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=pp1; bh=maQklBUJun5tn ZBBXefqmxTHQnD0x+WhqV1Ino1t/us=; b=oXnzAfexht/2vUWpXNKaSrKLLJH8U j32CCDA7rFWgSNAL1pklZX+j9TmiJnhA4BNajwKwXIUaV9oBPcPA/jpwnp8BB9JF 2ROkCGr2S52b2p1X/nY4Mx6n285fYbwPQ15MYeDrfU+VbZegcw5p4ie0lFinhILP GwHZ0N/H2Tv4CcUJ7Vyoc4kTA49ba8x5abAuezkE6BMmPDWvVQ7OkZXp8CI6okvm E/vM5RoHsfy9CQAXxvQOed5H1hcTniPL4ohnRBaxBN2h4SLkLNRDjgbQgcqbr/ju Fwc7O0PW+5vg+D+DGqcowgTAtxoTCrRwo8rDM/mLdbny4x8NWLOPqofNg== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3yvndp83jx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:10 +0000 (GMT) Received: from m0353724.ppops.net (m0353724.ppops.net [127.0.0.1]) by pps.reinject (8.18.0.8/8.18.0.8) with ESMTP id 45KEH9Io024281; Thu, 20 Jun 2024 14:17:09 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3yvndp83js-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:09 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 45KCqsaB011010; Thu, 20 Jun 2024 14:17:09 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 3yspsnpnqb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:09 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 45KEH3jf26411602 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 20 Jun 2024 14:17:05 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 47CED2005A; Thu, 20 Jun 2024 14:17:03 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 11B792004F; Thu, 20 Jun 2024 14:17:03 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.152.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 20 Jun 2024 14:17:03 +0000 (GMT) From: Nina Schoetterl-Glausch To: =?utf-8?q?Nico_B=C3=B6hr?= , Janosch Frank , Claudio Imbrenda Cc: Nina Schoetterl-Glausch , linux-s390@vger.kernel.org, Nicholas Piggin , kvm@vger.kernel.org, David Hildenbrand , Andrew Jones , Thomas Huth Subject: [kvm-unit-tests PATCH v3 3/7] s390x: Add sie_is_pv Date: Thu, 20 Jun 2024 16:16:56 +0200 Message-Id: <20240620141700.4124157-4-nsg@linux.ibm.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240620141700.4124157-1-nsg@linux.ibm.com> References: <20240620141700.4124157-1-nsg@linux.ibm.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: ZaFh4BimmABHIKUEQGHW4XPCjeUJ3Z5s X-Proofpoint-ORIG-GUID: 2KDpu9k3iAMYEw_ADRY7Ip2VWg9GBC46 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.28.16 definitions=2024-06-20_07,2024-06-20_04,2024-05-17_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 clxscore=1015 bulkscore=0 mlxscore=0 suspectscore=0 malwarescore=0 phishscore=0 mlxlogscore=805 spamscore=0 adultscore=0 lowpriorityscore=0 priorityscore=1501 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2405170001 definitions=main-2406200099 Add a function to check if a guest VM is currently running protected. Signed-off-by: Nina Schoetterl-Glausch Reviewed-by: Claudio Imbrenda Reviewed-by: Janosch Frank Reviewed-by: Nicholas Piggin --- lib/s390x/sie.h | 6 ++++++ lib/s390x/sie.c | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/s390x/sie.h b/lib/s390x/sie.h index c1724cf2..53cd767f 100644 --- a/lib/s390x/sie.h +++ b/lib/s390x/sie.h @@ -281,6 +281,12 @@ void sie_expect_validity(struct vm *vm); uint16_t sie_get_validity(struct vm *vm); void sie_check_validity(struct vm *vm, uint16_t vir_exp); void sie_handle_validity(struct vm *vm); + +static inline bool sie_is_pv(struct vm *vm) +{ + return vm->sblk->sdf == 2; +} + void sie_guest_sca_create(struct vm *vm); void sie_guest_create(struct vm *vm, uint64_t guest_mem, uint64_t guest_mem_len); void sie_guest_destroy(struct vm *vm); diff --git a/lib/s390x/sie.c b/lib/s390x/sie.c index 40936bd2..0fa915cf 100644 --- a/lib/s390x/sie.c +++ b/lib/s390x/sie.c @@ -59,7 +59,7 @@ void sie(struct vm *vm) /* When a pgm int code is set, we'll never enter SIE below. */ assert(!read_pgm_int_code()); - if (vm->sblk->sdf == 2) + if (sie_is_pv(vm)) memcpy(vm->sblk->pv_grregs, vm->save_area.guest.grs, sizeof(vm->save_area.guest.grs)); @@ -98,7 +98,7 @@ void sie(struct vm *vm) /* restore the old CR 13 */ lctlg(13, old_cr13); - if (vm->sblk->sdf == 2) + if (sie_is_pv(vm)) memcpy(vm->save_area.guest.grs, vm->sblk->pv_grregs, sizeof(vm->save_area.guest.grs)); } From patchwork Thu Jun 20 14:16:57 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nina Schoetterl-Glausch X-Patchwork-Id: 13705608 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8D84917554A; Thu, 20 Jun 2024 14:17:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718893036; cv=none; b=aTzLzwdeTIZmawNYnCIC0KwlFkIJk5XgU6k6sm5kFU8hJUcnqxlJL5lb8OQXhoKuAL71Zp92ybYhAllm6yr/tjPZsj55p54BgraiuKXbO/IlyuM1NONEQAdc6V0jLp1emorF5rAvIYMl48vsgQqdmXsv24LgzyhgBhPxYHrjApA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718893036; c=relaxed/simple; bh=5m+tafdMaBvin1wJINeCnSEppqOYjt5wBv2oOLycUak=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=iHPWEty/9q/eDBS2agouanjaWdCCFd990OuLGlt2cfBj4LHQ6u3a0hmmdUh7K58XvJbtd1gl7Mh7ZbjPz3TjR7wWofvTTAFfxH7HpWuqLYF5LX1s7dSWRHM5YJr+y1rTg/ebjQHw/8ZpXEzae2pCrdRinTXOI0trSEiJ3lXfxOE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=G3SykGCn; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="G3SykGCn" Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 45KDufso008232; Thu, 20 Jun 2024 14:17:11 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from :to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=pp1; bh=sKVi360H4+JzR HGS53qsuhs4zv2uF27pujXLHQKxS9Y=; b=G3SykGCnSGN4AM1XwXqLlR1MK9qJy ixfdYoygTnn64xg+XkwUqKPhvI15s0wA916USN1NDtqEoOJU0IQCAQ7ealY/5nUH 4vyD82ynkhXWerKCf0cnn6YOQncJex/P1vd3DtFire1aWzoHmBid7YjR5d33Haet RwLEvfJQYSogRp6OPjDuL1fDKVHmavv/17zl8HsG1gHb3mDWoQFHliSh+KMF50mO YkXSmTWtrf+jUzCQk6YlfsI8+oqNTrnCa/9DDdOGxEz9FUxoiAHEm5GEUWGuA+2Z xaJh5EVF0MHMipF1TtubEi28hVOOMl4VmmgiLmnGnYG1ErEKoWOndk3hQ== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3yvndu83nq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:11 +0000 (GMT) Received: from m0353725.ppops.net (m0353725.ppops.net [127.0.0.1]) by pps.reinject (8.18.0.8/8.18.0.8) with ESMTP id 45KEHAwl013494; Thu, 20 Jun 2024 14:17:10 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3yvndu83nk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:10 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 45KE38dw023897; Thu, 20 Jun 2024 14:17:09 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 3ysp9qpv2r-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:09 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 45KEH36J26149378 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 20 Jun 2024 14:17:05 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9824820040; Thu, 20 Jun 2024 14:17:03 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5B8DC2004F; Thu, 20 Jun 2024 14:17:03 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.152.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 20 Jun 2024 14:17:03 +0000 (GMT) From: Nina Schoetterl-Glausch To: Claudio Imbrenda , =?utf-8?q?Nico_B=C3=B6hr?= , Janosch Frank Cc: Nina Schoetterl-Glausch , Nicholas Piggin , Thomas Huth , Andrew Jones , David Hildenbrand , kvm@vger.kernel.org, linux-s390@vger.kernel.org Subject: [kvm-unit-tests PATCH v3 4/7] s390x: Add function for checking diagnose intercepts Date: Thu, 20 Jun 2024 16:16:57 +0200 Message-Id: <20240620141700.4124157-5-nsg@linux.ibm.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240620141700.4124157-1-nsg@linux.ibm.com> References: <20240620141700.4124157-1-nsg@linux.ibm.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: _VfbhLlqZ5DvPkWe89Pax-t64bEiZXew X-Proofpoint-ORIG-GUID: e5RNXUZrsgLXju1pWb16Y-ne1RPYAoAc X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.28.16 definitions=2024-06-20_07,2024-06-20_04,2024-05-17_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 malwarescore=0 mlxscore=0 lowpriorityscore=0 mlxlogscore=999 clxscore=1015 bulkscore=0 impostorscore=0 priorityscore=1501 adultscore=0 phishscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2405170001 definitions=main-2406200099 sie_is_diag_icpt() checks if the intercept is due to an expected diagnose call and is valid. It subsumes pv_icptdata_check_diag. Signed-off-by: Nina Schoetterl-Glausch Reviewed-by: Nicholas Piggin --- lib/s390x/pv_icptdata.h | 42 -------------------------------- lib/s390x/sie.h | 12 ++++++++++ lib/s390x/sie.c | 53 +++++++++++++++++++++++++++++++++++++++++ s390x/pv-diags.c | 8 +++---- s390x/pv-icptcode.c | 11 ++++----- s390x/pv-ipl.c | 7 +++--- 6 files changed, 76 insertions(+), 57 deletions(-) delete mode 100644 lib/s390x/pv_icptdata.h diff --git a/lib/s390x/pv_icptdata.h b/lib/s390x/pv_icptdata.h deleted file mode 100644 index 4746117e..00000000 --- a/lib/s390x/pv_icptdata.h +++ /dev/null @@ -1,42 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-only */ -/* - * Commonly used checks for PV SIE intercept data - * - * Copyright IBM Corp. 2023 - * Author: Janosch Frank - */ - -#ifndef _S390X_PV_ICPTDATA_H_ -#define _S390X_PV_ICPTDATA_H_ - -#include - -/* - * Checks the diagnose instruction intercept data for consistency with - * the constants defined by the PV SIE architecture - * - * Supports: 0x44, 0x9c, 0x288, 0x308, 0x500 - */ -static bool pv_icptdata_check_diag(struct vm *vm, int diag) -{ - int icptcode; - - switch (diag) { - case 0x44: - case 0x9c: - case 0x288: - case 0x308: - icptcode = ICPT_PV_NOTIFY; - break; - case 0x500: - icptcode = ICPT_PV_INSTR; - break; - default: - /* If a new diag is introduced add it to the cases above! */ - assert(0); - } - - return vm->sblk->icptcode == icptcode && vm->sblk->ipa == 0x8302 && - vm->sblk->ipb == 0x50000000 && vm->save_area.guest.grs[5] == diag; -} -#endif diff --git a/lib/s390x/sie.h b/lib/s390x/sie.h index 53cd767f..6d1a0d6e 100644 --- a/lib/s390x/sie.h +++ b/lib/s390x/sie.h @@ -287,6 +287,18 @@ static inline bool sie_is_pv(struct vm *vm) return vm->sblk->sdf == 2; } +/** + * sie_is_diag_icpt() - Check if intercept is due to diagnose instruction + * @vm: the guest + * @diag: the expected diagnose code + * + * Check that the intercept is due to diagnose @diag and valid. + * For protected virtualisation, check that the intercept data meets additional + * constraints. + * + * Returns: true if intercept is due to a valid and has matching diagnose code + */ +bool sie_is_diag_icpt(struct vm *vm, unsigned int diag); void sie_guest_sca_create(struct vm *vm); void sie_guest_create(struct vm *vm, uint64_t guest_mem, uint64_t guest_mem_len); void sie_guest_destroy(struct vm *vm); diff --git a/lib/s390x/sie.c b/lib/s390x/sie.c index 0fa915cf..d4ba2a40 100644 --- a/lib/s390x/sie.c +++ b/lib/s390x/sie.c @@ -42,6 +42,59 @@ void sie_check_validity(struct vm *vm, uint16_t vir_exp) report(vir_exp == vir, "VALIDITY: %x", vir); } +bool sie_is_diag_icpt(struct vm *vm, unsigned int diag) +{ + union { + struct { + uint64_t : 16; + uint64_t ipa : 16; + uint64_t ipb : 32; + }; + struct { + uint64_t : 16; + uint64_t opcode : 8; + uint64_t r_1 : 4; + uint64_t r_2 : 4; + uint64_t r_base : 4; + uint64_t displace : 12; + uint64_t zero : 16; + }; + } instr = { .ipa = vm->sblk->ipa, .ipb = vm->sblk->ipb }; + uint8_t icptcode; + uint64_t code; + + switch (diag) { + case 0x44: + case 0x9c: + case 0x288: + case 0x308: + icptcode = ICPT_PV_NOTIFY; + break; + case 0x500: + icptcode = ICPT_PV_INSTR; + break; + default: + /* If a new diag is introduced add it to the cases above! */ + assert_msg(false, "unknown diag"); + } + + if (sie_is_pv(vm)) { + if (instr.r_1 != 0 || instr.r_2 != 2 || instr.r_base != 5) + return false; + if (instr.displace) + return false; + } else { + icptcode = ICPT_INST; + } + if (vm->sblk->icptcode != icptcode) + return false; + if (instr.opcode != 0x83 || instr.zero) + return false; + code = instr.r_base ? vm->save_area.guest.grs[instr.r_base] : 0; + code = (code + instr.displace) & 0xffff; + return code == diag; +} + void sie_handle_validity(struct vm *vm) { if (vm->sblk->icptcode != ICPT_VALIDITY) diff --git a/s390x/pv-diags.c b/s390x/pv-diags.c index 3193ad99..6ebe469a 100644 --- a/s390x/pv-diags.c +++ b/s390x/pv-diags.c @@ -9,7 +9,6 @@ */ #include #include -#include #include #include #include @@ -32,8 +31,7 @@ static void test_diag_500(void) size_gbin, size_hdr, SNIPPET_UNPACK_OFF); sie(&vm); - report(pv_icptdata_check_diag(&vm, 0x500), - "intercept values"); + report(sie_is_diag_icpt(&vm, 0x500), "intercept values"); report(vm.save_area.guest.grs[1] == 1 && vm.save_area.guest.grs[2] == 2 && vm.save_area.guest.grs[3] == 3 && @@ -45,7 +43,7 @@ static void test_diag_500(void) */ vm.sblk->iictl = IICTL_CODE_OPERAND; sie(&vm); - report(pv_icptdata_check_diag(&vm, 0x9c) && + report(sie_is_diag_icpt(&vm, 0x9c) && vm.save_area.guest.grs[0] == PGM_INT_CODE_OPERAND, "operand exception"); @@ -57,7 +55,7 @@ static void test_diag_500(void) vm.sblk->iictl = IICTL_CODE_SPECIFICATION; /* Inject PGM, next exit should be 9c */ sie(&vm); - report(pv_icptdata_check_diag(&vm, 0x9c) && + report(sie_is_diag_icpt(&vm, 0x9c) && vm.save_area.guest.grs[0] == PGM_INT_CODE_SPECIFICATION, "specification exception"); diff --git a/s390x/pv-icptcode.c b/s390x/pv-icptcode.c index d7c47d6f..bc90df1e 100644 --- a/s390x/pv-icptcode.c +++ b/s390x/pv-icptcode.c @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -47,7 +46,7 @@ static void test_validity_timing(void) size_gbin, size_hdr, SNIPPET_UNPACK_OFF); sie(&vm); - report(pv_icptdata_check_diag(&vm, 0x44), "spt done"); + report(sie_is_diag_icpt(&vm, 0x44), "spt done"); stck(&time_exit); tmp = vm.sblk->cputm; mb(); @@ -258,7 +257,7 @@ static void test_validity_asce(void) /* Try if we can still do an entry with the correct asce */ sie(&vm); - report(pv_icptdata_check_diag(&vm, 0x44), "re-entry with valid CR1"); + report(sie_is_diag_icpt(&vm, 0x44), "re-entry with valid CR1"); uv_destroy_guest(&vm); free_pages(pgd_new); report_prefix_pop(); @@ -294,7 +293,7 @@ static void run_icpt_122_tests_prefix(unsigned long prefix) sie(&vm); /* Guest indicates that it has been setup via the diag 0x44 */ - assert(pv_icptdata_check_diag(&vm, 0x44)); + assert(sie_is_diag_icpt(&vm, 0x44)); /* If the pages have not been shared these writes will cause exceptions */ ptr = (uint32_t *)prefix; WRITE_ONCE(ptr, 0); @@ -328,7 +327,7 @@ static void test_icpt_112(void) /* Setup of the guest's state for 0x0 prefix */ sie(&vm); - assert(pv_icptdata_check_diag(&vm, 0x44)); + assert(sie_is_diag_icpt(&vm, 0x44)); /* Test on standard 0x0 prefix */ run_icpt_122_tests_prefix(0); @@ -348,7 +347,7 @@ static void test_icpt_112(void) /* Try a re-entry after everything has been imported again */ sie(&vm); - report(pv_icptdata_check_diag(&vm, 0x9c) && + report(sie_is_diag_icpt(&vm, 0x9c) && vm.save_area.guest.grs[0] == 42, "re-entry successful"); report_prefix_pop(); diff --git a/s390x/pv-ipl.c b/s390x/pv-ipl.c index cc46e7f7..cd49bd95 100644 --- a/s390x/pv-ipl.c +++ b/s390x/pv-ipl.c @@ -11,7 +11,6 @@ #include #include #include -#include #include #include @@ -35,7 +34,7 @@ static void test_diag_308(int subcode) /* First exit is a diag 0x500 */ sie(&vm); - assert(pv_icptdata_check_diag(&vm, 0x500)); + assert(sie_is_diag_icpt(&vm, 0x500)); /* * The snippet asked us for the subcode and we answer by @@ -46,7 +45,7 @@ static void test_diag_308(int subcode) /* Continue after diag 0x500, next icpt should be the 0x308 */ sie(&vm); - assert(pv_icptdata_check_diag(&vm, 0x308)); + assert(sie_is_diag_icpt(&vm, 0x308)); assert(vm.save_area.guest.grs[2] == subcode); /* @@ -118,7 +117,7 @@ static void test_diag_308(int subcode) * see a diagnose 0x9c PV instruction notification. */ sie(&vm); - report(pv_icptdata_check_diag(&vm, 0x9c) && + report(sie_is_diag_icpt(&vm, 0x9c) && vm.save_area.guest.grs[0] == 42, "continue after load"); From patchwork Thu Jun 20 14:16:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nina Schoetterl-Glausch X-Patchwork-Id: 13705607 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EAD7F1ACE6D; Thu, 20 Jun 2024 14:17:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718893036; cv=none; b=TkovNOQDUo41PNkLmvSI6eV7m9HKnPhndWUunkxDl6Tc/KcojHX7F76m13EmS6GvKJoFaiD1p/QAflObGy4kgx/Zs/aDmufJt+sJuIWxT7SdmlX3wcMYv9gdPqaF0jhh5dHDRVAG3fC8iF4erCqjye5/Lf0Kl7tB99JdFgpSezY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718893036; c=relaxed/simple; bh=tSuUhkcHUBVbRGL87e/lPChC0DGLQIcQj3pvWlKjLdE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=IHESOLVYsATUE8x4QgGmoVjML3JWdA4Gf6rFP08ymy3Ld7kYk0c+S42rslSi/Euv9mBk0HQBhltg2Gf0tL0BVMD5+Pb2e7t//b/AYHgWbaXippGqVKDPJQ21i1+Vpj86XzM0PH9jpQqnBvBzp2psrhb5XnokaE0KHdkIopLMNhA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=H5VJW8C2; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="H5VJW8C2" Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 45KDSp0A032754; Thu, 20 Jun 2024 14:17:11 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from :to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=pp1; bh=dFg3nn9gW2ttJ UmKtKI+Tz+VuErne/BlGOk8p/+6ahs=; b=H5VJW8C2YpeHlOgCGtY0zD8KtIkyq F5wBJAdhYC3x6jkgrRu7UQCkbclDbegNmLE0twVDeelheqU4s4YdgjN3h1Umz/t4 TSoDEcHBBADwcZl8EqLGCfbHWPN1AmO9AQECXgJUqyhbj101JEV/7KHSQWoZAUPz C7DtvaUOo2A1J1mAvGxevhN4NPVdfn0vHSIuux/xQ9ah4CcRJXcbpgJmegPg68hB wfIkQC9FYC+oRKow/LHYCxbQsmULww73zAdFdifj7Ijojt3XQjZlN70nY6+iqjdo huaCLBq+8mBWXMJqr1rBazxPAKaHmoPMMzeXBwO8TNwdDr4eU7Ahd0QEw== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3yvnbf04xd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:10 +0000 (GMT) Received: from m0356517.ppops.net (m0356517.ppops.net [127.0.0.1]) by pps.reinject (8.18.0.8/8.18.0.8) with ESMTP id 45KEHAxo020771; Thu, 20 Jun 2024 14:17:10 GMT Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3yvnbf04xa-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:10 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 45KD5TDh013389; Thu, 20 Jun 2024 14:17:09 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 3ysr046fnb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:09 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay07.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 45KEH4A748103786 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 20 Jun 2024 14:17:06 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id EBD4B2004F; Thu, 20 Jun 2024 14:17:03 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AC37420063; Thu, 20 Jun 2024 14:17:03 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.152.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 20 Jun 2024 14:17:03 +0000 (GMT) From: Nina Schoetterl-Glausch To: Thomas Huth , Nina Schoetterl-Glausch , Claudio Imbrenda , =?utf-8?q?Nico_B=C3=B6hr?= , Janosch Frank Cc: linux-s390@vger.kernel.org, Nicholas Piggin , David Hildenbrand , Andrew Jones , kvm@vger.kernel.org Subject: [kvm-unit-tests PATCH v3 5/7] s390x: Add library functions for exiting from snippet Date: Thu, 20 Jun 2024 16:16:58 +0200 Message-Id: <20240620141700.4124157-6-nsg@linux.ibm.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240620141700.4124157-1-nsg@linux.ibm.com> References: <20240620141700.4124157-1-nsg@linux.ibm.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: pZJPbJuVPniqsyRs-KGi51tLsLS214HN X-Proofpoint-ORIG-GUID: K-NnlvfFzGSsJICbGJzqO7nMgtLpFCej X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.28.16 definitions=2024-06-20_07,2024-06-20_04,2024-05-17_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 suspectscore=0 mlxscore=0 spamscore=0 malwarescore=0 mlxlogscore=905 phishscore=0 impostorscore=0 priorityscore=1501 lowpriorityscore=0 adultscore=0 clxscore=1015 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2405170001 definitions=main-2406200096 It is useful to be able to force an exit to the host from the snippet, as well as do so while returning a value. Add this functionality, also add helper functions for the host to check for an exit and get or check the value. Use diag 0x44 and 0x9c for this. Add a guest specific snippet header file and rename snippet.h to reflect that it is host specific. Signed-off-by: Nina Schoetterl-Glausch Reviewed-by: Claudio Imbrenda --- s390x/Makefile | 1 + lib/s390x/asm/arch_def.h | 13 ++++++++ lib/s390x/snippet-guest.h | 26 +++++++++++++++ lib/s390x/{snippet.h => snippet-host.h} | 10 ++++-- lib/s390x/snippet-host.c | 42 +++++++++++++++++++++++++ lib/s390x/uv.c | 2 +- s390x/mvpg-sie.c | 2 +- s390x/pv-diags.c | 2 +- s390x/pv-icptcode.c | 2 +- s390x/pv-ipl.c | 2 +- s390x/sie-dat.c | 2 +- s390x/spec_ex-sie.c | 2 +- s390x/uv-host.c | 2 +- 13 files changed, 97 insertions(+), 11 deletions(-) create mode 100644 lib/s390x/snippet-guest.h rename lib/s390x/{snippet.h => snippet-host.h} (92%) create mode 100644 lib/s390x/snippet-host.c diff --git a/s390x/Makefile b/s390x/Makefile index 23342bd6..12445fb5 100644 --- a/s390x/Makefile +++ b/s390x/Makefile @@ -111,6 +111,7 @@ cflatobjs += lib/s390x/css_lib.o cflatobjs += lib/s390x/malloc_io.o cflatobjs += lib/s390x/uv.o cflatobjs += lib/s390x/sie.o +cflatobjs += lib/s390x/snippet-host.o cflatobjs += lib/s390x/fault.o OBJDIRS += lib/s390x diff --git a/lib/s390x/asm/arch_def.h b/lib/s390x/asm/arch_def.h index 745a3387..db04deca 100644 --- a/lib/s390x/asm/arch_def.h +++ b/lib/s390x/asm/arch_def.h @@ -504,4 +504,17 @@ static inline uint32_t get_prefix(void) return current_prefix; } +static inline void diag44(void) +{ + asm volatile("diag 0,0,0x44\n"); +} + +static inline void diag9c(uint64_t val) +{ + asm volatile("diag %[val],0,0x9c\n" + : + : [val] "d"(val) + ); +} + #endif diff --git a/lib/s390x/snippet-guest.h b/lib/s390x/snippet-guest.h new file mode 100644 index 00000000..3cc098e1 --- /dev/null +++ b/lib/s390x/snippet-guest.h @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Snippet functionality for the guest. + * + * Copyright IBM Corp. 2023 + */ + +#ifndef _S390X_SNIPPET_GUEST_H_ +#define _S390X_SNIPPET_GUEST_H_ + +#include +#include + +static inline void force_exit(void) +{ + diag44(); + mb(); /* allow host to modify guest memory */ +} + +static inline void force_exit_value(uint64_t val) +{ + diag9c(val); + mb(); /* allow host to modify guest memory */ +} + +#endif /* _S390X_SNIPPET_GUEST_H_ */ diff --git a/lib/s390x/snippet.h b/lib/s390x/snippet-host.h similarity index 92% rename from lib/s390x/snippet.h rename to lib/s390x/snippet-host.h index 910849aa..230b25b0 100644 --- a/lib/s390x/snippet.h +++ b/lib/s390x/snippet-host.h @@ -1,13 +1,13 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Snippet definitions + * Snippet functionality for the host. * * Copyright IBM Corp. 2021 * Author: Janosch Frank */ -#ifndef _S390X_SNIPPET_H_ -#define _S390X_SNIPPET_H_ +#ifndef _S390X_SNIPPET_HOST_H_ +#define _S390X_SNIPPET_HOST_H_ #include #include @@ -144,4 +144,8 @@ static inline void snippet_setup_guest(struct vm *vm, bool is_pv) } } +bool snippet_is_force_exit(struct vm *vm); +bool snippet_is_force_exit_value(struct vm *vm); +uint64_t snippet_get_force_exit_value(struct vm *vm); +void snippet_check_force_exit_value(struct vm *vm, uint64_t exit_exp); #endif diff --git a/lib/s390x/snippet-host.c b/lib/s390x/snippet-host.c new file mode 100644 index 00000000..44a60bb9 --- /dev/null +++ b/lib/s390x/snippet-host.c @@ -0,0 +1,42 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Snippet functionality for the host. + * + * Copyright IBM Corp. 2023 + */ + +#include +#include +#include + +bool snippet_is_force_exit(struct vm *vm) +{ + return sie_is_diag_icpt(vm, 0x44); +} + +bool snippet_is_force_exit_value(struct vm *vm) +{ + return sie_is_diag_icpt(vm, 0x9c); +} + +uint64_t snippet_get_force_exit_value(struct vm *vm) +{ + struct kvm_s390_sie_block *sblk = vm->sblk; + + assert(snippet_is_force_exit_value(vm)); + + return vm->save_area.guest.grs[(sblk->ipa & 0xf0) >> 4]; +} + +void snippet_check_force_exit_value(struct vm *vm, uint64_t value_exp) +{ + uint64_t value; + + if (snippet_is_force_exit_value(vm)) { + value = snippet_get_force_exit_value(vm); + report(value == value_exp, "guest forced exit with value (0x%lx == 0x%lx)", + value, value_exp); + } else { + report_fail("guest forced exit with value"); + } +} diff --git a/lib/s390x/uv.c b/lib/s390x/uv.c index 723bb4f2..c9fffbfc 100644 --- a/lib/s390x/uv.c +++ b/lib/s390x/uv.c @@ -18,7 +18,7 @@ #include #include #include -#include +#include static struct uv_cb_qui uvcb_qui = { .header.cmd = UVC_CMD_QUI, diff --git a/s390x/mvpg-sie.c b/s390x/mvpg-sie.c index d182b49a..3aec9d71 100644 --- a/s390x/mvpg-sie.c +++ b/s390x/mvpg-sie.c @@ -19,7 +19,7 @@ #include #include #include -#include +#include static struct vm vm; diff --git a/s390x/pv-diags.c b/s390x/pv-diags.c index 6ebe469a..a686c688 100644 --- a/s390x/pv-diags.c +++ b/s390x/pv-diags.c @@ -8,7 +8,7 @@ * Janosch Frank */ #include -#include +#include #include #include #include diff --git a/s390x/pv-icptcode.c b/s390x/pv-icptcode.c index bc90df1e..82fd4246 100644 --- a/s390x/pv-icptcode.c +++ b/s390x/pv-icptcode.c @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/s390x/pv-ipl.c b/s390x/pv-ipl.c index cd49bd95..2acf7d0a 100644 --- a/s390x/pv-ipl.c +++ b/s390x/pv-ipl.c @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include diff --git a/s390x/sie-dat.c b/s390x/sie-dat.c index f0257770..9e60f26e 100644 --- a/s390x/sie-dat.c +++ b/s390x/sie-dat.c @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include "snippets/c/sie-dat.h" static struct vm vm; diff --git a/s390x/spec_ex-sie.c b/s390x/spec_ex-sie.c index fe2f23ee..0ad7ec08 100644 --- a/s390x/spec_ex-sie.c +++ b/s390x/spec_ex-sie.c @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include static struct vm vm; diff --git a/s390x/uv-host.c b/s390x/uv-host.c index 55b46446..87d108b6 100644 --- a/s390x/uv-host.c +++ b/s390x/uv-host.c @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include #include #include From patchwork Thu Jun 20 14:16:59 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nina Schoetterl-Glausch X-Patchwork-Id: 13705613 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 82E8C1AE0BA; Thu, 20 Jun 2024 14:17:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718893039; cv=none; b=nGMe8K9dWdYsAkEqmDMoOZHRCJINOLoMuBZcNy+vYFsZdtNKzXVr+XJ3K2dQFXuqSiE4jPg1RPwyoJKv3gfTzFxIP8zIUbTwOnU/g9NK9kGCToc7jhQDusNlghVJtX3EOoCrn6VokbtYWZfgMMPINCvFmqHGTfE0enuJgq13cbM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718893039; c=relaxed/simple; bh=Km/sCIal4KA+/3RwOV6NWtBT+wUhcfEHKXkvLUrmdPw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=tPHWw/zTl8M1U8seA5eOm7Z8mD+8bQKRivIM3fULI3mRdLlcovwROXH+vVcXbNdDwrEIpmzLtLLg6dEjSNTc0hIiEdR5uMukxYHZxywgE5gHmYD1NCfDC6YVnS89mEmFfq7C1QWfynTYR8cGTRdIvlHGNOLaQHm8rJt5CNj1+fA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=X3HkMIt+; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="X3HkMIt+" Received: from pps.filterd (m0353727.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 45KEEQfv022258; Thu, 20 Jun 2024 14:17:15 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from :to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=pp1; bh=fey+DeOa62WmH 7MehgUb+g88MYUXM4kvv+BBrjsafb4=; b=X3HkMIt+8c+Mb6nIZnLUDFGbbkTpk wuu4vtb+o+DsXie9xTdbT6KcXpQ4wUNjpMF0dHrZ4GurOrrxePFxcsReVknOLD9D ULkmmgPBWfKEX1inMNb2rD7OOcnDGBNfrJhDDtykrPcnZJdVok49SUj9tKAHXrW2 J+ShOiAvgeBmqhbuqfOH2fuo7Ki9K2HWCCJOceLkfBpvYFgmf+T4iNxoYFl/4Bsk aK9Tm8z87aLLbnNiphtyMOrZBS4lgRGuW/rZuQ3KUeqfuWtW8WMzamNcTVNTRqUW XJnG7EybxMxkC9sldpBCaXNCMTIdx2p0lFpJS6sozYcIOAtWjJW/fBWSg== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3yvnbhg503-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:14 +0000 (GMT) Received: from m0353727.ppops.net (m0353727.ppops.net [127.0.0.1]) by pps.reinject (8.18.0.8/8.18.0.8) with ESMTP id 45KEHElV028082; Thu, 20 Jun 2024 14:17:14 GMT Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3yvnbhg501-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:14 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 45KE1XUn019495; Thu, 20 Jun 2024 14:17:13 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 3ysnp1q00g-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:12 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay07.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 45KEH4Dp38273320 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 20 Jun 2024 14:17:06 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 417F920063; Thu, 20 Jun 2024 14:17:04 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0B58D20065; Thu, 20 Jun 2024 14:17:04 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.152.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 20 Jun 2024 14:17:03 +0000 (GMT) From: Nina Schoetterl-Glausch To: Claudio Imbrenda , Nina Schoetterl-Glausch , Janosch Frank , =?utf-8?q?Nico_B=C3=B6hr?= , Thomas Huth Cc: Andrew Jones , kvm@vger.kernel.org, Nicholas Piggin , linux-s390@vger.kernel.org, David Hildenbrand Subject: [kvm-unit-tests PATCH v3 6/7] s390x: Use library functions for snippet exit Date: Thu, 20 Jun 2024 16:16:59 +0200 Message-Id: <20240620141700.4124157-7-nsg@linux.ibm.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240620141700.4124157-1-nsg@linux.ibm.com> References: <20240620141700.4124157-1-nsg@linux.ibm.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: 0h6RvCqA1W4GDTukv-dr2qcuWFX78y4v X-Proofpoint-ORIG-GUID: tLcW6hBz1W0TN-8ZXZ5aWw9U598dmX4A X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.28.16 definitions=2024-06-20_07,2024-06-20_04,2024-05-17_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 impostorscore=0 phishscore=0 spamscore=0 malwarescore=0 mlxscore=0 suspectscore=0 adultscore=0 mlxlogscore=999 bulkscore=0 priorityscore=1501 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2405170001 definitions=main-2406200099 Replace the existing code for exiting from snippets with the newly introduced library functionality. Signed-off-by: Nina Schoetterl-Glausch Reviewed-by: Claudio Imbrenda Reviewed-by: Nicholas Piggin --- s390x/sie-dat.c | 11 +++-------- s390x/snippets/c/sie-dat.c | 19 +------------------ 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/s390x/sie-dat.c b/s390x/sie-dat.c index 9e60f26e..c8f38220 100644 --- a/s390x/sie-dat.c +++ b/s390x/sie-dat.c @@ -27,23 +27,18 @@ static void test_sie_dat(void) uint64_t test_page_gpa, test_page_hpa; uint8_t *test_page_hva, expected_val; bool contents_match; - uint8_t r1; /* guest will tell us the guest physical address of the test buffer */ sie(&vm); - assert(vm.sblk->icptcode == ICPT_INST && - (vm.sblk->ipa & 0xff00) == 0x8300 && vm.sblk->ipb == 0x9c0000); - - r1 = (vm.sblk->ipa & 0xf0) >> 4; - test_page_gpa = vm.save_area.guest.grs[r1]; + assert(snippet_is_force_exit_value(&vm)); + test_page_gpa = snippet_get_force_exit_value(&vm); test_page_hpa = virt_to_pte_phys(guest_root, (void*)test_page_gpa); test_page_hva = __va(test_page_hpa); report_info("test buffer gpa=0x%lx hva=%p", test_page_gpa, test_page_hva); /* guest will now write to the test buffer and we verify the contents */ sie(&vm); - assert(vm.sblk->icptcode == ICPT_INST && - vm.sblk->ipa == 0x8300 && vm.sblk->ipb == 0x440000); + assert(snippet_is_force_exit(&vm)); contents_match = true; for (unsigned int i = 0; i < GUEST_TEST_PAGE_COUNT; i++) { diff --git a/s390x/snippets/c/sie-dat.c b/s390x/snippets/c/sie-dat.c index 9d89801d..26f045b1 100644 --- a/s390x/snippets/c/sie-dat.c +++ b/s390x/snippets/c/sie-dat.c @@ -10,28 +10,11 @@ #include #include #include +#include #include "sie-dat.h" static uint8_t test_pages[GUEST_TEST_PAGE_COUNT * PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE))); -static inline void force_exit(void) -{ - asm volatile("diag 0,0,0x44\n" - : - : - : "memory" - ); -} - -static inline void force_exit_value(uint64_t val) -{ - asm volatile("diag %[val],0,0x9c\n" - : - : [val] "d"(val) - : "memory" - ); -} - int main(void) { uint8_t *invalid_ptr; From patchwork Thu Jun 20 14:17:00 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nina Schoetterl-Glausch X-Patchwork-Id: 13705609 Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2790E1AD4B4; Thu, 20 Jun 2024 14:17:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718893037; cv=none; b=HOPs6o1MEOyowyVjFpPj97WfRQC0Nb91JRHUEMogz/JFBPGAvc6iUDCoV6PlE3rcBP/qqqWqyDmSkZ8R1d9zayfHJsH2x/IgGqK8gqixxVCKGjpgs7Zposqh9nUaeDhBpcZEG4MVIiFQDz/9sSilaY6wvlnXYkfqiwSaRhT9neQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718893037; c=relaxed/simple; bh=Rj9cIfWGWKrmXLJWf4N9A9mRVogrlVD3Iqnr1nXHryE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=TS4NXN7KSOcrzZelJrELEulM+mXpxjVGjCHoBrOtWBzEXxQbbeaH6WTUN59m8dQg3ZnhOmemiDvyHg4oHYfFlCdG6sGsiqbfj3R5SJEi2M2M5WtZkiAYlgzqP4h7VOHkgwuusL2cSy2DqqW3J/FbY/VJLZfZGKkOS7Q4XWiFG/4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=jweByJnV; arc=none smtp.client-ip=148.163.156.1 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="jweByJnV" Received: from pps.filterd (m0353728.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 45KDTRxw026002; Thu, 20 Jun 2024 14:17:12 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from :to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; s=pp1; bh=keP6ekziMI+Xf yfXggiAG65uXvo+By5A+FVoZBUlWzw=; b=jweByJnV9sRI87x55uyhneIslVvMp DQov44W3whHNTIr2IhmojEZ4IkxxVitdrVwohzrXHMmzKmw1i97B0ZAsi6sseFWe zk5lHDK9XCJPcTaevQodYmeeLWAHJVupcnd5WLnyMxoq5fzWxfNKHOwsCZcilqmH ONUL78bUJvBti6q8ulCx4sRrLUfXk0O5HkjbhYyAVgr/plAbXBl2Eld2X8CIxMrw tmm6gDbwwxs/mFetvC5qVOw/VogSKQhwyS+0OtDCXG3A5jsjIMxQYCEcoL77LPgV DlwpQh1VsZw/XdFUCnayGXkM2uYBC3VSIFPfAmTxtvK6VB7hpnttMRVBA== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3yvnbhr4ve-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:12 +0000 (GMT) Received: from m0353728.ppops.net (m0353728.ppops.net [127.0.0.1]) by pps.reinject (8.18.0.8/8.18.0.8) with ESMTP id 45KEHBbP011989; Thu, 20 Jun 2024 14:17:11 GMT Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3yvnbhr4v8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:11 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 45KCkXoA011027; Thu, 20 Jun 2024 14:17:10 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 3yspsnpnqm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Thu, 20 Jun 2024 14:17:10 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay07.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 45KEH41242598858 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 20 Jun 2024 14:17:06 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8B6E92004D; Thu, 20 Jun 2024 14:17:04 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5554A20065; Thu, 20 Jun 2024 14:17:04 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.152.85.9]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Thu, 20 Jun 2024 14:17:04 +0000 (GMT) From: Nina Schoetterl-Glausch To: Janosch Frank , Claudio Imbrenda , =?utf-8?q?Nico_B=C3=B6hr?= , Nina Schoetterl-Glausch Cc: Andrew Jones , Thomas Huth , Nicholas Piggin , David Hildenbrand , linux-s390@vger.kernel.org, kvm@vger.kernel.org Subject: [kvm-unit-tests PATCH v3 7/7] s390x: Add test for STFLE interpretive execution (format-0) Date: Thu, 20 Jun 2024 16:17:00 +0200 Message-Id: <20240620141700.4124157-8-nsg@linux.ibm.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20240620141700.4124157-1-nsg@linux.ibm.com> References: <20240620141700.4124157-1-nsg@linux.ibm.com> Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: ZHH-_SUFoWhih_gfKb6dLKNOazJwq-kp X-Proofpoint-ORIG-GUID: VSmhF2XHD3gNUclOsg48rwraRNWP7yOu X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.28.16 definitions=2024-06-20_07,2024-06-20_04,2024-05-17_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 mlxscore=0 mlxlogscore=999 priorityscore=1501 suspectscore=0 bulkscore=0 lowpriorityscore=0 malwarescore=0 spamscore=0 clxscore=1015 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2405170001 definitions=main-2406200099 The STFLE instruction indicates installed facilities. SIE can interpretively execute STFLE. Use a snippet guest executing STFLE to get the result of interpretive execution and check the result. Signed-off-by: Nina Schoetterl-Glausch --- s390x/Makefile | 2 + lib/s390x/asm/facility.h | 10 ++- s390x/snippets/c/stfle.c | 26 ++++++++ s390x/stfle-sie.c | 134 +++++++++++++++++++++++++++++++++++++++ s390x/unittests.cfg | 3 + 5 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 s390x/snippets/c/stfle.c create mode 100644 s390x/stfle-sie.c diff --git a/s390x/Makefile b/s390x/Makefile index 12445fb5..7c38d66a 100644 --- a/s390x/Makefile +++ b/s390x/Makefile @@ -44,6 +44,7 @@ tests += $(TEST_DIR)/exittime.elf tests += $(TEST_DIR)/ex.elf tests += $(TEST_DIR)/topology.elf tests += $(TEST_DIR)/sie-dat.elf +tests += $(TEST_DIR)/stfle-sie.elf pv-tests += $(TEST_DIR)/pv-diags.elf pv-tests += $(TEST_DIR)/pv-icptcode.elf @@ -129,6 +130,7 @@ snippet_lib = $(snippet_asmlib) lib/auxinfo.o $(TEST_DIR)/mvpg-sie.elf: snippets = $(SNIPPET_DIR)/c/mvpg-snippet.gbin $(TEST_DIR)/sie-dat.elf: snippets = $(SNIPPET_DIR)/c/sie-dat.gbin $(TEST_DIR)/spec_ex-sie.elf: snippets = $(SNIPPET_DIR)/c/spec_ex.gbin +$(TEST_DIR)/stfle-sie.elf: snippets = $(SNIPPET_DIR)/c/stfle.gbin $(TEST_DIR)/pv-diags.elf: pv-snippets += $(SNIPPET_DIR)/asm/pv-diag-yield.gbin $(TEST_DIR)/pv-diags.elf: pv-snippets += $(SNIPPET_DIR)/asm/pv-diag-288.gbin diff --git a/lib/s390x/asm/facility.h b/lib/s390x/asm/facility.h index a66fe56a..2bad05c5 100644 --- a/lib/s390x/asm/facility.h +++ b/lib/s390x/asm/facility.h @@ -27,12 +27,20 @@ static inline void stfl(void) asm volatile(" stfl 0(0)\n" : : : "memory"); } -static inline void stfle(uint64_t *fac, unsigned int nb_doublewords) +static inline unsigned int stfle(uint64_t *fac, unsigned int nb_doublewords) { register unsigned long r0 asm("0") = nb_doublewords - 1; asm volatile(" .insn s,0xb2b00000,0(%1)\n" : "+d" (r0) : "a" (fac) : "memory", "cc"); + return r0 + 1; +} + +static inline unsigned long stfle_size(void) +{ + uint64_t dummy; + + return stfle(&dummy, 1); } static inline void setup_facilities(void) diff --git a/s390x/snippets/c/stfle.c b/s390x/snippets/c/stfle.c new file mode 100644 index 00000000..eb024a6a --- /dev/null +++ b/s390x/snippets/c/stfle.c @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright IBM Corp. 2023 + * + * Snippet used by the STLFE interpretive execution facilities test. + */ +#include +#include + +int main(void) +{ + const unsigned int max_fac_len = 8; + uint64_t res[max_fac_len + 1]; + + res[0] = max_fac_len - 1; + asm volatile ( "lg 0,%[len]\n" + " stfle %[fac]\n" + " stg 0,%[len]\n" + : [fac] "=QS"(*(uint64_t(*)[max_fac_len])&res[1]), + [len] "+RT"(res[0]) + : + : "%r0", "cc" + ); + force_exit_value((uint64_t)&res); + return 0; +} diff --git a/s390x/stfle-sie.c b/s390x/stfle-sie.c new file mode 100644 index 00000000..a3e7f1c9 --- /dev/null +++ b/s390x/stfle-sie.c @@ -0,0 +1,134 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright IBM Corp. 2023 + * + * SIE with STLFE interpretive execution facilities test. + */ +#include +#include +#include +#include +#include +#include +#include +#include + +static struct vm vm; +static uint64_t (*fac)[PAGE_SIZE / sizeof(uint64_t)]; +static prng_state prng_s; + +static void setup_guest(void) +{ + extern const char SNIPPET_NAME_START(c, stfle)[]; + extern const char SNIPPET_NAME_END(c, stfle)[]; + + setup_vm(); + fac = alloc_pages_flags(0, AREA_DMA31); + + snippet_setup_guest(&vm, false); + snippet_init(&vm, SNIPPET_NAME_START(c, stfle), + SNIPPET_LEN(c, stfle), SNIPPET_UNPACK_OFF); +} + +struct guest_stfle_res { + uint16_t len; + uint64_t reg; + unsigned char *mem; +}; + +static struct guest_stfle_res run_guest(void) +{ + struct guest_stfle_res res; + uint64_t guest_stfle_addr; + + sie(&vm); + assert(snippet_is_force_exit_value(&vm)); + guest_stfle_addr = snippet_get_force_exit_value(&vm); + res.mem = &vm.guest_mem[guest_stfle_addr]; + memcpy(&res.reg, res.mem, sizeof(res.reg)); + res.len = (res.reg & 0xff) + 1; + res.mem += sizeof(res.reg); + return res; +} + +static void test_stfle_format_0(void) +{ + struct guest_stfle_res res; + + report_prefix_push("format-0"); + for (int j = 0; j < stfle_size(); j++) + WRITE_ONCE((*fac)[j], prng64(&prng_s)); + vm.sblk->fac = (uint32_t)(uint64_t)fac; + res = run_guest(); + report(res.len == stfle_size(), "stfle len correct"); + report(!memcmp(*fac, res.mem, res.len * sizeof(uint64_t)), + "Guest facility list as specified"); + report_prefix_pop(); +} + +struct args { + uint64_t seed; +}; + +static bool parse_uint64_t(const char *arg, uint64_t *out) +{ + char *end; + uint64_t num; + + if (arg[0] == '\0') + return false; + num = strtoul(arg, &end, 0); + if (end[0] != '\0') + return false; + *out = num; + return true; +} + +static struct args parse_args(int argc, char **argv) +{ + struct args args; + const char *flag; + unsigned int i; + uint64_t arg; + bool has_arg; + + stck(&args.seed); + + for (i = 1; i < argc; i++) { + if (i + 1 < argc) + has_arg = parse_uint64_t(argv[i + 1], &arg); + else + has_arg = false; + + flag = "--seed"; + if (!strcmp(flag, argv[i])) { + if (!has_arg) + report_abort("%s needs an uint64_t parameter", flag); + args.seed = arg; + ++i; + continue; + } + report_abort("Unsupported parameter '%s'", + argv[i]); + } + + return args; +} + +int main(int argc, char **argv) +{ + struct args args = parse_args(argc, argv); + + if (!sclp_facilities.has_sief2) { + report_skip("SIEF2 facility unavailable"); + goto out; + } + + report_info("PRNG seed: 0x%lx", args.seed); + prng_s = prng_init(args.seed); + setup_guest(); + if (test_facility(7)) + test_stfle_format_0(); +out: + return report_summary(); +} diff --git a/s390x/unittests.cfg b/s390x/unittests.cfg index 3a9decc9..f2203069 100644 --- a/s390x/unittests.cfg +++ b/s390x/unittests.cfg @@ -392,3 +392,6 @@ file = sie-dat.elf [pv-attest] file = pv-attest.elf + +[stfle-sie] +file = stfle-sie.elf