Message ID | 20200213225109.13120-20-alex.bennee@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | testing and plugin updates | expand |
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>
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 --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; }
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