| #include <stdlib.h> | 
 | #include <string.h> | 
 |  | 
 | void _mdma_memcpy (bu32 dst, bu32 src, bu32 size, bs16 mod) | 
 | { | 
 |   bu32 count = size >> (abs (mod) / 2); | 
 |   bu16 wdsize; | 
 |   switch (abs (mod)) | 
 |     { | 
 |     case 4: wdsize = WDSIZE_32; break; | 
 |     case 2: wdsize = WDSIZE_16; break; | 
 |     default: wdsize = WDSIZE_8; break; | 
 |     } | 
 |  | 
 |   s->config = d->config = 0; | 
 |  | 
 |   d->irq_status = DMA_DONE | DMA_ERR; | 
 |  | 
 |   /* Destination */ | 
 |   d->start_addr = dst; | 
 |   d->x_count = count; | 
 |   d->x_modify = mod; | 
 |   d->irq_status = DMA_DONE | DMA_ERR; | 
 |  | 
 |   /* Source */ | 
 |   s->start_addr = src; | 
 |   s->x_count = count; | 
 |   s->x_modify = mod; | 
 |   s->irq_status = DMA_DONE | DMA_ERR; | 
 |  | 
 |   /* Enable */ | 
 |   s->config = DMAEN | wdsize; | 
 |   d->config = WNR | DI_EN | DMAEN | wdsize; | 
 |  | 
 |   while (!(d->irq_status & DMA_DONE)) | 
 |     continue; | 
 | } | 
 |  | 
 | void mdma_memcpy (bu32 dst, bu32 src, bu32 size); | 
 |  | 
 | #ifndef MAX_LEN | 
 | #define MAX_LEN 0x40000 | 
 | #endif | 
 | bu32 _data[(MAX_LEN / 4) * 2 + 3]; | 
 | char *data = (char *)(_data + 1); | 
 |  | 
 | int _start (void) | 
 | { | 
 |   char *src, *dst; | 
 |   bu32 len, canary, *canaries[3]; | 
 |  | 
 |   canary = 0x12345678; | 
 |  | 
 |   len = 4; | 
 |   while (len < MAX_LEN) | 
 |     { | 
 |       src = data; | 
 |       dst = data + len + 4; | 
 |       /* Set up the canaries.  */ | 
 |       canaries[0] = (void *)&src[-4]; | 
 |       canaries[1] = (void *)&dst[-4]; | 
 |       canaries[2] = (void *)&dst[len]; | 
 |       *canaries[0] = *canaries[1] = *canaries[2] = canary; | 
 |  | 
 |       memset (src, 0xad, len); | 
 |       memset (dst, 0x00, len); | 
 |  | 
 |       mdma_memcpy ((bu32)dst, (bu32)src, len); | 
 |       if (memcmp (src, dst, len)) | 
 | 	DBG_FAIL; | 
 |  | 
 |       if (*canaries[0] != canary || | 
 | 	  *canaries[1] != canary || | 
 | 	  *canaries[2] != canary) | 
 | 	DBG_FAIL; | 
 |  | 
 |       len <<= 4; | 
 |     } | 
 |   DBG_PASS; | 
 | } |