1 #include <stdlib.h> 2 #include <string.h> 3 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 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