• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <string.h>
2 #include <stdlib.h>
3 #include <stdint.h>
4 #include "test.h"
5 
6 static char buf[512];
7 
8 static void *(*volatile pmemcpy)(void *restrict, const void *restrict, size_t);
9 
aligned(void * p)10 static void *aligned(void *p) {
11 	return (void*)(((uintptr_t)p + 63) & -64);
12 }
13 
14 #define N 80
test_align(int dalign,int salign,int len)15 static void test_align(int dalign, int salign, int len)
16 {
17 	char *src = aligned(buf);
18 	char *dst = aligned(buf + 128);
19 	char *want = aligned(buf + 256);
20 	char *p;
21 	int i;
22 
23 	if (salign + len > N || dalign + len > N)
24 		abort();
25 	for (i = 0; i < N; i++) {
26 		src[i] = '#';
27 		dst[i] = want[i] = ' ';
28 	}
29 	for (i = 0; i < len; i++)
30 		src[salign+i] = want[dalign+i] = '0'+i;
31 	p = pmemcpy(dst+dalign, src+salign, len);
32 	if (p != dst+dalign)
33 		t_error("memcpy(%p,...) returned %p\n", dst+dalign, p);
34 	for (i = 0; i < N; i++)
35 		if (dst[i] != want[i]) {
36 			t_error("memcpy(align %d, align %d, %d) failed\n", dalign, salign, len);
37 			t_printf("got : %.*s\n", dalign+len+1, dst);
38 			t_printf("want: %.*s\n", dalign+len+1, want);
39 			break;
40 		}
41 }
42 
main(void)43 int main(void)
44 {
45 	int i,j,k;
46 
47 	pmemcpy = memcpy;
48 
49 	for (i = 0; i < 16; i++)
50 		for (j = 0; j < 16; j++)
51 			for (k = 0; k < 64; k++)
52 				test_align(i,j,k);
53 
54 	return t_status;
55 }
56