jitterentropy/jitterentropy-fix-a-stack-corruption-on-s390x.patch

71 lines
2.4 KiB
Diff

From 7bf9f85d32bc6b809ca687d772bc41bd9c0ecdd8 Mon Sep 17 00:00:00 2001
From: Vladis Dronov <vdronov@redhat.com>
Date: Tue, 27 Dec 2022 13:45:03 +0100
Subject: [PATCH] fix a stack corruption on s390x
Output size of the STCKE command on s390x is 16 bytes, compared to 8 bytes
of the STCK command. Fix a stack corruption in the s390x version of
jent_get_nstime(). Add some more detailed information on the STCKE command.
Signed-off-by: Stephan Mueller <smueller@chronox.de>
---
jitterentropy-base-user.h | 43 ++++++++++++++++++++++++++++++++++-----
1 file changed, 38 insertions(+), 5 deletions(-)
diff --git a/jitterentropy-base-user.h b/jitterentropy-base-user.h
index b7d21e8..625767a 100644
--- a/jitterentropy-base-user.h
+++ b/jitterentropy-base-user.h
@@ -129,13 +129,46 @@ static inline void jent_get_nstime(uint64_t *out)
static inline void jent_get_nstime(uint64_t *out)
{
- uint64_t clk;
+ /*
+ * This is MVS+STCK code! Enable it with -S in the compiler.
+ *
+ * uint64_t clk;
+ * __asm__ volatile("stck %0" : "=m" (clk) : : "cc");
+ * *out = (uint64_t)(clk);
+ */
+
+ /*
+ * This is GCC+STCKE code. STCKE command and data format:
+ * z/Architecture - Principles of Operation
+ * http://publibz.boulder.ibm.com/epubs/pdf/dz9zr007.pdf
+ *
+ * The current value of bits 0-103 of the TOD clock is stored in bytes
+ * 1-13 of the sixteen-byte output:
+ *
+ * bits 0-7: zeros (reserved for future extention)
+ * bits 8-111: TOD Clock value
+ * bits 112-127: Programmable Field
+ *
+ * Output bit 59 (TOD-Clock bit 51) effectively increments every
+ * microsecond. Bits 60 to 111 of STCKE output are fractions of
+ * a miscrosecond: bit 59 is 1.0us, bit 60 is .5us, bit 61 is .25us,
+ * bit 62 is .125us, bit 63 is 62.5ns, etc.
+ *
+ * Some of these bits can be implemented, some not. 64 bits of
+ * the TOD clock are implemented usually nowadays, these are
+ * bits 8-71 of the output.
+ *
+ * The stepping value of TOD-clock bit position 63, if implemented,
+ * is 2^-12 microseconds, or approximately 244 picoseconds. This value
+ * is called a clock unit.
+ */
+
+ uint8_t clk[16];
- /* this is MVS code! enable with -S in the compiler */
- /*__asm__ volatile("stck %0" : "=m" (clk) : : "cc"); */
- /* this is gcc */
asm volatile("stcke %0" : "=Q" (clk) : : "cc");
- *out = (uint64_t)(clk);
+
+ /* s390x is big-endian, so just perfom a byte-by-byte copy */
+ *out = *(uint64_t *)(clk + 1);
}
#elif defined(__powerpc)