#include #include #include #include #include #include int main(int argc, char *argv[]) { void *l1_addr = (void *)0xf0000000; void *src_addr, *dst_addr; size_t count; enum { AUTO, DMA, CORE } use_dma = AUTO; if (argc > 1) { if (!strcmp(argv[1], "-d")) use_dma = DMA; else if (!strcmp(argv[1], "-c")) use_dma = CORE; if (use_dma != AUTO) --argc, ++argv; } if (argc != 3) { fprintf(stderr, "Usage: dump [-d|-c]
\n" " -d - use DMA for copy (default if address >= %p)\n" " -c - use core loads (default if address < %p)\n" "Values are in hex.\n", l1_addr, l1_addr); return EXIT_FAILURE; } src_addr = (void *)strtoul(argv[1], NULL, 16); count = strtoul(argv[2], NULL, 16); if (use_dma == AUTO) use_dma = (src_addr >= l1_addr ? DMA : CORE); fprintf(stderr, "Copying %zi bytes from %p\n", count, src_addr); dst_addr = malloc(count); fprintf(stderr, "%smemcpy(%p, %p, %zi);\n", (use_dma == DMA ? "dma_" : ""), dst_addr, src_addr, count); if (use_dma == DMA) dma_memcpy(dst_addr, src_addr, count); else memcpy(dst_addr, src_addr, count); fprintf(stderr, "write(%i, %p, %zi);\n", 1, dst_addr, count); write(1, dst_addr, count); return 0; }