#include <stdint.h>
#include "test.h"
-static char buf[512];
+#define N 400
+static char buf[N];
+static char buf2[N];
static void *(*volatile pmemset)(void *, int, size_t);
-static void *aligned(void *p)
+static char *aligned(void *p)
{
- return (void*)(((uintptr_t)p + 63) & -64U);
+ return (char*)(((uintptr_t)p + 63) & -64);
}
-#define N 80
static void test_align(int align, int len)
{
- char *s = aligned(buf);
- char *want = aligned(buf + 256);
+ char *s = aligned(buf+64) + align;
+ char *want = aligned(buf2+64) + align;
char *p;
int i;
- if (align + len > N)
+ if (len + 64 > buf + N - s || len + 64 > buf2 + N - want)
abort();
for (i = 0; i < N; i++)
- s[i] = want[i] = ' ';
+ buf[i] = buf2[i] = ' ';
for (i = 0; i < len; i++)
- want[align+i] = '#';
- p = pmemset(s+align, '#', len);
- if (p != s+align)
- t_error("memset(%p,...) returned %p\n", s+align, p);
- for (i = 0; i < N; i++)
+ want[i] = '#';
+ p = pmemset(s, '#', len);
+ if (p != s)
+ t_error("memset(%p,...) returned %p\n", s, p);
+ for (i = -64; i < len+64; i++)
if (s[i] != want[i]) {
- t_error("memset(align %d, '#', %d) failed\n", align, len);
- t_printf("got : %.*s\n", align+len+1, s);
- t_printf("want: %.*s\n", align+len+1, want);
+ t_error("memset(align %d, '#', %d) failed at pos %d\n", align, len, i);
+ t_printf("got : '%.*s'\n", len+128, s-64);
+ t_printf("want: '%.*s'\n", len+128, want-64);
break;
}
}
pmemset = memset;
for (i = 0; i < 16; i++)
- for (j = 0; j < 64; j++)
+ for (j = 0; j < 200; j++)
test_align(i,j);
test_value('c');
test_value(0);
test_value(-1);
+ test_value(-5);
test_value(0xab);
return t_status;
}