From 4063859b4478fbb299b7ad58855ce9ed37a57aae Mon Sep 17 00:00:00 2001 From: Paul Floyd Date: Sun, 26 May 2024 07:46:33 +0200 Subject: [PATCH] arm64 regtest: improve dc_cvax test Make sure that the buffer used for dc zva is the right size. Turn on the dc cvap and dc cvadp tests, resorting to .byte arrays. --- none/tests/arm64/dc_cvax.c | 57 ++++++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/none/tests/arm64/dc_cvax.c b/none/tests/arm64/dc_cvax.c index 79674ce59..768f7592e 100644 --- a/none/tests/arm64/dc_cvax.c +++ b/none/tests/arm64/dc_cvax.c @@ -1,30 +1,39 @@ #include #include +#include +#include -int main() +int main(void) { - char buf[64] __attribute__((aligned(64))); - unsigned long check_dc_zva; - unsigned long check_dc_cvap; - memset(buf, 0xAA, 64); - asm volatile("mrs %0, dczid_el0" : "=r" (check_dc_zva)); - asm volatile("dc cvac, %0" :: "r" (buf)); - asm volatile("dc cvau, %0" :: "r" (buf)); - asm volatile("mrs %0, id_aa64isar1_el1" : "=r" (check_dc_cvap)); - /* Not sure if GCC supports this syntax */ - /* - if (check_dc_cvap & 0x3) { - asm volatile(".arch_extension ccpp;dc cvap, %0" :: "r" (buf)); - } - if (check_dc_cvap & 0x2) { - asm volatile(".arch_extension ccdp;dc cvadp, %0" :: "r" (buf)); - } - */ - asm volatile("dc civac, %0" :: "r" (buf)); - // and while I'm at it - if (!(check_dc_zva & 0x10)) { - asm volatile("dc zva, %0" :: "r" (buf)); - assert(buf[0] == 0); - assert(buf[63] == 0); + char buf[64] __attribute__((aligned(64))); + unsigned long check_dc_zva; + unsigned long check_dc_cvap; + memset(buf, 0xAA, 64); + asm volatile("mrs %0, dczid_el0" : "=r" (check_dc_zva)); + asm volatile("dc cvac, %0" :: "r" (buf)); + asm volatile("dc cvau, %0" :: "r" (buf)); + asm volatile("mrs %0, id_aa64isar1_el1" : "=r" (check_dc_cvap)); + if (check_dc_cvap & 0x3) { + asm volatile("add x8, sp, #0x40\n" + ".inst 0xd50b7c28\n"); + } + if (check_dc_cvap & 0x2) { + asm volatile("add x8, sp, #0x40\n" + ".inst 0xd50b7c28"); + } + asm volatile("dc civac, %0" :: "r" (buf)); + if (!(check_dc_zva & 0x10)) { + size_t buf_size = (1U << ((check_dc_zva & 0xf) + 2)); + //printf("lg 2 word count %lu byte count %zu\n", check_dc_zva & 0xfUL, buf_size); + char* var_buf; + if (posix_memalign((void**)&var_buf, buf_size, buf_size) == 0) { + asm volatile("dc zva, %0" :: "r" (var_buf)); + assert(var_buf[0] == 0); + assert(var_buf[buf_size - 1] == 0); + free(var_buf); + } else { + perror("posix_memalign failed:"); + exit(1); + } } } -- 2.47.2