diff mbox series

[v2,19/19] tests/tcg: take into account expected clashes pauth-4

Message ID 20200213225109.13120-20-alex.bennee@linaro.org
State Superseded
Headers show
Series testing and plugin updates | expand

Commit Message

Alex Bennée Feb. 13, 2020, 10:51 p.m. UTC
Pointer authentication isn't perfect so measure the percentage of
failed checks. As we want to vary the pointer that is authenticated we
recurse down the stack.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

---
 tests/tcg/aarch64/pauth-4.c | 54 +++++++++++++++++++++++++------------
 1 file changed, 37 insertions(+), 17 deletions(-)

-- 
2.20.1

Comments

Robert Foley Feb. 14, 2020, 7:12 p.m. UTC | #1
On Thu, 13 Feb 2020 at 18:00, Alex Bennée <alex.bennee@linaro.org> wrote:
>

> Pointer authentication isn't perfect so measure the percentage of

> failed checks. As we want to vary the pointer that is authenticated we

> recurse down the stack.

>

> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>


Reviewed-by: Robert Foley <robert.foley@linaro.org>
Richard Henderson Feb. 16, 2020, 9:30 a.m. UTC | #2
On 2/13/20 2:51 PM, Alex Bennée wrote:
> Pointer authentication isn't perfect so measure the percentage of

> failed checks. As we want to vary the pointer that is authenticated we

> recurse down the stack.

> 


You're no longer recursing.

> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

> ---

>  tests/tcg/aarch64/pauth-4.c | 54 +++++++++++++++++++++++++------------

>  1 file changed, 37 insertions(+), 17 deletions(-)

> 

> diff --git a/tests/tcg/aarch64/pauth-4.c b/tests/tcg/aarch64/pauth-4.c

> index 1040e92aec3..24a639e36ca 100644

> --- a/tests/tcg/aarch64/pauth-4.c

> +++ b/tests/tcg/aarch64/pauth-4.c

> @@ -1,25 +1,45 @@

>  #include <stdint.h>

>  #include <assert.h>

> +#include <stdio.h>

> +#include <stdlib.h>

> +

> +#define TESTS 1000

>  

>  int main()

>  {

> -  uintptr_t x, y;

> +    int i, count = 0;

> +    float perc;

> +    void *base = malloc(TESTS);

> +

> +    for (i = 0; i < TESTS; i++) {

> +        uintptr_t in, x, y;

> +

> +        in = i + (uintptr_t) base;


There's no reason all of these couldn't be char* or void* instead of casting to
uintptr_t.  Nothing else would have to change.

> +

> +        asm("mov %0, %[in]\n\t"

> +            "pacia %0, sp\n\t"        /* sigill if pauth not supported */

> +            "eor %0, %0, #4\n\t"      /* corrupt single bit */

> +            "mov %1, %0\n\t"

> +            "autia %1, sp\n\t"        /* validate corrupted pointer */

> +            "xpaci %0\n\t"            /* strip pac from corrupted pointer */

> +            : /* out */ "=r"(x), "=r"(y)

> +            : /* in */ [in] "r" (in)


It's weird to have some arguments named and some not.  Why not just use %2,
since this is simple enough?

Otherwise,
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>


r~
diff mbox series

Patch

diff --git a/tests/tcg/aarch64/pauth-4.c b/tests/tcg/aarch64/pauth-4.c
index 1040e92aec3..24a639e36ca 100644
--- a/tests/tcg/aarch64/pauth-4.c
+++ b/tests/tcg/aarch64/pauth-4.c
@@ -1,25 +1,45 @@ 
 #include <stdint.h>
 #include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define TESTS 1000
 
 int main()
 {
-  uintptr_t x, y;
+    int i, count = 0;
+    float perc;
+    void *base = malloc(TESTS);
+
+    for (i = 0; i < TESTS; i++) {
+        uintptr_t in, x, y;
+
+        in = i + (uintptr_t) base;
+
+        asm("mov %0, %[in]\n\t"
+            "pacia %0, sp\n\t"        /* sigill if pauth not supported */
+            "eor %0, %0, #4\n\t"      /* corrupt single bit */
+            "mov %1, %0\n\t"
+            "autia %1, sp\n\t"        /* validate corrupted pointer */
+            "xpaci %0\n\t"            /* strip pac from corrupted pointer */
+            : /* out */ "=r"(x), "=r"(y)
+            : /* in */ [in] "r" (in)
+            : /* clobbers */);
 
-  asm("mov %0, lr\n\t"
-      "pacia %0, sp\n\t"        /* sigill if pauth not supported */
-      "eor %0, %0, #4\n\t"      /* corrupt single bit */
-      "mov %1, %0\n\t"
-      "autia %1, sp\n\t"        /* validate corrupted pointer */
-      "xpaci %0\n\t"            /* strip pac from corrupted pointer */
-      : "=r"(x), "=r"(y));
+        /*
+         * Once stripped, the corrupted pointer is of the form 0x0000...wxyz.
+         * We expect the autia to indicate failure, producing a pointer of the
+         * form 0x000e....wxyz.  Use xpaci and != for the test, rather than
+         * extracting explicit bits from the top, because the location of the
+         * error code "e" depends on the configuration of virtual memory.
+         */
+        if (x != y) {
+            count++;
+        }
 
-  /*
-   * Once stripped, the corrupted pointer is of the form 0x0000...wxyz.
-   * We expect the autia to indicate failure, producing a pointer of the
-   * form 0x000e....wxyz.  Use xpaci and != for the test, rather than
-   * extracting explicit bits from the top, because the location of the
-   * error code "e" depends on the configuration of virtual memory.
-   */
-  assert(x != y);
-  return 0;
+    }
+    perc = (float) count / (float) TESTS;
+    printf("Checks Passed: %0.2f%%", perc * 100.0);
+    assert(perc > 0.95);
+    return 0;
 }