1 Commits

Author SHA256 Message Date
Dirk Müller
a4630a2beb Update to 3.25.1 (jsc#PED-13403) 2025-09-19 19:09:09 +02:00
8 changed files with 641 additions and 563 deletions

View File

@@ -0,0 +1,523 @@
From 24b634e8ce04de70d4aa6c61a12149df223f9c68 Mon Sep 17 00:00:00 2001
From: Andreas Arnez <arnez@linux.ibm.com>
Date: Wed, 25 Jun 2025 16:35:04 +0200
Subject: [PATCH] Bug 503241 - s390x: Support z17 changes to the NNPA
instruction
This adds support for the NNPA enhancements that are implemented with z17.
---
coregrind/m_extension/extension-s390x.c | 346 ++++++++++++++----------
1 file changed, 207 insertions(+), 139 deletions(-)
diff --git a/coregrind/m_extension/extension-s390x.c b/coregrind/m_extension/extension-s390x.c
index 85b99ad08..98b825d9b 100644
--- a/coregrind/m_extension/extension-s390x.c
+++ b/coregrind/m_extension/extension-s390x.c
@@ -301,11 +301,17 @@ typedef enum {
S390_NNPA_MAX = 0x15,
S390_NNPA_LOG = 0x20,
S390_NNPA_EXP = 0x21,
+ S390_NNPA_SQRT = 0x22,
+ S390_NNPA_INVSQRT = 0x23,
S390_NNPA_RELU = 0x31,
S390_NNPA_TANH = 0x32,
S390_NNPA_SIGMOID = 0x33,
S390_NNPA_SOFTMAX = 0x34,
+ S390_NNPA_GELU = 0x35,
S390_NNPA_BATCHNORM = 0x40,
+ S390_NNPA_MOMENTS = 0x41,
+ S390_NNPA_LAYERNORM = 0x42,
+ S390_NNPA_NORM = 0x43,
S390_NNPA_MAXPOOL2D = 0x50,
S390_NNPA_AVGPOOL2D = 0x51,
S390_NNPA_LSTMACT = 0x60,
@@ -313,6 +319,9 @@ typedef enum {
S390_NNPA_CONVOLUTION = 0x70,
S390_NNPA_MATMUL_OP = 0x71,
S390_NNPA_MATMUL_OP_BCAST23 = 0x72,
+ S390_NNPA_MATMUL_OP_BCAST1 = 0x73,
+ S390_NNPA_TRANSFORM = 0xf0,
+ S390_NNPA_REDUCE = 0xf1,
} s390_nnpa_function_t;
/* Suported NNPA functions */
@@ -321,30 +330,51 @@ static const ULong NNPA_functions[] = {
S390_SETBIT(S390_NNPA_SUB) | S390_SETBIT(S390_NNPA_MUL) |
S390_SETBIT(S390_NNPA_DIV) | S390_SETBIT(S390_NNPA_MIN) |
S390_SETBIT(S390_NNPA_MAX) | S390_SETBIT(S390_NNPA_LOG) |
- S390_SETBIT(S390_NNPA_EXP) | S390_SETBIT(S390_NNPA_RELU) |
+ S390_SETBIT(S390_NNPA_EXP) | S390_SETBIT(S390_NNPA_SQRT) |
+ S390_SETBIT(S390_NNPA_INVSQRT) | S390_SETBIT(S390_NNPA_RELU) |
S390_SETBIT(S390_NNPA_TANH) | S390_SETBIT(S390_NNPA_SIGMOID) |
- S390_SETBIT(S390_NNPA_SOFTMAX)),
- (S390_SETBIT(S390_NNPA_BATCHNORM) | S390_SETBIT(S390_NNPA_MAXPOOL2D) |
- S390_SETBIT(S390_NNPA_AVGPOOL2D) | S390_SETBIT(S390_NNPA_LSTMACT) |
- S390_SETBIT(S390_NNPA_GRUACT) | S390_SETBIT(S390_NNPA_CONVOLUTION) |
- S390_SETBIT(S390_NNPA_MATMUL_OP) |
- S390_SETBIT(S390_NNPA_MATMUL_OP_BCAST23)),
+ S390_SETBIT(S390_NNPA_SOFTMAX) | S390_SETBIT(S390_NNPA_GELU)),
+ (S390_SETBIT(S390_NNPA_BATCHNORM) | S390_SETBIT(S390_NNPA_MOMENTS) |
+ S390_SETBIT(S390_NNPA_LAYERNORM) | S390_SETBIT(S390_NNPA_NORM) |
+ S390_SETBIT(S390_NNPA_MAXPOOL2D) | S390_SETBIT(S390_NNPA_AVGPOOL2D) |
+ S390_SETBIT(S390_NNPA_LSTMACT) | S390_SETBIT(S390_NNPA_GRUACT) |
+ S390_SETBIT(S390_NNPA_CONVOLUTION) | S390_SETBIT(S390_NNPA_MATMUL_OP) |
+ S390_SETBIT(S390_NNPA_MATMUL_OP_BCAST23) |
+ S390_SETBIT(S390_NNPA_MATMUL_OP_BCAST1)),
+ 0,
+ (S390_SETBIT(S390_NNPA_TRANSFORM) | S390_SETBIT(S390_NNPA_REDUCE)),
};
/* Supported parameter block formats */
static const ULong NNPA_ipbf[] = {
- (S390_SETBIT(0)),
+ (S390_SETBIT(0) | S390_SETBIT(1)),
};
/* Supported data types and data layout formats */
+enum {
+ S390_NNPA_TYPE_1 = 0, // data type 1 (16 bit)
+ S390_NNPA_TYPE_BFP32 = 6,
+ S390_NNPA_TYPE_INT8 = 8,
+ S390_NNPA_TYPE_INT32 = 10,
+};
+
+enum {
+ S390_NNPA_4D_FEATURE_TENSOR = 0,
+ S390_NNPA_4D_KERNEL_TENSOR = 1,
+ S390_NNPA_4D_WEIGHTS_TENSOR = 2,
+ S390_NNPA_4D_GENERIC_TENSOR = 31,
+};
+
static const ULong NNPA_dtypes_layouts[] = {
/* Data types */
- (S390_SETBIT(0) | // data type 1 (16 bit)
+ (S390_SETBIT(S390_NNPA_TYPE_1) | S390_SETBIT(S390_NNPA_TYPE_BFP32) |
+ S390_SETBIT(S390_NNPA_TYPE_INT8) | S390_SETBIT(S390_NNPA_TYPE_INT32) |
/* Data layout formats */
- S390_SETBIT(32 + 0) | // 4D-feature tensor
- S390_SETBIT(32 + 1) // 4D-kernel tensor
- ),
+ S390_SETBIT(32 + S390_NNPA_4D_FEATURE_TENSOR) |
+ S390_SETBIT(32 + S390_NNPA_4D_KERNEL_TENSOR) |
+ S390_SETBIT(32 + S390_NNPA_4D_WEIGHTS_TENSOR) |
+ S390_SETBIT(32 + S390_NNPA_4D_GENERIC_TENSOR)),
};
static const ULong NNPA_conversions[] = {
@@ -360,10 +390,15 @@ struct s390_NNPA_parms_qaf {
UInt mdis;
ULong mts;
ULong conversions;
- ULong reserved2[22];
+ ULong reserved2;
+ UInt mdnis[4];
+ struct {
+ ULong reserved[19];
+ } reserved3;
};
-struct s390_NNPA_tensor0 {
+/* Tensor descriptor, common for all data-layout formats */
+struct s390_NNPA_tensor {
UChar layout;
UChar dtype;
UShort reserved1;
@@ -372,21 +407,21 @@ struct s390_NNPA_tensor0 {
ULong address;
};
-struct s390_NNPA_parms0 {
- ULong pbvn : 16;
- ULong mvn : 8;
- ULong ribm : 24;
- ULong reserved0 : 15;
- ULong cf : 1;
- ULong reserved1[6];
- ULong save_area_address;
- struct s390_NNPA_tensor0 out[2];
- struct s390_NNPA_tensor0 reserved2[2];
- struct s390_NNPA_tensor0 in[3];
- ULong reserved3[12];
- UInt param[5];
- UInt reserved4;
- ULong reserved5[13];
+/* Parameter block format 0 or 1 */
+struct s390_NNPA_parms {
+ ULong pbvn : 16;
+ ULong mvn : 8;
+ ULong ribm : 24;
+ ULong reserved0 : 15;
+ ULong cf : 1;
+ ULong reserved1[6];
+ ULong save_area_address;
+ struct s390_NNPA_tensor out[2];
+ struct s390_NNPA_tensor reserved2[2];
+ struct s390_NNPA_tensor in[3];
+ ULong reserved3[12];
+ UInt param[16];
+ ULong reserved4[8];
};
enum {
@@ -418,135 +453,145 @@ static const char* const s390_NNPA_errmsg_access[s390_NNPA_message_n] = {
struct s390_NNPA_mem_dimensions {
UChar layout;
- ULong dim[5]; // total dimensions
- ULong used[4]; // used dimensions, without padding
- ULong step[5];
- ULong last_dim4_size;
+ ULong dim[4];
+ ULong total_size;
+ ULong used_sticks; // occupied sticks per next-higher dimension
+ ULong stick_fill;
+ ULong last_stick_fill;
};
-/* Determine the 5 dimensions used to represent the tensor data in memory */
+/* Determine the dimensions used to represent the tensor data in memory */
static enum ExtensionError
-NNPA_tensor0_size(const struct s390_NNPA_tensor0* t,
- UInt msg_idx,
- struct s390_NNPA_mem_dimensions* out_md)
+NNPA_tensor_size(const struct s390_NNPA_tensor* t,
+ UInt msg_idx,
+ struct s390_NNPA_mem_dimensions* out_md)
{
struct s390_NNPA_mem_dimensions md;
ULong elem_size;
+ ULong eps;
- md.layout = t->layout;
- if (t->dtype == 0)
+ switch (t->dtype) {
+ case S390_NNPA_TYPE_INT8:
+ elem_size = 1;
+ break;
+ case S390_NNPA_TYPE_1:
elem_size = 2;
- else
+ break;
+ case S390_NNPA_TYPE_BFP32:
+ case S390_NNPA_TYPE_INT32:
+ elem_size = 4;
+ break;
+ default:
return INSN_ERR(s390_NNPA_errmsg_dtype[msg_idx]);
+ }
+ eps = 128 / elem_size;
+ md.layout = t->layout;
switch (t->layout) {
- case 0: // 4D-feature tensor
- md.dim[0] = md.used[0] = t->dim4;
- md.dim[1] = md.used[1] = (t->dim1 + 63) / 64;
- md.dim[2] = md.used[2] = t->dim3;
- md.dim[3] = (t->dim2 + 31) / 32 * 32;
- md.used[3] = t->dim2;
- md.dim[4] = 64;
- md.last_dim4_size = elem_size * (t->dim1 % 64);
+ case S390_NNPA_4D_FEATURE_TENSOR:
+ md.dim[0] = t->dim4;
+ md.dim[1] = (t->dim1 + eps - 1) / eps;
+ md.used_sticks = t->dim2;
+ goto common_tensor_dimensions;
+ case S390_NNPA_4D_KERNEL_TENSOR:
+ md.dim[0] = (t->dim1 + eps - 1) / eps;
+ md.dim[1] = t->dim4;
+ md.used_sticks = t->dim2;
+ goto common_tensor_dimensions;
+ case S390_NNPA_4D_WEIGHTS_TENSOR:
+ elem_size *= 2;
+ eps /= 2;
+ md.dim[0] = t->dim4;
+ md.dim[1] = (t->dim1 + eps - 1) / eps;
+ md.used_sticks = (t->dim2 + 1) / 2;
+ common_tensor_dimensions:
+ md.dim[2] = t->dim3;
+ md.dim[3] = (md.used_sticks + 31) / 32 * 32;
+ md.stick_fill = elem_size * (t->dim1 >= eps ? eps : t->dim1);
+ md.last_stick_fill = elem_size * ((t->dim1 - 1) % eps + 1);
break;
- case 1: // 4D-kernel tensor
- md.dim[0] = md.used[0] = (t->dim1 + 63) / 64;
- md.dim[1] = md.used[1] = t->dim4;
- md.dim[2] = md.used[2] = t->dim3;
- md.dim[3] = (t->dim2 + 31) / 32 * 32;
- md.used[3] = t->dim2;
- md.dim[4] = 64;
- md.last_dim4_size = elem_size * (t->dim1 % 64);
+ case S390_NNPA_4D_GENERIC_TENSOR:
+ md.dim[0] = t->dim4;
+ md.dim[1] = t->dim3;
+ md.dim[2] = t->dim2;
+ md.dim[3] = t->dim1;
+ eps = 1;
break;
default:
return INSN_ERR(s390_NNPA_errmsg_layout[msg_idx]);
}
- md.step[4] = elem_size * md.dim[4];
- md.step[3] = md.step[4] * md.dim[3];
- md.step[2] = md.step[3] * md.dim[2];
- md.step[1] = md.step[2] * md.dim[1];
- md.step[0] = md.step[1] * md.dim[0]; // total size
- *out_md = md;
+ md.total_size =
+ elem_size * eps * md.dim[3] * md.dim[2] * md.dim[1] * md.dim[0];
+ *out_md = md;
return ExtErr_OK;
}
-/* Determine the size of the non-pad elements in the last dimension */
-static ULong NNPA_mem_dim4_size(const struct s390_NNPA_mem_dimensions* md,
- ULong d0,
- ULong d1)
-{
- switch (md->layout) {
- case 0: // 4D-feature tensor
- return d1 + 1 == md->dim[1] ? md->last_dim4_size : md->step[4];
- case 1: // 4D-kernel tensor
- return d0 + 1 == md->dim[0] ? md->last_dim4_size : md->step[4];
- }
- return 0;
-}
-
-static enum ExtensionError NNPA_pre_read_tensor0(
- ThreadState* tst, UInt msg_idx, const struct s390_NNPA_tensor0* t)
+/* Track a tensor's memory regions with PRE_MEM_READ or POST_MEM_WRITE */
+static enum ExtensionError NNPA_track_tensor(ThreadState* tst,
+ UInt msg_idx,
+ const struct s390_NNPA_tensor* t,
+ Bool do_write)
{
struct s390_NNPA_mem_dimensions md;
enum ExtensionError ret;
+ ULong addr = t->address;
- ret = NNPA_tensor0_size(t, msg_idx, &md);
+ ret = NNPA_tensor_size(t, msg_idx, &md);
if (ret != ExtErr_OK)
return ret;
- for (ULong d0 = 0; d0 < md.used[0]; d0++) {
- for (ULong d1 = 0; d1 < md.used[1]; d1++) {
- for (ULong d2 = 0; d2 < md.used[2]; d2++) {
- for (ULong d3 = 0; d3 < md.used[3]; d3++) {
- ULong addr = t->address + d0 * md.step[1] + d1 * md.step[2] +
- d2 * md.step[3] + d3 * md.step[4];
- ULong len = NNPA_mem_dim4_size(&md, d0, d1);
- PRE_MEM_READ(tst, s390_NNPA_errmsg_access[msg_idx], addr, len);
+ switch (md.layout) {
+ case S390_NNPA_4D_FEATURE_TENSOR:
+ case S390_NNPA_4D_KERNEL_TENSOR:
+ case S390_NNPA_4D_WEIGHTS_TENSOR:
+ for (ULong d0 = 0; d0 < md.dim[0]; d0++) {
+ for (ULong d1 = 0; d1 < md.dim[1]; d1++) {
+ ULong len;
+ switch (md.layout) {
+ case S390_NNPA_4D_FEATURE_TENSOR:
+ case S390_NNPA_4D_WEIGHTS_TENSOR:
+ len = d1 + 1 == md.dim[1] ? md.last_stick_fill : md.stick_fill;
+ break;
+ case S390_NNPA_4D_KERNEL_TENSOR:
+ len = d0 + 1 == md.dim[0] ? md.last_stick_fill : md.stick_fill;
+ break;
}
- }
- }
- }
- return ExtErr_OK;
-}
-
-static UWord NNPA_pre_write_tensor0(ThreadState* tst,
- UInt msg_idx,
- const struct s390_NNPA_tensor0* t)
-{
- struct s390_NNPA_mem_dimensions md;
- enum ExtensionError ret;
-
- ret = NNPA_tensor0_size(t, msg_idx, &md);
- if (ret != ExtErr_OK)
- return ret;
-
- PRE_MEM_WRITE(tst, "NNPA(out_tensor)", t->address, md.step[0]);
- return ExtErr_OK;
-}
-
-static void NNPA_post_write_tensor0(ThreadState* tst,
- UInt msg_idx,
- const struct s390_NNPA_tensor0* t)
-{
- struct s390_NNPA_mem_dimensions md;
- enum ExtensionError ret;
-
- ret = NNPA_tensor0_size(t, msg_idx, &md);
- if (ret != ExtErr_OK)
- return;
-
- for (ULong d0 = 0; d0 < md.used[0]; d0++) {
- for (ULong d1 = 0; d1 < md.used[1]; d1++) {
- for (ULong d2 = 0; d2 < md.used[2]; d2++) {
- for (ULong d3 = 0; d3 < md.used[3]; d3++) {
- ULong addr = t->address + d0 * md.step[1] + d1 * md.step[2] +
- d2 * md.step[3] + d3 * md.step[4];
- ULong len = NNPA_mem_dim4_size(&md, d0, d1);
- POST_MEM_WRITE(tst, addr, len);
+ for (ULong d2 = 0; d2 < md.dim[2]; d2++) {
+ for (ULong d3 = 0; d3 < md.used_sticks; d3++) {
+ if (md.layout == S390_NNPA_4D_WEIGHTS_TENSOR &&
+ d3 == md.used_sticks - 1 && t->dim2 % 2 != 0) {
+ // even elements only
+ for (ULong i = 0; i < len - 1; i += 2) {
+ if (do_write) {
+ POST_MEM_WRITE(tst, addr + i, 1);
+ } else {
+ PRE_MEM_READ(tst, s390_NNPA_errmsg_access[msg_idx],
+ addr + i, 1);
+ }
+ }
+ } else if (do_write) {
+ POST_MEM_WRITE(tst, addr, len);
+ } else {
+ PRE_MEM_READ(tst, s390_NNPA_errmsg_access[msg_idx], addr,
+ len);
+ }
+ addr += 128;
+ }
+ addr += 128 * (md.dim[3] - md.used_sticks);
}
}
}
+ break;
+ case S390_NNPA_4D_GENERIC_TENSOR:
+ if (do_write) {
+ POST_MEM_WRITE(tst, t->address, md.total_size);
+ } else {
+ PRE_MEM_READ(tst, s390_NNPA_errmsg_access[msg_idx], t->address,
+ md.total_size);
+ }
+ break;
}
+ return ExtErr_OK;
}
static enum ExtensionError do_extension_NNPA(ThreadState* tst, ULong variant)
@@ -571,16 +616,21 @@ static enum ExtensionError do_extension_NNPA(ThreadState* tst, ULong variant)
NNPA_dtypes_layouts, sizeof(NNPA_dtypes_layouts));
s390_filter_functions(&parms->conversions, sizeof(ULong),
NNPA_conversions, sizeof(NNPA_conversions));
+ // Clear reserved fields
+ parms->reserved1 = 0;
+ parms->reserved2 = 0;
+ parms->reserved3 = (__typeof__(parms->reserved3)){0};
} else {
- struct s390_NNPA_parms0* parms = (void*)parms_addr;
- const struct s390_NNPA_parms0 orig_parms = *parms;
- ULong save_area_size = 0;
- UInt in_tensors;
- UInt out_tensors;
+ struct s390_NNPA_parms* parms = (void*)parms_addr;
+ const struct s390_NNPA_parms orig_parms = *parms;
+ ULong save_area_size = 0;
+ UInt in_tensors;
+ UInt out_tensors;
+ enum ExtensionError retval;
parms_len = 4096;
PRE_MEM_READ(tst, "NNPA(parms)", parms_addr,
- sizeof(struct s390_NNPA_parms0));
+ sizeof(struct s390_NNPA_parms));
if (parms->cf) {
PRE_MEM_READ(tst, "NNPA(parms.csb)", parms_addr + 512,
parms_len - 512);
@@ -594,28 +644,39 @@ static enum ExtensionError do_extension_NNPA(ThreadState* tst, ULong variant)
case S390_NNPA_DIV:
case S390_NNPA_MIN:
case S390_NNPA_MAX:
+ case S390_NNPA_NORM:
in_tensors = 2;
out_tensors = 1;
break;
case S390_NNPA_LOG:
case S390_NNPA_EXP:
+ case S390_NNPA_SQRT:
+ case S390_NNPA_INVSQRT:
case S390_NNPA_RELU:
case S390_NNPA_TANH:
case S390_NNPA_SIGMOID:
+ case S390_NNPA_GELU:
in_tensors = 1;
out_tensors = 1;
break;
case S390_NNPA_SOFTMAX:
+ case S390_NNPA_REDUCE:
in_tensors = 1;
out_tensors = 1;
save_area_size = 8192;
break;
case S390_NNPA_BATCHNORM:
+ case S390_NNPA_LAYERNORM:
in_tensors = 3;
out_tensors = 1;
break;
+ case S390_NNPA_MOMENTS:
+ in_tensors = 1;
+ out_tensors = 2;
+ break;
case S390_NNPA_MAXPOOL2D:
case S390_NNPA_AVGPOOL2D:
+ case S390_NNPA_TRANSFORM:
in_tensors = 1;
out_tensors = 1;
break;
@@ -627,6 +688,7 @@ static enum ExtensionError do_extension_NNPA(ThreadState* tst, ULong variant)
case S390_NNPA_CONVOLUTION:
case S390_NNPA_MATMUL_OP:
case S390_NNPA_MATMUL_OP_BCAST23:
+ case S390_NNPA_MATMUL_OP_BCAST1:
in_tensors = 3;
out_tensors = 1;
break;
@@ -635,16 +697,20 @@ static enum ExtensionError do_extension_NNPA(ThreadState* tst, ULong variant)
}
for (UInt i = 0; i < in_tensors; i++) {
- enum ExtensionError retval =
- NNPA_pre_read_tensor0(tst, s390_NNPA_message_in + i, &parms->in[i]);
+ retval = NNPA_track_tensor(tst, s390_NNPA_message_in + i,
+ &parms->in[i], False);
if (retval != ExtErr_OK)
return retval;
}
for (UInt i = 0; i < out_tensors; i++) {
- enum ExtensionError retval = NNPA_pre_write_tensor0(
- tst, s390_NNPA_message_out + i, &parms->out[i]);
+ UInt msg_idx = s390_NNPA_message_out + i;
+ struct s390_NNPA_mem_dimensions md;
+
+ retval = NNPA_tensor_size(&parms->out[i], msg_idx, &md);
if (retval != ExtErr_OK)
return retval;
+ PRE_MEM_WRITE(tst, s390_NNPA_errmsg_access[msg_idx],
+ parms->out[i].address, md.total_size);
}
if (save_area_size != 0) {
PRE_MEM_WRITE(tst, "NNPA(save_area)", parms->save_area_address,
@@ -653,8 +719,10 @@ static enum ExtensionError do_extension_NNPA(ThreadState* tst, ULong variant)
cc = do_NNPA_insn(&gpr0, parms_addr);
if (cc == 0) {
for (UInt i = 0; i < out_tensors; i++) {
- NNPA_post_write_tensor0(tst, s390_NNPA_message_out + i,
- &orig_parms.out[i]);
+ retval = NNPA_track_tensor(tst, s390_NNPA_message_out + i,
+ &orig_parms.out[i], True);
+ if (retval != ExtErr_OK)
+ return retval;
}
}
}
--
2.51.0

BIN
valgrind-3.25.1.tar.bz2 LFS Normal file

Binary file not shown.

View File

@@ -0,0 +1,11 @@
-----BEGIN PGP SIGNATURE-----
iQEzBAABCAAdFiEEEnaKlnlZkBB6DS/f/FfjzKzZmngFAmgsZEoACgkQ/FfjzKzZ
mnh+Pwf/UuzK/s83KgJuQFDPhc6vwQd4KYpeMWnXwzBRQgko72s9c3mmnl4UgK0t
JkdsuRqTCYpOo32G5Yr2mr7ukZFW0KSVv+jOF/D9Lg+IxZQ4Z20iQQAZNGwxUXi9
I8OA+UYr52lCl0hjOubYLTUydmWPzqzuECqru/7JZeDZxs2z1YhDUIaA/g9E73yn
mMTPJYUA0J/SsNn1Qo0YxuFZSQo4761Wjjn4CmosGf9w1oZiGMkB/dH3ANtdglhB
FXW5ndpOiytdIzxHB20Wez/qcWBX52nrjzh9UFiyAnDYFDa1usMxLd7XOaVYqusW
Ky9j2UvFQShhPiKgqlBcjiqF3hNuMg==
=7GVO
-----END PGP SIGNATURE-----

View File

@@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8d54c717029106f1644aadaf802ab9692e53d93dd015cbd19e74190eba616bd7
size 17182495

View File

@@ -1,7 +0,0 @@
-----BEGIN PGP SIGNATURE-----
iHUEABYIAB0WIQQo/0swqI1VI6fiy6IDdqFcb/wRzQUCaPvKQAAKCRADdqFcb/wR
zeW1AQCqKO/fITPNOn4KWNiw7fj/IKW6UTzxYXvWh3De+tCIlAEA67r3ehM0EbKH
W2KsI+9/FkqWdtk4aPDMyGBgtNW4VQM=
=kjIj
-----END PGP SIGNATURE-----

View File

@@ -1,44 +1,3 @@
-------------------------------------------------------------------
Mon Nov 17 17:10:26 UTC 2025 - Dirk Müller <dmueller@suse.com>
- update to 3.26.0:
* Upgrade to the GNU General Public License version 3.
* Control building documentation. When using make dist set the
Makefile BUILD_DOCS to none, all or html. none, does not build any
documentation. all, builds all documentation. html, builds HTML
docs but skips building PDFs. See also README_DEVELOPERS.
* New VEX API function LibVEX_set_VexControl
* The deprecated IROps: Iop_Clz32/64 and Iop_Ctz32/64 have been removed
* The Linux Test Project (LTP) integration has been updated to
v20250930. The test output has been made compatible with bunsen.
Various issues with the linux syscall wrappers have been fixed.
* --modify-fds=yes has been added. It acts like --modify-fds=high (the
highest available file descriptor is returned first) except when
when the lowers stdin/stdout/stderr (file descriptors 0, 1, 2) are
available. With --modify-fds=yes 0, 1 or 2 are always returned first
when still available before higher file descriptor numbers are.
* With --xml=yes log output protocol 6 is now always used (unlike
protocol 5 which was only used with--track-fds). The main difference
is that the xml output now contains error summaries. See also
xml-output-protocol6.txt.
* Add "bad" option for --track-fds. When --track-fds=bad is specified,
do not produce errors about unclosed file descriptors at program
exit. Only produce errors for bad file descriptor usage, either
double close or use of file descriptor that is (no longer) valid.
* vgdb will now handle the qExecAndArgs packet.
* DWARF inlined subroutine handling has been rewritten to work cross
compile units. This should get rid of backtraces with
"UnknownInlinedFun".
- drop 0001-Bug-503241-s390x-Support-z17-changes-to-the-NNPA-ins.patch
(upstream)
- updated keyring from https://www.klomp.org/mark/gnupg-pub.txt
-------------------------------------------------------------------
Mon Sep 22 09:01:09 UTC 2025 - Andreas Schwab <schwab@suse.de>
- Enable build on riscv64
- Fix file list
-------------------------------------------------------------------
Fri Sep 19 14:11:07 UTC 2025 - Dirk Müller <dmueller@suse.com>

View File

@@ -1,30 +1,3 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEaHQWvBYJKwYBBAHaRw8BAQdA56MyjCdsupmDDWzF+1byosQYwO7SL1xe8+az
n4Vvty+0Hk1hcmsgSi4gV2llbGFhcmQgPG1qd0BnbnUub3JnPoiTBBMWCgA7FiEE
KP9LMKiNVSOn4suiA3ahXG/8Ec0FAmh0F94CGwMFCwkIBwICIgIGFQoJCAsCBBYC
AwECHgcCF4AACgkQA3ahXG/8Ec30+QD/c6Lm9Od/FG+LpWPVLCBT4YmyktsQZ4xM
nFD+n4H33L8A/2P4xacRzmAiMzeFP+3B+YxrDRLvHnnsI6B0ckP3rxAGtCFNYXJr
IEouIFdpZWxhYXJkIDxtYXJrQGtsb21wLm9yZz6IlgQTFgoAPgIbAwULCQgHAgIi
AgYVCgkICwIEFgIDAQIeBwIXgBYhBCj/SzCojVUjp+LLogN2oVxv/BHNBQJodCQD
AhkBAAoJEAN2oVxv/BHNNIkA/2bc9sJA9kOWDtbs687j6rIbBF2hoqKvmh2B1t6p
taUbAQDhSUQJJiKHz7XwcYlUQUMPLtkm8QcDdlg5FMcGb2ZVCbQhTWFyayBKLiBX
aWVsYWFyZCA8bWp3QHJlZGhhdC5jb20+iJMEExYKADsWIQQo/0swqI1VI6fiy6ID
dqFcb/wRzQUCaHQXvQIbAwULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgAAKCRAD
dqFcb/wRzSYPAP4196kaDMdfRyTtB0oL/otYWr+NzI9Q9WV0EZeYYrhRdAEA8G40
H/V3TU2mgd914aYm4X+CYQaGD0bba3iRUK933wi4OARodBa8EgorBgEEAZdVAQUB
AQdA7FnysiTgAGXnd5bozNJ40DOV5k7OQgy8Y0YQo1tzg1cDAQgHiHgEGBYKACAW
IQQo/0swqI1VI6fiy6IDdqFcb/wRzQUCaHQWvAIbDAAKCRADdqFcb/wRzZ9IAP0X
PAaGTGemQj+B3j9dNghUk3ic2TSbnPVKpalCS0U3DwEAkqEP6jZ87xX4N9bG+wn2
bdfaAc/4AW2h9fJQCIwO6Ai4MwRodBlfFgkrBgEEAdpHDwEBB0D6Er72E6wa1+By
/I3Q5k7bVVS9k6Tw72q3gPr9bkPu7Ih4BBgWCgAgFiEEKP9LMKiNVSOn4suiA3ah
XG/8Ec0FAmh0GV8CGyAACgkQA3ahXG/8Ec30eQD/SVAUX+LMkzcrp6gKNrAEUmkx
YSU8Z8Ojfh+WG4ez0nkBAPX+WvJa9DrDaBDREaJmYlUP/mhpWd/SlnFyCEsj8RkJ
=mv0n
-----END PGP PUBLIC KEY BLOCK-----
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBFxDPtIBEAC8xePaWvq5cDMBYtrpdmR20YX5xrDXUeHgueSVE9Mw8yCan2Cq
@@ -38,483 +11,104 @@ B2VcmH4lOSH7HYNkMY8ggGk2/WG35eq8PZme8PvXUmLu+f2jzy9XFekIr+/Ks2Tc
hCTYCw6bhSLPa19HapCxvWXgNcYzZ8jULqBXsAfj4NnzBTn6u5nsJ1reA8GoO9vL
aQf3LDgr+UY/z+6N474lAVfr0eIdWzkWPvX8fcBCfiB944rPr+Q50RUfc9ngIKP4
JsflhXTn601aL4r6qkCcBVqO/eRhb4vCAUo7csemTKzI/05ooGfQtZ3O5QARAQAB
tB5NYXJrIFdpZWxhYXJkIDxtYXJrQGtsb21wLm9yZz6JAlEEEwEKADsCGwEFCwkI
BwIGFQoJCAsCBBYCAwECHgECF4AWIQTsPP6I9soHiHdPXB0apEvmSd52CgUCXE37
mQIZAQAKCRAapEvmSd52CuO9D/9Fi6LOrU+iYHjfIk+wT8jyhF1YNATnooa5W7y/
4QlXOIyKmkXM/0faH1hZNGf4qVK4dBUewuhALMEzudkXEhzudg9KpB9SaHZNR5DZ
+YHo204zJ84P+aJa7F8FOScbNAiG4pFGC7sQxvtAz0skM0yLsdhNg2tM8lM3n9e/
rO4EK7aR55ojzE9pCWhRSx/AKYT7545KzXuCRTky8fRcI8YeNNLPIseoV3QPkf7q
Ni6YXl0yUHV5gQMCWqgbfdHAljd2+N1RZvdzfEOLVPLX4/dgxb36i9OKkuCAHLoL
2UXfzcAElltHQundNi/xYzSizzEYBeIbVrbuqiJP1zmiPUKxHibkU3ThZZUbonKR
NVPQe1hO47Cxyj1RxXl6Nt9uda3W9ow6Kr96Bjs3WVBSqsuohqaAlAxC6RccslrE
w/7N7l8S423LJI6ZV+FvyJzmSAqkLNz/tuFSMj76uH4s1dLbRv8K4fcw1vZgqy/4
jIhBFycn29hMNvImKbMnLDwC7K92lBGQ6hp75/0Hf1qHOpDaiyV9Qqzr3sTOMXJi
Ym3ac5bDqJb9Mi5YPNB2OD3w3bDMGT5+eWjmw9RiYT5gNjY6nZhDiQS/PtIc6l3i
2GaBjSdurwj47TlCWALj3ZiiEKiybanK5/YXdVXGchLnoNkxeI1YcANZhX60FWEy
aHZsa4kBMwQQAQgAHRYhBEfMAzEIG4vG0P1NoINwZltXgWpqBQJcTg1zAAoJEINw
ZltXgWpqRV8IAL0mFWHk+F73NgMH7PP1WlRSKMDKZfwS9y7gqJJjLirMoorEzw9I
5wqTw+/umGBjidpC7bplLz95wjRP87Rj8XzGZzFRA5LUV2KBkU4eslM8nRjNw+5Y
AX8TBL2N849hIYuZW7BCTBpL40XK1NZ6Xz/g7ihrOa7MAPhfM/megxQFbBkR1DzN
IIrJTogo50Z2MMMcORivMKozfYvYvCdp0LZ1s79ZSTEmbyGfzT0ADOIqQ4UZM+TV
4Dq3kwcXLOjGAAiBtz6y60bvYfef/0MqctZLczeus4i9fsfbCITOIEJac0Wo2LvN
d7UAe5L+ldhfjcTLsiaZc4pCdCHzvJmYNl6JATMEEAEIAB0WIQS4Yxj5gGjfkJ4q
DNjj16DY7Kmy9QUCXFUybwAKCRDj16DY7Kmy9UZoB/4oa+VgxdSTSUrrQuzepJEe
1P5ODOJtHsBINKg3Sbd+BDIaeC/+K1LDZ6i3Y6y1U9vi9JIx724C89NK9NjuQqZg
Qjzyf9IobdR4r6pgPBAONR3UhcGtwC2mRmsYl12/07Nk4wHGezPFQhApKC8VsY9A
1y8v+2ORFOzJh1u0aQMDq+h0C2o+54cPe8rFAWCLO99/MWoW2gC1RtLj2Sdv9PZt
bTRC2DNm3WNRtrEr3eu4bXs7U0fc74NI6pSQQOwvfoVweUSbOGgQPl/LPjW1Q6Tq
aFjpNNfvgg6ZXkmge1CyIX30xyuAo0CLUdeNX/AIm+jZLuQFT1C4aZmXxX8y5aaZ
iQEcBBABCAAGBQJcZYIdAAoJEH6DYQEm3MLoSi0H/RSlkUv6nn24pPF8H6WVkqn8
3r32KJdQljGTDTQmI5Q9+EOhWGHTCukooiyQ4aYVvRlaVWNDckW4gSHkpz9+lzhM
YEMDyJO4aQGI71zpLn0QLS8VPusjbN9KheOU3dEqOrx3XrkHtZ6MCBrSgsRmqffa
MEyd9inl/OTGe2lF3LGBxSDnFLXo0VXwQcLJjjj/hPJSN51LW75jV7W9RCNf48zV
Y2MPB7DDpAuINXJHSaj+H/LawzxdLW1wIk3fkCrWW8eBymNNhdwmXz6oEgDSfTet
fhQxxQ0KYztYMD2VKLFAQR+X71O7almTLtkDZ/oyEvxt0oclIltZmTkqLCTLXCe0
Hk1hcmsgV2llbGFhcmQgPG1qd0ByZWRoYXQuY29tPokCTgQTAQoAOBYhBOw8/oj2
ygeId09cHRqkS+ZJ3nYKBQJcTfqnAhsBBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheA
AAoJEBqkS+ZJ3nYK6JIP/jGq2adAkk1IPsVx7X5argCXaI5o3aTG+N6BPMvizGY4
CyqTBmYAg3qRPWN4U+wxNFgzQ3nPfptJK6EDBAY4Lw+kKR4o8o5zPyjAjbc9/be5
bvTwMFmMbzWxGWoJ4ch9W+wD4W+W8ssnJDbVi5Btp7kKyUgg3KP7oUQpxZ9MTgmK
EmPuce9zOQ78q+LIPbkhI9zCS/1VCHkeVyn+TrnACoHx7sKgJoOwjVlcbW3S0sdC
uaGg3+VLI3v3IpQ56UXIX6RVeLX9zVDZnAq72Age4HHcxjX97j16iL5ZhZRc24J5
tpSkJgHt+RASOKHJGPIivCqKbQKhYc1G4MbFbGzclaLTXya3Q4ekFzo4ohd2ga7m
gjG0SJ+aIU5wCYxEUDsqJLm+uH/nbQzXTxIoQhH5yub4OhW88z6LpwPGhLvzS2Su
PJIXAlbGyrH70/uRZWkwKF/8mQjMCsLEYkZ9DRB815rUTc9CJkkeOlPXQUbxr2fD
Agi0j3yAUxlrC7jESO/zUJrICbxChYAx9KMWG/2PsKbrGAAMKiC7+q6mY09Q63F/
g1DEF2sb+bguMdWc7SEj64jFUf9wJ+vjU1F321Bkh/QWMABv6n+7EFkwnNkylCR5
H1boOHO03TNT0jyLbBECR7/Mtpwt46c4+n9EPCmQyvdU3MVPORvZge1hzvuvfo22
iQEzBBABCAAdFiEER8wDMQgbi8bQ/U2gg3BmW1eBamoFAlxODYEACgkQg3BmW1eB
ampC4AgAwHpIbLmQcMUi3zgCrgH6QbZoTCJC9ryaPnO3tPYkTuYz3TLFogGeSGyg
kQkGq99SSyie1R9ia9c3xELe8Zmkvtyd60GDeYRkp1TKa7DfXSRbAXqt7iYL6jTv
MVjM67OuTmVNgvosibRjcHmcdUZMBNpZiE6QER/Kljr8YVqmG1HOC5Q3eqSFpwPZ
XuRjDcw6Yz/tAUz/i5M/+W8bNZ8sUMhn3XUdA8Mt0qUC7El0TMfdN0St7eM6x7ts
e/Rw7MEiplLR8enu73awmrHtWbzzTXI2511PBp61f7ks7Pj44OV/75lDx3ljejMB
wnQuJBjFhtqmvqlTQKVjPd6JWYaG8IkBMwQQAQgAHRYhBLhjGPmAaN+QnioM2OPX
oNjsqbL1BQJcVTJ4AAoJEOPXoNjsqbL1tlUH/Rrrz8YkAt1opAUOWZ8G8Jr7Be2o
AOqtGtvjiQ1NDlPk1yLrOp0n9/UWx/OrGtE9YINNCrAoBxtCpE30QjD4QBzpGp1o
aRyyWADxnxvMq2LZgN1kyCgRipVO0/iCdX3nkTwXvbBJv3KqhYNHO95vkZhKjR/w
fxKZ6Xo0JX8ox9IV4WYNl/LaxjN+/mV9mhzCW5Usyrf66N1Xbk7+b3qk6mh2QqpU
0XqvpFtaifiLY9QuwDOgfkHIgRiz8TNUNBXOpQ65dzxmSEN2ULCbOhNqORRC9vmY
gvBxJ3YkdWBthc0cW7hWC4Fc+hh7CIz1abArT3THLNlf1kU3B/Xm9bcZUfOJARwE
EAEIAAYFAlxlgh0ACgkQfoNhASbcwuiGXAf+LU7MT3QOBWtJGjOXTUJT8CWd7OW9
vsAvRAeyEBlk92aQFwWF+WQ4PIcV0qA4/Pm3ppCWjf0XgUr8MbvFgh7Wc27iyPi1
lyBpz3pmrNQB4zYzmHPXNqbN9nxtgtmp845JCmduWk/QH3oSc/m2aQfG1mQhRsMh
NNFhfqJjE9l16B5yi05quxXFytHK0EQGxlkuFQ34lJfUepmRoce8nI/BxNaDzi+A
FmbY6mQpINGaSi3CJuIDIFzO668uU5+mqhHN+/hopzSeF507kJ/SN6S9/WC7WDvJ
Gmd6Yyw//V3gpQHw7GZm/GZjbp6CnArUuE8ZI1hk0b8rKoOQPZ2DD4iVR7QbTWFy
ayBXaWVsYWFyZCA8bWp3QGdudS5vcmc+iQJOBBMBCgA4FiEE7Dz+iPbKB4h3T1wd
GqRL5knedgoFAlxN+lMCGwEFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQGqRL
5knedgo1bhAArI7kReYq4YtaxS8Pxb5MdPxiQVtvfkbycWCZ4owzPeEIkJqcbadN
UiGSqCRR2xeT4kuzFZWILiZfBTwHwFM/bXRDK/FOn7F8aqUAV1tq2W70Z7BUpTwp
Av7Xm5YvsfbTBZmllJltEiIrKIzULCtRKKVXgtOKg0sd/W2aXwyl+OX+PVzu4mXX
NEkO10J7VpnCvjyaJNeKgeJYQLizSWdEf7i6RX31yC29+GsSqikaOHdfxJMM+bo/
x/aCuYlgDB+OQ6LZzpXZO0C8B5SMgMfZaK1rxDtUtViajSyOFJ4Ig6bcgc5qDCLn
k407oEN1yBWps867uN/Bi4Dk+xh691feGsyq95DvPis2Ut+0X0/Wi/uLg3uu/X5E
cNHynwht7KaGCLeuOZKxvzfeudNeyKFX34HtFyE/2k9LR0mFX8XnXQGBD9psOxcd
2K8Rku9BjjKDZ/vf53sMh5vxUNo+zkd+5dLZWPnLrhkfQrepDBP+Tc/6W0VSZCP5
/nKX6GjPwmELtZj4jGf33tgfNMJrmxGUjpDxtiJc7OroNC4he3F5AF4RNRa5VvHs
6ah57swVvKyJmLH5mxxKIn39PspOhzVxSbkWNPLS+km2InPum+fmYKQL6IrHcqt/
ecrR7o9GRgI0cJjLJ+wv93ti+gxsUWPbAUBaJPk24omIpQafFT/YAEWJATMEEAEI
AB0WIQRHzAMxCBuLxtD9TaCDcGZbV4FqagUCXE4NggAKCRCDcGZbV4FqauzxB/0Y
/3O0u8coseiF3kLR9I945vZWBmRBj4/fYUlDCtAbM9JQMsWGAGxRvR0/zGNRrVYy
2vhjpxdSi5TPUzNNSMotl121vEm3TFX2MLHv96VnaZywU6xpPypqrcvn+/NGE6da
AQnY3BJT7hPLfPTlMqNJAOFKu62DCdHinzNLbz7jROw3pQCO3oWd4aTlV+Jj6KQs
W0JYlX+UUbFHPS6UJ5Zx5Nnc5E0KRc2ow+rL1mOEmRuzUXSf+smASSHTxByWvmnh
b8S1P3hjp5PRlmueQ4mgjFW5nEH5d0rI8IPhBWXP/Jl8wHkeZBbN3i5l+f9vtWhZ
upn8zaKtUlXjjcmusXkDiQEzBBABCAAdFiEEuGMY+YBo35CeKgzY49eg2OypsvUF
AlxVMngACgkQ49eg2OypsvWI/QgA1mmdRIq3V1bz33fEWeoBsqOD2u7r0bHIZVKr
I8gQWeNVyYAvE1m+w8jWwWiiOetolokwHHSKKMmJCZCpMsl080Uzf/sGqzKFtLiS
xu524AoxhlEmeHs4+iZy3S1JTEgO9pJSg1DZPA24LLPAEpfexBC4Gejlg429hgkV
HZC09TNoUFhAPOLjH4EY/hr0IAGHvPx8PzvCYQ1w9EoZ7QzA3eC+Jscx4Qwrz8s5
o6BZns+xp5CNqQNAwH6WLjzHU26R8Grt8/TWBre0UZlRLhACbeWg7cVN0P0j9HV/
3K8iZVWrPQenFPp1kPvCdIBEEW8kMSmwC3KRGg8EJPy0XAMYJYkBHAQQAQgABgUC
XGWCHQAKCRB+g2EBJtzC6MLHCACvusz5S958h1IzoBUmgvoQvkF4vTyJdwzg8i1x
x310J3DdnxpvjygnFqIO/u6FWrH+H/JffI1Zt58CRVUwWatK7dgRUXPWOkE9yH5F
IJP86C8cXUACJanvDAGuWNLQGjIWf+p2ZGpA4uBMrHZcu7fY0GLau/r315Tks0N+
dHPtqP9dgfA700Be92jxhucoO3WWCCq7JE3QSYJ1eZ/LIX8bSxHGWo7JetFyOK2Z
dGd54pkBB+m5fFX6lcwWaFjESv37IZcz1wUOvUFLvj/olSEJscviA700riH8W32O
uSpWrHeF7TCroifv6Y9dbhZu08m0FBXkZjuRQ4Y6EyFil6eVuQENBFxDuhkBCAC1
9Q021v7kTuwYKwEmbqQC5wvmbEMT4ldvQ8gWCUIFL9kTxM67IF0annsys+rrAyqq
FUTq2onVmgjciu9upl6uDdV3wivCBEDN9ZLZAVHTSviiXDhnHUSg6EhCdZKhal9D
KAi+vGSLSe14e2Kfoe4c6R0yDVI+Dn0OfUhlMXu2NoDSFLAdHsDHSCrE6xKO+BNg
L2MPuMeXLhNitNIVrykoZMkFrUMcMsHrvrk05ah87RQO1e2ljenn8qxPRLdOVWc0
TJiosjiy04vwDAYNUCPDL5W2Mp2bv2AeTPCzF1qkDnGKZEqV2peWKCPB608lS1ic
w5oKtOl50PSgzTdaLVRXABEBAAGJAjYEGAEKACAWIQTsPP6I9soHiHdPXB0apEvm
Sd52CgUCXEO6GQIbDAAKCRAapEvmSd52Cpy8D/9tq4BQ3VwrDNCxycALqWvZSPv/
AgsT6hRvQsLc6Yp0FEtz+frFPLWt7bylMrzKItpsr0G2FofWw0yNyHNYPmGlCi+S
rWLJnUTEm5TZgwT+9kLt/mJ4B0J1gHkknXSo91S84DPaik9CH0GmXIQyPANkDDlm
p9W/Hk8oKxxvCx+SSsZ6ANXakcNVg/w4MhDW2HowW4sBvtltOFSgPRs9zISiNw//
GYjeYrdOOnieMhszwpjQuK5XYnDhwiSap2D8nQlD/VpAa2CvE/fOFV2CJyKZfE0J
8v5DZOU+SUwnty1f52ZA1s/OCysaK1LLdCXz3bQiybQZhobcAneBVZFlNzf6xpR+
pGtw3OVSyLQo4LSQf4lFszNy8FfE+BJ1/yUWFBjljLwIHd4IW7Y17PugAc19fQ23
krOIc3O4qsuYzqdhzYzqGbPvf7fY3Tz0BNcW5885KEQJH7VJJLqpf3EELhmkLBON
YiF10iggFSmn8WSQWbXm0kGRETvAzf+FYcJsKDu9QASDRNck8J20ZJGVLbZNdP+V
uLOXCDAkSGIxi91TLi6bY0Mb2yNRgAq6cnIJUTAbcnw05BLxRW+e8AS3HodjZHWz
AMDPpZn5TFfJOXdDhdeePVGgkypxwnbeyTT3OjUEh37vr+XIgrTMpz+ZNpHxLr4b
JatQEVK3H6Q3ZbQkMbkBDQRcQ7q3AQgAqSM4Wx4QvvCIf8is+57mLJhceB2kLt3V
R67UFZC0ywcr5V0pvTuu2U1oUB+BVYC/A9UdnvWTyDef3xTCx0hAiiFhlMe6CkOD
OalmxI+KwPxD276+70tcxd8vR2FJviDQKw96f2hlLAnxR47GUp3cPfIgVfkvIXnX
LMUJQvBhXeXqgYhOcAplI677n/zTeFjBtd/JqtyDoJ0De1odEyC+ZZD/Jo5q80Sy
dhvb99BHQMgLTJTJPW1iRV2AK4xfBjxOMwqml9Lx4HRIpV/IHs3MTyhEpEA+I/eK
pO6UxApHWHZ76Zm8BL8RwnfFaXjMueRhIGMFtJnLuNFc5mOLXa3uhwARAQABiQNs
BBgBCgAgFiEE7Dz+iPbKB4h3T1wdGqRL5knedgoFAlxDurcCGwIBQAkQGqRL5kne
dgrAdCAEGQEKAB0WIQQSdoqWeVmQEHoNL9/8V+PMrNmaeAUCXEO6twAKCRD8V+PM
rNmaeEvuB/92qMj2mQN3CXRQUTlmzVNUJLJAwzjRDoSt3kqDrACJ2N8JLSxWFeHm
EmrrmFPUmXfBUkT+F2W+OrsJlUtwepuTYROgLNZebFQdjB38oqsj8RMKb5ikWntR
Uka2xhSDRBa0IlpxHBWLHS8nEx1x4HB4uYRK3IpWShAVmWk7jiATGJLFYJGVo4TB
fM27zCty8/GQN/3A2DAJ2OJbiJ12ByTgzztGdhJ69H/QUltkK7eJUGMjPwhpmp07
lrolyUurbzaLMQow4SLo/ZIxa0nPC+AoMSk06teichCZwIyiU/70S0c/uL3RFhnT
bgWcdQkAVpWdkwFqIES4xG5QLUu85/WT7lMQALJKKuOOpbOeKvyLV16Oo70OTms/
LbmXU9+bjCjz7QISuzhI4rua0onjQzBaRXFYkfCjBudWaEpy/wP5wk6QlqxLkeZN
Ck0TswksLxQjyO2XgBcOnrSsQIEJ7VICG9PDvtVzbrSBYMjoDo58AyniEMVANyUn
FYl1YBlFt506PDh86ZEqlpbbReAsYfEuBQdBfJhWph9WZgJDVtEHUAxaiqisvNEb
z4xRIAsxX/OxnQMdD09Xs50yvl38ERIadacejtQnAIYeEaUBsgQk3rt0+g9lm6tr
D7P4FXYhUD9vml6/n8TGB3UJi3lKpX41GSUC1y+oPna8p+EEmrm3BbB4fgnIkfYi
EDNogvm2pe7nzUP7sNnE8RcyYcjUoEQ0Uo+HB6fk6NeBGKqaIKVexCcExnWKHvl0
DZzGydvKx41nyzFI1sueg34LcWwpGHXzJyhmpjhNe1GOKtVGHCGKhKhppK4ntUZI
SciGh38wvKuFDohHO3JVZ9AhyRWKTuynzLarBpmvu11TDbv0lfnZcghlWWHNlx8x
8DdaEuFWXZTDuVXqGclmeV2hS0LomX33LCB4n0XkZtC9LsmTIsr+ZdVCAXUeX/pJ
ONNxNF8G47lZLLgLWF9beuHWp3u1Io31fzh44TZxm1Z31wCZjOrsL9bvy3xHyDFa
DL+/7i6TXsSxtqTXuQENBFxDu6IBCACgVJJnY8zh8uHn8d/E7p4j+9ueTvTHMRYO
S0kkGhHBC7JmxCw6/EvbnbTsI0CQeyIJHlmPIqDVgRVjijcTWacd3vIdazzH9sqs
65nl49yMnA23tIya4VWlbHC3J4x/LL84A4GaJO/FVF2vv6hVg3IGbopp5KX+pr6s
56TiWddSDqMgjb7rSzjWuNyRK75ToctL7Y/Zn6st3ZioO7LXq3ghkWf8JR7ZaUFI
Y6P1qS5heiCHP0PxQJSrtpYzH3rKJoHpIkjxnsB/sD0C05cAdlzXBTUVTNLY+DPl
Q7FeRkG+VK91briG4tvQ8ohhEiC9HuJu1AKMNWBZ9qeUwsXaJvNzABEBAAGJAjYE
GAEKACAWIQTsPP6I9soHiHdPXB0apEvmSd52CgUCXEO7ogIbIAAKCRAapEvmSd52
Ch8ZD/9wKuIlaRMSB1AMCwhGPaqXZahrJ649Y0jI4JqpFKv2/U5hKHOG7bihRAeE
j7pZzhlgBrkZg1SBdZ3vHs1ufElnfe5RQApdDm93daU5SP29iEivJQxKjF91EfEf
fl0trxxztBipI5/2D+kaS8cnNVfzo5ZEWy/cd6AShvRVHM7Y2QHc+mlaZhYhBvTt
wC6avXNnG55WYgobGENeAwkyD072JF3XrxFb+XkcKxla9yRdWdHxJd5PYJqsKM+n
VeJM226OwOyU235gfIhIP6pfGqF9UVH0uFoCYkVkUSjVd96Q+Cj0kdhTOrtLW1OY
11d9TBxje42GOtc7X9Zzx1nhwU8rCCErF9/uJIJKlq7I08rMX3rFDTtizwN7g7ZB
kDDiZO+BIKQPt/awA9NM+tda02hyfQokBBi+v8b/iKifKIfUaqPDo1PA5uxljdlu
yX8AXIotKjJXF6Elsiz7bVpcIc0ZXOOFr9ylmtZm51YNmOzDNznEBmol2oBZfsk2
G55/QgShHmKUnvzKANBGfnfS/a/K7Hv4sfZAb58Prl6OmQSrkmhzFry/4BNLKq+n
d4s8VXkJPpx3Ogf3DoIynqpNF0bwf52U5IgJSNcJN/HrAwhaG1W+Y3LDe7S19M0c
UzftEUeq3Jd89hoijC72tdba+BRfW0ncfvEcsk9QifSU1tvZxQ==
=CjRQ
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
1tvZxQ==
=DlFV
-----END PGP PUBLIC KEY BLOCK-----
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=JBTJ
-----END PGP PUBLIC KEY BLOCK-----
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
=fgqz
-----END PGP PUBLIC KEY BLOCK-----

View File

@@ -29,10 +29,10 @@
%endif
%bcond_without docs
Name: valgrind%{?psuffix}
Version: 3.26.0
Version: 3.25.1
Release: 0
Summary: Memory Management Debugger
License: GFDL-1.2-only AND GPL-3.0-or-later
License: GFDL-1.2-only AND GPL-2.0-or-later
Group: Development/Tools/Debuggers
URL: https://valgrind.org/
Source0: https://sourceware.org/pub/valgrind/valgrind-%{version}.tar.bz2
@@ -43,13 +43,14 @@ Source2: valgrind.keyring
Patch0: valgrind.xen.patch
# bko#276780 missing implementation for PINSRD
Patch1: VEX-x86-pinsrd.patch
Patch2: 0001-Bug-503241-s390x-Support-z17-changes-to-the-NNPA-ins.patch
Patch10: dhat-use-datadir.patch
BuildRequires: automake
BuildRequires: pkgconfig
%if %{suse_version} == 1600 && !0%{?is_opensuse}
ExclusiveArch: aarch64 x86_64 ppc64le s390x
%else
ExclusiveArch: aarch64 %{ix86} x86_64 ppc ppc64 ppc64le s390x armv7l armv7hl armv6l armv6hl riscv64
ExclusiveArch: aarch64 %{ix86} x86_64 ppc ppc64 ppc64le s390x armv7l armv7hl armv6l armv6hl
%endif
%if "%{flavor}" == ""
Requires: (glibc >= %{glibc_main_version}.%{glibc_major_version} with glibc < %{glibc_main_version}.%{lua:print(rpm.expand("%{glibc_major_version}")+1)})
@@ -274,9 +275,6 @@ VALGRIND_LIB=$PWD/.in_place VALGRIND_LIB_INNER=$PWD/.in_place ./coregrind/valgri
%ifarch %{arm}
%{_libexecdir}/valgrind/*-arm-linux
%endif
%ifarch riscv64
%{_libexecdir}/valgrind/*-riscv64-linux
%endif
%dir %{_datadir}/valgrind
%{_datadir}/valgrind/dh_view*
%{_libexecdir}/valgrind/*-linux.so