| /* |
| * Dump memory |
| */ |
| |
| #include <stdio.h> |
| #include <string.h> |
| #include <stdlib.h> |
| #include <sys/cpu.h> |
| #include "sysdump.h" |
| |
| static char *lowmem; |
| static size_t lowmem_len; |
| |
| void *zero_addr; /* Hack to keep gcc from complaining */ |
| |
| void snapshot_lowmem(void) |
| { |
| extern void _start(void); |
| |
| lowmem_len = (size_t)_start; |
| lowmem = malloc(lowmem_len); |
| if (lowmem) { |
| printf("Snapshotting lowmem... "); |
| cli(); |
| memcpy(lowmem, zero_addr, lowmem_len); |
| sti(); |
| printf("ok\n"); |
| } |
| } |
| |
| static void dump_memory_range(struct upload_backend *be, const void *where, |
| const void *addr, size_t len) |
| { |
| char filename[32]; |
| |
| sprintf(filename, "memory/%08zx", (size_t)addr); |
| cpio_writefile(be, filename, where, len); |
| } |
| |
| void dump_memory(struct upload_backend *be) |
| { |
| printf("Dumping memory... "); |
| |
| cpio_mkdir(be, "memory"); |
| |
| if (lowmem) |
| dump_memory_range(be, lowmem, zero_addr, lowmem_len); |
| |
| printf("done.\n"); |
| } |