xref: /netbsd-src/external/gpl3/gdb/dist/sim/testsuite/bfin/mdma-skel.h (revision 4b169a6ba595ae283ca507b26b15fdff40495b1c)
1 #include <stdlib.h>
2 #include <string.h>
3 
_mdma_memcpy(bu32 dst,bu32 src,bu32 size,bs16 mod)4 void _mdma_memcpy (bu32 dst, bu32 src, bu32 size, bs16 mod)
5 {
6   bu32 count = size >> (abs (mod) / 2);
7   bu16 wdsize;
8   switch (abs (mod))
9     {
10     case 4: wdsize = WDSIZE_32; break;
11     case 2: wdsize = WDSIZE_16; break;
12     default: wdsize = WDSIZE_8; break;
13     }
14 
15   s->config = d->config = 0;
16 
17   d->irq_status = DMA_DONE | DMA_ERR;
18 
19   /* Destination */
20   d->start_addr = dst;
21   d->x_count = count;
22   d->x_modify = mod;
23   d->irq_status = DMA_DONE | DMA_ERR;
24 
25   /* Source */
26   s->start_addr = src;
27   s->x_count = count;
28   s->x_modify = mod;
29   s->irq_status = DMA_DONE | DMA_ERR;
30 
31   /* Enable */
32   s->config = DMAEN | wdsize;
33   d->config = WNR | DI_EN | DMAEN | wdsize;
34 
35   while (!(d->irq_status & DMA_DONE))
36     continue;
37 }
38 
39 void mdma_memcpy (bu32 dst, bu32 src, bu32 size);
40 
41 #ifndef MAX_LEN
42 #define MAX_LEN 0x40000
43 #endif
44 bu32 _data[(MAX_LEN / 4) * 2 + 3];
45 char *data = (char *)(_data + 1);
46 
_start(void)47 int _start (void)
48 {
49   char *src, *dst;
50   bu32 len, canary, *canaries[3];
51 
52   canary = 0x12345678;
53 
54   len = 4;
55   while (len < MAX_LEN)
56     {
57       src = data;
58       dst = data + len + 4;
59       /* Set up the canaries.  */
60       canaries[0] = (void *)&src[-4];
61       canaries[1] = (void *)&dst[-4];
62       canaries[2] = (void *)&dst[len];
63       *canaries[0] = *canaries[1] = *canaries[2] = canary;
64 
65       memset (src, 0xad, len);
66       memset (dst, 0x00, len);
67 
68       mdma_memcpy ((bu32)dst, (bu32)src, len);
69       if (memcmp (src, dst, len))
70 	DBG_FAIL;
71 
72       if (*canaries[0] != canary ||
73 	  *canaries[1] != canary ||
74 	  *canaries[2] != canary)
75 	DBG_FAIL;
76 
77       len <<= 4;
78     }
79   DBG_PASS;
80 }
81