Home | History | Annotate | Download | only in sysdump
      1 /*
      2  * Dump memory
      3  */
      4 
      5 #include <stdio.h>
      6 #include <string.h>
      7 #include <stdlib.h>
      8 #include <sys/cpu.h>
      9 #include "sysdump.h"
     10 
     11 static char *lowmem;
     12 static size_t lowmem_len;
     13 
     14 void *zero_addr;		/* Hack to keep gcc from complaining */
     15 
     16 void snapshot_lowmem(void)
     17 {
     18     extern void _start(void);
     19 
     20     lowmem_len = (size_t)_start;
     21     lowmem = malloc(lowmem_len);
     22     if (lowmem) {
     23 	printf("Snapshotting lowmem... ");
     24 	cli();
     25 	memcpy(lowmem, zero_addr, lowmem_len);
     26 	sti();
     27 	printf("ok\n");
     28     }
     29 }
     30 
     31 static void dump_memory_range(struct upload_backend *be, const void *where,
     32 			      const void *addr, size_t len)
     33 {
     34     char filename[32];
     35 
     36     sprintf(filename, "memory/%08zx", (size_t)addr);
     37     cpio_writefile(be, filename, where, len);
     38 }
     39 
     40 void dump_memory(struct upload_backend *be)
     41 {
     42     printf("Dumping memory... ");
     43 
     44     cpio_mkdir(be, "memory");
     45 
     46     if (lowmem)
     47 	dump_memory_range(be, lowmem, zero_addr, lowmem_len);
     48 
     49     printf("done.\n");
     50 }
     51