
Requirements
------------
- You need a GCC-compatible compiler with C11 support to compile
  the s390 port.
- Valgrind requires a machine not older than z196 to run.


Limitations
-----------
- 31-bit client programs are not supported.
- Hexadecimal floating point is not supported.
- Transactional memory is not supported. The transactional-execution
  facility is masked off from HWCAP.
- A full list of unimplemented instructions can be retrieved from
  `docs/internals/s390-opcodes.csv', by grepping for "not implemented".
- FP signalling is not accurate. E.g., the "compare and signal"
  instructions behave like their non-signalling counterparts.
- Some gcc versions use mvc to copy 4/8 byte values. This will affect
  certain debug messages. For example, memcheck will complain about
  4 one-byte reads/writes instead of just a single read/write.


Hardware facilities
-------------------
Valgrind does not require that the host machine has the same hardware
facilities as the machine for which the client program was compiled.
This is convenient. If possible, the JIT compiler will translate the
client instructions according to the facilities available on the host.
This means, though, that probing for hardware facilities by issuing
instructions from that facility and observing whether SIGILL is thrown
may not work. As a consequence, programs that attempt to do so may
behave differently. It is believed that this is a rare use case.


Reading Material
----------------
(1) ELF ABI s390x Supplement
    https://github.com/IBM/s390x-abi/releases
(2) z/Architecture Principles of Operation
    https://www.ibm.com/docs/en/module_1678991624569/pdf/SA22-7832-14.pdf
(3) Collection of z/Architecture publications
    https://linux.mainframe.blog/zarchitecture-principles-of-operation/
