mirror of
https://gitlab.alpinelinux.org/alpine/aports.git
synced 2025-04-19 14:56:46 +02:00
66 lines
2 KiB
Diff
66 lines
2 KiB
Diff
From: Dermot Bradley <dermot_bradley@yahoo.com>
|
|
Date: Mon, 10 Apr 2023 14:25 +0100
|
|
|
|
Output size of the STCKE command on s390x is 16 bytes, compared to 8
|
|
bytes of the STCK command. This leads to a stack corruption in
|
|
jent_get_nstime() on an s390x system.
|
|
|
|
Upstream PR #95, already merged in master.
|
|
|
|
---
|
|
|
|
diff -aur a/jitterentropy-base-user.h b/jitterentropy-base-user.h
|
|
--- a/jitterentropy-base-user.h
|
|
+++ b/jitterentropy-base-user.h
|
|
@@ -129,13 +129,46 @@
|
|
|
|
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)
|