[PATCH 02/11] tests/tcg/hexagon: check priv instructions raise SIGILL
Brian Cain <[email protected]>
| Newsgroups | gmane.comp.emulators.qemu |
|---|---|
| Message-ID | <[email protected]> |
A_PRIV and A_GUEST instructions executed from user mode raise HEX_CAUSE_PRIV_USER_NO_SINSN and HEX_CAUSE_PRIV_USER_NO_GINSN, which aborted qemu-hexagon until the preceding patch. Signed-off-by: Brian Cain <[email protected]> --- tests/tcg/hexagon/privileged-insn.c | 79 +++++++++++++++++++++++++++++ tests/tcg/hexagon/Makefile.target | 1 + 2 files changed, 80 insertions(+) create mode 100644 tests/tcg/hexagon/privileged-insn.c diff --git a/tests/tcg/hexagon/privileged-insn.c b/tests/tcg/hexagon/privileged-insn.c new file mode 100644 index 00000000000..306d4542ea4 --- /dev/null +++ b/tests/tcg/hexagon/privileged-insn.c @@ -0,0 +1,79 @@ +/* + * Test that privileged and guest-mode instructions raise SIGILL in user mode. + * + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include <assert.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +static void *resume_pc; + +static void handle_sigill(int sig, siginfo_t *info, void *puc) +{ + ucontext_t *uc = (ucontext_t *)puc; + + if (sig != SIGILL) { + _exit(EXIT_FAILURE); + } + + uc->uc_mcontext.r0 = SIGILL; + uc->uc_mcontext.pc = (unsigned long)resume_pc; +} + +static int test_priv_insn(void) +{ + int sig; + + asm volatile( + "r0 = #0\n" + "r1 = ##1f\n" + "memw(%[pc]) = r1\n" + "stop(r0)\n" + "1:\n" + "%[sig] = r0\n" + : [sig] "=r"(sig) + : [pc] "r"(&resume_pc) + : "r0", "r1", "memory"); + + return sig; +} + +static int test_guest_insn(void) +{ + int sig; + + asm volatile( + "r0 = #0\n" + "r1 = ##1f\n" + "memw(%[pc]) = r1\n" + "r0 = g0\n" + "1:\n" + "%[sig] = r0\n" + : [sig] "=r"(sig) + : [pc] "r"(&resume_pc) + : "r0", "r1", "memory"); + + return sig; +} + +int main() +{ + struct sigaction act; + + memset(&act, 0, sizeof(act)); + act.sa_sigaction = handle_sigill; + act.sa_flags = SA_SIGINFO; + assert(sigaction(SIGILL, &act, NULL) == 0); + + assert(test_priv_insn() == SIGILL); + assert(test_guest_insn() == SIGILL); + + puts("PASS"); + return EXIT_SUCCESS; +} diff --git a/tests/tcg/hexagon/Makefile.target b/tests/tcg/hexagon/Makefile.target index 61adf6356e4..641f6bc10e7 100644 --- a/tests/tcg/hexagon/Makefile.target +++ b/tests/tcg/hexagon/Makefile.target @@ -58,6 +58,7 @@ HEX_TESTS += invalid-slots HEX_TESTS += valid-slots HEX_TESTS += invalid-encoding HEX_TESTS += multiple-writes +HEX_TESTS += privileged-insn HEX_TESTS += unaligned_pc HEX_TESTS += unaligned_data -- 2.34.1