]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
arm64 regtest: improve dc_cvax test
authorPaul Floyd <pjfloyd@wanadoo.fr>
Sun, 26 May 2024 05:46:33 +0000 (07:46 +0200)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Sun, 26 May 2024 05:52:25 +0000 (07:52 +0200)
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

index 79674ce5938f2fb12ae01864a554e727d2182997..768f7592e379613a2bacdbdd7a1c560ae957c9f6 100644 (file)
@@ -1,30 +1,39 @@
 #include <assert.h>
 #include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
 
-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);
+      }
    }
 }