| // SPDX-License-Identifier: GPL-2.0 |
| /* |
| * Copyright (C) 2021 ARM Limited |
| * |
| * Verify that using an instruction not supported in streaming mode |
| * traps when in streaming mode. |
| */ |
| |
| #include <signal.h> |
| #include <ucontext.h> |
| #include <sys/prctl.h> |
| |
| #include "test_signals_utils.h" |
| #include "testcases.h" |
| |
| int sme_trap_non_streaming_trigger(struct tdescr *td) |
| { |
| /* |
| * The framework will handle SIGILL so we need to exit SM to |
| * stop any other code triggering a further SIGILL down the |
| * line from using a streaming-illegal instruction. |
| */ |
| asm volatile(".inst 0xd503437f; /* SMSTART ZA */ \ |
| cnt v0.16b, v0.16b; \ |
| .inst 0xd503447f /* SMSTOP ZA */"); |
| |
| return 0; |
| } |
| |
| int sme_trap_non_streaming_run(struct tdescr *td, siginfo_t *si, ucontext_t *uc) |
| { |
| return 1; |
| } |
| |
| struct tdescr tde = { |
| .name = "SME SM trap unsupported instruction", |
| .descr = "Check that we get a SIGILL if we use an unsupported instruction in streaming mode", |
| .feats_required = FEAT_SME, |
| .feats_incompatible = FEAT_SME_FA64, |
| .timeout = 3, |
| .sanity_disabled = true, |
| .trigger = sme_trap_non_streaming_trigger, |
| .run = sme_trap_non_streaming_run, |
| .sig_ok = SIGILL, |
| }; |