1#include <string.h> 2#include <stdlib.h> 3#include <stdint.h> 4#include "test.h" 5 6static char buf[512]; 7 8static void *(*volatile pmemcpy)(void *restrict, const void *restrict, size_t); 9 10static void *aligned(void *p) { 11 return (void*)(((uintptr_t)p + 63) & -64); 12} 13 14#define N 80 15static 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 43int 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