diff options
Diffstat (limited to 'string/test/memset.c')
-rw-r--r-- | string/test/memset.c | 162 |
1 files changed, 90 insertions, 72 deletions
diff --git a/string/test/memset.c b/string/test/memset.c index 48c10fa..f172144 100644 --- a/string/test/memset.c +++ b/string/test/memset.c @@ -1,7 +1,7 @@ /* * memset test. * - * Copyright (c) 2019, Arm Limited. + * Copyright (c) 2019-2020, Arm Limited. * SPDX-License-Identifier: MIT */ @@ -9,103 +9,121 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include "mte.h" #include "stringlib.h" +#include "stringtest.h" + +#define F(x, mte) {#x, x, mte}, static const struct fun { - const char *name; - void *(*fun)(void *s, int c, size_t n); + const char *name; + void *(*fun) (void *s, int c, size_t n); + int test_mte; } funtab[] = { -#define F(x) {#x, x}, -F(memset) + // clang-format off + F(memset, 0) #if __aarch64__ -F(__memset_aarch64) + F(__memset_aarch64, 1) #elif __arm__ -F(__memset_arm) + F(__memset_arm, 0) #endif -#undef F - {0, 0} + {0, 0, 0} + // clang-format on }; - -static int test_status; -#define ERR(...) (test_status=1, printf(__VA_ARGS__)) +#undef F #define A 32 #define LEN 250000 -static unsigned char sbuf[LEN+2*A]; +static unsigned char *sbuf; -static void *alignup(void *p) +static void * +alignup (void *p) { - return (void*)(((uintptr_t)p + A-1) & -A); + return (void *) (((uintptr_t) p + A - 1) & -A); } -static void err(const char *name, unsigned char *src, int salign, int c, int len) +static void +test (const struct fun *fun, int salign, int c, int len) { - ERR("%s(align %d, %d, %d) failed\n", name, salign, c, len); - ERR("got : %.*s\n", salign+len+1, src); -} + unsigned char *src = alignup (sbuf); + unsigned char *s = src + salign; + void *p; + int i; -static void test(const struct fun *fun, int salign, int c, int len) -{ - unsigned char *src = alignup(sbuf); - unsigned char *s = src + salign; - void *p; - int i; + if (err_count >= ERR_LIMIT) + return; + if (len > LEN || salign >= A) + abort (); + for (i = 0; i < len + A; i++) + src[i] = '?'; + for (i = 0; i < len; i++) + s[i] = 'a' + i % 23; - if (len > LEN || salign >= A) - abort(); - for (i = 0; i < len+A; i++) - src[i] = '?'; - for (i = 0; i < len; i++) - s[i] = 'a' + i%23; - for (; i<len%A; i++) - s[i] = '*'; + s = tag_buffer (s, len, fun->test_mte); + p = fun->fun (s, c, len); + untag_buffer (s, len, fun->test_mte); - p = fun->fun(s, c, len); - if (p != s) - ERR("%s(%p,..) returned %p\n", fun->name, s, p); + if (p != s) + ERR ("%s(%p,..) returned %p\n", fun->name, s, p); - for (i = 0; i < salign; i++) { - if (src[i] != '?') { - err(fun->name, src, salign, c, len); - return; - } + for (i = 0; i < salign; i++) + { + if (src[i] != '?') + { + ERR ("%s(align %d, %d, %d) failed\n", fun->name, salign, c, len); + quoteat ("got", src, len + A, i); + return; } - for (i = salign; i < len; i++) { - if (src[i] != (unsigned char)c) { - err(fun->name, src, salign, c, len); - return; - } + } + for (; i < salign + len; i++) + { + if (src[i] != (unsigned char) c) + { + ERR ("%s(align %d, %d, %d) failed\n", fun->name, salign, c, len); + quoteat ("got", src, len + A, i); + return; } - for (; i < len%A; i++) { - if (src[i] != '*') { - err(fun->name, src, salign, c, len); - return; - } + } + for (; i < len + A; i++) + { + if (src[i] != '?') + { + ERR ("%s(align %d, %d, %d) failed\n", fun->name, salign, c, len); + quoteat ("got", src, len + A, i); + return; } + } } -int main() +int +main () { - int r = 0; - for (int i=0; funtab[i].name; i++) { - test_status = 0; - for (int s = 0; s < A; s++) { - int n; - for (n = 0; n < 100; n++) { - test(funtab+i, s, 0, n); - test(funtab+i, s, 0x25, n); - test(funtab+i, s, 0xaa25, n); - } - for (; n < LEN; n *= 2) { - test(funtab+i, s, 0, n); - test(funtab+i, s, 0x25, n); - test(funtab+i, s, 0xaa25, n); - } - } - printf("%s %s\n", test_status ? "FAIL" : "PASS", funtab[i].name); - if (test_status) - r = -1; + sbuf = mte_mmap (LEN + 2 * A); + int r = 0; + for (int i = 0; funtab[i].name; i++) + { + err_count = 0; + for (int s = 0; s < A; s++) + { + int n; + for (n = 0; n < 100; n++) + { + test (funtab + i, s, 0, n); + test (funtab + i, s, 0x25, n); + test (funtab + i, s, 0xaa25, n); + } + for (; n < LEN; n *= 2) + { + test (funtab + i, s, 0, n); + test (funtab + i, s, 0x25, n); + test (funtab + i, s, 0xaa25, n); + } } - return r; + char *pass = funtab[i].test_mte && mte_enabled () ? "MTE PASS" : "PASS"; + printf ("%s %s\n", err_count ? "FAIL" : pass, funtab[i].name); + if (err_count) + r = -1; + } + return r; } |