Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
tests/tcg/aarch64: add DC CVA[D]P tests
Test execution of DC CVAP and DC CVADP instructions under user mode emulation. Signed-off-by: Zhuojia Shen <chaosdefinition@hotmail.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
- Loading branch information
1 parent
cd4a47f
commit c81e4ab
Showing
3 changed files
with
137 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,63 @@ | ||
| /* | ||
| * Test execution of DC CVADP instruction. | ||
| * | ||
| * Copyright (c) 2023 Zhuojia Shen <chaosdefinition@hotmail.com> | ||
| * SPDX-License-Identifier: GPL-2.0-or-later | ||
| */ | ||
|
|
||
| #include <asm/hwcap.h> | ||
| #include <sys/auxv.h> | ||
|
|
||
| #include <signal.h> | ||
| #include <stdbool.h> | ||
| #include <stdio.h> | ||
| #include <stdlib.h> | ||
|
|
||
| #ifndef HWCAP2_DCPODP | ||
| #define HWCAP2_DCPODP (1 << 0) | ||
| #endif | ||
|
|
||
| bool should_fail = false; | ||
|
|
||
| static void signal_handler(int sig, siginfo_t *si, void *data) | ||
| { | ||
| ucontext_t *uc = (ucontext_t *)data; | ||
|
|
||
| if (should_fail) { | ||
| uc->uc_mcontext.pc += 4; | ||
| } else { | ||
| exit(EXIT_FAILURE); | ||
| } | ||
| } | ||
|
|
||
| static int do_dc_cvadp(void) | ||
| { | ||
| struct sigaction sa = { | ||
| .sa_flags = SA_SIGINFO, | ||
| .sa_sigaction = signal_handler, | ||
| }; | ||
|
|
||
| sigemptyset(&sa.sa_mask); | ||
| if (sigaction(SIGSEGV, &sa, NULL) < 0) { | ||
| perror("sigaction"); | ||
| return EXIT_FAILURE; | ||
| } | ||
|
|
||
| asm volatile("dc cvadp, %0\n\t" :: "r"(&sa)); | ||
|
|
||
| should_fail = true; | ||
| asm volatile("dc cvadp, %0\n\t" :: "r"(NULL)); | ||
| should_fail = false; | ||
|
|
||
| return EXIT_SUCCESS; | ||
| } | ||
|
|
||
| int main(void) | ||
| { | ||
| if (getauxval(AT_HWCAP2) & HWCAP2_DCPODP) { | ||
| return do_dc_cvadp(); | ||
| } else { | ||
| printf("SKIP: no HWCAP2_DCPODP on this system\n"); | ||
| return EXIT_SUCCESS; | ||
| } | ||
| } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,63 @@ | ||
| /* | ||
| * Test execution of DC CVAP instruction. | ||
| * | ||
| * Copyright (c) 2023 Zhuojia Shen <chaosdefinition@hotmail.com> | ||
| * SPDX-License-Identifier: GPL-2.0-or-later | ||
| */ | ||
|
|
||
| #include <asm/hwcap.h> | ||
| #include <sys/auxv.h> | ||
|
|
||
| #include <signal.h> | ||
| #include <stdbool.h> | ||
| #include <stdio.h> | ||
| #include <stdlib.h> | ||
|
|
||
| #ifndef HWCAP_DCPOP | ||
| #define HWCAP_DCPOP (1 << 16) | ||
| #endif | ||
|
|
||
| bool should_fail = false; | ||
|
|
||
| static void signal_handler(int sig, siginfo_t *si, void *data) | ||
| { | ||
| ucontext_t *uc = (ucontext_t *)data; | ||
|
|
||
| if (should_fail) { | ||
| uc->uc_mcontext.pc += 4; | ||
| } else { | ||
| exit(EXIT_FAILURE); | ||
| } | ||
| } | ||
|
|
||
| static int do_dc_cvap(void) | ||
| { | ||
| struct sigaction sa = { | ||
| .sa_flags = SA_SIGINFO, | ||
| .sa_sigaction = signal_handler, | ||
| }; | ||
|
|
||
| sigemptyset(&sa.sa_mask); | ||
| if (sigaction(SIGSEGV, &sa, NULL) < 0) { | ||
| perror("sigaction"); | ||
| return EXIT_FAILURE; | ||
| } | ||
|
|
||
| asm volatile("dc cvap, %0\n\t" :: "r"(&sa)); | ||
|
|
||
| should_fail = true; | ||
| asm volatile("dc cvap, %0\n\t" :: "r"(NULL)); | ||
| should_fail = false; | ||
|
|
||
| return EXIT_SUCCESS; | ||
| } | ||
|
|
||
| int main(void) | ||
| { | ||
| if (getauxval(AT_HWCAP) & HWCAP_DCPOP) { | ||
| return do_dc_cvap(); | ||
| } else { | ||
| printf("SKIP: no HWCAP_DCPOP on this system\n"); | ||
| return EXIT_SUCCESS; | ||
| } | ||
| } |