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