util: Add a unit test for the "inst" call type in the m5 util.
authorGabe Black <gabeblack@google.com>
Thu, 9 Apr 2020 09:33:56 +0000 (02:33 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 25 Aug 2020 19:45:26 +0000 (19:45 +0000)
commit45beec4a59f6ec6c71b6632665a628703bf45dd7
tree5c6d5aba29020d4d5746b653ee105759c5ea4eb0
parentd753719ee37dfe6655752d03dd8e20f6d6a96f2e
util: Add a unit test for the "inst" call type in the m5 util.

This test does two things. First, it makes sure that the "inst" call
type detects that it's being requested in the command line arguments
correctly.

Second, it detects whether it's running in gem5 or not, really just
detecting an environment variable which tells it whether it is. If it
is, then it attempts to run the "sum" op which it expects to succeed and
give the right answer.

If not, it expects to get a SIGILL signal from the OS when it tries to
execute the otherwise illegal instruction. It sets up a signal handler
to catch it, and in that handler saves off information about what
happened. It then uses siglongjmp to return to sanity (before the
signal) and to examine what happened to see if the right instruction was
attempted.

It looks like, depending on the architecture, Linux will either set
si_code to ILL_ILLOPC (illegal opcode) or ILL_ILLOPN (illegal operand).
The later doesn't seem right since the entire instruction is illegal,
not just some operand, but it is what it is and we need to handle
either.

The test then calls a small function, abi_verify, which takes the
siginfo_t and does any abi specific verification. That includes
extracting fields from the instruction if the instruction trigger the
signal, or checking for architecture specific constants, etc.

Also, to centralize setting the macro which lets a call type know that
it's the default, the call types are now also responsible for setting up
their own tweaks to the environment.

Change-Id: I8710e39e20bd9c03b1375a2dccefb27bd6fe0c10
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/27689
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
14 files changed:
util/m5/SConstruct
util/m5/src/SConscript
util/m5/src/abi/aarch64/SConsopts
util/m5/src/abi/aarch64/verify_inst.cc [new file with mode: 0644]
util/m5/src/abi/arm/SConsopts
util/m5/src/abi/arm/verify_inst.cc [new file with mode: 0644]
util/m5/src/abi/sparc/SConsopts
util/m5/src/abi/sparc/verify_inst.cc [new file with mode: 0644]
util/m5/src/abi/thumb/SConsopts
util/m5/src/abi/thumb/verify_inst.cc [new file with mode: 0644]
util/m5/src/abi/x86/SConsopts
util/m5/src/abi/x86/verify_inst.cc [new file with mode: 0644]
util/m5/src/call_type/inst.test.cc
util/m5/src/call_type/verify_inst.hh [new file with mode: 0644]