Skip to content

Commit

Permalink
fix a stack corruption on s390x
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
nefigtut authored and smuellerDD committed Dec 27, 2022
1 parent 4544e11 commit 7bf9f85
Showing 1 changed file with 38 additions and 5 deletions.
43 changes: 38 additions & 5 deletions jitterentropy-base-user.h
Expand Up @@ -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)
Expand Down

0 comments on commit 7bf9f85

Please sign in to comment.